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