|
|
@@ -21,11 +21,12 @@ const testdata = "../../testdata"
|
|
|
|
|
|
// fakeDialogs returns preset answers; "" is a cancelled dialog.
|
|
|
type fakeDialogs struct {
|
|
|
- wav, folder, zip string
|
|
|
- zipDefault string
|
|
|
+ wav, project, folder, zip string
|
|
|
+ zipDefault string
|
|
|
}
|
|
|
|
|
|
func (f *fakeDialogs) OpenWAV() (string, error) { return f.wav, nil }
|
|
|
+func (f *fakeDialogs) OpenProject() (string, error) { return f.project, nil }
|
|
|
func (f *fakeDialogs) ChooseFolder() (string, error) { return f.folder, nil }
|
|
|
func (f *fakeDialogs) SaveZip(name string) (string, error) {
|
|
|
f.zipDefault = name
|
|
|
@@ -302,3 +303,74 @@ func TestAudio(t *testing.T) {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+func TestMoveCopySwap(t *testing.T) {
|
|
|
+ s, _ := newService()
|
|
|
+ kick := filepath.Join(kickDir, "Linn 9000 kick.wav")
|
|
|
+ kick2 := filepath.Join(kickDir, "Linn 9000 kick001.wav")
|
|
|
+ _, err := s.AssignSamplePath(0, kick)
|
|
|
+ must(t, err)
|
|
|
+ _, err = s.SetTune(0, 3, 0)
|
|
|
+ must(t, err)
|
|
|
+ _, err = s.AssignSamplePath(1, kick2)
|
|
|
+ must(t, err)
|
|
|
+
|
|
|
+ // Copy across banks keeps the tuning and shares the sample.
|
|
|
+ st, err := s.CopyPad(0, 40)
|
|
|
+ must(t, err)
|
|
|
+ if st.Pads[40].File != "Linn 9000 kick.wav" || st.Pads[40].Coarse != 3 || st.SampleCount != 2 {
|
|
|
+ t.Errorf("copy: %+v, %d samples", st.Pads[40], st.SampleCount)
|
|
|
+ }
|
|
|
+ // Swap.
|
|
|
+ st, err = s.SwapPads(1, 40)
|
|
|
+ must(t, err)
|
|
|
+ if st.Pads[1].File != "Linn 9000 kick.wav" || st.Pads[40].File != "Linn 9000 kick001.wav" {
|
|
|
+ t.Error("swap")
|
|
|
+ }
|
|
|
+ // Move onto a filled pad replaces it.
|
|
|
+ st, err = s.MovePad(40, 0)
|
|
|
+ must(t, err)
|
|
|
+ if st.Pads[40].File != "" || st.Pads[0].File != "Linn 9000 kick001.wav" || st.Pads[0].Coarse != 0 {
|
|
|
+ t.Errorf("move: A01 %+v", st.Pads[0])
|
|
|
+ }
|
|
|
+ if _, err := s.MovePad(0, 128); err == nil {
|
|
|
+ t.Error("move to slot 128 accepted")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestLoad(t *testing.T) {
|
|
|
+ s, d := newService()
|
|
|
+
|
|
|
+ // Cancelled: nothing changes.
|
|
|
+ res, err := s.Load()
|
|
|
+ must(t, err)
|
|
|
+ if res.Path != "" || res.State.Name != DefaultName {
|
|
|
+ t.Errorf("cancelled load: %+v", res.Path)
|
|
|
+ }
|
|
|
+
|
|
|
+ d.project = filepath.Join(testdata, "device", "DemoFile.xpj")
|
|
|
+ res, err = s.Load()
|
|
|
+ must(t, err)
|
|
|
+ st := res.State
|
|
|
+ if st.Name != "DemoFile" || st.Dirty || st.SampleCount != 6 || len(res.Warnings) != 0 || res.Path != d.project {
|
|
|
+ t.Errorf("load: %q dirty %v samples %d warnings %v", st.Name, st.Dirty, st.SampleCount, res.Warnings)
|
|
|
+ }
|
|
|
+ // DemoFile has notes on A01-A04 only.
|
|
|
+ for i, p := range st.Pads {
|
|
|
+ if p.HasNotes != (i < 4) {
|
|
|
+ t.Errorf("%s hasNotes %v", p.Label, p.HasNotes)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if !strings.HasPrefix(st.Pads[0].Audio, "/audio/0?k=") || st.Pads[0].End != 44099 {
|
|
|
+ t.Errorf("A01 %+v", st.Pads[0])
|
|
|
+ }
|
|
|
+ if st.SequenceCount != 2 || st.Sequences[0].Name != "Intro" || !st.Sequences[0].HasNotes {
|
|
|
+ t.Errorf("sequences %+v", st.Sequences)
|
|
|
+ }
|
|
|
+
|
|
|
+ // A bad file keeps the current project.
|
|
|
+ _, err = s.LoadPath(filepath.Join(testdata, "device", "DemoFile_[ProjectData]", "Bass-Pure C.wav"))
|
|
|
+ if err == nil || s.State().Name != "DemoFile" {
|
|
|
+ t.Errorf("bad load: %v", err)
|
|
|
+ }
|
|
|
+}
|