JAL-4090 JAL-1551 source license
[jalview.git] / test / jalview / bin / argparser / ArgParserTest.java
index 47d9e24..442812e 100644 (file)
@@ -1,3 +1,23 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
 package jalview.bin.argparser;
 
 import java.io.File;
@@ -7,10 +27,12 @@ import java.util.Properties;
 
 import org.testng.Assert;
 import org.testng.annotations.AfterClass;
+import org.testng.annotations.AfterMethod;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 import jalview.bin.Cache;
+import jalview.gui.Desktop;
 
 @Test(singleThreaded = true)
 public class ArgParserTest
@@ -21,6 +43,13 @@ public class ArgParserTest
     Cache.loadProperties("test/jalview/testProps.jvprops");
   }
 
+  @AfterMethod(alwaysRun = true)
+  public void tearDown()
+  {
+    if (Desktop.instance != null)
+      Desktop.instance.closeAll_actionPerformed(null);
+  }
+
   @Test(groups = "Functional", dataProvider = "argLines")
   public void parseArgsTest(String commandLineArgs, Arg a, String other)
   {
@@ -35,7 +64,7 @@ public class ArgParserTest
   {
     String[] args = commandLineArgs.split("\\s+");
     ArgParser argparser = new ArgParser(args);
-    ArgValuesMap avm = argparser.linkedArgs(linkedId);
+    ArgValuesMap avm = argparser.getLinkedArgs(linkedId);
     ArgValue av = avm.getArgValue(a);
     SubVals sv = av.getSubVals();
     String testString = null;
@@ -63,11 +92,11 @@ public class ArgParserTest
   public void parseAutoIndexAndSubstitutionsTest(String commandLineArgs,
           String linkedId, Arg a, String filename)
   {
-    // { "--open=filename0 --increment --open=filename1", "JALVIEW:1", Arg.OPEN,
-    // "filename1" },
+    // { "--append=filename0 --new --append=filename1", "JALVIEW:1",
+    // Arg.OPEN, "filename1" },
     String[] args = commandLineArgs.split("\\s+");
     ArgParser argparser = new ArgParser(args);
-    ArgValuesMap avm = argparser.linkedArgs(linkedId);
+    ArgValuesMap avm = argparser.getLinkedArgs(linkedId);
     ArgValue av = avm.getArgValue(a);
     Assert.assertEquals(av.getValue(), filename);
   }
@@ -81,13 +110,14 @@ public class ArgParserTest
     Assert.assertTrue(b.contains(a));
     if (a == Arg.PROPS)
     {
-      Properties bP = Cache.bootstrapProperties(b.get(Arg.PROPS));
+      Properties bP = Cache.bootstrapProperties(b.getValue(Arg.PROPS));
+      Assert.assertNotNull(bP);
       Assert.assertTrue(other.equals(bP.get(Cache.BOOTSTRAP_TEST)));
       Assert.assertFalse(bP.contains("NOT" + Cache.BOOTSTRAP_TEST));
     }
     else if (a == Arg.ARGFILE)
     {
-      List<String> filenames = b.getList(a);
+      List<String> filenames = b.getValueList(a);
       boolean found = false;
       for (String s : filenames)
       {
@@ -117,10 +147,10 @@ public class ArgParserTest
     BootstrapArgs b = BootstrapArgs.getBootstrapArgs(args);
 
     Assert.assertTrue(b.contains(a));
-    Assert.assertFalse(b.contains(Arg.OPEN));
+    Assert.assertFalse(b.contains(Arg.APPEND));
     if (a == Arg.PROPS)
     {
-      Properties bP = Cache.bootstrapProperties(b.get(Arg.PROPS));
+      Properties bP = Cache.bootstrapProperties(b.getValue(Arg.PROPS));
       Assert.assertTrue("true".equals(bP.get(Cache.BOOTSTRAP_TEST)));
     }
   }
@@ -139,13 +169,14 @@ public class ArgParserTest
   @DataProvider(name = "argLines")
   public Object[][] argLines()
   {
-    return new Object[][] {
-        { "--debug --open=test/jalview/bin/argparser/testfiles/test1.fa",
+    return new Object[][] { {
+        "--append=test/jalview/bin/argparser/testfiles/test1.fa --props=test/jalview/bin/argparser/testfiles/testProps.jvprops",
+        Arg.PROPS, "true" },
+        { "--debug --append=test/jalview/bin/argparser/testfiles/test1.fa",
             Arg.DEBUG, null },
-        { "--open=test/jalview/bin/argparser/testfiles/test1.fa --headless",
+        { "--append=test/jalview/bin/argparser/testfiles/test1.fa --headless",
             Arg.HEADLESS, null },
-        { "--open=test/jalview/bin/argparser/testfiles/test1.fa --props=test/jalview/bin/argparser/testfiles/testProps.jvprops",
-            Arg.PROPS, "true" },
+
         { "--argfile test/jalview/bin/argparser/testfiles/argfile0.txt",
             Arg.ARGFILE,
             "test/jalview/bin/argparser/testfiles/argfile0.txt" },
@@ -173,38 +204,73 @@ public class ArgParserTest
   @DataProvider(name = "argSubValsAndLinkedIds")
   public Object[][] argSubValsAndLinkedIds()
   {
-    return new Object[][] { {
-        "--debug --open=[hi]test/jalview/bin/argparser/testfiles/test1.fa",
-        "JALVIEW:0", Arg.OPEN, "hi", "true", true },
-        { "--open[linkedId1]=[new;hello=world;1]test/jalview/bin/argparser/testfiles/test1.fa --headless",
-            "linkedId1", Arg.OPEN, "new", "true", true },
-        { "--open[linkedId2]=[new;hello=world;1]test/jalview/bin/argparser/testfiles/test1.fa --headless",
-            "linkedId2", Arg.OPEN, "hello", "world", true },
-        { "--open[linkedId3]=[new;hello=world;1]test/jalview/bin/argparser/testfiles/test1.fa --headless",
-            "linkedId3", Arg.OPEN, "GETINDEX", "1", true },
-        { "--open[linkedId4]=[new;hello=world;1]test/jalview/bin/argparser/testfiles/test1.fa --open[linkedId5]=[notnew;hello=world;1]test/jalview/bin/argparser/testfiles/test1.fa --headless",
-            "linkedId5", Arg.OPEN, "new", "true", false },
-        { "--open[linkedId5]=[new;hello=worlddomination;1]test/jalview/bin/argparser/testfiles/test1.fa --open[linkedId2]=[new;hello=world;1]test/jalview/bin/argparser/testfiles/test1.fa --headless",
-            "linkedId5", Arg.OPEN, "hello", "world", false },
-        { "--open[linkedId6]=[new;hello=world;0]test/jalview/bin/argparser/testfiles/test1.fa --open[linkedId7]=[new;hello=world;1]test/jalview/bin/argparser/testfiles/test1.fa --headless",
-            "linkedId7", Arg.OPEN, "GETINDEX", "0", false }, };
+    return new Object[][] {
+        //
+        /*
+         */
+        { "--debug --append=[hi]test/jalview/bin/argparser/testfiles/test1.fa",
+            "JALVIEW:0", Arg.APPEND, "hi", "true", true },
+        { "--append[linkedId1]=[new,hello=world,1]test/jalview/bin/argparser/testfiles/test1.fa --headless",
+            "linkedId1", Arg.APPEND, "new", "true", true },
+        { "--append[linkedId2]=[new,hello=world,1]test/jalview/bin/argparser/testfiles/test1.fa --headless",
+            "linkedId2", Arg.APPEND, "hello", "world", true },
+        { "--append[linkedId3]=[new,hello=world,1]test/jalview/bin/argparser/testfiles/test1.fa --headless",
+            "linkedId3", Arg.APPEND, "GETINDEX", "1", true },
+        { "--append[linkedId4]=[new,hello=world,1]test/jalview/bin/argparser/testfiles/test1.fa --append[linkedId5]=[notnew;hello=world;1]test/jalview/bin/argparser/testfiles/test1.fa --headless",
+            "linkedId5", Arg.APPEND, "new", "true", false },
+        { "--append[linkedId5]=[new,hello=worlddomination,1]test/jalview/bin/argparser/testfiles/test1.fa --append[linkedId2]=[new;hello=world;1]test/jalview/bin/argparser/testfiles/test1.fa --headless",
+            "linkedId5", Arg.APPEND, "hello", "world", false },
+        { "--append[linkedId6]=[new,hello=world,0]test/jalview/bin/argparser/testfiles/test1.fa --append[linkedId7]=[new;hello=world;1]test/jalview/bin/argparser/testfiles/test1.fa --headless",
+            "linkedId7", Arg.APPEND, "GETINDEX", "0", false },
+        /*
+         */
+        //
+    };
   }
 
   @DataProvider(name = "argAutoIndexAndSubstitutions")
   public Object[][] argAutoIndexAndSubstitutions()
   {
-    return new Object[][] { { "--open=filename0 --open=filename1",
-        "JALVIEW:0", Arg.OPEN, "filename0" },
-        { "--open=filename0 --increment --open=filename1", "JALVIEW:1",
-            Arg.OPEN, "filename1" },
-        { "--open=filename0 --increment --increment --open=filename2",
-            "JALVIEW:0", Arg.OPEN, "filename0" },
-        { "--open=filename0 --increment --increment --open=filename2",
-            "JALVIEW:2", Arg.OPEN, "filename2" },
-        { "--open[linkA-{n}]=filenameA0 --open[linkA-{++n}]=filenameA1",
+    return new Object[][] {
+        //
+        /*
+         */
+        { "--append=filename0 --append=filename1", "JALVIEW:0", Arg.APPEND,
+            "filename0" },
+        { "--append=filename0 --new --append=filename1", "JALVIEW:1",
+            Arg.APPEND, "filename1" },
+        { "--append=filename0 --new --new --append=filename2", "JALVIEW:0",
+            Arg.APPEND, "filename0" },
+        { "--append=filename0 --new --new --append=filename2", "JALVIEW:2",
+            Arg.APPEND, "filename2" },
+        { "--append[linkA-{n}]=filenameA0 --append[linkA-{++n}]=filenameA1",
+            "linkA-0", Arg.APPEND, "filenameA0" },
+        { "--append[linkB-{n}]=filenameB0 --append[linkB-{++n}]=filenameB1",
+            "linkB-1", Arg.APPEND, "filenameB1" },
+        { "--append[linkC-{n}]=filenameC0 --image[linkC-{n}]=outputC{n}.txt",
+            "linkC-0", Arg.IMAGE, "outputC{n}.txt" },
+        { "--append[linkD-{n}]=filenameD0 --substitutions --image[linkD-{n}]=outputD{n}.txt",
+            "linkD-0", Arg.IMAGE, "outputD0.txt" },
+        { "--append[linkE-{n}]=filenameE0 --substitutions --image[linkE-{n}]=output-E{n}.txt --nil[{++n}] --image[linkE-{n}]=outputE{n}.txt",
+            "linkE-0", Arg.IMAGE, "output-E0.txt" },
+        { "--append[linkF-{n}]=filenameF0 --substitutions --image[linkF-{n}]=output-F{n}.txt --nil[{++n}] --image[linkF-{n}]=outputF{n}.txt",
+            "linkF-1", Arg.IMAGE, "outputF1.txt" },
+        { "--append[linkG-{n}]=filenameG0 --substitutions --image[linkG-{n}]=output-G{n}.txt --nil[{++n}] --nosubstitutions --image[linkG-{n}]=outputG{n}.txt",
+            "linkG-1", Arg.IMAGE, "outputG{n}.txt" },
+        { "--append[linkH-{n}]=filenameH0 --substitutions --image[linkH-{n}]=output-H{n}.txt --nil[{++n}] --nosubstitutions --image[linkH-{n}]=outputH{n}.txt",
+            "linkH-0", Arg.IMAGE, "output-H0.txt" },
+        { "--open=filename0 --append=filename1", "JALVIEW:0", Arg.OPEN,
+            "filename0" },
+        { "--open=filename0 --new --append=filename1", "JALVIEW:1",
+            Arg.APPEND, "filename1" },
+        { "--open=filename0 --new --new --append=filename2", "JALVIEW:0",
+            Arg.OPEN, "filename0" },
+        { "--open=filename0 --new --new --append=filename2", "JALVIEW:2",
+            Arg.APPEND, "filename2" },
+        { "--open[linkA-{n}]=filenameA0 --append[linkA-{++n}]=filenameA1",
             "linkA-0", Arg.OPEN, "filenameA0" },
-        { "--open[linkB-{n}]=filenameB0 --open[linkB-{++n}]=filenameB1",
-            "linkB-1", Arg.OPEN, "filenameB1" },
+        { "--open[linkB-{n}]=filenameB0 --append[linkB-{++n}]=filenameB1",
+            "linkB-1", Arg.APPEND, "filenameB1" },
         { "--open[linkC-{n}]=filenameC0 --image[linkC-{n}]=outputC{n}.txt",
             "linkC-0", Arg.IMAGE, "outputC{n}.txt" },
         { "--open[linkD-{n}]=filenameD0 --substitutions --image[linkD-{n}]=outputD{n}.txt",
@@ -216,7 +282,12 @@ public class ArgParserTest
         { "--open[linkG-{n}]=filenameG0 --substitutions --image[linkG-{n}]=output-G{n}.txt --nil[{++n}] --nosubstitutions --image[linkG-{n}]=outputG{n}.txt",
             "linkG-1", Arg.IMAGE, "outputG{n}.txt" },
         { "--open[linkH-{n}]=filenameH0 --substitutions --image[linkH-{n}]=output-H{n}.txt --nil[{++n}] --nosubstitutions --image[linkH-{n}]=outputH{n}.txt",
-            "linkH-0", Arg.IMAGE, "output-H0.txt" }, };
+            "linkH-0", Arg.IMAGE, "output-H0.txt" },
+        /*
+         */
+
+        //
+    };
   }
 
   @DataProvider(name = "argFiles")
@@ -226,4 +297,159 @@ public class ArgParserTest
         "--argfile=test/jalview/bin/argparser/testfiles/argfile0.txt --open=shouldntbeabootstrap",
         Arg.ARGFILE, "test/jalview/bin/argfiles/testfiles/test1.fa" } };
   }
-}
+
+  @Test(groups = "Functional", dataProvider = "allLinkedIdsData")
+  public void allLinkedIdsTest(String pwd, String commandLineArgs, Arg a,
+          String[] values, String[] nonvalues)
+  {
+    String userDir = System.getProperty("user.dir");
+    if (pwd != null)
+    {
+      File pwdFile = new File(pwd);
+      System.setProperty("user.dir", pwdFile.getAbsolutePath());
+    }
+    String[] args = commandLineArgs.split("\\s+");
+    ArgParser argparser = new ArgParser(args);
+
+    int num = values.length;
+    List<String> linkedIds = argparser.getLinkedIds();
+    Assert.assertEquals(linkedIds.size(), num,
+            "Wrong number of linkedIds: " + linkedIds.toString());
+    for (int i = 0; i < num; i++)
+    {
+      String value = values[i];
+      String linkedId = linkedIds.get(i);
+      ArgValuesMap avm = argparser.getLinkedArgs(linkedId);
+      if (value == null)
+      {
+        Assert.assertTrue(avm.containsArg(a),
+                "Arg value for " + a.argString()
+                        + " not applied correctly to linkedId '" + linkedId
+                        + "'");
+      }
+      else
+      {
+        ArgValues avs = avm.getArgValues(a);
+        ArgValue av = avs.getArgValue();
+        String v = av.getValue();
+        value = new File(value).getPath();
+        Assert.assertEquals(v, value, "Arg value for " + a.argString()
+                + " not applied correctly to linkedId '" + linkedId + "'");
+      }
+    }
+
+    System.setProperty("user.dir", userDir);
+  }
+
+  @DataProvider(name = "allLinkedIdsData")
+  public Object[][] allLinkedIdsData()
+  {
+    return new Object[][] {
+        //
+        /*
+        */
+        { null,
+            "--open=test/jalview/bin/argparser/testfiles/*.fa --substitutions --all --image={dirname}/{basename}.png --close",
+            Arg.CLOSE, new String[]
+            { null, null, null },
+            null },
+        { null,
+            "--open=test/jalview/bin/argparser/testfiles/*.fa --substitutions --all --output={dirname}/{basename}.stk --close",
+            Arg.OUTPUT, new String[]
+            { "test/jalview/bin/argparser/testfiles/test1.stk",
+                "test/jalview/bin/argparser/testfiles/test2.stk",
+                "test/jalview/bin/argparser/testfiles/test3.stk", },
+            null },
+        { null,
+            "--open=test/jalview/bin/argparser/testfiles/*.fa --substitutions --all --image={dirname}/{basename}.png --close",
+            Arg.IMAGE, new String[]
+            { "test/jalview/bin/argparser/testfiles/test1.png",
+                "test/jalview/bin/argparser/testfiles/test2.png",
+                "test/jalview/bin/argparser/testfiles/test3.png", },
+            null },
+        /*
+         * Find a way to change pwd reliably -- need to match "*.fa" against some files!
+         { "test/jalview/bin/argparser/testfiles",
+         
+            "--open=*.fa --image={dirname}/{basename}.png --close",
+            Arg.IMAGE, new String[]
+            { "./test1.png", "./test2.png", "./test3.png", }, null },
+            */
+        //
+    };
+  }
+
+  @Test(groups = "Functional", dataProvider = "bootstrapArgsData")
+  public void bootstrapArgsValuesAndHeadlessModeTest(String commandLineArgs,
+          Arg a, String valS, boolean valB, boolean headlessValue)
+  {
+    String[] args = commandLineArgs.split("\\s+");
+    BootstrapArgs bsa = BootstrapArgs.getBootstrapArgs(args);
+    if (a != null)
+    {
+      if (valS != null)
+      {
+        Assert.assertEquals(bsa.getValue(a), valS,
+                "BootstrapArg " + a.argString()
+                        + " value does not match expected '" + valS + "'");
+      }
+      else
+      {
+        Assert.assertEquals(bsa.getBoolean(a), valB,
+                "Boolean/Unary value of BootstrapArg " + a.argString()
+                        + "' is not the expected '" + valB + "'");
+      }
+    }
+
+    boolean isHeadless = bsa.isHeadless();
+    Assert.assertEquals(isHeadless, headlessValue,
+            "Assumed headless setting '" + isHeadless + "' is wrong.");
+  }
+
+  @DataProvider(name = "bootstrapArgsData")
+  public Object[][] bootstrapArgsData()
+  {
+    return new Object[][] {
+        /*
+         * cmdline args
+         * Arg (null if only testing headless)
+         * String value if there is one (null otherwise)
+         * boolean value if String value is null
+         * expected value of isHeadless()
+         */
+        /*
+        */
+        { "--open thisway.fa --output thatway.fa --jabaws https://forwardsandbackwards.com/",
+            Arg.JABAWS, "https://forwardsandbackwards.com/", false, true },
+        { "--help-all --open thisway.fa --output thatway.fa --jabaws https://forwardsandbackwards.com/",
+            Arg.HELP, null, true, true },
+        { "--help-all --nonews --open thisway.fa --output thatway.fa --jabaws https://forwardsandbackwards.com/",
+            Arg.NEWS, null, false, true },
+        { "--help --nonews --open thisway.fa --output thatway.fa --jabaws https://forwardsandbackwards.com/",
+            Arg.NEWS, null, false, true },
+        { "--help-opening --nonews --open thisway.fa --output thatway.fa --jabaws https://forwardsandbackwards.com/",
+            Arg.NEWS, null, false, true },
+        { "--nonews --open thisway.fa --output thatway.fa --jabaws https://forwardsandbackwards.com/",
+            Arg.NEWS, null, false, true },
+        { "--open thisway.fa --image thatway.png", null, null, false,
+            true },
+        { "--open thisway.fa --output thatway.png", null, null, false,
+            true },
+        { "--open thisway.fa --image thatway.png --noheadless", null, null,
+            false, false },
+        { "--open thisway.fa --output thatway.png --noheadless", null, null,
+            false, false },
+        { "--open thisway.fa --image thatway.png --gui", null, null, false,
+            false },
+        { "--open thisway.fa --output thatway.png --gui", null, null, false,
+            false },
+        // --gui takes precedence
+        { "--open thisway.fa --image thatway.png --gui --headless", null,
+            null, false, false },
+        { "--open thisway.fa --output thatway.png --gui --headless", null,
+            null, false, false },
+        //
+    };
+  }
+
+}
\ No newline at end of file