+
+ @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 },
+ //
+ };
+ }
+
+ @Test(groups = "Functional", dataProvider = "argsWithinTypesData")
+ public void checkArgsWithinTypesTest(String commandLineArgs,
+ Object[] stuff)
+ {
+ String linkedId = "JALVIEW:0";
+ String[] args = commandLineArgs.split("\\s+");
+ ArgParser argparser = new ArgParser(args);
+ ArgValuesMap avm = argparser.getLinkedArgs(linkedId);
+
+ ArgAndValues avals = (ArgAndValues) stuff[0];
+
+ Object[] moreStuff = (Object[]) stuff[1];
+
+ ArgAndValues[] subAv = (ArgAndValues[]) moreStuff[0];
+
+ Object[] secondaryArgAndAuxStuff = (Object[]) stuff[2];
+
+ // Now look at the argparser
+
+ Arg primaryArg = avals.arg;
+
+ List<ArgValue> parsed_ArgValues = avm.getArgValueList(primaryArg);
+
+ Assert.assertTrue(
+ areEqualSets(avals.values,
+ ArgValuesMap.toValues(parsed_ArgValues)),
+ "Primary arg (" + primaryArg.toString()
+ + ") does not have the expected values");
+
+ for (int i = 0; i < parsed_ArgValues.size(); i++)
+ {
+ ArgValue parsed_ArgValue = parsed_ArgValues.get(i);
+ String value = avals.values.get(i);
+
+ Console.debug("- primary arg '" + primaryArg + "' = '" + value + "'");
+
+ Assert.assertEquals(parsed_ArgValue.getValue(), value,
+ "Primary arg value not as expected");
+
+ ArgAndValues[] aux_avals = (ArgAndValues[]) moreStuff[i];
+
+ for (ArgAndValues aux_aval : aux_avals)
+ {
+ Arg auxArg = aux_aval.arg;
+ List<String> auxValues = aux_aval.values;
+
+ for (String auxValue : auxValues)
+ {
+ String parsed_auxValue = avm.getFromSubValArgOrPref(auxArg,
+ ArgValuesMap.Position.AFTER, parsed_ArgValue, null, null,
+ null, null);
+
+ Console.debug("- + primary aux arg '" + auxArg + "' = '"
+ + auxValue + "'");
+
+ Assert.assertEquals(parsed_auxValue, auxValue,
+ "Primary auxiliary arg (" + auxArg.toString()
+ + ") values do not match");
+
+ }
+ }
+
+ // Now for the secondary args
+ Object[] secondaryStuff = (Object[]) secondaryArgAndAuxStuff[i];
+ ArgAndValues secondaryArgAndValues = (ArgAndValues) secondaryStuff[0];
+ Arg secondaryArg = secondaryArgAndValues.arg;
+ List<String> secondaryValues = secondaryArgAndValues.values;
+
+ List<ArgValue> parsed_secondaryArgValues = avm
+ .getArgValueListFromSubValOrArg(parsed_ArgValue, secondaryArg,
+ null);
+
+ Assert.assertTrue(
+ areEqualSets(secondaryValues,
+ ArgValuesMap.toValues(parsed_secondaryArgValues)),
+ "Secondary arg (" + secondaryArg.toString()
+ + ") does not have the expected values");
+
+ Object[] secondaryMoreStuff = (Object[]) secondaryStuff[1];
+
+ for (int j = 0; j < parsed_secondaryArgValues.size(); j++)
+ {
+ ArgValue parsed_secondaryArgValue = parsed_secondaryArgValues
+ .get(j);
+ String secondary_value = secondaryValues.get(j);
+
+ Console.debug("-- secondary arg '" + secondaryArg + "' = '"
+ + secondary_value + "'");
+
+ Assert.assertEquals(parsed_secondaryArgValue.getValue(),
+ secondary_value, "Secondary arg value not as expected");
+
+ ArgAndValues[] secondary_aux_avals = (ArgAndValues[]) secondaryMoreStuff[j];
+
+ for (ArgAndValues secondary_aux_aval : secondary_aux_avals)
+ {
+ Arg secondary_auxArg = secondary_aux_aval.arg;
+ List<String> secondary_auxValues = secondary_aux_aval.values;
+
+ for (String secondary_auxValue : secondary_auxValues)
+ {
+ String parsed_secondary_auxValue = avm.getValueFromSubValOrArg(
+ parsed_secondaryArgValue, secondary_auxArg, null);
+
+ Console.debug("-- + secondary aux arg '" + secondary_auxArg
+ + "' for value '" + secondary_auxValue + "'");
+
+ Assert.assertEquals(parsed_secondary_auxValue,
+ secondary_auxValue,
+ "Secondary auxiliary arg ("
+ + secondary_auxArg.toString()
+ + ") values do not match");
+ }
+ }
+ }
+ }
+ }
+
+ @DataProvider(name = "argsWithinTypesData")
+ public Object[][] argsWithinTypesData()
+ {
+ return new Object[][] {
+ /*
+ * { cmdline args },
+ * {
+ * { Primary Arg, Secondary Args },
+ * { { Secondary Arg => { Values } } }
+ * },
+ */
+ /*
+ */
+ { //
+ // commandLineArgs
+ "--open=alignment.fa --structure=structure0.pdb"
+ // structureimage0a and structureimage args
+ + " --structureimage=image0a.png --bgcolour=bg0a --imagecolour=col0a"
+ // structureimage0b and structureimage args
+ + " --structureimage=image0b.png --bgcolour=bg0b --imagecolour=col0b"
+ // more structure args
+ + " --structureviewer=sv0 --paematrix=pae0" //
+ // structure1
+ + " --structure=structure1.pdb"
+ // structure args
+ + " --structureviewer=sv1 --paematrix=pae1"
+ // structureimage1a with NO structureimage args
+ // (see `--all --bgcolour=pineapple` later)
+ + " --structureimage=image1a.png"
+ // structureimage1b and structureimage args
+ + " --structureimage=image1b.png --bgcolour=bg1b --imagecolour=col1b"
+ // --all args, should apply to structureimage1a only
+ + " --all --bgcolour=pineapple" //
+ ,
+ // stuff
+ new Object[]
+ {
+ // avals (0) and (1)
+ av(Arg.STRUCTURE, "structure0.pdb", "structure1.pdb"),
+ // moreStuff (0) and (1)
+ new ArgAndValues[][]
+ { //
+ { av(Arg.STRUCTUREVIEWER, "sv0"),
+ av(Arg.PAEMATRIX, "pae0") },
+ { av(Arg.STRUCTUREVIEWER, "sv1"),
+ av(Arg.PAEMATRIX, "pae1") } //
+ },
+ // secondaryArgAndAuxStuff
+ // (same size as values of avals)
+ new Object[][]
+ {
+ // secondaryStuff (0)
+ {
+ // secondaryArgAndValues (a) and (b)
+ av(Arg.STRUCTUREIMAGE, "image0a.png",
+ "image0b.png"),
+ // secondaryMoreStuff
+ // (same size as values of secondaryArgAndValues)
+ new ArgAndValues[][]
+ {
+ // secondary_aux_avals (a)
+ { av(Arg.BGCOLOUR, "bg0a"),
+ av(Arg.IMAGECOLOUR, "col0a") },
+ // secondary_aux_avals (b)
+ { av(Arg.BGCOLOUR, "bg0b"),
+ av(Arg.IMAGECOLOUR, "col0b") }, //
+ }, //
+ },
+ // secondaryStuff (1)
+ {
+ // secondaryArgAndValues (a) and (b)
+ av(Arg.STRUCTUREIMAGE, "image1a.png",
+ "image1b.png"),
+ // secondaryMoreStuff
+ new ArgAndValues[][]
+ {
+ // secondary_aux_avals (a)
+ { av(Arg.BGCOLOUR, "pineapple"),
+ av(Arg.IMAGECOLOUR) },
+ // secondary_aux_avals (b)
+ { av(Arg.BGCOLOUR, "bg1b"),
+ av(Arg.IMAGECOLOUR, "col1b") }, //
+ }, //
+ }, //
+ } //
+ } //
+ } //
+ };
+ }
+
+ protected ArgAndValues av(Arg a, String... vals)
+ {
+ return new ArgAndValues(a, vals);
+ }
+
+ protected class ArgAndValues
+ {
+ protected Arg arg;
+
+ protected List<String> values;
+
+ ArgAndValues(Arg a, String... vals)
+ {
+ arg = a;
+ values = vals == null ? new ArrayList<String>() : Arrays.asList(vals);
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder sb = new StringBuilder();
+ sb.append(arg.argString());
+ sb.append("\n");
+ sb.append(Strings.join(values, ','));
+ sb.append("\n");
+ return sb.toString();
+ }
+ }
+
+ private static boolean areEqualSets(String[] strArray,
+ List<String> strList)
+ {
+ return areEqualSets(Arrays.asList(strArray), strList);
+ }
+
+ private static boolean areEqualSets(List<String> l1, List<String> l2)
+ {
+ if (l1 == null && l2 == null)
+ {
+ return true;
+ }
+ if (l1 == null || l2 == null)
+ {
+ return true;
+ }
+ return new HashSet<String>(l1).equals(new HashSet<String>(l2));
+ }
+
+}
\ No newline at end of file