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