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 Desktop.closeDesktop();
55 public static void callJalviewMain(String[] args) {
56 if (Jalview.getInstance()!=null) {
57 Jalview.getInstance().doMain(args);
63 /* --setprops is currently disabled so this test won't work
64 @Test(groups = "Functional")
65 public void setpropsTest()
67 final String MOSTLY_HARMLESS = "MOSTLY_HARMLESS";
68 String cmdLine = "--setprop=" + MOSTLY_HARMLESS + "=Earth";
69 String[] args = cmdLine.split("\\s+");
71 Assert.assertEquals(Cache.getDefault(MOSTLY_HARMLESS, "Magrathea"),
76 @Test(groups = "Functional", dataProvider = "cmdLines")
77 public void commandsOpenTest(String cmdLine, boolean cmdArgs,
78 int numFrames, String[] sequences)
80 String[] args = (cmdLine + " --gui").split("\\s+");
81 callJalviewMain(args);
82 Commands cmds = Jalview.getInstance().getCommands();
83 Assert.assertNotNull(cmds);
84 Assert.assertEquals(cmds.commandArgsProvided(), cmdArgs,
85 "Commands were not provided in the args");
86 Assert.assertEquals(cmds.argsWereParsed(), cmdArgs,
87 "Overall command parse and operation is false");
89 Assert.assertEquals(Desktop.getAlignFrames().length, numFrames,
90 "Wrong number of AlignFrames");
92 if (sequences != null)
94 Set<String> openedSequenceNames = new HashSet<>();
95 AlignFrame[] afs = Desktop.getAlignFrames();
96 for (AlignFrame af : afs)
99 .addAll(af.getViewport().getAlignment().getSequenceNames());
101 for (String sequence : sequences)
103 Assert.assertTrue(openedSequenceNames.contains(sequence),
104 "Sequence '" + sequence
105 + "' was not found in opened alignment files: "
106 + cmdLine + ".\nOpened sequence names are:\n"
107 + String.join("\n", openedSequenceNames));
112 lookForSequenceName("THIS_SEQUENCE_ID_DOESN'T_EXIST"));
115 @Test(groups = "Functional", dataProvider = "structureImageOutputFiles")
116 public void structureImageOutputTest(String cmdLine, String[] filenames)
119 cleanupFiles(filenames);
120 String[] args = (cmdLine + " --gui").split("\\s+");
121 callJalviewMain(args);
122 Commands cmds = Jalview.getInstance().getCommands();
123 Assert.assertNotNull(cmds);
124 File lastFile = null;
125 for (String filename : filenames)
127 File file = new File(filename);
128 Assert.assertTrue(file.exists(), "File '" + filename
129 + "' was not created by '" + cmdLine + "'");
130 Assert.assertTrue(file.isFile(), "File '" + filename
131 + "' is not a file from '" + cmdLine + "'");
132 Assert.assertTrue(Files.size(file.toPath()) > 0, "File '" + filename
133 + "' has no content from '" + cmdLine + "'");
134 // make sure the successive output files get bigger!
135 if (lastFile != null)
137 Files.size(file.toPath()) > Files.size(lastFile.toPath()));
139 cleanupFiles(filenames);
143 @Test(groups = "Functional", dataProvider = "argfileOutputFiles")
144 public void argFilesGlobAndSubstitutionsTest(String cmdLine,
145 String[] filenames) throws IOException
147 cleanupFiles(filenames);
148 String[] args = (cmdLine + " --gui").split("\\s+");
149 callJalviewMain(args);
150 Commands cmds = Jalview.getInstance().getCommands();
151 Assert.assertNotNull(cmds);
152 File lastFile = null;
153 for (String filename : filenames)
155 File file = new File(filename);
156 Assert.assertTrue(file.exists(), "File '" + filename
157 + "' was not created by '" + cmdLine + "'");
158 Assert.assertTrue(file.isFile(), "File '" + filename
159 + "' is not a file from '" + cmdLine + "'");
160 Assert.assertTrue(Files.size(file.toPath()) > 0, "File '" + filename
161 + "' has no content from '" + cmdLine + "'");
162 // make sure the successive output files get bigger!
163 if (lastFile != null)
165 Files.size(file.toPath()) > Files.size(lastFile.toPath()));
167 cleanupFiles(filenames);
171 @DataProvider(name = "structureImageOutputFiles")
172 public Object[][] structureImageOutputFiles()
174 return new Object[][] {
176 { "--gui --nonews --nosplash --open=./examples/test_fab41.result/sample.a2m "
177 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
178 + "--structureimage=" + testfiles + "/structureimage1.png "
179 + "--open=./examples/test_fab41.result/sample.a2m "
180 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
181 + "--structureimage=" + testfiles
182 + "/structureimage2.png --structureimagescale=1.5"
183 + "--open=./examples/test_fab41.result/sample.a2m "
184 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
185 + "--structureimage=" + testfiles
186 + "/structureimage3.png --structureimagescale=2.0",
188 { testfiles + "/structureimage1.png",
189 testfiles + "/structureimage2.png",
190 testfiles + "/structureimage3.png" } },
192 { "--headless --noquit --open=./examples/test_fab41.result/sample.a2m "
193 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
194 + "--structureimage=" + testfiles + "/structureimage1.png "
195 + "--open=./examples/test_fab41.result/sample.a2m "
196 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
197 + "--structureimage=" + testfiles
198 + "/structureimage2.png --structureimagescale=1.5"
199 + "--open=./examples/test_fab41.result/sample.a2m "
200 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
201 + "--structureimage=" + testfiles
202 + "/structureimage3.png --structureimagescale=2.0",
204 { testfiles + "/structureimage1.png",
205 testfiles + "/structureimage2.png",
206 testfiles + "/structureimage3.png" } },
213 @DataProvider(name = "argfileOutputFiles")
214 public Object[][] argfileOutputFiles()
216 return new Object[][] {
218 { "--gui --argfile=" + testfiles + "/**/*.txt", new String[]
219 { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png",
220 testfiles + "/dir3/subdir/test0.png" } },
221 { "--gui --argfile=" + testfiles + "/**/argfile.txt", new String[]
222 { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png" } },
223 { "--gui --argfile=" + testfiles + "/dir*/argfile.txt", new String[]
224 { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png" } },
225 { "--gui --initsubstitutions --append examples/uniref50.fa --image "
226 + testfiles + "/{basename}.png",
228 { testfiles + "/uniref50.png" } },
229 { "--gui --append examples/uniref50.fa --nosubstitutions --image "
230 + testfiles + "/{basename}.png",
232 { testfiles + "/{basename}.png" } }
238 @DataProvider(name = "cmdLines")
239 public Object[][] cmdLines()
241 String[] someUniref50Seqs = new String[] { "FER_CAPAA", "FER_CAPAN",
242 "FER1_MAIZE", "FER1_SPIOL", "O80429_MAIZE" };
243 String[] t1 = new String[] { "TEST1" };
244 String[] t2 = new String[] { "TEST2" };
245 String[] t3 = new String[] { "TEST3" };
246 return new Object[][] {
249 { "--append=examples/uniref50.fa", true, 1, someUniref50Seqs },
250 { "--append examples/uniref50.fa", true, 1, someUniref50Seqs },
251 { "--append=examples/uniref50*.fa", true, 1, someUniref50Seqs },
252 // NOTE we cannot use shell expansion in tests, so list all files!
253 { "--append examples/uniref50.fa examples/uniref50_mz.fa", true, 1,
255 { "--append=[new]examples/uniref50*.fa", true, 2,
257 { "--open=examples/uniref50*.fa", true, 2, someUniref50Seqs },
258 { "examples/uniref50.fa", true, 1, someUniref50Seqs },
259 { "examples/uniref50.fa " + testfiles + "/test1.fa", true, 2,
260 ArrayUtils.concatArrays(someUniref50Seqs, t1) },
261 { "examples/uniref50.fa " + testfiles + "/test1.fa", true, 2, t1 },
262 { "--gui --argfile=" + testfiles + "/argfile0.txt", true, 1,
263 ArrayUtils.concatArrays(t1, t3) },
264 { "--gui --argfile=" + testfiles + "/argfile*.txt", true, 5,
265 ArrayUtils.concatArrays(t1, t2, t3) },
266 { "--gui --argfile=" + testfiles + "/argfile.autocounter", true, 3,
267 ArrayUtils.concatArrays(t1, t2) } };
271 public static boolean lookForSequenceName(String sequenceName)
273 AlignFrame[] afs = Desktop.getAlignFrames();
274 for (AlignFrame af : afs)
276 for (String name : af.getViewport().getAlignment().getSequenceNames())
278 if (sequenceName.equals(name))
287 public static void cleanupFiles(String[] filenames)
289 for (String filename : filenames)
291 File file = new File(filename);
300 groups = "Functional",
301 dataProvider = "allLinkedIdsData",
302 singleThreaded = true)
303 public void allLinkedIdsTest(String cmdLine, String[] filenames,
304 String[] nonfilenames)
306 String[] args = (cmdLine + " --gui").split("\\s+");
307 callJalviewMain(args);
308 Commands cmds = Jalview.getInstance().getCommands();
309 Assert.assertNotNull(cmds);
310 for (String filename : filenames)
312 Assert.assertTrue(new File(filename).exists(),
313 "File '" + filename + "' was not created");
315 cleanupFiles(filenames);
316 if (nonfilenames != null)
318 for (String nonfilename : nonfilenames)
320 File nonfile = new File(nonfilename);
321 Assert.assertFalse(nonfile.exists(),
322 "File " + nonfilename + " exists when it shouldn't!");
327 @DataProvider(name = "allLinkedIdsData")
328 public Object[][] allLinkedIdsData()
330 return new Object[][] {
334 { "--gui --open=test/jalview/bin/argparser/testfiles/*.fa --substitutions --all --output={dirname}/{basename}.stk --close",
336 { "test/jalview/bin/argparser/testfiles/test1.stk",
337 "test/jalview/bin/argparser/testfiles/test2.stk",
338 "test/jalview/bin/argparser/testfiles/test3.stk", },
340 { "--gui --open=test/jalview/bin/argparser/testfiles/*.fa --substitutions --all --image={dirname}/{basename}.png --close",
342 { "test/jalview/bin/argparser/testfiles/test1.png",
343 "test/jalview/bin/argparser/testfiles/test2.png",
344 "test/jalview/bin/argparser/testfiles/test3.png", },
346 { "--gui --open=test/jalview/bin/argparser/testfiles/*.fa --all --output={dirname}/{basename}.stk --close",
348 { "test/jalview/bin/argparser/testfiles/test1.stk",
349 "test/jalview/bin/argparser/testfiles/test2.stk",
350 "test/jalview/bin/argparser/testfiles/test3.stk", },
352 { "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
353 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
354 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
355 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
356 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
357 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
358 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
359 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
360 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
361 { "--gui --open=test/jalview/bin/argparser/**/*.fa --all --output={dirname}/{basename}.stk --close",
363 { "test/jalview/bin/argparser/testfiles/test1.stk",
364 "test/jalview/bin/argparser/testfiles/test2.stk",
365 "test/jalview/bin/argparser/testfiles/test3.stk",
366 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
367 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
368 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
369 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
370 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
371 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
372 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
373 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
374 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", },
376 { "--gui --open=test/jalview/bin/argparser/**/*.fa --output=*.stk --close",
378 { "test/jalview/bin/argparser/testfiles/test1.stk",
379 "test/jalview/bin/argparser/testfiles/test2.stk",
380 "test/jalview/bin/argparser/testfiles/test3.stk",
381 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
382 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
383 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
384 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
385 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
386 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
387 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
388 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
389 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", },
391 { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output=*.stk --close",
393 { "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
394 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
395 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
396 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
397 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
399 { "test/jalview/bin/argparser/testfiles/test1.stk",
400 "test/jalview/bin/argparser/testfiles/test2.stk",
401 "test/jalview/bin/argparser/testfiles/test3.stk",
402 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
403 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
404 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
405 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
406 { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output=open*.stk --close",
408 { "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
409 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
410 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
412 { "test/jalview/bin/argparser/testfiles/test1.stk",
413 "test/jalview/bin/argparser/testfiles/test2.stk",
414 "test/jalview/bin/argparser/testfiles/test3.stk",
415 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
416 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
417 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
418 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
419 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
420 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
421 { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --opened --output={dirname}/{basename}.stk --close",
423 { "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
424 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
425 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
427 { "test/jalview/bin/argparser/testfiles/test1.stk",
428 "test/jalview/bin/argparser/testfiles/test2.stk",
429 "test/jalview/bin/argparser/testfiles/test3.stk",
430 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
431 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
432 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
433 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
434 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
435 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
436 { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --output open*.stk --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output=open*.aln --close",
438 { "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
439 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
440 "test/jalview/bin/argparser/testfiles/dir2/test1.aln",
441 "test/jalview/bin/argparser/testfiles/dir2/test2.aln",
442 "test/jalview/bin/argparser/testfiles/dir2/test3.aln", },
444 { "test/jalview/bin/argparser/testfiles/test1.stk",
445 "test/jalview/bin/argparser/testfiles/test2.stk",
446 "test/jalview/bin/argparser/testfiles/test3.stk",
447 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
448 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
449 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
450 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
451 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
452 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
453 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk",
454 "test/jalview/bin/argparser/testfiles/test1.aln",
455 "test/jalview/bin/argparser/testfiles/test2.aln",
456 "test/jalview/bin/argparser/testfiles/test3.aln",
457 "test/jalview/bin/argparser/testfiles/dir1/test1.aln",
458 "test/jalview/bin/argparser/testfiles/dir1/test2.aln",
459 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.aln",
460 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.aln",
461 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.aln",
462 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.aln", }, },