4 import java.io.IOException;
5 import java.nio.file.Files;
7 import java.util.HashSet;
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;
17 import jalview.gui.AlignFrame;
18 import jalview.gui.Desktop;
19 import jalview.gui.JvOptionPane;
20 import jalview.util.ArrayUtils;
23 public class CommandsTest
25 private static final String testfiles = "test/jalview/bin/argparser/testfiles";
27 @BeforeClass(alwaysRun = true)
28 public static void setUpBeforeClass() throws Exception
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);
36 @AfterClass(alwaysRun = true)
37 public static void resetProps()
39 Cache.loadProperties("test/jalview/testProps.jvprops");
42 @BeforeClass(alwaysRun = true)
43 public void setUpJvOptionPane()
45 JvOptionPane.setInteractiveMode(false);
46 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
49 @AfterMethod(alwaysRun = true)
50 public void tearDown()
52 if (Desktop.instance != null)
53 Desktop.instance.closeAll_actionPerformed(null);
56 /* --setprops is currently disabled so this test won't work
57 @Test(groups = "Functional")
58 public void setpropsTest()
60 final String MOSTLY_HARMLESS = "MOSTLY_HARMLESS";
61 String cmdLine = "--setprop=" + MOSTLY_HARMLESS + "=Earth";
62 String[] args = cmdLine.split("\\s+");
64 Assert.assertEquals(Cache.getDefault(MOSTLY_HARMLESS, "Magrathea"),
69 @Test(groups = "Functional", dataProvider = "cmdLines")
70 public void commandsOpenTest(String cmdLine, boolean cmdArgs,
71 int numFrames, String[] sequences)
73 String[] args = (cmdLine + " --gui").split("\\s+");
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");
82 Assert.assertEquals(Desktop.getAlignFrames().length, numFrames,
83 "Wrong number of AlignFrames");
85 if (sequences != null)
87 Set<String> openedSequenceNames = new HashSet<>();
88 AlignFrame[] afs = Desktop.getAlignFrames();
89 for (AlignFrame af : afs)
92 .addAll(af.getViewport().getAlignment().getSequenceNames());
94 for (String sequence : sequences)
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));
105 lookForSequenceName("THIS_SEQUENCE_ID_DOESN'T_EXIST"));
108 @Test(groups = "Functional", dataProvider = "structureImageOutputFiles")
109 public void structureImageOutputTest(String cmdLine, String[] filenames)
112 cleanupFiles(filenames);
113 String[] args = (cmdLine + " --gui").split("\\s+");
115 Commands cmds = Jalview.getInstance().getCommands();
116 Assert.assertNotNull(cmds);
117 File lastFile = null;
118 for (String filename : filenames)
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)
130 Files.size(file.toPath()) > Files.size(lastFile.toPath()));
132 cleanupFiles(filenames);
136 @Test(groups = "Functional", dataProvider = "argfileOutputFiles")
137 public void argFilesGlobAndSubstitutionsTest(String cmdLine,
138 String[] filenames) throws IOException
140 cleanupFiles(filenames);
141 String[] args = (cmdLine + " --gui").split("\\s+");
143 Commands cmds = Jalview.getInstance().getCommands();
144 Assert.assertNotNull(cmds);
145 File lastFile = null;
146 for (String filename : filenames)
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)
158 Files.size(file.toPath()) > Files.size(lastFile.toPath()));
160 cleanupFiles(filenames);
164 @DataProvider(name = "structureImageOutputFiles")
165 public Object[][] structureImageOutputFiles()
167 return new Object[][] {
169 { "--gui --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",
181 { testfiles + "/structureimage1.png",
182 testfiles + "/structureimage2.png",
183 testfiles + "/structureimage3.png" } },
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",
197 { testfiles + "/structureimage1.png",
198 testfiles + "/structureimage2.png",
199 testfiles + "/structureimage3.png" } },
206 @DataProvider(name = "argfileOutputFiles")
207 public Object[][] argfileOutputFiles()
209 return new Object[][] {
211 { "--gui --argfile=" + testfiles + "/**/*.txt", new String[]
212 { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png",
213 testfiles + "/dir3/subdir/test0.png" } },
214 { "--gui --argfile=" + testfiles + "/**/argfile.txt", new String[]
215 { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png" } },
216 { "--gui --argfile=" + testfiles + "/dir*/argfile.txt", new String[]
217 { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png" } },
218 { "--gui --initsubstitutions --append examples/uniref50.fa --image "
219 + testfiles + "/{basename}.png",
221 { testfiles + "/uniref50.png" } },
222 { "--gui --append examples/uniref50.fa --nosubstitutions --image "
223 + testfiles + "/{basename}.png",
225 { testfiles + "/{basename}.png" } }
231 @DataProvider(name = "cmdLines")
232 public Object[][] cmdLines()
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[][] {
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,
248 { "--append=[new]examples/uniref50*.fa", true, 2,
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 { "--gui --argfile=" + testfiles + "/argfile0.txt", true, 1,
256 ArrayUtils.concatArrays(t1, t3) },
257 { "--gui --argfile=" + testfiles + "/argfile*.txt", true, 5,
258 ArrayUtils.concatArrays(t1, t2, t3) },
259 { "--gui --argfile=" + testfiles + "/argfile.autocounter", true, 3,
260 ArrayUtils.concatArrays(t1, t2) } };
264 public static boolean lookForSequenceName(String sequenceName)
266 AlignFrame[] afs = Desktop.getAlignFrames();
267 for (AlignFrame af : afs)
269 for (String name : af.getViewport().getAlignment().getSequenceNames())
271 if (sequenceName.equals(name))
280 public static void cleanupFiles(String[] filenames)
282 for (String filename : filenames)
284 File file = new File(filename);
293 groups = "Functional",
294 dataProvider = "allLinkedIdsData",
295 singleThreaded = true)
296 public void allLinkedIdsTest(String cmdLine, String[] filenames,
297 String[] nonfilenames)
299 String[] args = (cmdLine + " --gui").split("\\s+");
301 Commands cmds = Jalview.getInstance().getCommands();
302 Assert.assertNotNull(cmds);
303 for (String filename : filenames)
305 Assert.assertTrue(new File(filename).exists(),
306 "File '" + filename + "' was not created");
308 cleanupFiles(filenames);
309 if (nonfilenames != null)
311 for (String nonfilename : nonfilenames)
313 File nonfile = new File(nonfilename);
314 Assert.assertFalse(nonfile.exists(),
315 "File " + nonfilename + " exists when it shouldn't!");
320 @DataProvider(name = "allLinkedIdsData")
321 public Object[][] allLinkedIdsData()
323 return new Object[][] {
327 { "--gui --open=test/jalview/bin/argparser/testfiles/*.fa --substitutions --all --output={dirname}/{basename}.stk --close",
329 { "test/jalview/bin/argparser/testfiles/test1.stk",
330 "test/jalview/bin/argparser/testfiles/test2.stk",
331 "test/jalview/bin/argparser/testfiles/test3.stk", },
333 { "--gui --open=test/jalview/bin/argparser/testfiles/*.fa --substitutions --all --image={dirname}/{basename}.png --close",
335 { "test/jalview/bin/argparser/testfiles/test1.png",
336 "test/jalview/bin/argparser/testfiles/test2.png",
337 "test/jalview/bin/argparser/testfiles/test3.png", },
339 { "--gui --open=test/jalview/bin/argparser/testfiles/*.fa --all --output={dirname}/{basename}.stk --close",
341 { "test/jalview/bin/argparser/testfiles/test1.stk",
342 "test/jalview/bin/argparser/testfiles/test2.stk",
343 "test/jalview/bin/argparser/testfiles/test3.stk", },
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 { "--gui --open=test/jalview/bin/argparser/**/*.fa --all --output={dirname}/{basename}.stk --close",
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", },
369 { "--gui --open=test/jalview/bin/argparser/**/*.fa --output=*.stk --close",
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", },
384 { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output=*.stk --close",
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", },
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 { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output=open*.stk --close",
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", },
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 { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --opened --output={dirname}/{basename}.stk --close",
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", },
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 { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --output open*.stk --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output=open*.aln --close",
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", },
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", }, },