2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
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.
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.
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.
23 import java.awt.image.BufferedImage;
25 import java.io.IOException;
26 import java.nio.file.Files;
27 import java.util.Date;
28 import java.util.HashSet;
31 import javax.imageio.ImageIO;
32 import javax.swing.SwingUtilities;
34 import org.testng.Assert;
35 import org.testng.annotations.AfterClass;
36 import org.testng.annotations.AfterMethod;
37 import org.testng.annotations.BeforeClass;
38 import org.testng.annotations.DataProvider;
39 import org.testng.annotations.Test;
41 import jalview.gui.AlignFrame;
42 import jalview.gui.Desktop;
43 import jalview.gui.JvOptionPane;
44 import jalview.util.ArrayUtils;
46 public class CommandsTest
48 private static final String testfiles = "test/jalview/bin/argparser/testfiles";
50 @BeforeClass(alwaysRun = true)
51 public static void setUpBeforeClass() throws Exception
53 Cache.loadProperties("test/jalview/gui/quitProps.jvprops");
54 Date oneHourFromNow = new Date(
55 System.currentTimeMillis() + 3600 * 1000);
56 Cache.setDateProperty("JALVIEW_NEWS_RSS_LASTMODIFIED", oneHourFromNow);
59 @AfterClass(alwaysRun = true)
60 public static void resetProps()
62 Cache.loadProperties("test/jalview/testProps.jvprops");
65 @BeforeClass(alwaysRun = true)
66 public void setUpJvOptionPane()
68 JvOptionPane.setInteractiveMode(false);
69 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
72 @AfterMethod(alwaysRun = true)
73 public void tearDown()
77 // occasionally we are blocked by Jmol redraws
78 SwingUtilities.invokeAndWait(new Runnable()
84 Desktop.closeDesktop();
87 } catch (Exception foo)
89 System.err.println("Failed during teardown with exception");
90 foo.printStackTrace();
95 public static void callJalviewMain(String[] args)
97 callJalviewMain(args, false);
100 public static void callJalviewMain(String[] args, boolean newJalview)
102 if (Jalview.getInstance() != null && !newJalview)
104 Jalview.getInstance().doMain(args);
112 /* --setprops is currently disabled so this test won't work
113 @Test(groups = "Functional")
114 public void setpropsTest()
116 final String MOSTLY_HARMLESS = "MOSTLY_HARMLESS";
117 String cmdLine = "--setprop=" + MOSTLY_HARMLESS + "=Earth";
118 String[] args = cmdLine.split("\\s+");
120 Assert.assertEquals(Cache.getDefault(MOSTLY_HARMLESS, "Magrathea"),
127 { "Functional", "testTask3" },
128 dataProvider = "cmdLines",
129 singleThreaded = true)
131 public void commandsOpenTest(String cmdLine, boolean cmdArgs,
132 int numFrames, String[] sequences)
136 String[] args = (cmdLine + " --gui").split("\\s+");
137 callJalviewMain(args);
138 Commands cmds = Jalview.getInstance().getCommands();
139 Assert.assertNotNull(cmds);
140 Assert.assertEquals(cmds.commandArgsProvided(), cmdArgs,
141 "Commands were not provided in the args");
142 Assert.assertEquals(cmds.argsWereParsed(), cmdArgs,
143 "Overall command parse and operation is false");
145 Assert.assertEquals(Desktop.getDesktopAlignFrames().length, numFrames,
146 "Wrong number of AlignFrames");
148 if (sequences != null)
150 Set<String> openedSequenceNames = new HashSet<>();
151 AlignFrame[] afs = Desktop.getDesktopAlignFrames();
152 for (AlignFrame af : afs)
154 openedSequenceNames.addAll(
155 af.getViewport().getAlignment().getSequenceNames());
157 for (String sequence : sequences)
159 Assert.assertTrue(openedSequenceNames.contains(sequence),
160 "Sequence '" + sequence
161 + "' was not found in opened alignment files: "
162 + cmdLine + ".\nOpened sequence names are:\n"
163 + String.join("\n", openedSequenceNames));
168 lookForSequenceName("THIS_SEQUENCE_ID_DOESN'T_EXIST"));
169 } catch (Exception x)
171 Assert.fail("Unexpected exception during commandsOpenTest", x);
181 { "Functional", "testTask3" },
182 dataProvider = "structureImageOutputFiles",
183 singleThreaded = true)
184 public void structureImageOutputTest(String cmdLine, String[] filenames)
187 cleanupFiles(filenames);
188 String[] args = (cmdLine).split("\\s+");
191 callJalviewMain(args, true);
192 Commands cmds = Jalview.getInstance().getCommands();
193 Assert.assertNotNull(cmds);
194 verifyIncreasingSize(cmdLine, filenames);
195 } catch (Exception x)
197 Assert.fail("Unexpected exception during structureImageOutputTest",
201 cleanupFiles(filenames);
207 * given two command lines, compare the output files produced - they should
208 * exist and be equal in size
212 { "Functional", "testTask3" },
213 dataProvider = "compareHeadlessAndGUIOps",
214 singleThreaded = true)
215 public void headlessOrGuiImageOutputTest(String[] cmdLines,
216 String[] filenames) throws IOException
218 cleanupFiles(filenames);
221 for (String cmdLine : cmdLines)
223 CommandLineOperations.Worker runner = CommandLineOperations
224 .getJalviewDesktopRunner(false, cmdLine, 1000);
225 long timeOut = 10000;
226 while (runner.isAlive() && timeOut > 0)
233 verifyOrderedFileSet(cmdLines[0] + " vs " + cmdLines[1], filenames,
236 verifySimilarEnoughImages(cmdLines[0] + " vs " + cmdLines[1],
238 } catch (Exception x)
240 Assert.fail("Unexpected exception during structureImageOutputTest",
244 cleanupFiles(filenames);
249 @DataProvider(name = "compareHeadlessAndGUIOps")
250 public Object[][] compareHeadlessAndGUIOps()
252 return new Object[][] {
254 { new String[] { "--open examples/uniref50.fa "
255 + "--structure [seqid=FER1_SPIOL,tempfac=plddt,showssannotations,structureviewer=jmol]"
256 + "examples/AlphaFold/AF-P00221-F1-model_v4.pdb "
257 + "--paematrix examples/AlphaFold/AF-P00221-F1-predicted_aligned_error_v4.json --image="
259 + "test-al-pae-ss-gui.png --overwrite --gui --props test/jalview/bin/commandsTest3.jvprops --quit",
260 "--open examples/uniref50.fa "
261 + "--structure [seqid=FER1_SPIOL,tempfac=plddt,showssannotations,structureviewer=jmol]"
262 + "examples/AlphaFold/AF-P00221-F1-model_v4.pdb "
263 + "--paematrix examples/AlphaFold/AF-P00221-F1-predicted_aligned_error_v4.json --image="
265 + "test-al-pae-ss-nogui.png --overwrite --nogui --props test/jalview/bin/commandsTest3.jvprops" },
267 { testfiles + "/test-al-pae-ss-gui.png",
268 testfiles + "/test-al-pae-ss-nogui.png", } } };
271 private static void verifyIncreasingSize(String cmdLine,
272 String[] filenames) throws Exception
274 verifyOrderedFileSet(cmdLine, filenames, true);
277 private static void verifyOrderedFileSet(String cmdLine,
278 String[] filenames, boolean increasingSize) throws Exception
280 File lastFile = null;
281 for (String filename : filenames)
283 File file = new File(filename);
284 Assert.assertTrue(file.exists(), "File '" + filename
285 + "' was not created by '" + cmdLine + "'");
286 Assert.assertTrue(file.isFile(), "File '" + filename
287 + "' is not a file from '" + cmdLine + "'");
288 Assert.assertTrue(Files.size(file.toPath()) > 0, "File '" + filename
289 + "' has no content from '" + cmdLine + "'");
290 // make sure the successive output files get bigger!
291 if (lastFile != null)
293 waitForLastWrite(file, 25);
298 Files.size(file.toPath()) > Files.size(lastFile.toPath()),
299 "Expected " + file.toPath() + " to be larger than "
300 + lastFile.toPath());
304 Assert.assertEquals(Files.size(file.toPath()),
305 Files.size(lastFile.toPath()),
306 "New file " + file.toPath()
307 + " (actual size) not same as last file's size "
308 + lastFile.toString());
311 // remember it for next file
317 private static void verifySimilarEnoughImages(String cmdLine,
318 String[] filenames, float w_tolerance_pc, float h_tolerance_pc)
325 for (String filename : filenames)
327 File file = new File(filename);
328 Assert.assertTrue(file.exists(), "File '" + filename
329 + "' was not created by '" + cmdLine + "'");
330 Assert.assertTrue(file.isFile(), "File '" + filename
331 + "' is not a file from '" + cmdLine + "'");
332 Assert.assertTrue(Files.size(file.toPath()) > 0, "File '" + filename
333 + "' has no content from '" + cmdLine + "'");
335 BufferedImage img = ImageIO.read(file);
336 if (img.getWidth() < min_w || min_w == -1)
338 min_w = img.getWidth();
340 if (img.getWidth() > max_w || max_w == -1)
342 max_w = img.getWidth();
344 if (img.getHeight() < min_h || min_h == -1)
346 min_h = img.getHeight();
348 if (img.getHeight() > max_h || max_h == -1)
350 max_h = img.getHeight();
353 Assert.assertTrue(min_w > 0,
354 "Minimum width is not positive (" + min_w + ")");
355 Assert.assertTrue(max_w > 0,
356 "Maximum width is not positive (" + max_w + ")");
357 Assert.assertTrue(min_h > 0,
358 "Minimum height is not positive (" + min_h + ")");
359 Assert.assertTrue(max_h > 0,
360 "Maximum height is not positive (" + max_h + ")");
362 Assert.assertTrue(100 * (max_w - min_w) / min_w <= w_tolerance_pc,
363 "Width variation (" + (max_w - min_w)
364 + " not within tolerance (" + w_tolerance_pc
365 + "%) of minimum width (" + min_w + ")");
368 System.out.println("Widths within tolerance (" + w_tolerance_pc
369 + "%), min_w=" + min_w + " < max_w=" + max_w);
371 Assert.assertTrue(100 * (max_h - min_h) / min_h <= h_tolerance_pc,
372 "Height variation (" + (max_h - min_h)
373 + " not within tolerance (" + h_tolerance_pc
374 + "%) of minimum height (" + min_h + ")");
377 System.out.println("Heights within tolerance (" + h_tolerance_pc
378 + "%), min_h=" + min_h + " < max_h=" + max_h);
382 private static long waitForLastWrite(File file, int i) throws IOException
384 long lastSize, stableSize = Files.size(file.toPath());
385 // wait around until we are sure the file has been completely written.
388 lastSize = stableSize;
392 } catch (Exception x)
395 stableSize = Files.size(file.toPath());
396 } while (stableSize != lastSize);
401 groups = "Functional",
402 dataProvider = "argfileOutputFiles",
403 singleThreaded = true)
405 public void argFilesGlobAndSubstitutionsTest(String cmdLine,
406 String[] filenames) throws IOException
408 cleanupFiles(filenames);
409 String[] args = (cmdLine + " --gui").split("\\s+");
412 callJalviewMain(args);
413 Commands cmds = Jalview.getInstance().getCommands();
414 Assert.assertNotNull(cmds);
415 File lastFile = null;
416 for (String filename : filenames)
418 File file = new File(filename);
419 Assert.assertTrue(file.exists(), "File '" + filename
420 + "' was not created by '" + cmdLine + "'");
421 Assert.assertTrue(file.isFile(), "File '" + filename
422 + "' is not a file from '" + cmdLine + "'");
423 Assert.assertTrue(Files.size(file.toPath()) > 0, "File '" + filename
424 + "' has no content from '" + cmdLine + "'");
425 // make sure the successive output files get bigger!
426 if (lastFile != null)
428 Assert.assertTrue(Files.size(file.toPath()) > Files
429 .size(lastFile.toPath()));
430 System.out.println("this file: " + file + " +"
431 + Files.size(file.toPath()) + " greater than "
432 + Files.size(lastFile.toPath()));
434 // remember it for next file
437 } catch (Exception x)
440 "Unexpected exception during argFilesGlobAndSubstitutions",
444 cleanupFiles(filenames);
449 @DataProvider(name = "structureImageOutputFiles")
450 public Object[][] structureImageOutputFiles()
452 return new Object[][] {
456 { "--gui --nonews --nosplash --open=./examples/test_fab41.result/sample.a2m "
457 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
458 + "--structureimage=" + testfiles
459 + "/structureimage0-1.png "
460 + "--open=./examples/test_fab41.result/sample.a2m "
461 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
462 + "--structureimage=" + testfiles
463 + "/structureimage0-2.png --scale=1.5 "
464 + "--open=./examples/test_fab41.result/sample.a2m "
465 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
466 + "--structureimage=" + testfiles
467 + "/structureimage0-3.png --scale=2.0 ",
469 { testfiles + "/structureimage0-1.png",
470 testfiles + "/structureimage0-2.png",
471 testfiles + "/structureimage0-3.png" } },
472 { "--headless --noquit --open=./examples/test_fab41.result/sample.a2m "
473 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
474 + "--structureimage=" + testfiles
475 + "/structureimage1-1.png "
476 + "--open=./examples/test_fab41.result/sample.a2m "
477 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
478 + "--structureimage=" + testfiles
479 + "/structureimage1-2.png --scale=1.5 "
480 + "--open=./examples/test_fab41.result/sample.a2m "
481 + "--structure=./examples/test_fab41.result/test_fab41_unrelaxed_rank_1_model_3.pdb "
482 + "--structureimage=" + testfiles
483 + "/structureimage1-3.png --scale=2.0 ",
485 { testfiles + "/structureimage1-1.png",
486 testfiles + "/structureimage1-2.png",
487 testfiles + "/structureimage1-3.png" } },
488 { "--gui --nonews --nosplash --open examples/1gaq.txt --append ./examples/3W5V.pdb "
489 + "--structure examples/1gaq.txt --seqid \"1GAQ|A\" "
490 + "--structureimage " + testfiles
491 + "/structureimage2-1gaq.png --structure examples/3W5V.pdb "
492 + "--seqid \"3W5V|A\" --structureimage " + testfiles
493 + "/structureimage2-3w5v.png --overwrite",
496 { testfiles + "/structureimage2-3w5v.png",
497 testfiles + "/structureimage2-1gaq.png", } },
498 { "--headless --noquit --open ./examples/1gaq.txt --append ./examples/3W5V.pdb "
499 + "--structure examples/1gaq.txt --seqid \"1GAQ|A\" "
500 + "--structureimage " + testfiles
501 + "/structureimage3-1gaq.png --structure examples/3W5V.pdb "
502 + "--seqid \"3W5V|A\" --structureimage " + testfiles
503 + "/structureimage3-3w5v.png --overwrite",
506 { testfiles + "/structureimage3-3w5v.png",
507 testfiles + "/structureimage3-1gaq.png", } }
515 @DataProvider(name = "argfileOutputFiles")
516 public Object[][] argfileOutputFiles()
518 return new Object[][] {
520 { "--gui --argfile=" + testfiles + "/**/*.txt", new String[]
521 { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png",
522 testfiles + "/dir3/subdir/test0.png" } },
523 { "--gui --argfile=" + testfiles + "/**/argfile.txt", new String[]
524 { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png" } },
525 { "--gui --argfile=" + testfiles + "/dir*/argfile.txt", new String[]
526 { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png" } },
527 { "--gui --initsubstitutions --append examples/uniref50.fa --image "
528 + testfiles + "/{basename}.png",
530 { testfiles + "/uniref50.png" } },
531 { "--gui --append examples/uniref50.fa --nosubstitutions --image "
532 + testfiles + "/{basename}.png",
534 { testfiles + "/{basename}.png" } }
540 @DataProvider(name = "cmdLines")
541 public Object[][] cmdLines()
543 String[] someUniref50Seqs = new String[] { "FER_CAPAA", "FER_CAPAN",
544 "FER1_MAIZE", "FER1_SPIOL", "O80429_MAIZE" };
545 String[] t1 = new String[] { "TEST1" };
546 String[] t2 = new String[] { "TEST2" };
547 String[] t3 = new String[] { "TEST3" };
548 return new Object[][] {
551 { "--append=examples/uniref50.fa", true, 1, someUniref50Seqs },
552 { "--append examples/uniref50.fa", true, 1, someUniref50Seqs },
553 { "--append=examples/uniref50*.fa", true, 1, someUniref50Seqs },
554 // NOTE we cannot use shell expansion in tests, so list all files!
555 { "--append examples/uniref50.fa examples/uniref50_mz.fa", true, 1,
557 { "--append=[new]examples/uniref50*.fa", true, 2,
559 { "--open=examples/uniref50*.fa", true, 2, someUniref50Seqs },
560 { "examples/uniref50.fa", true, 1, someUniref50Seqs },
561 { "examples/uniref50.fa " + testfiles + "/test1.fa", true, 2,
562 ArrayUtils.concatArrays(someUniref50Seqs, t1) },
563 { "examples/uniref50.fa " + testfiles + "/test1.fa", true, 2, t1 },
564 { "--gui --argfile=" + testfiles + "/argfile0.txt", true, 1,
565 ArrayUtils.concatArrays(t1, t3) },
566 { "--gui --argfile=" + testfiles + "/argfile*.txt", true, 5,
567 ArrayUtils.concatArrays(t1, t2, t3) },
568 { "--gui --argfile=" + testfiles + "/argfile.autocounter", true, 3,
569 ArrayUtils.concatArrays(t1, t2) } };
573 public static boolean lookForSequenceName(String sequenceName)
575 AlignFrame[] afs = Desktop.getDesktopAlignFrames();
576 for (AlignFrame af : afs)
578 for (String name : af.getViewport().getAlignment().getSequenceNames())
580 if (sequenceName.equals(name))
589 public static void cleanupFiles(String[] filenames)
591 for (String filename : filenames)
593 File file = new File(filename);
601 private final String deleteDir = "test/deleteAfter";
604 groups = "Functional",
605 dataProvider = "allLinkedIdsData",
606 singleThreaded = true)
607 public void allLinkedIdsTest(String cmdLine, String[] filenames,
608 String[] nonfilenames)
610 String[] args = (cmdLine + " --gui").split("\\s+");
611 callJalviewMain(args);
612 Commands cmds = Jalview.getInstance().getCommands();
613 Assert.assertNotNull(cmds);
614 for (String filename : filenames)
616 Assert.assertTrue(new File(filename).exists(),
617 "File '" + filename + "' was not created");
619 cleanupFiles(filenames);
620 if (nonfilenames != null)
622 for (String nonfilename : nonfilenames)
624 File nonfile = new File(nonfilename);
625 Assert.assertFalse(nonfile.exists(),
626 "File " + nonfilename + " exists when it shouldn't!");
630 File deleteDirF = new File(deleteDir);
631 if (deleteDirF.exists())
637 @DataProvider(name = "allLinkedIdsData")
638 public Object[][] allLinkedIdsData()
640 return new Object[][] {
642 { "--gui --open=test/jalview/bin/argparser/testfiles/*.fa --substitutions --all --output={dirname}/{basename}.stk --close",
644 { "test/jalview/bin/argparser/testfiles/test1.stk",
645 "test/jalview/bin/argparser/testfiles/test2.stk",
646 "test/jalview/bin/argparser/testfiles/test3.stk", },
648 { "--gui --open=test/jalview/bin/argparser/testfiles/*.fa --substitutions --all --image={dirname}/{basename}.png --close",
650 { "test/jalview/bin/argparser/testfiles/test1.png",
651 "test/jalview/bin/argparser/testfiles/test2.png",
652 "test/jalview/bin/argparser/testfiles/test3.png", },
654 { "--gui --open=test/jalview/bin/argparser/testfiles/*.fa --all --output={dirname}/{basename}.stk --close",
656 { "test/jalview/bin/argparser/testfiles/test1.stk",
657 "test/jalview/bin/argparser/testfiles/test2.stk",
658 "test/jalview/bin/argparser/testfiles/test3.stk", },
660 { "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
661 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
662 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
663 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
664 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
665 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
666 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
667 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
668 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
669 { "--gui --open=test/jalview/bin/argparser/**/*.fa --all --output={dirname}/{basename}.stk --close",
671 { "test/jalview/bin/argparser/testfiles/test1.stk",
672 "test/jalview/bin/argparser/testfiles/test2.stk",
673 "test/jalview/bin/argparser/testfiles/test3.stk",
674 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
675 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
676 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
677 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
678 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
679 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
680 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
681 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
682 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", },
684 { "--gui --open=test/jalview/bin/argparser/**/*.fa --output=*/*.stk --close",
686 { "test/jalview/bin/argparser/testfiles/test1.stk",
687 "test/jalview/bin/argparser/testfiles/test2.stk",
688 "test/jalview/bin/argparser/testfiles/test3.stk",
689 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
690 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
691 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
692 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
693 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
694 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
695 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
696 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
697 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", },
699 { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --all --output=*/*.stk --close",
701 { "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
702 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
703 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
704 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
705 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
707 { "test/jalview/bin/argparser/testfiles/test1.stk",
708 "test/jalview/bin/argparser/testfiles/test2.stk",
709 "test/jalview/bin/argparser/testfiles/test3.stk",
710 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
711 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
712 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
713 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
714 { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output=*/*.stk --close",
716 { "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
717 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
718 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
720 { "test/jalview/bin/argparser/testfiles/test1.stk",
721 "test/jalview/bin/argparser/testfiles/test2.stk",
722 "test/jalview/bin/argparser/testfiles/test3.stk",
723 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
724 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
725 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
726 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
727 { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output={dirname}/{basename}.stk --close",
729 { "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
730 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
731 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
733 { "test/jalview/bin/argparser/testfiles/test1.stk",
734 "test/jalview/bin/argparser/testfiles/test2.stk",
735 "test/jalview/bin/argparser/testfiles/test3.stk",
736 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
737 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
738 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
739 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
740 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
741 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
742 { "--gui --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output={dirname}/{basename}.stk --close",
744 { "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
745 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
746 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
748 { "test/jalview/bin/argparser/testfiles/test1.stk",
749 "test/jalview/bin/argparser/testfiles/test2.stk",
750 "test/jalview/bin/argparser/testfiles/test3.stk",
751 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
752 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
753 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
754 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
755 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
756 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
757 { "--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",
759 { "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
760 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
761 "test/jalview/bin/argparser/testfiles/dir2/test1.aln",
762 "test/jalview/bin/argparser/testfiles/dir2/test2.aln",
763 "test/jalview/bin/argparser/testfiles/dir2/test3.aln", },
765 { "test/jalview/bin/argparser/testfiles/test1.stk",
766 "test/jalview/bin/argparser/testfiles/test2.stk",
767 "test/jalview/bin/argparser/testfiles/test3.stk",
768 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
769 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
770 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
771 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
772 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
773 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
774 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk",
775 "test/jalview/bin/argparser/testfiles/test1.aln",
776 "test/jalview/bin/argparser/testfiles/test2.aln",
777 "test/jalview/bin/argparser/testfiles/test3.aln",
778 "test/jalview/bin/argparser/testfiles/dir1/test1.aln",
779 "test/jalview/bin/argparser/testfiles/dir1/test2.aln",
780 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.aln",
781 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.aln",
782 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.aln",
783 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.aln", }, },
785 { "--headless --open=test/jalview/bin/argparser/testfiles/dir1/*.fa --output "
787 + "/{dirname}/{basename}.stk --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output="
789 + "/{dirname}/{basename}.aln --close --all --mkdirs",
792 + "/test/jalview/bin/argparser/testfiles/dir1/test1.stk",
794 + "/test/jalview/bin/argparser/testfiles/dir1/test2.stk",
796 + "/test/jalview/bin/argparser/testfiles/dir2/test1.aln",
798 + "/test/jalview/bin/argparser/testfiles/dir2/test2.aln",
800 + "/test/jalview/bin/argparser/testfiles/dir2/test3.aln", },
802 { "test/jalview/bin/argparser/testfiles/test1.stk",
803 "test/jalview/bin/argparser/testfiles/test2.stk",
804 "test/jalview/bin/argparser/testfiles/test3.stk",
805 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
806 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
807 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
808 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
809 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
810 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
811 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk",
812 "test/jalview/bin/argparser/testfiles/test1.aln",
813 "test/jalview/bin/argparser/testfiles/test2.aln",
814 "test/jalview/bin/argparser/testfiles/test3.aln",
815 "test/jalview/bin/argparser/testfiles/dir1/test1.aln",
816 "test/jalview/bin/argparser/testfiles/dir1/test2.aln",
817 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.aln",
818 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.aln",
819 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.aln",
820 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.aln",
822 + "test/jalview/bin/argparser/testfiles/test1.stk",
824 + "test/jalview/bin/argparser/testfiles/test2.stk",
826 + "test/jalview/bin/argparser/testfiles/test3.stk",
828 + "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
830 + "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
832 + "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
834 + "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
836 + "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
838 + "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
840 + "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk",
842 + "test/jalview/bin/argparser/testfiles/test1.aln",
844 + "test/jalview/bin/argparser/testfiles/test2.aln",
846 + "test/jalview/bin/argparser/testfiles/test3.aln",
848 + "test/jalview/bin/argparser/testfiles/dir1/test1.aln",
850 + "test/jalview/bin/argparser/testfiles/dir1/test2.aln",
852 + "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.aln",
854 + "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.aln",
856 + "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.aln",
858 + "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.aln", }, },
865 { "Functional", "testTask3" },
866 dataProvider = "structureImageAnnotationsOutputFiles",
867 singleThreaded = true)
868 public void structureImageAnnotationsOutputTest(String cmdLine,
869 String filename, int height) throws IOException
871 cleanupFiles(new String[] { filename });
872 String[] args = (cmdLine).split("\\s+");
873 callJalviewMain(args, true); // Create new instance of Jalview each time for
875 BufferedImage img = ImageIO.read(new File(filename));
876 Assert.assertEquals(height, img.getHeight(), "Output image '" + filename
877 + "' is not in the expected height range, possibly because of the wrong number of annotations");
879 cleanupFiles(new String[] { filename });
883 @DataProvider(name = "structureImageAnnotationsOutputFiles")
884 public Object[][] structureImageAnnotationsOutputFiles()
886 String filename = "test/jalview/bin/argparser/testfiles/test_annotations.png";
887 return new Object[][] {
888 // MUST use --noquit with --headless to avoid a System.exit()
889 { "--noquit --headless --nonews --nosplash --open=./examples/uniref50.fa "
890 + "--structure=examples/AlphaFold/AF-P00221-F1-model_v4.pdb "
891 + "--seqid=FER1_SPIOL --structureviewer=jmol "
892 + "--paematrix examples/AlphaFold/AF-P00221-F1-predicted_aligned_error_v4.json "
893 + "--image=" + filename + " " + "--tempfac=plddt "
895 + "--noshowssannotations " + "--noshowannotations", //
898 { "--noquit --headless --nonews --nosplash --open=./examples/uniref50.fa "
899 + "--structure=examples/AlphaFold/AF-P00221-F1-model_v4.pdb "
900 + "--seqid=FER1_SPIOL --structureviewer=jmol "
901 + "--paematrix examples/AlphaFold/AF-P00221-F1-predicted_aligned_error_v4.json "
902 + "--image=" + filename + " " + "--tempfac=plddt "
904 + "--showssannotations " + "--noshowannotations", //
907 { "--noquit --headless --nonews --nosplash --open=./examples/uniref50.fa "
908 + "--structure=examples/AlphaFold/AF-P00221-F1-model_v4.pdb "
909 + "--seqid=FER1_SPIOL --structureviewer=jmol "
910 + "--paematrix examples/AlphaFold/AF-P00221-F1-predicted_aligned_error_v4.json "
911 + "--image=" + filename + " " + "--tempfac=plddt "
913 + "--noshowssannotations " + "--showannotations", //
916 { "--noquit --headless --nonews --nosplash --open=./examples/uniref50.fa "
917 + "--structure=examples/AlphaFold/AF-P00221-F1-model_v4.pdb "
918 + "--seqid=FER1_SPIOL --structureviewer=jmol "
919 + "--paematrix examples/AlphaFold/AF-P00221-F1-predicted_aligned_error_v4.json "
920 + "--image=" + filename + " " + "--tempfac=plddt "
922 + "--showssannotations " + "--showannotations", //
925 { "--gui --nonews --nosplash --open=./examples/uniref50.fa "
926 + "--structure=examples/AlphaFold/AF-P00221-F1-model_v4.pdb "
927 + "--seqid=FER1_SPIOL --structureviewer=jmol "
928 + "--paematrix examples/AlphaFold/AF-P00221-F1-predicted_aligned_error_v4.json "
929 + "--image=" + filename + " " + "--tempfac=plddt "
931 + "--noshowssannotations " + "--noshowannotations", //
934 { "--gui --nonews --nosplash --open=./examples/uniref50.fa "
935 + "--structure=examples/AlphaFold/AF-P00221-F1-model_v4.pdb "
936 + "--seqid=FER1_SPIOL --structureviewer=jmol "
937 + "--paematrix examples/AlphaFold/AF-P00221-F1-predicted_aligned_error_v4.json "
938 + "--image=" + filename + " " + "--tempfac=plddt "
940 + "--showssannotations " + "--noshowannotations", //
943 { "--gui --nonews --nosplash --open=./examples/uniref50.fa "
944 + "--structure=examples/AlphaFold/AF-P00221-F1-model_v4.pdb "
945 + "--seqid=FER1_SPIOL --structureviewer=jmol "
946 + "--paematrix examples/AlphaFold/AF-P00221-F1-predicted_aligned_error_v4.json "
947 + "--image=" + filename + " " + "--tempfac=plddt "
949 + "--noshowssannotations " + "--showannotations", //
952 { "--gui --nonews --nosplash --open=./examples/uniref50.fa "
953 + "--structure=examples/AlphaFold/AF-P00221-F1-model_v4.pdb "
954 + "--seqid=FER1_SPIOL --structureviewer=jmol "
955 + "--paematrix examples/AlphaFold/AF-P00221-F1-predicted_aligned_error_v4.json "
956 + "--image=" + filename + " " + "--tempfac=plddt "
958 + "--showssannotations " + "--showannotations", //