JAL-4290 new CommandsTest.headlessOrGuiImageOutputTest - uses CommandLineOperations...
[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       verifyIncreasingSize(cmdLine, filenames);
184     } catch (Exception x)
185     {
186       Assert.fail("Unexpected exception during structureImageOutputTest",
187               x);
188     } finally
189     {
190       cleanupFiles(filenames);
191       tearDown();
192     }
193   }
194
195   /**
196    * given two command lines, compare the output files produced - they should exist and be equal in size
197    */
198   @Test(
199     groups =
200     { "Functional", "testTask3" },
201     dataProvider = "compareHeadlessAndGUIOps",
202     singleThreaded = true)
203   public void headlessOrGuiImageOutputTest(String[] cmdLines,
204           String[] filenames) throws IOException
205   {
206     cleanupFiles(filenames);
207     try
208     {
209       for (String cmdLine : cmdLines)
210       {
211         CommandLineOperations.Worker runner = CommandLineOperations.getJalviewDesktopRunner(false, cmdLine, 1000);
212         long timeOut = 10000;
213         while (runner.isAlive() && timeOut>0)
214         {
215           Thread.sleep(25);
216           timeOut-=25;
217         }
218       }
219       verifyOrderedFileSet(cmdLines[0] + " vs " + cmdLines[1], filenames,
220               false);
221     } catch (Exception x)
222     {
223       Assert.fail("Unexpected exception during structureImageOutputTest",
224               x);
225     } finally
226     {
227       cleanupFiles(filenames);
228       tearDown();
229     }
230   }
231   @DataProvider(name = "compareHeadlessAndGUIOps")
232   public Object[][] compareHeadlessAndGUIOps()
233   {
234     return new Object[][] {
235         new Object[]
236         { new String[] { "--open examples/uniref50.fa "
237                 + "--structure [seqid=FER1_SPIOL,tempfac=plddt,showssannotations,structureviewer=jmol]"
238                 + "examples/AlphaFold/AF-P00221-F1-model_v4.pdb "
239                 + "--paematrix examples/AlphaFold/AF-P00221-F1-predicted_aligned_error_v4.json --image="
240                 + testfiles + "test-al-pae-ss-gui.png --overwrite --gui --quit",
241             "--open examples/uniref50.fa "
242                     + "--structure [seqid=FER1_SPIOL,tempfac=plddt,showssannotations,structureviewer=jmol]"
243                     + "examples/AlphaFold/AF-P00221-F1-model_v4.pdb "
244                     + "--paematrix examples/AlphaFold/AF-P00221-F1-predicted_aligned_error_v4.json --image="
245                     + testfiles
246                     + "test-al-pae-ss-nogui.png --overwrite --nogui"
247
248         }, new String[] {
249             testfiles + "test-al-pae-ss-gui.png",
250             testfiles
251             + "test-al-pae-ss-nogui.png",
252         } } };
253   }
254   
255   private static void verifyIncreasingSize(String cmdLine, String[] filenames) throws Exception
256   {
257     verifyOrderedFileSet(cmdLine, filenames, true);
258   }
259   
260   private static void verifyOrderedFileSet(String cmdLine, String[] filenames, boolean increasingSize) throws Exception
261   {
262     File lastFile = null;
263     for (String filename : filenames)
264     {
265       File file = new File(filename);
266       Assert.assertTrue(file.exists(), "File '" + filename
267               + "' was not created by '" + cmdLine + "'");
268       Assert.assertTrue(file.isFile(), "File '" + filename
269               + "' is not a file from '" + cmdLine + "'");
270       Assert.assertTrue(Files.size(file.toPath()) > 0, "File '" + filename
271               + "' has no content from '" + cmdLine + "'");
272       // make sure the successive output files get bigger!
273       if (lastFile != null)
274       {
275         waitForLastWrite(file,25);
276         
277         if (increasingSize)
278         { Assert.assertTrue(Files.size(file.toPath()) > Files
279                 .size(lastFile.toPath()),"Expected " + file.toPath()+ " to be larger than "+lastFile.toPath());
280         } else {
281           Assert.assertEquals(Files.size(file.toPath()), Files
282                 .size(lastFile.toPath()), "New file "+file.toPath()+" (actual size) not same as last file's size "+lastFile.toString());
283         }
284       }
285       // remember it for next file
286       lastFile = file;
287     }
288
289   }
290   private static long waitForLastWrite(File file, int i) throws IOException
291   {
292     long lastSize,stableSize =Files.size(file.toPath());
293     // wait around until we are sure the file has been completely written.
294     do {
295       lastSize = stableSize;
296       try {
297         Thread.sleep(i);
298       } catch (Exception x) {}
299       stableSize=Files.size(file.toPath());
300     } while (stableSize!=lastSize);
301     return stableSize;
302   }
303
304   @Test(groups = "Functional", dataProvider = "argfileOutputFiles", singleThreaded = true)
305
306   public void argFilesGlobAndSubstitutionsTest(String cmdLine,
307           String[] filenames) throws IOException
308   {
309     cleanupFiles(filenames);
310     String[] args = (cmdLine + " --gui").split("\\s+");
311     try
312     {
313       callJalviewMain(args);
314       Commands cmds = Jalview.getInstance().getCommands();
315       Assert.assertNotNull(cmds);
316       File lastFile = null;
317       for (String filename : filenames)
318       {
319         File file = new File(filename);
320         Assert.assertTrue(file.exists(), "File '" + filename
321                 + "' was not created by '" + cmdLine + "'");
322         Assert.assertTrue(file.isFile(), "File '" + filename
323                 + "' is not a file from '" + cmdLine + "'");
324         Assert.assertTrue(Files.size(file.toPath()) > 0, "File '" + filename
325                 + "' has no content from '" + cmdLine + "'");
326         // make sure the successive output files get bigger!
327         if (lastFile != null) {
328           Assert.assertTrue(Files.size(file.toPath()) > Files
329                   .size(lastFile.toPath()));
330           System.out.println("this file: "+file+" +"+Files.size(file.toPath()) + " greater than " +Files.size(lastFile.toPath()));
331         }
332         // remember it for next file
333         lastFile = file;
334       }
335     } catch (Exception x)
336     {
337       Assert.fail(
338               "Unexpected exception during argFilesGlobAndSubstitutions",
339               x);
340     } finally
341     {
342       cleanupFiles(filenames);
343       tearDown();
344     }
345   }
346
347   @DataProvider(name = "structureImageOutputFiles")
348   public Object[][] structureImageOutputFiles()
349   {
350     return new Object[][] {
351         //
352         { "--gui --nonews --nosplash --open=./examples/test_fab41.result/sample.a2m "
353                 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
354                 + "--structureimage=" + testfiles + "/structureimage1.png "
355                 + "--open=./examples/test_fab41.result/sample.a2m "
356                 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
357                 + "--structureimage=" + testfiles
358                 + "/structureimage2.png --scale=1.5 "
359                 + "--open=./examples/test_fab41.result/sample.a2m "
360                 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
361                 + "--structureimage=" + testfiles
362                 + "/structureimage3.png --scale=2.0 ",
363             new String[]
364             { testfiles + "/structureimage1.png",
365                 testfiles + "/structureimage2.png",
366                 testfiles + "/structureimage3.png" } },
367         { "--headless --noquit --open=./examples/test_fab41.result/sample.a2m "
368                 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
369                 + "--structureimage=" + testfiles + "/structureimage1.png "
370                 + "--open=./examples/test_fab41.result/sample.a2m "
371                 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
372                 + "--structureimage=" + testfiles
373                 + "/structureimage2.png --scale=1.5 "
374                 + "--open=./examples/test_fab41.result/sample.a2m "
375                 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
376                 + "--structureimage=" + testfiles
377                 + "/structureimage3.png --scale=2.0 ",
378             new String[]
379             { testfiles + "/structureimage1.png",
380                 testfiles + "/structureimage2.png",
381                 testfiles + "/structureimage3.png" } },
382         { "--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",
383                         
384                 new String[] {
385                                 testfiles+"/1gaq.png",testfiles+"/3w5v.png"
386                 }
387         },
388         { "--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",
389                 
390             new String[] {
391                         testfiles+"/1gaq.png",testfiles+"/3w5v.png"
392             }
393     }
394
395         /*
396                 */
397         //
398     };
399
400   }
401
402   @DataProvider(name = "argfileOutputFiles")
403   public Object[][] argfileOutputFiles()
404   {
405     return new Object[][] {
406         //
407         { "--gui --argfile=" + testfiles + "/**/*.txt", new String[]
408         { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png",
409             testfiles + "/dir3/subdir/test0.png" } },
410         { "--gui --argfile=" + testfiles + "/**/argfile.txt", new String[]
411         { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png" } },
412         { "--gui --argfile=" + testfiles + "/dir*/argfile.txt", new String[]
413         { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png" } },
414         { "--gui --initsubstitutions --append examples/uniref50.fa --image "
415                 + testfiles + "/{basename}.png",
416             new String[]
417             { testfiles + "/uniref50.png" } },
418         { "--gui --append examples/uniref50.fa --nosubstitutions --image "
419                 + testfiles + "/{basename}.png",
420             new String[]
421             { testfiles + "/{basename}.png" } }
422         //
423     };
424
425   }
426
427   @DataProvider(name = "cmdLines")
428   public Object[][] cmdLines()
429   {
430     String[] someUniref50Seqs = new String[] { "FER_CAPAA", "FER_CAPAN",
431         "FER1_MAIZE", "FER1_SPIOL", "O80429_MAIZE" };
432     String[] t1 = new String[] { "TEST1" };
433     String[] t2 = new String[] { "TEST2" };
434     String[] t3 = new String[] { "TEST3" };
435     return new Object[][] {
436         /*
437         */
438         { "--append=examples/uniref50.fa", true, 1, someUniref50Seqs },
439         { "--append examples/uniref50.fa", true, 1, someUniref50Seqs },
440         { "--append=examples/uniref50*.fa", true, 1, someUniref50Seqs },
441         // NOTE we cannot use shell expansion in tests, so list all files!
442         { "--append examples/uniref50.fa examples/uniref50_mz.fa", true, 1,
443             someUniref50Seqs },
444         { "--append=[new]examples/uniref50*.fa", true, 2,
445             someUniref50Seqs },
446         { "--open=examples/uniref50*.fa", true, 2, someUniref50Seqs },
447         { "examples/uniref50.fa", true, 1, someUniref50Seqs },
448         { "examples/uniref50.fa " + testfiles + "/test1.fa", true, 2,
449             ArrayUtils.concatArrays(someUniref50Seqs, t1) },
450         { "examples/uniref50.fa " + testfiles + "/test1.fa", true, 2, t1 },
451         { "--gui --argfile=" + testfiles + "/argfile0.txt", true, 1,
452             ArrayUtils.concatArrays(t1, t3) },
453         { "--gui --argfile=" + testfiles + "/argfile*.txt", true, 5,
454             ArrayUtils.concatArrays(t1, t2, t3) },
455         { "--gui --argfile=" + testfiles + "/argfile.autocounter", true, 3,
456             ArrayUtils.concatArrays(t1, t2) } };
457
458   }
459
460   public static boolean lookForSequenceName(String sequenceName)
461   {
462     AlignFrame[] afs = Desktop.getDesktopAlignFrames();
463     for (AlignFrame af : afs)
464     {
465       for (String name : af.getViewport().getAlignment().getSequenceNames())
466       {
467         if (sequenceName.equals(name))
468         {
469           return true;
470         }
471       }
472     }
473     return false;
474   }
475
476   public static void cleanupFiles(String[] filenames)
477   {
478     for (String filename : filenames)
479     {
480       File file = new File(filename);
481       if (file.exists())
482       {
483         file.delete();
484       }
485     }
486   }
487
488   private final String deleteDir = "test/deleteAfter";
489
490   @Test(
491     groups = "Functional",
492     dataProvider = "allLinkedIdsData",
493     singleThreaded = true)
494   public void allLinkedIdsTest(String cmdLine, String[] filenames,
495           String[] nonfilenames)
496   {
497     String[] args = (cmdLine + " --gui").split("\\s+");
498     callJalviewMain(args);
499     Commands cmds = Jalview.getInstance().getCommands();
500     Assert.assertNotNull(cmds);
501     for (String filename : filenames)
502     {
503       Assert.assertTrue(new File(filename).exists(),
504               "File '" + filename + "' was not created");
505     }
506     cleanupFiles(filenames);
507     if (nonfilenames != null)
508     {
509       for (String nonfilename : nonfilenames)
510       {
511         File nonfile = new File(nonfilename);
512         Assert.assertFalse(nonfile.exists(),
513                 "File " + nonfilename + " exists when it shouldn't!");
514       }
515     }
516
517     File deleteDirF = new File(deleteDir);
518     if (deleteDirF.exists())
519     {
520       deleteDirF.delete();
521     }
522   }
523
524   @DataProvider(name = "allLinkedIdsData")
525   public Object[][] allLinkedIdsData()
526   {
527     return new Object[][] {
528         //
529         { "--gui --open=test/jalview/bin/argparser/testfiles/*.fa --substitutions --all --output={dirname}/{basename}.stk --close",
530             new String[]
531             { "test/jalview/bin/argparser/testfiles/test1.stk",
532                 "test/jalview/bin/argparser/testfiles/test2.stk",
533                 "test/jalview/bin/argparser/testfiles/test3.stk", },
534             null },
535         { "--gui --open=test/jalview/bin/argparser/testfiles/*.fa --substitutions --all --image={dirname}/{basename}.png --close",
536             new String[]
537             { "test/jalview/bin/argparser/testfiles/test1.png",
538                 "test/jalview/bin/argparser/testfiles/test2.png",
539                 "test/jalview/bin/argparser/testfiles/test3.png", },
540             null },
541         { "--gui --open=test/jalview/bin/argparser/testfiles/*.fa --all --output={dirname}/{basename}.stk --close",
542             new String[]
543             { "test/jalview/bin/argparser/testfiles/test1.stk",
544                 "test/jalview/bin/argparser/testfiles/test2.stk",
545                 "test/jalview/bin/argparser/testfiles/test3.stk", },
546             new String[]
547             { "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
548                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
549                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
550                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
551                 "test/jalview/bin/argparser/testfiles/dir2/test3.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/**/*.fa --all --output={dirname}/{basename}.stk --close",
557             new String[]
558             { "test/jalview/bin/argparser/testfiles/test1.stk",
559                 "test/jalview/bin/argparser/testfiles/test2.stk",
560                 "test/jalview/bin/argparser/testfiles/test3.stk",
561                 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
562                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
563                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
564                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
565                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
566                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
567                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
568                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
569                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", },
570             null },
571         { "--gui --open=test/jalview/bin/argparser/**/*.fa --output=*/*.stk --close",
572             new String[]
573             { "test/jalview/bin/argparser/testfiles/test1.stk",
574                 "test/jalview/bin/argparser/testfiles/test2.stk",
575                 "test/jalview/bin/argparser/testfiles/test3.stk",
576                 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
577                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
578                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
579                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
580                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
581                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
582                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
583                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
584                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", },
585             null },
586         { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --all --output=*/*.stk --close",
587             new String[]
588             { "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
589                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
590                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
591                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
592                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
593             new String[]
594             { "test/jalview/bin/argparser/testfiles/test1.stk",
595                 "test/jalview/bin/argparser/testfiles/test2.stk",
596                 "test/jalview/bin/argparser/testfiles/test3.stk",
597                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
598                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
599                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
600                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
601         { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output=*/*.stk --close",
602             new String[]
603             { "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
604                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
605                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
606             new String[]
607             { "test/jalview/bin/argparser/testfiles/test1.stk",
608                 "test/jalview/bin/argparser/testfiles/test2.stk",
609                 "test/jalview/bin/argparser/testfiles/test3.stk",
610                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
611                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
612                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
613                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
614         { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output={dirname}/{basename}.stk --close",
615             new String[]
616             { "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
617                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
618                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
619             new String[]
620             { "test/jalview/bin/argparser/testfiles/test1.stk",
621                 "test/jalview/bin/argparser/testfiles/test2.stk",
622                 "test/jalview/bin/argparser/testfiles/test3.stk",
623                 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
624                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
625                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
626                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
627                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
628                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
629         { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output={dirname}/{basename}.stk --close",
630             new String[]
631             { "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
632                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
633                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
634             new String[]
635             { "test/jalview/bin/argparser/testfiles/test1.stk",
636                 "test/jalview/bin/argparser/testfiles/test2.stk",
637                 "test/jalview/bin/argparser/testfiles/test3.stk",
638                 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
639                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
640                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
641                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
642                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
643                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
644         { "--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",
645             new String[]
646             { "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
647                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
648                 "test/jalview/bin/argparser/testfiles/dir2/test1.aln",
649                 "test/jalview/bin/argparser/testfiles/dir2/test2.aln",
650                 "test/jalview/bin/argparser/testfiles/dir2/test3.aln", },
651             new String[]
652             { "test/jalview/bin/argparser/testfiles/test1.stk",
653                 "test/jalview/bin/argparser/testfiles/test2.stk",
654                 "test/jalview/bin/argparser/testfiles/test3.stk",
655                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
656                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
657                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
658                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
659                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
660                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
661                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk",
662                 "test/jalview/bin/argparser/testfiles/test1.aln",
663                 "test/jalview/bin/argparser/testfiles/test2.aln",
664                 "test/jalview/bin/argparser/testfiles/test3.aln",
665                 "test/jalview/bin/argparser/testfiles/dir1/test1.aln",
666                 "test/jalview/bin/argparser/testfiles/dir1/test2.aln",
667                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.aln",
668                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.aln",
669                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.aln",
670                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.aln", }, },
671         // --mkdirs
672         { "--headless --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --output "
673                 + deleteDir
674                 + "/{dirname}/{basename}.stk --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output="
675                 + deleteDir
676                 + "/{dirname}/{basename}.aln --close --all --mkdirs",
677             new String[]
678             { deleteDir
679                     + "/test/jalview/bin/argparser/testfiles/dir1/test1.stk",
680                 deleteDir
681                         + "/test/jalview/bin/argparser/testfiles/dir1/test2.stk",
682                 deleteDir
683                         + "/test/jalview/bin/argparser/testfiles/dir2/test1.aln",
684                 deleteDir
685                         + "/test/jalview/bin/argparser/testfiles/dir2/test2.aln",
686                 deleteDir
687                         + "/test/jalview/bin/argparser/testfiles/dir2/test3.aln", },
688             new String[]
689             { "test/jalview/bin/argparser/testfiles/test1.stk",
690                 "test/jalview/bin/argparser/testfiles/test2.stk",
691                 "test/jalview/bin/argparser/testfiles/test3.stk",
692                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
693                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
694                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
695                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
696                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
697                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
698                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk",
699                 "test/jalview/bin/argparser/testfiles/test1.aln",
700                 "test/jalview/bin/argparser/testfiles/test2.aln",
701                 "test/jalview/bin/argparser/testfiles/test3.aln",
702                 "test/jalview/bin/argparser/testfiles/dir1/test1.aln",
703                 "test/jalview/bin/argparser/testfiles/dir1/test2.aln",
704                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.aln",
705                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.aln",
706                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.aln",
707                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.aln",
708                 deleteDir
709                         + "test/jalview/bin/argparser/testfiles/test1.stk",
710                 deleteDir
711                         + "test/jalview/bin/argparser/testfiles/test2.stk",
712                 deleteDir
713                         + "test/jalview/bin/argparser/testfiles/test3.stk",
714                 deleteDir
715                         + "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
716                 deleteDir
717                         + "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
718                 deleteDir
719                         + "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
720                 deleteDir
721                         + "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
722                 deleteDir
723                         + "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
724                 deleteDir
725                         + "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
726                 deleteDir
727                         + "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk",
728                 deleteDir
729                         + "test/jalview/bin/argparser/testfiles/test1.aln",
730                 deleteDir
731                         + "test/jalview/bin/argparser/testfiles/test2.aln",
732                 deleteDir
733                         + "test/jalview/bin/argparser/testfiles/test3.aln",
734                 deleteDir
735                         + "test/jalview/bin/argparser/testfiles/dir1/test1.aln",
736                 deleteDir
737                         + "test/jalview/bin/argparser/testfiles/dir1/test2.aln",
738                 deleteDir
739                         + "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.aln",
740                 deleteDir
741                         + "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.aln",
742                 deleteDir
743                         + "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.aln",
744                 deleteDir
745                         + "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.aln", }, },
746         //
747     };
748   }
749
750 }