JAL-4195 tidy up desktop instances after creating them
[jalview.git] / test / jalview / bin / CommandsTest.java
1 package jalview.bin;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.nio.file.Files;
6 import java.util.Date;
7 import java.util.HashSet;
8 import java.util.Set;
9
10 import org.testng.Assert;
11 import org.testng.annotations.AfterClass;
12 import org.testng.annotations.AfterMethod;
13 import org.testng.annotations.BeforeClass;
14 import org.testng.annotations.DataProvider;
15 import org.testng.annotations.Test;
16
17 import jalview.gui.AlignFrame;
18 import jalview.gui.Desktop;
19 import jalview.gui.JvOptionPane;
20 import jalview.util.ArrayUtils;
21
22 @Test
23 public class CommandsTest
24 {
25   private static final String testfiles = "test/jalview/bin/argparser/testfiles";
26
27   @BeforeClass(alwaysRun = true)
28   public static void setUpBeforeClass() throws Exception
29   {
30     Cache.loadProperties("test/jalview/gui/quitProps.jvprops");
31     Date oneHourFromNow = new Date(
32             System.currentTimeMillis() + 3600 * 1000);
33     Cache.setDateProperty("JALVIEW_NEWS_RSS_LASTMODIFIED", oneHourFromNow);
34   }
35
36   @AfterClass(alwaysRun = true)
37   public static void resetProps()
38   {
39     Cache.loadProperties("test/jalview/testProps.jvprops");
40   }
41
42   @BeforeClass(alwaysRun = true)
43   public void setUpJvOptionPane()
44   {
45     JvOptionPane.setInteractiveMode(false);
46     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
47   }
48
49   @AfterMethod(alwaysRun = true)
50   public void tearDown()
51   {
52     Desktop.closeDesktop();
53   }
54   
55   public static void callJalviewMain(String[] args) {
56     if (Jalview.getInstance()!=null) {
57       Jalview.getInstance().doMain(args);
58     } else {
59       Jalview.main(args);
60     }
61   }
62
63   /* --setprops is currently disabled so this test won't work
64   @Test(groups = "Functional")
65   public void setpropsTest()
66   {
67     final String MOSTLY_HARMLESS = "MOSTLY_HARMLESS";
68     String cmdLine = "--setprop=" + MOSTLY_HARMLESS + "=Earth";
69     String[] args = cmdLine.split("\\s+");
70     Jalview.main(args);
71     Assert.assertEquals(Cache.getDefault(MOSTLY_HARMLESS, "Magrathea"),
72             "Earth");
73   }
74   */
75
76   @Test(groups = "Functional", dataProvider = "cmdLines")
77   public void commandsOpenTest(String cmdLine, boolean cmdArgs,
78           int numFrames, String[] sequences)
79   {
80     String[] args = (cmdLine + " --gui").split("\\s+");
81     callJalviewMain(args);
82     Commands cmds = Jalview.getInstance().getCommands();
83     Assert.assertNotNull(cmds);
84     Assert.assertEquals(cmds.commandArgsProvided(), cmdArgs,
85             "Commands were not provided in the args");
86     Assert.assertEquals(cmds.argsWereParsed(), cmdArgs,
87             "Overall command parse and operation is false");
88
89     Assert.assertEquals(Desktop.getAlignFrames().length, numFrames,
90             "Wrong number of AlignFrames");
91
92     if (sequences != null)
93     {
94       Set<String> openedSequenceNames = new HashSet<>();
95       AlignFrame[] afs = Desktop.getAlignFrames();
96       for (AlignFrame af : afs)
97       {
98         openedSequenceNames
99                 .addAll(af.getViewport().getAlignment().getSequenceNames());
100       }
101       for (String sequence : sequences)
102       {
103         Assert.assertTrue(openedSequenceNames.contains(sequence),
104                 "Sequence '" + sequence
105                         + "' was not found in opened alignment files: "
106                         + cmdLine + ".\nOpened sequence names are:\n"
107                         + String.join("\n", openedSequenceNames));
108       }
109     }
110
111     Assert.assertFalse(
112             lookForSequenceName("THIS_SEQUENCE_ID_DOESN'T_EXIST"));
113   }
114
115   @Test(groups = "Functional", dataProvider = "structureImageOutputFiles")
116   public void structureImageOutputTest(String cmdLine, String[] filenames)
117           throws IOException
118   {
119     cleanupFiles(filenames);
120     String[] args = (cmdLine + " --gui").split("\\s+");
121     callJalviewMain(args);
122     Commands cmds = Jalview.getInstance().getCommands();
123     Assert.assertNotNull(cmds);
124     File lastFile = null;
125     for (String filename : filenames)
126     {
127       File file = new File(filename);
128       Assert.assertTrue(file.exists(), "File '" + filename
129               + "' was not created by '" + cmdLine + "'");
130       Assert.assertTrue(file.isFile(), "File '" + filename
131               + "' is not a file from '" + cmdLine + "'");
132       Assert.assertTrue(Files.size(file.toPath()) > 0, "File '" + filename
133               + "' has no content from '" + cmdLine + "'");
134       // make sure the successive output files get bigger!
135       if (lastFile != null)
136         Assert.assertTrue(
137                 Files.size(file.toPath()) > Files.size(lastFile.toPath()));
138     }
139     cleanupFiles(filenames);
140     tearDown();
141   }
142
143   @Test(groups = "Functional", dataProvider = "argfileOutputFiles")
144   public void argFilesGlobAndSubstitutionsTest(String cmdLine,
145           String[] filenames) throws IOException
146   {
147     cleanupFiles(filenames);
148     String[] args = (cmdLine + " --gui").split("\\s+");
149     callJalviewMain(args);
150     Commands cmds = Jalview.getInstance().getCommands();
151     Assert.assertNotNull(cmds);
152     File lastFile = null;
153     for (String filename : filenames)
154     {
155       File file = new File(filename);
156       Assert.assertTrue(file.exists(), "File '" + filename
157               + "' was not created by '" + cmdLine + "'");
158       Assert.assertTrue(file.isFile(), "File '" + filename
159               + "' is not a file from '" + cmdLine + "'");
160       Assert.assertTrue(Files.size(file.toPath()) > 0, "File '" + filename
161               + "' has no content from '" + cmdLine + "'");
162       // make sure the successive output files get bigger!
163       if (lastFile != null)
164         Assert.assertTrue(
165                 Files.size(file.toPath()) > Files.size(lastFile.toPath()));
166     }
167     cleanupFiles(filenames);
168     tearDown();
169   }
170
171   @DataProvider(name = "structureImageOutputFiles")
172   public Object[][] structureImageOutputFiles()
173   {
174     return new Object[][] {
175         //
176         { "--gui --nonews --nosplash --open=./examples/test_fab41.result/sample.a2m "
177                 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
178                 + "--structureimage=" + testfiles + "/structureimage1.png "
179                 + "--open=./examples/test_fab41.result/sample.a2m "
180                 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
181                 + "--structureimage=" + testfiles
182                 + "/structureimage2.png --structureimagescale=1.5"
183                 + "--open=./examples/test_fab41.result/sample.a2m "
184                 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
185                 + "--structureimage=" + testfiles
186                 + "/structureimage3.png --structureimagescale=2.0",
187             new String[]
188             { testfiles + "/structureimage1.png",
189                 testfiles + "/structureimage2.png",
190                 testfiles + "/structureimage3.png" } },
191         /*
192         { "--headless --noquit --open=./examples/test_fab41.result/sample.a2m "
193                 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
194                 + "--structureimage=" + testfiles + "/structureimage1.png "
195                 + "--open=./examples/test_fab41.result/sample.a2m "
196                 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
197                 + "--structureimage=" + testfiles
198                 + "/structureimage2.png --structureimagescale=1.5"
199                 + "--open=./examples/test_fab41.result/sample.a2m "
200                 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
201                 + "--structureimage=" + testfiles
202                 + "/structureimage3.png --structureimagescale=2.0",
203             new String[]
204             { testfiles + "/structureimage1.png",
205                 testfiles + "/structureimage2.png",
206                 testfiles + "/structureimage3.png" } },
207                 */
208         //
209     };
210
211   }
212
213   @DataProvider(name = "argfileOutputFiles")
214   public Object[][] argfileOutputFiles()
215   {
216     return new Object[][] {
217         //
218         { "--gui --argfile=" + testfiles + "/**/*.txt", new String[]
219         { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png",
220             testfiles + "/dir3/subdir/test0.png" } },
221         { "--gui --argfile=" + testfiles + "/**/argfile.txt", new String[]
222         { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png" } },
223         { "--gui --argfile=" + testfiles + "/dir*/argfile.txt", new String[]
224         { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png" } },
225         { "--gui --initsubstitutions --append examples/uniref50.fa --image "
226                 + testfiles + "/{basename}.png",
227             new String[]
228             { testfiles + "/uniref50.png" } },
229         { "--gui --append examples/uniref50.fa --nosubstitutions --image "
230                 + testfiles + "/{basename}.png",
231             new String[]
232             { testfiles + "/{basename}.png" } }
233         //
234     };
235
236   }
237
238   @DataProvider(name = "cmdLines")
239   public Object[][] cmdLines()
240   {
241     String[] someUniref50Seqs = new String[] { "FER_CAPAA", "FER_CAPAN",
242         "FER1_MAIZE", "FER1_SPIOL", "O80429_MAIZE" };
243     String[] t1 = new String[] { "TEST1" };
244     String[] t2 = new String[] { "TEST2" };
245     String[] t3 = new String[] { "TEST3" };
246     return new Object[][] {
247         /*
248         */
249         { "--append=examples/uniref50.fa", true, 1, someUniref50Seqs },
250         { "--append examples/uniref50.fa", true, 1, someUniref50Seqs },
251         { "--append=examples/uniref50*.fa", true, 1, someUniref50Seqs },
252         // NOTE we cannot use shell expansion in tests, so list all files!
253         { "--append examples/uniref50.fa examples/uniref50_mz.fa", true, 1,
254             someUniref50Seqs },
255         { "--append=[new]examples/uniref50*.fa", true, 2,
256             someUniref50Seqs },
257         { "--open=examples/uniref50*.fa", true, 2, someUniref50Seqs },
258         { "examples/uniref50.fa", true, 1, someUniref50Seqs },
259         { "examples/uniref50.fa " + testfiles + "/test1.fa", true, 2,
260             ArrayUtils.concatArrays(someUniref50Seqs, t1) },
261         { "examples/uniref50.fa " + testfiles + "/test1.fa", true, 2, t1 },
262         { "--gui --argfile=" + testfiles + "/argfile0.txt", true, 1,
263             ArrayUtils.concatArrays(t1, t3) },
264         { "--gui --argfile=" + testfiles + "/argfile*.txt", true, 5,
265             ArrayUtils.concatArrays(t1, t2, t3) },
266         { "--gui --argfile=" + testfiles + "/argfile.autocounter", true, 3,
267             ArrayUtils.concatArrays(t1, t2) } };
268
269   }
270
271   public static boolean lookForSequenceName(String sequenceName)
272   {
273     AlignFrame[] afs = Desktop.getAlignFrames();
274     for (AlignFrame af : afs)
275     {
276       for (String name : af.getViewport().getAlignment().getSequenceNames())
277       {
278         if (sequenceName.equals(name))
279         {
280           return true;
281         }
282       }
283     }
284     return false;
285   }
286
287   public static void cleanupFiles(String[] filenames)
288   {
289     for (String filename : filenames)
290     {
291       File file = new File(filename);
292       if (file.exists())
293       {
294         file.delete();
295       }
296     }
297   }
298
299   @Test(
300     groups = "Functional",
301     dataProvider = "allLinkedIdsData",
302     singleThreaded = true)
303   public void allLinkedIdsTest(String cmdLine, String[] filenames,
304           String[] nonfilenames)
305   {
306     String[] args = (cmdLine + " --gui").split("\\s+");
307     callJalviewMain(args);
308     Commands cmds = Jalview.getInstance().getCommands();
309     Assert.assertNotNull(cmds);
310     for (String filename : filenames)
311     {
312       Assert.assertTrue(new File(filename).exists(),
313               "File '" + filename + "' was not created");
314     }
315     cleanupFiles(filenames);
316     if (nonfilenames != null)
317     {
318       for (String nonfilename : nonfilenames)
319       {
320         File nonfile = new File(nonfilename);
321         Assert.assertFalse(nonfile.exists(),
322                 "File " + nonfilename + " exists when it shouldn't!");
323       }
324     }
325   }
326
327   @DataProvider(name = "allLinkedIdsData")
328   public Object[][] allLinkedIdsData()
329   {
330     return new Object[][] {
331         //
332         /*
333          */
334         { "--gui --open=test/jalview/bin/argparser/testfiles/*.fa --substitutions --all --output={dirname}/{basename}.stk --close",
335             new String[]
336             { "test/jalview/bin/argparser/testfiles/test1.stk",
337                 "test/jalview/bin/argparser/testfiles/test2.stk",
338                 "test/jalview/bin/argparser/testfiles/test3.stk", },
339             null },
340         { "--gui --open=test/jalview/bin/argparser/testfiles/*.fa --substitutions --all --image={dirname}/{basename}.png --close",
341             new String[]
342             { "test/jalview/bin/argparser/testfiles/test1.png",
343                 "test/jalview/bin/argparser/testfiles/test2.png",
344                 "test/jalview/bin/argparser/testfiles/test3.png", },
345             null },
346         { "--gui --open=test/jalview/bin/argparser/testfiles/*.fa --all --output={dirname}/{basename}.stk --close",
347             new String[]
348             { "test/jalview/bin/argparser/testfiles/test1.stk",
349                 "test/jalview/bin/argparser/testfiles/test2.stk",
350                 "test/jalview/bin/argparser/testfiles/test3.stk", },
351             new String[]
352             { "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
353                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
354                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
355                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
356                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
357                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
358                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
359                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
360                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
361         { "--gui --open=test/jalview/bin/argparser/**/*.fa --all --output={dirname}/{basename}.stk --close",
362             new String[]
363             { "test/jalview/bin/argparser/testfiles/test1.stk",
364                 "test/jalview/bin/argparser/testfiles/test2.stk",
365                 "test/jalview/bin/argparser/testfiles/test3.stk",
366                 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
367                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
368                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
369                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
370                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
371                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
372                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
373                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
374                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", },
375             null },
376         { "--gui --open=test/jalview/bin/argparser/**/*.fa --output=*.stk --close",
377             new String[]
378             { "test/jalview/bin/argparser/testfiles/test1.stk",
379                 "test/jalview/bin/argparser/testfiles/test2.stk",
380                 "test/jalview/bin/argparser/testfiles/test3.stk",
381                 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
382                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
383                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
384                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
385                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
386                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
387                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
388                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
389                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", },
390             null },
391         { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output=*.stk --close",
392             new String[]
393             { "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
394                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
395                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
396                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
397                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
398             new String[]
399             { "test/jalview/bin/argparser/testfiles/test1.stk",
400                 "test/jalview/bin/argparser/testfiles/test2.stk",
401                 "test/jalview/bin/argparser/testfiles/test3.stk",
402                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
403                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
404                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
405                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
406         { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output=open*.stk --close",
407             new String[]
408             { "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
409                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
410                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
411             new String[]
412             { "test/jalview/bin/argparser/testfiles/test1.stk",
413                 "test/jalview/bin/argparser/testfiles/test2.stk",
414                 "test/jalview/bin/argparser/testfiles/test3.stk",
415                 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
416                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
417                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
418                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
419                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
420                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
421         { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --opened --output={dirname}/{basename}.stk --close",
422             new String[]
423             { "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
424                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
425                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
426             new String[]
427             { "test/jalview/bin/argparser/testfiles/test1.stk",
428                 "test/jalview/bin/argparser/testfiles/test2.stk",
429                 "test/jalview/bin/argparser/testfiles/test3.stk",
430                 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
431                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
432                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
433                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
434                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
435                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
436         { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --output open*.stk --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output=open*.aln --close",
437             new String[]
438             { "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
439                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
440                 "test/jalview/bin/argparser/testfiles/dir2/test1.aln",
441                 "test/jalview/bin/argparser/testfiles/dir2/test2.aln",
442                 "test/jalview/bin/argparser/testfiles/dir2/test3.aln", },
443             new String[]
444             { "test/jalview/bin/argparser/testfiles/test1.stk",
445                 "test/jalview/bin/argparser/testfiles/test2.stk",
446                 "test/jalview/bin/argparser/testfiles/test3.stk",
447                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
448                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
449                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
450                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
451                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
452                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
453                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk",
454                 "test/jalview/bin/argparser/testfiles/test1.aln",
455                 "test/jalview/bin/argparser/testfiles/test2.aln",
456                 "test/jalview/bin/argparser/testfiles/test3.aln",
457                 "test/jalview/bin/argparser/testfiles/dir1/test1.aln",
458                 "test/jalview/bin/argparser/testfiles/dir1/test2.aln",
459                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.aln",
460                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.aln",
461                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.aln",
462                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.aln", }, },
463         //
464     };
465   }
466
467 }