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