JAL-4353 wait for files to be written fully before comparing size with older file
[jalview.git] / test / jalview / bin / CommandsTest.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.bin;
22
23 import java.io.File;
24 import java.io.IOException;
25 import java.lang.reflect.InvocationTargetException;
26 import java.nio.file.Files;
27 import java.util.Date;
28 import java.util.HashSet;
29 import java.util.Set;
30
31 import javax.swing.SwingUtilities;
32
33 import org.testng.Assert;
34 import org.testng.annotations.AfterClass;
35 import org.testng.annotations.AfterMethod;
36 import org.testng.annotations.BeforeClass;
37 import org.testng.annotations.DataProvider;
38 import org.testng.annotations.Test;
39
40 import jalview.gui.AlignFrame;
41 import jalview.gui.Desktop;
42 import jalview.gui.JvOptionPane;
43 import jalview.util.ArrayUtils;
44
45 public class CommandsTest
46 {
47   private static final String testfiles = "test/jalview/bin/argparser/testfiles";
48
49   @BeforeClass(alwaysRun = true)
50   public static void setUpBeforeClass() throws Exception
51   {
52     Cache.loadProperties("test/jalview/gui/quitProps.jvprops");
53     Date oneHourFromNow = new Date(
54             System.currentTimeMillis() + 3600 * 1000);
55     Cache.setDateProperty("JALVIEW_NEWS_RSS_LASTMODIFIED", oneHourFromNow);
56   }
57
58   @AfterClass(alwaysRun = true)
59   public static void resetProps()
60   {
61     Cache.loadProperties("test/jalview/testProps.jvprops");
62   }
63
64   @BeforeClass(alwaysRun = true)
65   public void setUpJvOptionPane()
66   {
67     JvOptionPane.setInteractiveMode(false);
68     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
69   }
70
71   @AfterMethod(alwaysRun = true)
72   public void tearDown()
73   {
74     try
75     {
76       // occasionally we are blocked by Jmol redraws
77       SwingUtilities.invokeAndWait(new Runnable()
78       {
79
80         @Override
81         public void run()
82         {
83           Desktop.closeDesktop();
84         }
85       });
86     } catch (Exception foo)
87     {
88       System.err.println("Failed during teardown with exception");
89       foo.printStackTrace();
90     }
91
92   }
93
94   public static void callJalviewMain(String[] args)
95   {
96     if (Jalview.getInstance() != null)
97     {
98       Jalview.getInstance().doMain(args);
99     }
100     else
101     {
102       Jalview.main(args);
103     }
104   }
105
106   /* --setprops is currently disabled so this test won't work
107   @Test(groups = "Functional")
108   public void setpropsTest()
109   {
110     final String MOSTLY_HARMLESS = "MOSTLY_HARMLESS";
111     String cmdLine = "--setprop=" + MOSTLY_HARMLESS + "=Earth";
112     String[] args = cmdLine.split("\\s+");
113     Jalview.main(args);
114     Assert.assertEquals(Cache.getDefault(MOSTLY_HARMLESS, "Magrathea"),
115             "Earth");
116   }
117   */
118
119   @Test(groups = { "Functional", "testTask3" }, dataProvider = "cmdLines", singleThreaded = true)
120
121   public void commandsOpenTest(String cmdLine, boolean cmdArgs,
122           int numFrames, String[] sequences)
123   {
124     try
125     {
126       String[] args = (cmdLine + " --gui").split("\\s+");
127       callJalviewMain(args);
128       Commands cmds = Jalview.getInstance().getCommands();
129       Assert.assertNotNull(cmds);
130       Assert.assertEquals(cmds.commandArgsProvided(), cmdArgs,
131               "Commands were not provided in the args");
132       Assert.assertEquals(cmds.argsWereParsed(), cmdArgs,
133               "Overall command parse and operation is false");
134
135       Assert.assertEquals(Desktop.getDesktopAlignFrames().length, numFrames,
136               "Wrong number of AlignFrames");
137
138       if (sequences != null)
139       {
140         Set<String> openedSequenceNames = new HashSet<>();
141         AlignFrame[] afs = Desktop.getDesktopAlignFrames();
142         for (AlignFrame af : afs)
143         {
144           openedSequenceNames.addAll(
145                   af.getViewport().getAlignment().getSequenceNames());
146         }
147         for (String sequence : sequences)
148         {
149           Assert.assertTrue(openedSequenceNames.contains(sequence),
150                   "Sequence '" + sequence
151                           + "' was not found in opened alignment files: "
152                           + cmdLine + ".\nOpened sequence names are:\n"
153                           + String.join("\n", openedSequenceNames));
154         }
155       }
156
157       Assert.assertFalse(
158               lookForSequenceName("THIS_SEQUENCE_ID_DOESN'T_EXIST"));
159     } catch (Exception x)
160     {
161       Assert.fail("Unexpected exception during commandsOpenTest", x);
162     } finally
163     {
164       tearDown();
165
166     }
167   }
168
169   @Test(
170     groups =
171     { "Functional", "testTask3" },
172     dataProvider = "structureImageOutputFiles",    singleThreaded = true)
173   public void structureImageOutputTest(String cmdLine, String[] filenames)
174           throws IOException
175   {
176     cleanupFiles(filenames);
177     String[] args = (cmdLine + " --gui").split("\\s+");
178     try
179     {
180       callJalviewMain(args);
181       Commands cmds = Jalview.getInstance().getCommands();
182       Assert.assertNotNull(cmds);
183       File lastFile = null;
184       for (String filename : filenames)
185       {
186         File file = new File(filename);
187         Assert.assertTrue(file.exists(), "File '" + filename
188                 + "' was not created by '" + cmdLine + "'");
189         Assert.assertTrue(file.isFile(), "File '" + filename
190                 + "' is not a file from '" + cmdLine + "'");
191         Assert.assertTrue(Files.size(file.toPath()) > 0, "File '" + filename
192                 + "' has no content from '" + cmdLine + "'");
193         // make sure the successive output files get bigger!
194         if (lastFile != null)
195         {
196           waitForLastWrite(file,25);
197           
198           if (Files.size(file.toPath()) > Files
199                   .size(lastFile.toPath()))
200           Assert.assertTrue(Files.size(file.toPath()) > Files
201                   .size(lastFile.toPath()));
202         }
203         // remember it for next file
204         lastFile = file;
205       }
206     } catch (Exception x)
207     {
208       Assert.fail("Unexpected exception during structureImageOutputTest",
209               x);
210     } finally
211     {
212       cleanupFiles(filenames);
213       tearDown();
214     }
215   }
216
217   private static long waitForLastWrite(File file, int i) throws IOException
218   {
219     long lastSize,stableSize =Files.size(file.toPath());
220     // wait around until we are sure the file has been completely written.
221     do {
222       lastSize = stableSize;
223       try {
224         Thread.sleep(i);
225       } catch (Exception x) {}
226       stableSize=Files.size(file.toPath());
227     } while (stableSize!=lastSize);
228     return stableSize;
229   }
230
231   @Test(groups = "Functional", dataProvider = "argfileOutputFiles", singleThreaded = true)
232
233   public void argFilesGlobAndSubstitutionsTest(String cmdLine,
234           String[] filenames) throws IOException
235   {
236     cleanupFiles(filenames);
237     String[] args = (cmdLine + " --gui").split("\\s+");
238     try
239     {
240       callJalviewMain(args);
241       Commands cmds = Jalview.getInstance().getCommands();
242       Assert.assertNotNull(cmds);
243       File lastFile = null;
244       for (String filename : filenames)
245       {
246         File file = new File(filename);
247         Assert.assertTrue(file.exists(), "File '" + filename
248                 + "' was not created by '" + cmdLine + "'");
249         Assert.assertTrue(file.isFile(), "File '" + filename
250                 + "' is not a file from '" + cmdLine + "'");
251         Assert.assertTrue(Files.size(file.toPath()) > 0, "File '" + filename
252                 + "' has no content from '" + cmdLine + "'");
253         // make sure the successive output files get bigger!
254         if (lastFile != null) {
255           Assert.assertTrue(Files.size(file.toPath()) > Files
256                   .size(lastFile.toPath()));
257           System.out.println("this file: "+file+" +"+Files.size(file.toPath()) + " greater than " +Files.size(lastFile.toPath()));
258         }
259         // remember it for next file
260         lastFile = file;
261       }
262     } catch (Exception x)
263     {
264       Assert.fail(
265               "Unexpected exception during argFilesGlobAndSubstitutions",
266               x);
267     } finally
268     {
269       cleanupFiles(filenames);
270       tearDown();
271     }
272   }
273
274   @DataProvider(name = "structureImageOutputFiles")
275   public Object[][] structureImageOutputFiles()
276   {
277     return new Object[][] {
278         //
279         { "--gui --nonews --nosplash --open=./examples/test_fab41.result/sample.a2m "
280                 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
281                 + "--structureimage=" + testfiles + "/structureimage1.png "
282                 + "--open=./examples/test_fab41.result/sample.a2m "
283                 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
284                 + "--structureimage=" + testfiles
285                 + "/structureimage2.png --scale=1.5 "
286                 + "--open=./examples/test_fab41.result/sample.a2m "
287                 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
288                 + "--structureimage=" + testfiles
289                 + "/structureimage3.png --scale=2.0 ",
290             new String[]
291             { testfiles + "/structureimage1.png",
292                 testfiles + "/structureimage2.png",
293                 testfiles + "/structureimage3.png" } },
294         { "--headless --noquit --open=./examples/test_fab41.result/sample.a2m "
295                 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
296                 + "--structureimage=" + testfiles + "/structureimage1.png "
297                 + "--open=./examples/test_fab41.result/sample.a2m "
298                 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
299                 + "--structureimage=" + testfiles
300                 + "/structureimage2.png --scale=1.5 "
301                 + "--open=./examples/test_fab41.result/sample.a2m "
302                 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
303                 + "--structureimage=" + testfiles
304                 + "/structureimage3.png --scale=2.0 ",
305             new String[]
306             { testfiles + "/structureimage1.png",
307                 testfiles + "/structureimage2.png",
308                 testfiles + "/structureimage3.png" } },
309         { "--gui --nonews --nosplash --open examples/1gaq.txt --append ./examples/3W5V.pdb "+"--structure examples/1gaq.txt --seqid \"1GAQ|A\" "+"--structureimage "+testfiles+"/1gaq.png --structure examples/3W5V.pdb "+"--seqid \"3W5V|A\" --structureimage "+testfiles+"/3w5v.png --overwrite",
310                         
311                 new String[] {
312                                 testfiles+"/1gaq.png",testfiles+"/3w5v.png"
313                 }
314         },
315         { "--headless --noquit --open ./examples/1gaq.txt --append ./examples/3W5V.pdb "+"--structure examples/1gaq.txt --seqid \"1GAQ|A\" "+"--structureimage "+testfiles+"/1gaq.png --structure examples/3W5V.pdb "+"--seqid \"3W5V|A\" --structureimage "+testfiles+"/3w5v.png --overwrite",
316                 
317             new String[] {
318                         testfiles+"/1gaq.png",testfiles+"/3w5v.png"
319             }
320     }
321
322         /*
323                 */
324         //
325     };
326
327   }
328
329   @DataProvider(name = "argfileOutputFiles")
330   public Object[][] argfileOutputFiles()
331   {
332     return new Object[][] {
333         //
334         { "--gui --argfile=" + testfiles + "/**/*.txt", new String[]
335         { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png",
336             testfiles + "/dir3/subdir/test0.png" } },
337         { "--gui --argfile=" + testfiles + "/**/argfile.txt", new String[]
338         { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png" } },
339         { "--gui --argfile=" + testfiles + "/dir*/argfile.txt", new String[]
340         { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png" } },
341         { "--gui --initsubstitutions --append examples/uniref50.fa --image "
342                 + testfiles + "/{basename}.png",
343             new String[]
344             { testfiles + "/uniref50.png" } },
345         { "--gui --append examples/uniref50.fa --nosubstitutions --image "
346                 + testfiles + "/{basename}.png",
347             new String[]
348             { testfiles + "/{basename}.png" } }
349         //
350     };
351
352   }
353
354   @DataProvider(name = "cmdLines")
355   public Object[][] cmdLines()
356   {
357     String[] someUniref50Seqs = new String[] { "FER_CAPAA", "FER_CAPAN",
358         "FER1_MAIZE", "FER1_SPIOL", "O80429_MAIZE" };
359     String[] t1 = new String[] { "TEST1" };
360     String[] t2 = new String[] { "TEST2" };
361     String[] t3 = new String[] { "TEST3" };
362     return new Object[][] {
363         /*
364         */
365         { "--append=examples/uniref50.fa", true, 1, someUniref50Seqs },
366         { "--append examples/uniref50.fa", true, 1, someUniref50Seqs },
367         { "--append=examples/uniref50*.fa", true, 1, someUniref50Seqs },
368         // NOTE we cannot use shell expansion in tests, so list all files!
369         { "--append examples/uniref50.fa examples/uniref50_mz.fa", true, 1,
370             someUniref50Seqs },
371         { "--append=[new]examples/uniref50*.fa", true, 2,
372             someUniref50Seqs },
373         { "--open=examples/uniref50*.fa", true, 2, someUniref50Seqs },
374         { "examples/uniref50.fa", true, 1, someUniref50Seqs },
375         { "examples/uniref50.fa " + testfiles + "/test1.fa", true, 2,
376             ArrayUtils.concatArrays(someUniref50Seqs, t1) },
377         { "examples/uniref50.fa " + testfiles + "/test1.fa", true, 2, t1 },
378         { "--gui --argfile=" + testfiles + "/argfile0.txt", true, 1,
379             ArrayUtils.concatArrays(t1, t3) },
380         { "--gui --argfile=" + testfiles + "/argfile*.txt", true, 5,
381             ArrayUtils.concatArrays(t1, t2, t3) },
382         { "--gui --argfile=" + testfiles + "/argfile.autocounter", true, 3,
383             ArrayUtils.concatArrays(t1, t2) } };
384
385   }
386
387   public static boolean lookForSequenceName(String sequenceName)
388   {
389     AlignFrame[] afs = Desktop.getDesktopAlignFrames();
390     for (AlignFrame af : afs)
391     {
392       for (String name : af.getViewport().getAlignment().getSequenceNames())
393       {
394         if (sequenceName.equals(name))
395         {
396           return true;
397         }
398       }
399     }
400     return false;
401   }
402
403   public static void cleanupFiles(String[] filenames)
404   {
405     for (String filename : filenames)
406     {
407       File file = new File(filename);
408       if (file.exists())
409       {
410         file.delete();
411       }
412     }
413   }
414
415   private final String deleteDir = "test/deleteAfter";
416
417   @Test(
418     groups = "Functional",
419     dataProvider = "allLinkedIdsData",
420     singleThreaded = true)
421   public void allLinkedIdsTest(String cmdLine, String[] filenames,
422           String[] nonfilenames)
423   {
424     String[] args = (cmdLine + " --gui").split("\\s+");
425     callJalviewMain(args);
426     Commands cmds = Jalview.getInstance().getCommands();
427     Assert.assertNotNull(cmds);
428     for (String filename : filenames)
429     {
430       Assert.assertTrue(new File(filename).exists(),
431               "File '" + filename + "' was not created");
432     }
433     cleanupFiles(filenames);
434     if (nonfilenames != null)
435     {
436       for (String nonfilename : nonfilenames)
437       {
438         File nonfile = new File(nonfilename);
439         Assert.assertFalse(nonfile.exists(),
440                 "File " + nonfilename + " exists when it shouldn't!");
441       }
442     }
443
444     File deleteDirF = new File(deleteDir);
445     if (deleteDirF.exists())
446     {
447       deleteDirF.delete();
448     }
449   }
450
451   @DataProvider(name = "allLinkedIdsData")
452   public Object[][] allLinkedIdsData()
453   {
454     return new Object[][] {
455         //
456         { "--gui --open=test/jalview/bin/argparser/testfiles/*.fa --substitutions --all --output={dirname}/{basename}.stk --close",
457             new String[]
458             { "test/jalview/bin/argparser/testfiles/test1.stk",
459                 "test/jalview/bin/argparser/testfiles/test2.stk",
460                 "test/jalview/bin/argparser/testfiles/test3.stk", },
461             null },
462         { "--gui --open=test/jalview/bin/argparser/testfiles/*.fa --substitutions --all --image={dirname}/{basename}.png --close",
463             new String[]
464             { "test/jalview/bin/argparser/testfiles/test1.png",
465                 "test/jalview/bin/argparser/testfiles/test2.png",
466                 "test/jalview/bin/argparser/testfiles/test3.png", },
467             null },
468         { "--gui --open=test/jalview/bin/argparser/testfiles/*.fa --all --output={dirname}/{basename}.stk --close",
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             new String[]
474             { "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
475                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
476                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
477                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
478                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
479                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
480                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
481                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
482                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
483         { "--gui --open=test/jalview/bin/argparser/**/*.fa --all --output={dirname}/{basename}.stk --close",
484             new String[]
485             { "test/jalview/bin/argparser/testfiles/test1.stk",
486                 "test/jalview/bin/argparser/testfiles/test2.stk",
487                 "test/jalview/bin/argparser/testfiles/test3.stk",
488                 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
489                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
490                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
491                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
492                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
493                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
494                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
495                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
496                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", },
497             null },
498         { "--gui --open=test/jalview/bin/argparser/**/*.fa --output=*/*.stk --close",
499             new String[]
500             { "test/jalview/bin/argparser/testfiles/test1.stk",
501                 "test/jalview/bin/argparser/testfiles/test2.stk",
502                 "test/jalview/bin/argparser/testfiles/test3.stk",
503                 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
504                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
505                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
506                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
507                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
508                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
509                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
510                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
511                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", },
512             null },
513         { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --all --output=*/*.stk --close",
514             new String[]
515             { "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
516                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
517                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
518                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
519                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
520             new String[]
521             { "test/jalview/bin/argparser/testfiles/test1.stk",
522                 "test/jalview/bin/argparser/testfiles/test2.stk",
523                 "test/jalview/bin/argparser/testfiles/test3.stk",
524                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
525                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
526                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
527                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
528         { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output=*/*.stk --close",
529             new String[]
530             { "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
531                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
532                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
533             new String[]
534             { "test/jalview/bin/argparser/testfiles/test1.stk",
535                 "test/jalview/bin/argparser/testfiles/test2.stk",
536                 "test/jalview/bin/argparser/testfiles/test3.stk",
537                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
538                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
539                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
540                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
541         { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output={dirname}/{basename}.stk --close",
542             new String[]
543             { "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
544                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
545                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
546             new String[]
547             { "test/jalview/bin/argparser/testfiles/test1.stk",
548                 "test/jalview/bin/argparser/testfiles/test2.stk",
549                 "test/jalview/bin/argparser/testfiles/test3.stk",
550                 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
551                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
552                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
553                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
554                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
555                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
556         { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output={dirname}/{basename}.stk --close",
557             new String[]
558             { "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
559                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
560                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
561             new String[]
562             { "test/jalview/bin/argparser/testfiles/test1.stk",
563                 "test/jalview/bin/argparser/testfiles/test2.stk",
564                 "test/jalview/bin/argparser/testfiles/test3.stk",
565                 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
566                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
567                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
568                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
569                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
570                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
571         { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --output {dirname}/{basename}.stk --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output={dirname}/{basename}.aln --close",
572             new String[]
573             { "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
574                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
575                 "test/jalview/bin/argparser/testfiles/dir2/test1.aln",
576                 "test/jalview/bin/argparser/testfiles/dir2/test2.aln",
577                 "test/jalview/bin/argparser/testfiles/dir2/test3.aln", },
578             new String[]
579             { "test/jalview/bin/argparser/testfiles/test1.stk",
580                 "test/jalview/bin/argparser/testfiles/test2.stk",
581                 "test/jalview/bin/argparser/testfiles/test3.stk",
582                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
583                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
584                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
585                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
586                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
587                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
588                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk",
589                 "test/jalview/bin/argparser/testfiles/test1.aln",
590                 "test/jalview/bin/argparser/testfiles/test2.aln",
591                 "test/jalview/bin/argparser/testfiles/test3.aln",
592                 "test/jalview/bin/argparser/testfiles/dir1/test1.aln",
593                 "test/jalview/bin/argparser/testfiles/dir1/test2.aln",
594                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.aln",
595                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.aln",
596                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.aln",
597                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.aln", }, },
598         // --mkdirs
599         { "--headless --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --output "
600                 + deleteDir
601                 + "/{dirname}/{basename}.stk --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output="
602                 + deleteDir
603                 + "/{dirname}/{basename}.aln --close --all --mkdirs",
604             new String[]
605             { deleteDir
606                     + "/test/jalview/bin/argparser/testfiles/dir1/test1.stk",
607                 deleteDir
608                         + "/test/jalview/bin/argparser/testfiles/dir1/test2.stk",
609                 deleteDir
610                         + "/test/jalview/bin/argparser/testfiles/dir2/test1.aln",
611                 deleteDir
612                         + "/test/jalview/bin/argparser/testfiles/dir2/test2.aln",
613                 deleteDir
614                         + "/test/jalview/bin/argparser/testfiles/dir2/test3.aln", },
615             new String[]
616             { "test/jalview/bin/argparser/testfiles/test1.stk",
617                 "test/jalview/bin/argparser/testfiles/test2.stk",
618                 "test/jalview/bin/argparser/testfiles/test3.stk",
619                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
620                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
621                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
622                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
623                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
624                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
625                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk",
626                 "test/jalview/bin/argparser/testfiles/test1.aln",
627                 "test/jalview/bin/argparser/testfiles/test2.aln",
628                 "test/jalview/bin/argparser/testfiles/test3.aln",
629                 "test/jalview/bin/argparser/testfiles/dir1/test1.aln",
630                 "test/jalview/bin/argparser/testfiles/dir1/test2.aln",
631                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.aln",
632                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.aln",
633                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.aln",
634                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.aln",
635                 deleteDir
636                         + "test/jalview/bin/argparser/testfiles/test1.stk",
637                 deleteDir
638                         + "test/jalview/bin/argparser/testfiles/test2.stk",
639                 deleteDir
640                         + "test/jalview/bin/argparser/testfiles/test3.stk",
641                 deleteDir
642                         + "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
643                 deleteDir
644                         + "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
645                 deleteDir
646                         + "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
647                 deleteDir
648                         + "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
649                 deleteDir
650                         + "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
651                 deleteDir
652                         + "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
653                 deleteDir
654                         + "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk",
655                 deleteDir
656                         + "test/jalview/bin/argparser/testfiles/test1.aln",
657                 deleteDir
658                         + "test/jalview/bin/argparser/testfiles/test2.aln",
659                 deleteDir
660                         + "test/jalview/bin/argparser/testfiles/test3.aln",
661                 deleteDir
662                         + "test/jalview/bin/argparser/testfiles/dir1/test1.aln",
663                 deleteDir
664                         + "test/jalview/bin/argparser/testfiles/dir1/test2.aln",
665                 deleteDir
666                         + "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.aln",
667                 deleteDir
668                         + "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.aln",
669                 deleteDir
670                         + "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.aln",
671                 deleteDir
672                         + "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.aln", }, },
673         //
674     };
675   }
676
677 }