20ccd110cd1e0155cb8f085a5a84c3203121f007
[jalview.git] / test / jalview / bin / CommandsTest.java
1 package jalview.bin;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.nio.file.Files;
6 import java.util.Date;
7 import java.util.HashSet;
8 import java.util.Set;
9
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;
16
17 import jalview.gui.AlignFrame;
18 import jalview.gui.Desktop;
19 import jalview.gui.JvOptionPane;
20 import jalview.util.ArrayUtils;
21
22 @Test
23 public class CommandsTest
24 {
25   private static final String testfiles = "test/jalview/bin/argparser/testfiles";
26
27   @BeforeClass(alwaysRun = true)
28   public static void setUpBeforeClass() throws Exception
29   {
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);
34   }
35
36   @AfterClass(alwaysRun = true)
37   public static void resetProps()
38   {
39     Cache.loadProperties("test/jalview/testProps.jvprops");
40   }
41
42   @BeforeClass(alwaysRun = true)
43   public void setUpJvOptionPane()
44   {
45     JvOptionPane.setInteractiveMode(false);
46     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
47   }
48
49   @AfterMethod(alwaysRun = true)
50   public void tearDown()
51   {
52     if (Desktop.instance != null)
53       Desktop.instance.closeAll_actionPerformed(null);
54   }
55
56   /* --setprops is currently disabled so this test won't work
57   @Test(groups = "Functional")
58   public void setpropsTest()
59   {
60     final String MOSTLY_HARMLESS = "MOSTLY_HARMLESS";
61     String cmdLine = "--setprop=" + MOSTLY_HARMLESS + "=Earth";
62     String[] args = cmdLine.split("\\s+");
63     Jalview.main(args);
64     Assert.assertEquals(Cache.getDefault(MOSTLY_HARMLESS, "Magrathea"),
65             "Earth");
66   }
67   */
68
69   @Test(groups = "Functional", dataProvider = "cmdLines")
70   public void commandsOpenTest(String cmdLine, boolean cmdArgs,
71           int numFrames, String[] sequences)
72   {
73     String[] args = cmdLine.split("\\s+");
74     Jalview.main(args);
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");
81
82     Assert.assertEquals(Desktop.getAlignFrames().length, numFrames,
83             "Wrong number of AlignFrames");
84
85     if (sequences != null)
86     {
87       Set<String> openedSequenceNames = new HashSet<>();
88       AlignFrame[] afs = Desktop.getAlignFrames();
89       for (AlignFrame af : afs)
90       {
91         openedSequenceNames
92                 .addAll(af.getViewport().getAlignment().getSequenceNames());
93       }
94       for (String sequence : sequences)
95       {
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));
101       }
102     }
103
104     Assert.assertFalse(
105             lookForSequenceName("THIS_SEQUENCE_ID_DOESN'T_EXIST"));
106   }
107
108   @Test(groups = "Functional", dataProvider = "argfileOutputFiles")
109   public void argFilesGlobAndSubstitutionsTest(String cmdLine,
110           String[] filenames) throws IOException
111   {
112     cleanupFiles(filenames);
113     String[] args = cmdLine.split("\\s+");
114     Jalview.main(args);
115     Commands cmds = Jalview.getInstance().getCommands();
116     Assert.assertNotNull(cmds);
117     File lastFile = null;
118     for (String filename : filenames)
119     {
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)
129         Assert.assertTrue(
130                 Files.size(file.toPath()) > Files.size(lastFile.toPath()));
131     }
132     cleanupFiles(filenames);
133     tearDown();
134   }
135
136   @DataProvider(name = "argfileOutputFiles")
137   public Object[][] argfileOutputFiles()
138   {
139     return new Object[][] {
140         //
141         { "--argfile=" + testfiles + "/**/*.txt", new String[]
142         { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png",
143             testfiles + "/dir3/subdir/test0.png" } },
144         { "--argfile=" + testfiles + "/**/argfile.txt", new String[]
145         { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png" } },
146         { "--argfile=" + testfiles + "/dir*/argfile.txt", new String[]
147         { testfiles + "/dir1/test1.png", testfiles + "/dir2/test1.png" } },
148         { "--initsubstitutions --append examples/uniref50.fa --image "
149                 + testfiles + "/{basename}.png",
150             new String[]
151             { testfiles + "/uniref50.png" } },
152         { "--append examples/uniref50.fa --nosubstitutions --image "
153                 + testfiles + "/{basename}.png",
154             new String[]
155             { testfiles + "/{basename}.png" } }
156         //
157     };
158
159   }
160
161   @DataProvider(name = "cmdLines")
162   public Object[][] cmdLines()
163   {
164     String[] someUniref50Seqs = new String[] { "FER_CAPAA", "FER_CAPAN",
165         "FER1_MAIZE", "FER1_SPIOL", "O80429_MAIZE" };
166     String[] t1 = new String[] { "TEST1" };
167     String[] t2 = new String[] { "TEST2" };
168     String[] t3 = new String[] { "TEST3" };
169     return new Object[][] {
170         /*
171         */
172         { "--append=examples/uniref50.fa", true, 1, someUniref50Seqs },
173         { "--append examples/uniref50.fa", true, 1, someUniref50Seqs },
174         { "--append=examples/uniref50*.fa", true, 1, someUniref50Seqs },
175         // NOTE we cannot use shell expansion in tests, so list all files!
176         { "--append examples/uniref50.fa examples/uniref50_mz.fa", true, 1,
177             someUniref50Seqs },
178         { "--append=[new]examples/uniref50*.fa", true, 2,
179             someUniref50Seqs },
180         { "--open=examples/uniref50*.fa", true, 2, someUniref50Seqs },
181         { "examples/uniref50.fa", true, 1, someUniref50Seqs },
182         { "examples/uniref50.fa " + testfiles + "/test1.fa", true, 2,
183             ArrayUtils.concatArrays(someUniref50Seqs, t1) },
184         { "examples/uniref50.fa " + testfiles + "/test1.fa", true, 2, t1 },
185         { "--argfile=" + testfiles + "/argfile0.txt", true, 1,
186             ArrayUtils.concatArrays(t1, t3) },
187         { "--argfile=" + testfiles + "/argfile*.txt", true, 5,
188             ArrayUtils.concatArrays(t1, t2, t3) },
189         { "--argfile=" + testfiles + "/argfile.autocounter", true, 3,
190             ArrayUtils.concatArrays(t1, t2) } };
191
192   }
193
194   public static boolean lookForSequenceName(String sequenceName)
195   {
196     AlignFrame[] afs = Desktop.getAlignFrames();
197     for (AlignFrame af : afs)
198     {
199       for (String name : af.getViewport().getAlignment().getSequenceNames())
200       {
201         if (sequenceName.equals(name))
202         {
203           return true;
204         }
205       }
206     }
207     return false;
208   }
209
210   public static void cleanupFiles(String[] filenames)
211   {
212     for (String filename : filenames)
213     {
214       File file = new File(filename);
215       if (file.exists())
216       {
217         file.delete();
218       }
219     }
220   }
221
222   @Test(
223     groups = "Functional",
224     dataProvider = "allLinkedIdsData",
225     singleThreaded = true)
226   public void allLinkedIdsTest(String cmdLine, String[] filenames,
227           String[] nonfilenames)
228   {
229     String[] args = cmdLine.split("\\s+");
230     Jalview.main(args);
231     Commands cmds = Jalview.getInstance().getCommands();
232     Assert.assertNotNull(cmds);
233     for (String filename : filenames)
234     {
235       Assert.assertTrue(new File(filename).exists(),
236               "File '" + filename + "' was not created");
237     }
238     cleanupFiles(filenames);
239     if (nonfilenames != null)
240     {
241       for (String nonfilename : nonfilenames)
242       {
243         File nonfile = new File(nonfilename);
244         Assert.assertFalse(nonfile.exists(),
245                 "File " + nonfilename + " exists when it shouldn't!");
246       }
247     }
248   }
249
250   @DataProvider(name = "allLinkedIdsData")
251   public Object[][] allLinkedIdsData()
252   {
253     return new Object[][] {
254         //
255         /*
256          */
257         { "--open=test/jalview/bin/argparser/testfiles/*.fa --substitutions --all --output={dirname}/{basename}.stk --close",
258             new String[]
259             { "test/jalview/bin/argparser/testfiles/test1.stk",
260                 "test/jalview/bin/argparser/testfiles/test2.stk",
261                 "test/jalview/bin/argparser/testfiles/test3.stk", },
262             null },
263         { "--open=test/jalview/bin/argparser/testfiles/*.fa --substitutions --all --image={dirname}/{basename}.png --close",
264             new String[]
265             { "test/jalview/bin/argparser/testfiles/test1.png",
266                 "test/jalview/bin/argparser/testfiles/test2.png",
267                 "test/jalview/bin/argparser/testfiles/test3.png", },
268             null },
269         { "--open=test/jalview/bin/argparser/testfiles/*.fa --all --output={dirname}/{basename}.stk --close",
270             new String[]
271             { "test/jalview/bin/argparser/testfiles/test1.stk",
272                 "test/jalview/bin/argparser/testfiles/test2.stk",
273                 "test/jalview/bin/argparser/testfiles/test3.stk", },
274             new String[]
275             { "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
276                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
277                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
278                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
279                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
280                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
281                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
282                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
283                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
284         { "--open=test/jalview/bin/argparser/**/*.fa --all --output={dirname}/{basename}.stk --close",
285             new String[]
286             { "test/jalview/bin/argparser/testfiles/test1.stk",
287                 "test/jalview/bin/argparser/testfiles/test2.stk",
288                 "test/jalview/bin/argparser/testfiles/test3.stk",
289                 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
290                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
291                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
292                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
293                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
294                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
295                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
296                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
297                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", },
298             null },
299         { "--open=test/jalview/bin/argparser/**/*.fa --output=*.stk --close",
300             new String[]
301             { "test/jalview/bin/argparser/testfiles/test1.stk",
302                 "test/jalview/bin/argparser/testfiles/test2.stk",
303                 "test/jalview/bin/argparser/testfiles/test3.stk",
304                 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
305                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
306                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
307                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
308                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
309                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
310                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
311                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
312                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", },
313             null },
314         { "--open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output=*.stk --close",
315             new String[]
316             { "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
317                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
318                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
319                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
320                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
321             new String[]
322             { "test/jalview/bin/argparser/testfiles/test1.stk",
323                 "test/jalview/bin/argparser/testfiles/test2.stk",
324                 "test/jalview/bin/argparser/testfiles/test3.stk",
325                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
326                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
327                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
328                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
329         { "--open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output=open*.stk --close",
330             new String[]
331             { "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
332                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
333                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
334             new String[]
335             { "test/jalview/bin/argparser/testfiles/test1.stk",
336                 "test/jalview/bin/argparser/testfiles/test2.stk",
337                 "test/jalview/bin/argparser/testfiles/test3.stk",
338                 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
339                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
340                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
341                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
342                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
343                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
344         { "--open=test/jalview/bin/argparser/testfiles/dir1/*.fa --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --opened --output={dirname}/{basename}.stk --close",
345             new String[]
346             { "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
347                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
348                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk", },
349             new String[]
350             { "test/jalview/bin/argparser/testfiles/test1.stk",
351                 "test/jalview/bin/argparser/testfiles/test2.stk",
352                 "test/jalview/bin/argparser/testfiles/test3.stk",
353                 "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
354                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
355                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
356                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
357                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
358                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk", }, },
359         { "--open=test/jalview/bin/argparser/testfiles/dir1/*.fa --output open*.stk --open=test/jalview/bin/argparser/testfiles/dir2/*.fa --output=open*.aln --close",
360             new String[]
361             { "test/jalview/bin/argparser/testfiles/dir1/test1.stk",
362                 "test/jalview/bin/argparser/testfiles/dir1/test2.stk",
363                 "test/jalview/bin/argparser/testfiles/dir2/test1.aln",
364                 "test/jalview/bin/argparser/testfiles/dir2/test2.aln",
365                 "test/jalview/bin/argparser/testfiles/dir2/test3.aln", },
366             new String[]
367             { "test/jalview/bin/argparser/testfiles/test1.stk",
368                 "test/jalview/bin/argparser/testfiles/test2.stk",
369                 "test/jalview/bin/argparser/testfiles/test3.stk",
370                 "test/jalview/bin/argparser/testfiles/dir2/test1.stk",
371                 "test/jalview/bin/argparser/testfiles/dir2/test2.stk",
372                 "test/jalview/bin/argparser/testfiles/dir2/test3.stk",
373                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.stk",
374                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.stk",
375                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.stk",
376                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.stk",
377                 "test/jalview/bin/argparser/testfiles/test1.aln",
378                 "test/jalview/bin/argparser/testfiles/test2.aln",
379                 "test/jalview/bin/argparser/testfiles/test3.aln",
380                 "test/jalview/bin/argparser/testfiles/dir1/test1.aln",
381                 "test/jalview/bin/argparser/testfiles/dir1/test2.aln",
382                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test0.aln",
383                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test1.aln",
384                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test2.aln",
385                 "test/jalview/bin/argparser/testfiles/dir3/subdir/test3.aln", }, },
386         //
387     };
388   }
389
390 }