|
|
@@ -184,7 +184,7 @@ func TestExport(t *testing.T) {
|
|
|
d.folder = t.TempDir()
|
|
|
dir, err := s.ChooseExportFolder()
|
|
|
must(t, err)
|
|
|
- res, err := s.ExportFolder(dir, false)
|
|
|
+ res, err := s.ExportFolder(false)
|
|
|
must(t, err)
|
|
|
if res.Path != filepath.Join(dir, "Kit.xpj") || len(res.Exists) != 0 {
|
|
|
t.Fatalf("export: %+v", res)
|
|
|
@@ -196,13 +196,20 @@ func TestExport(t *testing.T) {
|
|
|
t.Error(err)
|
|
|
}
|
|
|
|
|
|
- // Second time: reported, not written, until overwrite.
|
|
|
- res, err = s.ExportFolder(dir, false)
|
|
|
+ // The target is forgotten after a successful export.
|
|
|
+ if _, err := s.ExportFolder(false); err == nil || err.Error() != "choose where to export first" {
|
|
|
+ t.Errorf("export without choosing again: %v", err)
|
|
|
+ }
|
|
|
+ // Second time: reported, not written, until overwrite. The confirmed
|
|
|
+ // call uses the same target.
|
|
|
+ _, err = s.ChooseExportFolder()
|
|
|
+ must(t, err)
|
|
|
+ res, err = s.ExportFolder(false)
|
|
|
must(t, err)
|
|
|
if res.Path != "" || len(res.Exists) != 2 {
|
|
|
t.Errorf("re-export: %+v", res)
|
|
|
}
|
|
|
- res, err = s.ExportFolder(dir, true)
|
|
|
+ res, err = s.ExportFolder(true)
|
|
|
must(t, err)
|
|
|
if res.Path == "" {
|
|
|
t.Error("overwrite export failed")
|
|
|
@@ -211,24 +218,82 @@ func TestExport(t *testing.T) {
|
|
|
d.zip = filepath.Join(dir, "kit-export") // no extension: .zip is added
|
|
|
zpath, err := s.ChooseZipPath()
|
|
|
must(t, err)
|
|
|
- if d.zipDefault != "Kit.zip" {
|
|
|
- t.Errorf("zip dialog default %q", d.zipDefault)
|
|
|
+ if d.zipDefault != "Kit.zip" || zpath != filepath.Join(dir, "kit-export.zip") {
|
|
|
+ t.Errorf("zip dialog default %q, chosen %q", d.zipDefault, zpath)
|
|
|
}
|
|
|
- res, err = s.ExportZip(zpath, false)
|
|
|
+ res, err = s.ExportZip(false)
|
|
|
must(t, err)
|
|
|
if res.Path != filepath.Join(dir, "kit-export.zip") {
|
|
|
t.Errorf("zip: %+v", res)
|
|
|
}
|
|
|
- if res, _ = s.ExportZip(zpath, false); len(res.Exists) != 1 {
|
|
|
+ _, err = s.ChooseZipPath()
|
|
|
+ must(t, err)
|
|
|
+ if res, _ = s.ExportZip(false); len(res.Exists) != 1 {
|
|
|
t.Errorf("zip re-export: %+v", res)
|
|
|
}
|
|
|
|
|
|
// Missing folder: a real error.
|
|
|
- if _, err := s.ExportFolder(filepath.Join(dir, "missing", "deeper"), false); err == nil {
|
|
|
+ d.folder = filepath.Join(dir, "missing", "deeper")
|
|
|
+ _, err = s.ChooseExportFolder()
|
|
|
+ must(t, err)
|
|
|
+ if _, err := s.ExportFolder(false); err == nil {
|
|
|
t.Error("export into a missing folder succeeded")
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+func TestExportTarget(t *testing.T) {
|
|
|
+ s, d := newService()
|
|
|
+ for _, export := range []func(bool) (ExportResult, error){s.ExportFolder, s.ExportZip} {
|
|
|
+ if _, err := export(false); err == nil || err.Error() != "choose where to export first" {
|
|
|
+ t.Errorf("export with nothing chosen: %v", err)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // A cancelled dialog forgets an earlier choice.
|
|
|
+ d.folder, d.zip = t.TempDir(), filepath.Join(t.TempDir(), "kit.zip")
|
|
|
+ _, err := s.ChooseExportFolder()
|
|
|
+ must(t, err)
|
|
|
+ _, err = s.ChooseZipPath()
|
|
|
+ must(t, err)
|
|
|
+ d.folder, d.zip = "", ""
|
|
|
+ _, err = s.ChooseExportFolder()
|
|
|
+ must(t, err)
|
|
|
+ _, err = s.ChooseZipPath()
|
|
|
+ must(t, err)
|
|
|
+ if s.exportDir != "" || s.zipPath != "" {
|
|
|
+ t.Errorf("cancel kept %q, %q", s.exportDir, s.zipPath)
|
|
|
+ }
|
|
|
+
|
|
|
+ // New and Load forget the targets chosen for the old project.
|
|
|
+ d.folder, d.zip = t.TempDir(), filepath.Join(t.TempDir(), "kit.zip")
|
|
|
+ choose := func() {
|
|
|
+ _, err := s.ChooseExportFolder()
|
|
|
+ must(t, err)
|
|
|
+ _, err = s.ChooseZipPath()
|
|
|
+ must(t, err)
|
|
|
+ }
|
|
|
+ choose()
|
|
|
+ s.New()
|
|
|
+ if s.exportDir != "" || s.zipPath != "" {
|
|
|
+ t.Error("New kept the export targets")
|
|
|
+ }
|
|
|
+ choose()
|
|
|
+ _, err = s.LoadPath(filepath.Join(testdata, "device", "DemoBlank.xpj"))
|
|
|
+ must(t, err)
|
|
|
+ if s.exportDir != "" || s.zipPath != "" {
|
|
|
+ t.Error("Load kept the export targets")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// exportTo chooses dir in the fake dialog and exports there.
|
|
|
+func exportTo(t *testing.T, s *Service, dir string) (ExportResult, error) {
|
|
|
+ t.Helper()
|
|
|
+ s.dialogs.(*fakeDialogs).folder = dir
|
|
|
+ _, err := s.ChooseExportFolder()
|
|
|
+ must(t, err)
|
|
|
+ return s.ExportFolder(false)
|
|
|
+}
|
|
|
+
|
|
|
func TestExportMatchesCLIRecipe(t *testing.T) {
|
|
|
// Same edits as MpckitT1's pads, through the service.
|
|
|
s, _ := newService()
|
|
|
@@ -241,7 +306,7 @@ func TestExportMatchesCLIRecipe(t *testing.T) {
|
|
|
_, err = s.SetTune(16, 5, 0)
|
|
|
must(t, err)
|
|
|
dir := t.TempDir()
|
|
|
- res, err := s.ExportFolder(dir, false)
|
|
|
+ res, err := exportTo(t, s, dir)
|
|
|
must(t, err)
|
|
|
|
|
|
p, err := project.New("MpckitT1")
|
|
|
@@ -428,7 +493,7 @@ func TestGoldenT1ThroughService(t *testing.T) {
|
|
|
_, err := c()
|
|
|
must(t, err)
|
|
|
}
|
|
|
- res, err := s.ExportFolder(t.TempDir(), false)
|
|
|
+ res, err := exportTo(t, s, t.TempDir())
|
|
|
must(t, err)
|
|
|
if !bytes.Equal(gunzip(t, res.Path), gunzip(t, filepath.Join(testdata, "accepted", "MpckitT1.xpj"))) {
|
|
|
t.Error("differs from testdata/accepted/MpckitT1.xpj")
|
|
|
@@ -475,7 +540,7 @@ func TestMissingFiles(t *testing.T) {
|
|
|
|
|
|
// Export names the missing file and writes nothing.
|
|
|
out := t.TempDir()
|
|
|
- if _, err := s.ExportFolder(out, false); err == nil || !strings.Contains(err.Error(), "80s-Snr-Dreamer SA.wav") {
|
|
|
+ if _, err := exportTo(t, s, out); err == nil || !strings.Contains(err.Error(), "80s-Snr-Dreamer SA.wav") {
|
|
|
t.Errorf("export with a missing file: %v", err)
|
|
|
}
|
|
|
if ents, _ := os.ReadDir(out); len(ents) != 0 {
|
|
|
@@ -488,7 +553,7 @@ func TestMissingFiles(t *testing.T) {
|
|
|
if st.MissingCount != 0 || st.Pads[1].Missing {
|
|
|
t.Error("still missing after replace")
|
|
|
}
|
|
|
- if _, err := s.ExportFolder(out, false); err != nil {
|
|
|
+ if _, err := exportTo(t, s, out); err != nil {
|
|
|
t.Error(err)
|
|
|
}
|
|
|
}
|