Repository: logging-log4j2 Updated Branches: refs/heads/master 7d52f131e -> 23bcd257f
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/23bcd257/log4j-core/src/test/java/org/apache/logging/log4j/core/tools/picocli/CommandLineTest.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/tools/picocli/CommandLineTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/tools/picocli/CommandLineTest.java index 5b482a4..561ce73 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/tools/picocli/CommandLineTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/tools/picocli/CommandLineTest.java @@ -104,10 +104,10 @@ public class CommandLineTest { } @Test public void testVersion() { - assertEquals("2.0.0", CommandLine.VERSION); + assertEquals("2.0.3", CommandLine.VERSION); } - private static class SupportedTypes { + static class SupportedTypes { @Option(names = "-boolean") boolean booleanField; @Option(names = "-Boolean") Boolean aBooleanField; @Option(names = "-byte") byte byteField; @@ -362,20 +362,6 @@ public class CommandLineTest { assertEquals(34, bean.longField); assertEquals(Long.valueOf(34), bean.aLongField); } - @Test(expected = MissingParameterException.class) - public void testSingleValueFieldDefaultMinArityIs1() { - CommandLine.populateCommand(new SupportedTypes(), "-Long"); - } - @Test - public void testSingleValueFieldDefaultMinArityIsOne() { - try { - CommandLine.populateCommand(new SupportedTypes(), "-Long", "-boolean"); - fail("should fail"); - } catch (ParameterException ex) { - assertEquals("Could not convert '-boolean' to Long for option '-Long'" + - ": java.lang.NumberFormatException: For input string: \"-boolean\"", ex.getMessage()); - } - } @Test public void testTimeFormatHHmmSupported() throws ParseException { SupportedTypes bean = CommandLine.populateCommand(new SupportedTypes(), "-Time", "23:59"); @@ -535,7 +521,7 @@ public class CommandLineTest { assertEquals(args[0], app.globField.glob); } - static class EnumParams { + private static class EnumParams { @Option(names = "-timeUnit") TimeUnit timeUnit; @Option(names = "-timeUnitArray", arity = "2") TimeUnit[] timeUnitArray; @Option(names = "-timeUnitList", type = TimeUnit.class, arity = "3") List<TimeUnit> timeUnitList; @@ -543,9 +529,9 @@ public class CommandLineTest { @Test public void testEnumTypeConversionSuceedsForValidInput() { EnumParams params = CommandLine.populateCommand(new EnumParams(), - "-timeUnit DAYS -timeUnitArray HOURS MINUTES -timeUnitList SECONDS MICROSECONDS NANOSECONDS".split(" ")); - assertEquals(DAYS, params.timeUnit); - assertArrayEquals(new TimeUnit[]{HOURS, TimeUnit.MINUTES}, params.timeUnitArray); + "-timeUnit SECONDS -timeUnitArray MILLISECONDS SECONDS -timeUnitList SECONDS MICROSECONDS NANOSECONDS".split(" ")); + assertEquals(SECONDS, params.timeUnit); + assertArrayEquals(new TimeUnit[]{MILLISECONDS, TimeUnit.SECONDS}, params.timeUnitArray); List<TimeUnit> expected = new ArrayList<TimeUnit>(Arrays.asList(TimeUnit.SECONDS, TimeUnit.MICROSECONDS, TimeUnit.NANOSECONDS)); assertEquals(expected, params.timeUnitList); } @@ -555,17 +541,20 @@ public class CommandLineTest { CommandLine.populateCommand(new EnumParams(), "-timeUnit", "xyz"); fail("Accepted invalid timeunit"); } catch (Exception ex) { - assertEquals("Could not convert 'xyz' to TimeUnit for option '-timeUnit'" + - ": java.lang.IllegalArgumentException: No enum constant java.util.concurrent.TimeUnit.xyz", ex.getMessage()); + String prefix = "Could not convert 'xyz' to TimeUnit for option '-timeUnit'" + + ": java.lang.IllegalArgumentException: No enum cons"; + String suffix = " java.util.concurrent.TimeUnit.xyz"; + assertEquals(prefix, ex.getMessage().substring(0, prefix.length())); + assertEquals(suffix, ex.getMessage().substring(ex.getMessage().length() - suffix.length(), ex.getMessage().length())); } } @Ignore("Requires #14 case-insensitive enum parsing") @Test public void testEnumTypeConversionIsCaseInsensitive() { EnumParams params = CommandLine.populateCommand(new EnumParams(), - "-timeUnit daYS -timeUnitArray hours miNutEs -timeUnitList SEConds MiCROsEconds nanoSEConds".split(" ")); - assertEquals(DAYS, params.timeUnit); - assertArrayEquals(new TimeUnit[]{HOURS, TimeUnit.MINUTES}, params.timeUnitArray); + "-timeUnit sEcONds -timeUnitArray milliSeconds miCroSeConds -timeUnitList SEConds MiCROsEconds nanoSEConds".split(" ")); + assertEquals(SECONDS, params.timeUnit); + assertArrayEquals(new TimeUnit[]{MILLISECONDS, TimeUnit.MICROSECONDS}, params.timeUnitArray); List<TimeUnit> expected = new ArrayList<TimeUnit>(Arrays.asList(TimeUnit.SECONDS, TimeUnit.MICROSECONDS, TimeUnit.NANOSECONDS)); assertEquals(expected, params.timeUnitList); } @@ -575,19 +564,24 @@ public class CommandLineTest { CommandLine.populateCommand(new EnumParams(), "-timeUnitArray", "a", "b"); fail("Accepted invalid timeunit"); } catch (Exception ex) { - assertEquals("Could not convert 'a' to TimeUnit for option '-timeUnitArray' at index 0 (<timeUnitArray>)" + - ": java.lang.IllegalArgumentException: No enum constant java.util.concurrent.TimeUnit.a", ex.getMessage()); + String prefix = "Could not convert 'a' to TimeUnit for option '-timeUnitArray' at index 0 (<timeUnitArray>)" + + ": java.lang.IllegalArgumentException: No enum const"; + String suffix = " java.util.concurrent.TimeUnit.a"; + assertEquals(prefix, ex.getMessage().substring(0, prefix.length())); + assertEquals(suffix, ex.getMessage().substring(ex.getMessage().length() - suffix.length(), ex.getMessage().length())); } } @Test public void testEnumListTypeConversionFailsForInvalidInput() { try { - CommandLine.populateCommand(new EnumParams(), "-timeUnitList", "DAYS", "b", "c"); + CommandLine.populateCommand(new EnumParams(), "-timeUnitList", "SECONDS", "b", "c"); fail("Accepted invalid timeunit"); } catch (Exception ex) { - assertEquals("Could not convert 'b' to TimeUnit for option '-timeUnitList' at index 1 (<timeUnitList>)" + - ": java.lang.IllegalArgumentException: No enum constant java.util.concurrent.TimeUnit.b", - ex.getMessage()); + String prefix = "Could not convert 'b' to TimeUnit for option '-timeUnitList' at index 1 (<timeUnitList>)" + + ": java.lang.IllegalArgumentException: No enum const"; + String suffix = " java.util.concurrent.TimeUnit.b"; + assertEquals(prefix, ex.getMessage().substring(0, prefix.length())); + assertEquals(suffix, ex.getMessage().substring(ex.getMessage().length() - suffix.length(), ex.getMessage().length())); } } @@ -595,23 +589,23 @@ public class CommandLineTest { public void testArrayOptionParametersAreAlwaysInstantiated() { EnumParams params = new EnumParams(); TimeUnit[] array = params.timeUnitArray; - new CommandLine(params).parse("-timeUnitArray", "DAYS", "HOURS"); + new CommandLine(params).parse("-timeUnitArray", "SECONDS", "MILLISECONDS"); assertNotSame(array, params.timeUnitArray); } @Test public void testListOptionParametersAreInstantiatedIfNull() { EnumParams params = new EnumParams(); assertNull(params.timeUnitList); - new CommandLine(params).parse("-timeUnitList", "DAYS", "HOURS", "DAYS"); - assertEquals(Arrays.asList(DAYS, HOURS, DAYS), params.timeUnitList); + new CommandLine(params).parse("-timeUnitList", "SECONDS", "MICROSECONDS", "MILLISECONDS"); + assertEquals(Arrays.asList(SECONDS, MICROSECONDS, MILLISECONDS), params.timeUnitList); } @Test public void testListOptionParametersAreReusedInstantiatedIfNonNull() { EnumParams params = new EnumParams(); List<TimeUnit> list = new ArrayList<TimeUnit>(); params.timeUnitList = list; - new CommandLine(params).parse("-timeUnitList", "DAYS", "HOURS", "DAYS"); - assertEquals(Arrays.asList(DAYS, HOURS, DAYS), params.timeUnitList); + new CommandLine(params).parse("-timeUnitList", "SECONDS", "MICROSECONDS", "SECONDS"); + assertEquals(Arrays.asList(SECONDS, MICROSECONDS, SECONDS), params.timeUnitList); assertSame(list, params.timeUnitList); } @Test @@ -626,7 +620,7 @@ public class CommandLineTest { assertNotSame(array, params.array); assertArrayEquals(new int[]{0, 0, 0, 3, 2, 1}, params.array); } - class ListPositionalParams { + private class ListPositionalParams { @Parameters(type = Integer.class) List<Integer> list; } @Test @@ -894,134 +888,6 @@ public class CommandLineTest { assertFalse("version info requested", parsedCommands.get(0).isVersionHelpRequested()); } @Test - public void testMissingRequiredParams() { - class Example { - @Parameters(index = "1", arity = "0..1") String optional; - @Parameters(index = "0") String mandatory; - } - try { CommandLine.populateCommand(new Example(), new String[] {"mandatory"}); } - catch (MissingParameterException ex) { fail(); } - - try { - CommandLine.populateCommand(new Example(), new String[0]); - fail("Should not accept missing mandatory parameter"); - } catch (MissingParameterException ex) { - assertEquals("Missing required parameter: <mandatory>", ex.getMessage()); - } - } - @Test - public void testMissingRequiredParams1() { - class Tricky1 { - @Parameters(index = "2") String anotherMandatory; - @Parameters(index = "1", arity = "0..1") String optional; - @Parameters(index = "0") String mandatory; - } - try { - CommandLine.populateCommand(new Tricky1(), new String[0]); - fail("Should not accept missing mandatory parameter"); - } catch (MissingParameterException ex) { - assertEquals("Missing required parameters: <mandatory>, <anotherMandatory>", ex.getMessage()); - } - try { - CommandLine.populateCommand(new Tricky1(), new String[] {"firstonly"}); - fail("Should not accept missing mandatory parameter"); - } catch (MissingParameterException ex) { - assertEquals("Missing required parameter: <anotherMandatory>", ex.getMessage()); - } - } - @Test - public void testMissingRequiredParams2() { - class Tricky2 { - @Parameters(index = "2", arity = "0..1") String anotherOptional; - @Parameters(index = "1", arity = "0..1") String optional; - @Parameters(index = "0") String mandatory; - } - try { CommandLine.populateCommand(new Tricky2(), new String[] {"mandatory"}); } - catch (MissingParameterException ex) { fail(); } - - try { - CommandLine.populateCommand(new Tricky2(), new String[0]); - fail("Should not accept missing mandatory parameter"); - } catch (MissingParameterException ex) { - assertEquals("Missing required parameter: <mandatory>", ex.getMessage()); - } - } - @Test - public void testMissingRequiredParamsWithOptions() { - class Tricky3 { - @Option(names="-v") boolean more; - @Option(names="-t") boolean any; - @Parameters(index = "1") String alsoMandatory; - @Parameters(index = "0") String mandatory; - } - try { - CommandLine.populateCommand(new Tricky3(), new String[] {"-t", "-v", "mandatory"}); - fail("Should not accept missing mandatory parameter"); - } catch (MissingParameterException ex) { - assertEquals("Missing required parameter: <alsoMandatory>", ex.getMessage()); - } - - try { - CommandLine.populateCommand(new Tricky3(), new String[] { "-t", "-v"}); - fail("Should not accept missing two mandatory parameters"); - } catch (MissingParameterException ex) { - assertEquals("Missing required parameters: <mandatory>, <alsoMandatory>", ex.getMessage()); - } - } - @Test - public void testMissingRequiredParamWithOption() { - class Tricky3 { - @Option(names="-t") boolean any; - @Parameters(index = "0") String mandatory; - } - try { - CommandLine.populateCommand(new Tricky3(), new String[] {"-t"}); - fail("Should not accept missing mandatory parameter"); - } catch (MissingParameterException ex) { - assertEquals("Missing required parameter: <mandatory>", ex.getMessage()); - } - } - @Test - public void testNoMissingRequiredParamErrorIfHelpOptionSpecified() { - class App { - @Parameters(hidden = true) // "hidden": don't show this parameter in usage help message - List<String> allParameters; // no "index" attribute: captures _all_ arguments (as Strings) - - @Parameters(index = "0") InetAddress host; - @Parameters(index = "1") int port; - @Parameters(index = "2..*") File[] files; - - @Option(names = "-?", help = true) boolean help; - } - CommandLine.populateCommand(new App(), new String[] {"-?"}); - try { - CommandLine.populateCommand(new App(), new String[0]); - fail("Should not accept missing mandatory parameter"); - } catch (MissingParameterException ex) { - assertEquals("Missing required parameters: <host>, <port>", ex.getMessage()); - } - } - @Test - public void testNoMissingRequiredParamErrorWithLabelIfHelpOptionSpecified() { - class App { - @Parameters(hidden = true) // "hidden": don't show this parameter in usage help message - List<String> allParameters; // no "index" attribute: captures _all_ arguments (as Strings) - - @Parameters(index = "0", paramLabel = "HOST") InetAddress host; - @Parameters(index = "1", paramLabel = "PORT") int port; - @Parameters(index = "2..*", paramLabel = "FILES") File[] files; - - @Option(names = "-?", help = true) boolean help; - } - CommandLine.populateCommand(new App(), new String[] {"-?"}); - try { - CommandLine.populateCommand(new App(), new String[0]); - fail("Should not accept missing mandatory parameter"); - } catch (MissingParameterException ex) { - assertEquals("Missing required parameters: HOST, PORT", ex.getMessage()); - } - } - @Test public void testHelpRequestedFlagResetWhenParsing_staticMethod() { RequiredField requiredField = CommandLine.populateCommand(new RequiredField(), "-?"); assertTrue("help requested", requiredField.isHelpRequested); @@ -1090,6 +956,9 @@ public class CommandLineTest { compact = CommandLine.populateCommand(new CompactFields(), "-r -v -oout p1 p2".split(" ")); verifyCompact(compact, true, true, "out", fileArray("p1", "p2")); + compact = CommandLine.populateCommand(new CompactFields(), "-rv -o out p1 p2".split(" ")); //#233 + verifyCompact(compact, true, true, "out", fileArray("p1", "p2")); + compact = CommandLine.populateCommand(new CompactFields(), "-oout -r -v p1 p2".split(" ")); verifyCompact(compact, true, true, "out", fileArray("p1", "p2")); @@ -1147,7 +1016,7 @@ public class CommandLineTest { @Test public void testShortOptionsWithSeparatorButNoValueAssignsEmptyStringEvenIfNotLast() { CompactFields compact = CommandLine.populateCommand(new CompactFields(), "-ro= -v".split(" ")); - verifyCompact(compact, true, true, "", null); + verifyCompact(compact, false, true, "-v", null); } @Test public void testShortOptionsWithColonSeparatorButNoValueAssignsEmptyStringEvenIfNotLast() { @@ -1155,11 +1024,33 @@ public class CommandLineTest { CommandLine cmd = new CommandLine(compact); cmd.setSeparator(":"); cmd.parse("-ro: -v".split(" ")); + verifyCompact(compact, false, true, "-v", null); + } + @Test + public void testShortOptionsWithSeparatorButNoValueFailsIfValueRequired() { + try { + CommandLine.populateCommand(new CompactFields(), "-rvo=".split(" ")); + fail("Expected exception"); + } catch (ParameterException ex) { + assertEquals("Missing required parameter for option '-o' (<outputFile>)", ex.getMessage()); + } + } + @Test + public void testShortOptionsWithSeparatorButNoValueAssignsQuotedEmptyStringEvenIfNotLast() { + CompactFields compact = CommandLine.populateCommand(new CompactFields(), "-ro=\"\" -v".split(" ")); verifyCompact(compact, true, true, "", null); } @Test - public void testShortOptionsWithSeparatorButNoValueAssignsEmptyStringIfLast() { - CompactFields compact = CommandLine.populateCommand(new CompactFields(), "-rvo=".split(" ")); + public void testShortOptionsWithColonSeparatorButNoValueAssignsQuotedEmptyStringEvenIfNotLast() { + CompactFields compact = new CompactFields(); + CommandLine cmd = new CommandLine(compact); + cmd.setSeparator(":"); + cmd.parse("-ro:\"\" -v".split(" ")); + verifyCompact(compact, true, true, "", null); + } + @Test + public void testShortOptionsWithSeparatorButNoValueAssignsEmptyQuotedStringIfLast() { + CompactFields compact = CommandLine.populateCommand(new CompactFields(), "-rvo=\"\"".split(" ")); verifyCompact(compact, true, true, "", null); } @@ -1197,19 +1088,19 @@ public class CommandLineTest { "[picocli INFO] Found end-of-options delimiter '--'. Treating remainder as positional parameters.%n" + "[picocli DEBUG] Processing next arg as a positional parameter at index=0. Remainder=[-r, -v, p1, p2]%n" + "[picocli DEBUG] Position 0 is in index range 0..*. Trying to assign args to java.io.File[] %1$s$CompactFields.inputFiles, arity=0..1%n" + - "[picocli INFO] Adding [-r] to File[] field 'CompactFields.inputFiles' for args[0..*]%n" + + "[picocli INFO] Adding [-r] to File[] field 'CompactFields.inputFiles' for args[0..*] at position 0%n" + "[picocli DEBUG] Consumed 1 arguments, moving position to index 1.%n" + "[picocli DEBUG] Processing next arg as a positional parameter at index=1. Remainder=[-v, p1, p2]%n" + "[picocli DEBUG] Position 1 is in index range 0..*. Trying to assign args to java.io.File[] %1$s$CompactFields.inputFiles, arity=0..1%n" + - "[picocli INFO] Adding [-v] to File[] field 'CompactFields.inputFiles' for args[0..*]%n" + + "[picocli INFO] Adding [-v] to File[] field 'CompactFields.inputFiles' for args[0..*] at position 1%n" + "[picocli DEBUG] Consumed 1 arguments, moving position to index 2.%n" + "[picocli DEBUG] Processing next arg as a positional parameter at index=2. Remainder=[p1, p2]%n" + "[picocli DEBUG] Position 2 is in index range 0..*. Trying to assign args to java.io.File[] %1$s$CompactFields.inputFiles, arity=0..1%n" + - "[picocli INFO] Adding [p1] to File[] field 'CompactFields.inputFiles' for args[0..*]%n" + + "[picocli INFO] Adding [p1] to File[] field 'CompactFields.inputFiles' for args[0..*] at position 2%n" + "[picocli DEBUG] Consumed 1 arguments, moving position to index 3.%n" + "[picocli DEBUG] Processing next arg as a positional parameter at index=3. Remainder=[p2]%n" + "[picocli DEBUG] Position 3 is in index range 0..*. Trying to assign args to java.io.File[] %1$s$CompactFields.inputFiles, arity=0..1%n" + - "[picocli INFO] Adding [p2] to File[] field 'CompactFields.inputFiles' for args[0..*]%n" + + "[picocli INFO] Adding [p2] to File[] field 'CompactFields.inputFiles' for args[0..*] at position 3%n" + "[picocli DEBUG] Consumed 1 arguments, moving position to index 4.%n", CommandLineTest.class.getName(), new File("/home/rpopma/picocli")); String actual = new String(baos.toByteArray(), "UTF8"); @@ -1254,461 +1145,6 @@ public class CommandLineTest { assertArrayEquals(new int[] {1, 2, 3, 4}, params.intParams); } - @Test - public void testArityConstructor_fixedRange() { - Range arity = new Range(1, 23, false, false, null); - assertEquals("min", 1, arity.min); - assertEquals("max", 23, arity.max); - assertEquals("1..23", arity.toString()); - assertEquals(Range.valueOf("1..23"), arity); - } - @Test - public void testArityConstructor_variableRange() { - Range arity = new Range(1, Integer.MAX_VALUE, true, false, null); - assertEquals("min", 1, arity.min); - assertEquals("max", Integer.MAX_VALUE, arity.max); - assertEquals("1..*", arity.toString()); - assertEquals(Range.valueOf("1..*"), arity); - } - @Test - public void testArityForOption_booleanFieldImplicitArity0() throws Exception { - Range arity = Range.optionArity(SupportedTypes.class.getDeclaredField("booleanField")); - assertEquals(Range.valueOf("0"), arity); - assertEquals("0", arity.toString()); - } - @Test - public void testArityForOption_intFieldImplicitArity1() throws Exception { - Range arity = Range.optionArity(SupportedTypes.class.getDeclaredField("intField")); - assertEquals(Range.valueOf("1"), arity); - assertEquals("1", arity.toString()); - } - @Test - public void testArityForOption_isExplicitlyDeclaredValue() throws Exception { - Range arity = Range.optionArity(EnumParams.class.getDeclaredField("timeUnitList")); - assertEquals(Range.valueOf("3"), arity); - assertEquals("3", arity.toString()); - } - @Test - public void testArityForOption_listFieldImplicitArity1() throws Exception { - class ImplicitList { @Option(names = "-a") List<Integer> listIntegers; } - Range arity = Range.optionArity(ImplicitList.class.getDeclaredField("listIntegers")); - assertEquals(Range.valueOf("1"), arity); - assertEquals("1", arity.toString()); - } - @Test - public void testArityForOption_arrayFieldImplicitArity1() throws Exception { - class ImplicitList { @Option(names = "-a") int[] intArray; } - Range arity = Range.optionArity(ImplicitList.class.getDeclaredField("intArray")); - assertEquals(Range.valueOf("1"), arity); - assertEquals("1", arity.toString()); - } - @Test - public void testArityForParameters_booleanFieldImplicitArity1() throws Exception { - class ImplicitBoolField { @Parameters boolean boolSingleValue; } - Range arity = Range.parameterArity(ImplicitBoolField.class.getDeclaredField("boolSingleValue")); - assertEquals(Range.valueOf("1"), arity); - assertEquals("1", arity.toString()); - } - @Test - public void testArityForParameters_intFieldImplicitArity1() throws Exception { - class ImplicitSingleField { @Parameters int intSingleValue; } - Range arity = Range.parameterArity(ImplicitSingleField.class.getDeclaredField("intSingleValue")); - assertEquals(Range.valueOf("1"), arity); - assertEquals("1", arity.toString()); - } - @Test - public void testArityForParameters_listFieldImplicitArity0_1() throws Exception { - Range arity = Range.parameterArity(ListPositionalParams.class.getDeclaredField("list")); - assertEquals(Range.valueOf("0..1"), arity); - assertEquals("0..1", arity.toString()); - } - @Test - public void testArityForParameters_arrayFieldImplicitArity0_1() throws Exception { - Range arity = Range.parameterArity(CompactFields.class.getDeclaredField("inputFiles")); - assertEquals(Range.valueOf("0..1"), arity); - assertEquals("0..1", arity.toString()); - } - @Test - public void testArrayOptionsWithArity0_nConsumeAllArguments() { - final double[] DEFAULT_PARAMS = new double[] {1, 2}; - class ArrayOptionsArity0_nAndParameters { - @Parameters double[] doubleParams = DEFAULT_PARAMS; - @Option(names = "-doubles", arity = "0..*") double[] doubleOptions; - } - ArrayOptionsArity0_nAndParameters - params = CommandLine.populateCommand(new ArrayOptionsArity0_nAndParameters(), "-doubles 1.1 2.2 3.3 4.4".split(" ")); - assertArrayEquals(Arrays.toString(params.doubleOptions), - new double[] {1.1, 2.2, 3.3, 4.4}, params.doubleOptions, 0.000001); - assertArrayEquals(DEFAULT_PARAMS, params.doubleParams, 0.000001); - } - - @Test - public void testArrayOptionsWithArity1_nConsumeAllArguments() { - class ArrayOptionsArity1_nAndParameters { - @Parameters double[] doubleParams; - @Option(names = "-doubles", arity = "1..*") double[] doubleOptions; - } - ArrayOptionsArity1_nAndParameters - params = CommandLine.populateCommand(new ArrayOptionsArity1_nAndParameters(), "-doubles 1.1 2.2 3.3 4.4".split(" ")); - assertArrayEquals(Arrays.toString(params.doubleOptions), - new double[] {1.1, 2.2, 3.3, 4.4}, params.doubleOptions, 0.000001); - assertArrayEquals(null, params.doubleParams, 0.000001); - } - - @Test - public void testArrayOptionsWithArity2_nConsumeAllArguments() { - class ArrayOptionsArity2_nAndParameters { - @Parameters double[] doubleParams; - @Option(names = "-doubles", arity = "2..*") double[] doubleOptions; - } - ArrayOptionsArity2_nAndParameters - params = CommandLine.populateCommand(new ArrayOptionsArity2_nAndParameters(), "-doubles 1.1 2.2 3.3 4.4".split(" ")); - assertArrayEquals(Arrays.toString(params.doubleOptions), - new double[] {1.1, 2.2, 3.3, 4.4}, params.doubleOptions, 0.000001); - assertArrayEquals(null, params.doubleParams, 0.000001); - } - - @Test - public void testArrayOptionArity2_nConsumesAllArgumentsUpToClusteredOption() { - class ArrayOptionsArity2_nAndParameters { - @Parameters String[] stringParams; - @Option(names = "-s", arity = "2..*") String[] stringOptions; - @Option(names = "-v") boolean verbose; - @Option(names = "-f") File file; - } - ArrayOptionsArity2_nAndParameters - params = CommandLine.populateCommand(new ArrayOptionsArity2_nAndParameters(), "-s 1.1 2.2 3.3 4.4 -vfFILE 5.5".split(" ")); - assertArrayEquals(Arrays.toString(params.stringOptions), - new String[] {"1.1", "2.2", "3.3", "4.4"}, params.stringOptions); - assertTrue(params.verbose); - assertEquals(new File("FILE"), params.file); - assertArrayEquals(new String[] {"5.5"}, params.stringParams); - } - - @Test - public void testArrayOptionArity2_nConsumesAllArgumentIncludingQuotedSimpleOption() { - class ArrayOptionArity2_nAndParameters { - @Parameters String[] stringParams; - @Option(names = "-s", arity = "2..*") String[] stringOptions; - @Option(names = "-v") boolean verbose; - @Option(names = "-f") File file; - } - ArrayOptionArity2_nAndParameters - params = CommandLine.populateCommand(new ArrayOptionArity2_nAndParameters(), "-s 1.1 2.2 3.3 4.4 \"-v\" \"-f\" \"FILE\" 5.5".split(" ")); - assertArrayEquals(Arrays.toString(params.stringOptions), - new String[] {"1.1", "2.2", "3.3", "4.4", "-v", "-f", "FILE", "5.5"}, params.stringOptions); - assertFalse("verbose", params.verbose); - assertNull("file", params.file); - assertArrayEquals(null, params.stringParams); - } - - @Test - public void testArrayOptionArity2_nConsumesAllArgumentIncludingQuotedClusteredOption() { - class ArrayOptionArity2_nAndParameters { - @Parameters String[] stringParams; - @Option(names = "-s", arity = "2..*") String[] stringOptions; - @Option(names = "-v") boolean verbose; - @Option(names = "-f") File file; - } - ArrayOptionArity2_nAndParameters - params = CommandLine.populateCommand(new ArrayOptionArity2_nAndParameters(), "-s 1.1 2.2 3.3 4.4 \"-vfFILE\" 5.5".split(" ")); - assertArrayEquals(Arrays.toString(params.stringOptions), - new String[] {"1.1", "2.2", "3.3", "4.4", "-vfFILE", "5.5"}, params.stringOptions); - assertFalse("verbose", params.verbose); - assertNull("file", params.file); - assertArrayEquals(null, params.stringParams); - } - - @Test - public void testArrayOptionArity2_nConsumesAllArgumentsUpToNextSimpleOption() { - class ArrayOptionArity2_nAndParameters { - @Parameters double[] doubleParams; - @Option(names = "-s", arity = "2..*") String[] stringOptions; - @Option(names = "-v") boolean verbose; - @Option(names = "-f") File file; - } - ArrayOptionArity2_nAndParameters - params = CommandLine.populateCommand(new ArrayOptionArity2_nAndParameters(), "-s 1.1 2.2 3.3 4.4 -v -f=FILE 5.5".split(" ")); - assertArrayEquals(Arrays.toString(params.stringOptions), - new String[] {"1.1", "2.2", "3.3", "4.4"}, params.stringOptions); - assertTrue(params.verbose); - assertEquals(new File("FILE"), params.file); - assertArrayEquals(new double[] {5.5}, params.doubleParams, 0.000001); - } - - @Test - public void testArrayOptionArity2_nConsumesAllArgumentsUpToNextOptionWithAttachment() { - class ArrayOptionArity2_nAndParameters { - @Parameters double[] doubleParams; - @Option(names = "-s", arity = "2..*") String[] stringOptions; - @Option(names = "-v") boolean verbose; - @Option(names = "-f") File file; - } - ArrayOptionArity2_nAndParameters - params = CommandLine.populateCommand(new ArrayOptionArity2_nAndParameters(), "-s 1.1 2.2 3.3 4.4 -f=FILE -v 5.5".split(" ")); - assertArrayEquals(Arrays.toString(params.stringOptions), - new String[] {"1.1", "2.2", "3.3", "4.4"}, params.stringOptions); - assertTrue(params.verbose); - assertEquals(new File("FILE"), params.file); - assertArrayEquals(new double[] {5.5}, params.doubleParams, 0.000001); - } - - @Test - public void testArrayOptionArityNConsumeAllArguments() { - class ArrayOptionArityNAndParameters { - @Parameters char[] charParams; - @Option(names = "-chars", arity = "*") char[] charOptions; - } - ArrayOptionArityNAndParameters - params = CommandLine.populateCommand(new ArrayOptionArityNAndParameters(), "-chars a b c d".split(" ")); - assertArrayEquals(Arrays.toString(params.charOptions), - new char[] {'a', 'b', 'c', 'd'}, params.charOptions); - assertArrayEquals(null, params.charParams); - } - - private static class BooleanOptionsArity0_nAndParameters { - @Parameters String[] params; - @Option(names = "-bool", arity = "0..*") boolean bool; - @Option(names = {"-v", "-other"}, arity="0..*") boolean vOrOther; - @Option(names = "-r") boolean rBoolean; - } - @Test - public void testBooleanOptionsArity0_nConsume1ArgumentIfPossible() { // ignores varargs - BooleanOptionsArity0_nAndParameters - params = CommandLine.populateCommand(new BooleanOptionsArity0_nAndParameters(), "-bool false false true".split(" ")); - assertFalse(params.bool); - assertArrayEquals(new String[]{ "false", "true"}, params.params); - } - @Test - public void testBooleanOptionsArity0_nRequiresNoArgument() { // ignores varargs - BooleanOptionsArity0_nAndParameters - params = CommandLine.populateCommand(new BooleanOptionsArity0_nAndParameters(), "-bool".split(" ")); - assertTrue(params.bool); - } - @Test - public void testBooleanOptionsArity0_nConsume0ArgumentsIfNextArgIsOption() { // ignores varargs - BooleanOptionsArity0_nAndParameters - params = CommandLine.populateCommand(new BooleanOptionsArity0_nAndParameters(), "-bool -other".split(" ")); - assertTrue(params.bool); - assertTrue(params.vOrOther); - } - @Test - public void testBooleanOptionsArity0_nConsume0ArgumentsIfNextArgIsParameter() { // ignores varargs - BooleanOptionsArity0_nAndParameters - params = CommandLine.populateCommand(new BooleanOptionsArity0_nAndParameters(), "-bool 123 -other".split(" ")); - assertTrue(params.bool); - assertTrue(params.vOrOther); - assertArrayEquals(new String[]{ "123"}, params.params); - } - @Test - public void testBooleanOptionsArity0_nFailsIfAttachedParamNotABoolean() { // ignores varargs - try { - CommandLine.populateCommand(new BooleanOptionsArity0_nAndParameters(), "-bool=123 -other".split(" ")); - fail("was able to assign 123 to boolean"); - } catch (ParameterException ex) { - assertEquals("'123' is not a boolean for option '-bool'", ex.getMessage()); - } - } - @Test - public void testBooleanOptionsArity0_nShortFormFailsIfAttachedParamNotABoolean() { // ignores varargs - try { - CommandLine.populateCommand(new BooleanOptionsArity0_nAndParameters(), "-rv234 -bool".split(" ")); - fail("Expected exception"); - } catch (UnmatchedArgumentException ok) { - assertEquals("Unmatched argument [-234]", ok.getMessage()); - } - } - @Test - public void testBooleanOptionsArity0_nShortFormFailsIfAttachedParamNotABooleanWithUnmatchedArgsAllowed() { // ignores varargs - setTraceLevel("OFF"); - CommandLine cmd = new CommandLine(new BooleanOptionsArity0_nAndParameters()).setUnmatchedArgumentsAllowed(true); - cmd.parse("-rv234 -bool".split(" ")); - assertEquals(Arrays.asList("-234"), cmd.getUnmatchedArguments()); - } - @Test - public void testBooleanOptionsArity0_nShortFormFailsIfAttachedWithSepParamNotABoolean() { // ignores varargs - try { - CommandLine.populateCommand(new BooleanOptionsArity0_nAndParameters(), "-rv=234 -bool".split(" ")); - fail("was able to assign 234 to boolean"); - } catch (ParameterException ex) { - assertEquals("'234' is not a boolean for option '-v'", ex.getMessage()); - } - } - - private static class BooleanOptionsArity1_nAndParameters { - @Parameters boolean[] boolParams; - @Option(names = "-bool", arity = "1..*") boolean aBoolean; - } - @Test - public void testBooleanOptionsArity1_nConsume1Argument() { // ignores varargs - BooleanOptionsArity1_nAndParameters - params = CommandLine.populateCommand(new BooleanOptionsArity1_nAndParameters(), "-bool false false true".split(" ")); - assertFalse(params.aBoolean); - assertArrayEquals(new boolean[]{ false, true}, params.boolParams); - - params = CommandLine.populateCommand(new BooleanOptionsArity1_nAndParameters(), "-bool true false true".split(" ")); - assertTrue(params.aBoolean); - assertArrayEquals(new boolean[]{ false, true}, params.boolParams); - } - @Test - public void testBooleanOptionsArity1_nCaseInsensitive() { // ignores varargs - BooleanOptionsArity1_nAndParameters - params = CommandLine.populateCommand(new BooleanOptionsArity1_nAndParameters(), "-bool fAlsE false true".split(" ")); - assertFalse(params.aBoolean); - assertArrayEquals(new boolean[]{ false, true}, params.boolParams); - - params = CommandLine.populateCommand(new BooleanOptionsArity1_nAndParameters(), "-bool FaLsE false true".split(" ")); - assertFalse(params.aBoolean); - assertArrayEquals(new boolean[]{ false, true}, params.boolParams); - - params = CommandLine.populateCommand(new BooleanOptionsArity1_nAndParameters(), "-bool tRuE false true".split(" ")); - assertTrue(params.aBoolean); - assertArrayEquals(new boolean[]{ false, true}, params.boolParams); - } - @Test - public void testBooleanOptionsArity1_nErrorIfValueNotTrueOrFalse() { // ignores varargs - try { - CommandLine.populateCommand(new BooleanOptionsArity1_nAndParameters(), "-bool abc".split(" ")); - fail("Invalid format abc was accepted for boolean"); - } catch (ParameterException expected) { - assertEquals("'abc' is not a boolean for option '-bool'", expected.getMessage()); - } - } - @Test - public void testBooleanOptionsArity1_nErrorIfValueMissing() { - try { - CommandLine.populateCommand(new BooleanOptionsArity1_nAndParameters(), "-bool".split(" ")); - fail("Missing param was accepted for boolean with arity=1"); - } catch (ParameterException expected) { - assertEquals("Missing required parameter for option '-bool' at index 0 (<aBoolean>)", expected.getMessage()); - } - } - - @Test - public void testBooleanOptionArity0Consumes0Arguments() { - class BooleanOptionArity0AndParameters { - @Parameters boolean[] boolParams; - @Option(names = "-bool", arity = "0") boolean aBoolean; - } - BooleanOptionArity0AndParameters - params = CommandLine.populateCommand(new BooleanOptionArity0AndParameters(), "-bool true false true".split(" ")); - assertTrue(params.aBoolean); - assertArrayEquals(new boolean[]{true, false, true}, params.boolParams); - } - - @Test - public void testIntOptionArity1_nConsumes1Argument() { // ignores varargs - class IntOptionArity1_nAndParameters { - @Parameters int[] intParams; - @Option(names = "-int", arity = "1..*") int anInt; - } - IntOptionArity1_nAndParameters - params = CommandLine.populateCommand(new IntOptionArity1_nAndParameters(), "-int 23 42 7".split(" ")); - assertEquals(23, params.anInt); - assertArrayEquals(new int[]{ 42, 7}, params.intParams); - } - - @Test - public void testArrayOptionsWithArity0Consume0Arguments() { - class OptionsArray0ArityAndParameters { - @Parameters double[] doubleParams; - @Option(names = "-doubles", arity = "0") double[] doubleOptions; - } - OptionsArray0ArityAndParameters - params = CommandLine.populateCommand(new OptionsArray0ArityAndParameters(), "-doubles 1.1 2.2 3.3 4.4".split(" ")); - assertArrayEquals(Arrays.toString(params.doubleOptions), - new double[0], params.doubleOptions, 0.000001); - assertArrayEquals(new double[]{1.1, 2.2, 3.3, 4.4}, params.doubleParams, 0.000001); - } - - @Test - public void testArrayOptionWithArity1Consumes1Argument() { - class Options1ArityAndParameters { - @Parameters double[] doubleParams; - @Option(names = "-doubles", arity = "1") double[] doubleOptions; - } - Options1ArityAndParameters - params = CommandLine.populateCommand(new Options1ArityAndParameters(), "-doubles 1.1 2.2 3.3 4.4".split(" ")); - assertArrayEquals(Arrays.toString(params.doubleOptions), - new double[] {1.1}, params.doubleOptions, 0.000001); - assertArrayEquals(new double[]{2.2, 3.3, 4.4}, params.doubleParams, 0.000001); - - // repeated occurrence - params = CommandLine.populateCommand(new Options1ArityAndParameters(), "-doubles 1.1 -doubles 2.2 -doubles 3.3 4.4".split(" ")); - assertArrayEquals(Arrays.toString(params.doubleOptions), - new double[] {1.1, 2.2, 3.3}, params.doubleOptions, 0.000001); - assertArrayEquals(new double[]{4.4}, params.doubleParams, 0.000001); - - } - - private static class ArrayOptionArity2AndParameters { - @Parameters double[] doubleParams; - @Option(names = "-doubles", arity = "2") double[] doubleOptions; - } - @Test - public void testArrayOptionWithArity2Consumes2Arguments() { - ArrayOptionArity2AndParameters - params = CommandLine.populateCommand(new ArrayOptionArity2AndParameters(), "-doubles 1.1 2.2 3.3 4.4".split(" ")); - assertArrayEquals(Arrays.toString(params.doubleOptions), - new double[] {1.1, 2.2, }, params.doubleOptions, 0.000001); - assertArrayEquals(new double[]{3.3, 4.4}, params.doubleParams, 0.000001); - - // repeated occurrence - params = CommandLine.populateCommand(new ArrayOptionArity2AndParameters(), "-doubles 1.1 2.2 -doubles 3.3 4.4 0".split(" ")); - assertArrayEquals(Arrays.toString(params.doubleOptions), - new double[] {1.1, 2.2, 3.3, 4.4 }, params.doubleOptions, 0.000001); - assertArrayEquals(new double[]{ 0.0 }, params.doubleParams, 0.000001); - } - @Test - public void testArrayOptionsWithArity2Consume2ArgumentsEvenIfFirstIsAttached() { - ArrayOptionArity2AndParameters - params = CommandLine.populateCommand(new ArrayOptionArity2AndParameters(), "-doubles=1.1 2.2 3.3 4.4".split(" ")); - assertArrayEquals(Arrays.toString(params.doubleOptions), - new double[] {1.1, 2.2, }, params.doubleOptions, 0.000001); - assertArrayEquals(new double[]{3.3, 4.4}, params.doubleParams, 0.000001); - - // repeated occurrence - params = CommandLine.populateCommand(new ArrayOptionArity2AndParameters(), "-doubles=1.1 2.2 -doubles=3.3 4.4 0".split(" ")); - assertArrayEquals(Arrays.toString(params.doubleOptions), - new double[] {1.1, 2.2, 3.3, 4.4}, params.doubleOptions, 0.000001); - assertArrayEquals(new double[]{0}, params.doubleParams, 0.000001); - } - /** Arity should not limit the total number of values put in an array or collection #191 */ - @Test - public void testArrayOptionsWithArity2MayContainMoreThan2Values() { - ArrayOptionArity2AndParameters - params = CommandLine.populateCommand(new ArrayOptionArity2AndParameters(), "-doubles=1 2 -doubles 3 4 -doubles 5 6".split(" ")); - assertArrayEquals(Arrays.toString(params.doubleOptions), - new double[] {1, 2, 3, 4, 5, 6 }, params.doubleOptions, 0.000001); - assertArrayEquals(null, params.doubleParams, 0.000001); - } - - @Test - public void testArrayOptionWithoutArityConsumesOneArgument() { // #192 - class OptionsNoArityAndParameters { - @Parameters char[] charParams; - @Option(names = "-chars") char[] charOptions; - } - OptionsNoArityAndParameters - params = CommandLine.populateCommand(new OptionsNoArityAndParameters(), "-chars a b c d".split(" ")); - assertArrayEquals(Arrays.toString(params.charOptions), - new char[] {'a', }, params.charOptions); - assertArrayEquals(Arrays.toString(params.charParams), new char[] {'b', 'c', 'd'}, params.charParams); - - // repeated occurrence - params = CommandLine.populateCommand(new OptionsNoArityAndParameters(), "-chars a -chars b c d".split(" ")); - assertArrayEquals(Arrays.toString(params.charOptions), - new char[] {'a', 'b', }, params.charOptions); - assertArrayEquals(Arrays.toString(params.charParams), new char[] {'c', 'd'}, params.charParams); - - try { - CommandLine.populateCommand(new OptionsNoArityAndParameters(), "-chars".split(" ")); - fail("expected MissingParameterException"); - } catch (MissingParameterException ok) { - assertEquals("Missing required parameter for option '-chars' (<charOptions>)", ok.getMessage()); - } - } - @Test(expected = MissingTypeConverterException.class) public void testMissingTypeConverter() { class MissingConverter { @@ -1718,191 +1154,6 @@ public class CommandLineTest { } @Test - public void testArrayParametersWithDefaultArity() { - class ArrayParamsDefaultArity { - @Parameters - List<String> params; - } - ArrayParamsDefaultArity params = CommandLine.populateCommand(new ArrayParamsDefaultArity(), "a", "b", "c"); - assertEquals(Arrays.asList("a", "b", "c"), params.params); - - params = CommandLine.populateCommand(new ArrayParamsDefaultArity(), "a"); - assertEquals(Arrays.asList("a"), params.params); - - params = CommandLine.populateCommand(new ArrayParamsDefaultArity()); - assertEquals(null, params.params); - } - - @Test - public void testArrayParametersWithArityMinusOneToN() { - class ArrayParamsNegativeArity { - @Parameters(arity = "-1..*") - List<String> params; - } - ArrayParamsNegativeArity params = CommandLine.populateCommand(new ArrayParamsNegativeArity(), "a", "b", "c"); - assertEquals(Arrays.asList("a", "b", "c"), params.params); - - params = CommandLine.populateCommand(new ArrayParamsNegativeArity(), "a"); - assertEquals(Arrays.asList("a"), params.params); - - params = CommandLine.populateCommand(new ArrayParamsNegativeArity()); - assertEquals(null, params.params); - } - - @Test - public void testArrayParametersArity0_n() { - class ArrayParamsArity0_n { - @Parameters(arity = "0..*") - List<String> params; - } - ArrayParamsArity0_n params = CommandLine.populateCommand(new ArrayParamsArity0_n(), "a", "b", "c"); - assertEquals(Arrays.asList("a", "b", "c"), params.params); - - params = CommandLine.populateCommand(new ArrayParamsArity0_n(), "a"); - assertEquals(Arrays.asList("a"), params.params); - - params = CommandLine.populateCommand(new ArrayParamsArity0_n()); - assertEquals(null, params.params); - } - - @Test - public void testArrayParametersArity1_n() { - class ArrayParamsArity1_n { - @Parameters(arity = "1..*") - List<String> params; - } - ArrayParamsArity1_n params = CommandLine.populateCommand(new ArrayParamsArity1_n(), "a", "b", "c"); - assertEquals(Arrays.asList("a", "b", "c"), params.params); - - params = CommandLine.populateCommand(new ArrayParamsArity1_n(), "a"); - assertEquals(Arrays.asList("a"), params.params); - - try { - params = CommandLine.populateCommand(new ArrayParamsArity1_n()); - fail("Should not accept input with missing parameter"); - } catch (MissingParameterException ex) { - assertEquals("Missing required parameters at positions 0..*: <params>", ex.getMessage()); - } - } - - @Test - public void testArrayParametersArity2_n() { - class ArrayParamsArity2_n { - @Parameters(arity = "2..*") - List<String> params; - } - ArrayParamsArity2_n params = CommandLine.populateCommand(new ArrayParamsArity2_n(), "a", "b", "c"); - assertEquals(Arrays.asList("a", "b", "c"), params.params); - - try { - params = CommandLine.populateCommand(new ArrayParamsArity2_n(), "a"); - fail("Should not accept input with missing parameter"); - } catch (MissingParameterException ex) { - assertEquals("positional parameter at index 0..* (<params>) requires at least 2 values, but only 1 were specified: [a]", ex.getMessage()); - } - - try { - params = CommandLine.populateCommand(new ArrayParamsArity2_n()); - fail("Should not accept input with missing parameter"); - } catch (MissingParameterException ex) { - assertEquals("positional parameter at index 0..* (<params>) requires at least 2 values, but none were specified.", ex.getMessage()); - } - } - - @Test - public void testNonVarargArrayParametersWithNegativeArityConsumesZeroArguments() { - class NonVarArgArrayParamsNegativeArity { - @Parameters(arity = "-1") - List<String> params; - } - try { - CommandLine.populateCommand(new NonVarArgArrayParamsNegativeArity(), "a", "b", "c"); - fail("Expected UnmatchedArgumentException"); - } catch (UnmatchedArgumentException ex) { - assertEquals("Unmatched arguments [a, b, c]", ex.getMessage()); - } - try { - CommandLine.populateCommand(new NonVarArgArrayParamsNegativeArity(), "a"); - fail("Expected UnmatchedArgumentException"); - } catch (UnmatchedArgumentException ex) { - assertEquals("Unmatched argument [a]", ex.getMessage()); - } - NonVarArgArrayParamsNegativeArity params = CommandLine.populateCommand(new NonVarArgArrayParamsNegativeArity()); - assertEquals(null, params.params); - } - - @Test - public void testNonVarargArrayParametersWithArity0() { - class NonVarArgArrayParamsZeroArity { - @Parameters(arity = "0") - List<String> params; - } - try { - CommandLine.populateCommand(new NonVarArgArrayParamsZeroArity(), "a", "b", "c"); - fail("Expected UnmatchedArgumentException"); - } catch (UnmatchedArgumentException ex) { - assertEquals("Unmatched arguments [a, b, c]", ex.getMessage()); - } - try { - CommandLine.populateCommand(new NonVarArgArrayParamsZeroArity(), "a"); - fail("Expected UnmatchedArgumentException"); - } catch (UnmatchedArgumentException ex) { - assertEquals("Unmatched argument [a]", ex.getMessage()); - } - NonVarArgArrayParamsZeroArity params = CommandLine.populateCommand(new NonVarArgArrayParamsZeroArity()); - assertEquals(null, params.params); - } - - @Test - public void testNonVarargArrayParametersWithArity1() { - class NonVarArgArrayParamsArity1 { - @Parameters(arity = "1") - List<String> params; - } - NonVarArgArrayParamsArity1 actual = CommandLine.populateCommand(new NonVarArgArrayParamsArity1(), "a", "b", "c"); - assertEquals(Arrays.asList("a", "b", "c"), actual.params); - - NonVarArgArrayParamsArity1 params = CommandLine.populateCommand(new NonVarArgArrayParamsArity1(), "a"); - assertEquals(Arrays.asList("a"), params.params); - - try { - params = CommandLine.populateCommand(new NonVarArgArrayParamsArity1()); - fail("Should not accept input with missing parameter"); - } catch (MissingParameterException ex) { - assertEquals("Missing required parameter: <params>", ex.getMessage()); - } - } - - @Test - public void testNonVarargArrayParametersWithArity2() { - class NonVarArgArrayParamsArity2 { - @Parameters(arity = "2") - List<String> params; - } - NonVarArgArrayParamsArity2 params = null; - try { - CommandLine.populateCommand(new NonVarArgArrayParamsArity2(), "a", "b", "c"); - fail("expected MissingParameterException"); - } catch (MissingParameterException ex) { - assertEquals("positional parameter at index 0..* (<params>) requires at least 2 values, but only 1 were specified: [c]", ex.getMessage()); - } - - try { - params = CommandLine.populateCommand(new NonVarArgArrayParamsArity2(), "a"); - fail("Should not accept input with missing parameter"); - } catch (MissingParameterException ex) { - assertEquals("positional parameter at index 0..* (<params>) requires at least 2 values, but only 1 were specified: [a]", ex.getMessage()); - } - - try { - params = CommandLine.populateCommand(new NonVarArgArrayParamsArity2()); - fail("Should not accept input with missing parameter"); - } catch (MissingParameterException ex) { - assertEquals("positional parameter at index 0..* (<params>) requires at least 2 values, but none were specified.", ex.getMessage()); - } - } - - @Test public void testParametersDeclaredOutOfOrderWithNoArgs() { class WithParams { @Parameters(index = "1") String param1; @@ -2701,9 +1952,9 @@ public class CommandLineTest { "[picocli INFO] Setting File field 'Git.gitDir' to '%s' (was 'null') for option --git-dir%n" + "[picocli INFO] Adding [Fixed typos] to List<String> field 'GitCommit.message' for option -m%n" + "[picocli INFO] Found end-of-options delimiter '--'. Treating remainder as positional parameters.%n" + - "[picocli INFO] Adding [src1.java] to List<File> field 'GitCommit.files' for args[0..*]%n" + - "[picocli INFO] Adding [src2.java] to List<File> field 'GitCommit.files' for args[0..*]%n" + - "[picocli INFO] Adding [src3.java] to List<File> field 'GitCommit.files' for args[0..*]%n", + "[picocli INFO] Adding [src1.java] to List<File> field 'GitCommit.files' for args[0..*] at position 0%n" + + "[picocli INFO] Adding [src2.java] to List<File> field 'GitCommit.files' for args[0..*] at position 1%n" + + "[picocli INFO] Adding [src3.java] to List<File> field 'GitCommit.files' for args[0..*] at position 2%n", new File("/home/rpopma/picocli")); String actual = new String(baos.toByteArray(), "UTF8"); //System.out.println(actual); @@ -2743,15 +1994,15 @@ public class CommandLineTest { "[picocli INFO] Found end-of-options delimiter '--'. Treating remainder as positional parameters.%n" + "[picocli DEBUG] Processing next arg as a positional parameter at index=0. Remainder=[src1.java, src2.java, src3.java]%n" + "[picocli DEBUG] Position 0 is in index range 0..*. Trying to assign args to java.util.List %1$s$GitCommit.files, arity=0..1%n" + - "[picocli INFO] Adding [src1.java] to List<File> field 'GitCommit.files' for args[0..*]%n" + + "[picocli INFO] Adding [src1.java] to List<File> field 'GitCommit.files' for args[0..*] at position 0%n" + "[picocli DEBUG] Consumed 1 arguments, moving position to index 1.%n" + "[picocli DEBUG] Processing next arg as a positional parameter at index=1. Remainder=[src2.java, src3.java]%n" + "[picocli DEBUG] Position 1 is in index range 0..*. Trying to assign args to java.util.List %1$s$GitCommit.files, arity=0..1%n" + - "[picocli INFO] Adding [src2.java] to List<File> field 'GitCommit.files' for args[0..*]%n" + + "[picocli INFO] Adding [src2.java] to List<File> field 'GitCommit.files' for args[0..*] at position 1%n" + "[picocli DEBUG] Consumed 1 arguments, moving position to index 2.%n" + "[picocli DEBUG] Processing next arg as a positional parameter at index=2. Remainder=[src3.java]%n" + "[picocli DEBUG] Position 2 is in index range 0..*. Trying to assign args to java.util.List %1$s$GitCommit.files, arity=0..1%n" + - "[picocli INFO] Adding [src3.java] to List<File> field 'GitCommit.files' for args[0..*]%n" + + "[picocli INFO] Adding [src3.java] to List<File> field 'GitCommit.files' for args[0..*] at position 2%n" + "[picocli DEBUG] Consumed 1 arguments, moving position to index 3.%n", Demo.class.getName(), new File("/home/rpopma/picocli")); String actual = new String(baos.toByteArray(), "UTF8"); @@ -2828,7 +2079,7 @@ public class CommandLineTest { static class CustomType implements ITypeConverter<CustomType> { private final String val; private CustomType(String val) { this.val = val; } - @Override public CustomType convert(String value) { return new CustomType(value); } + public CustomType convert(String value) { return new CustomType(value); } } private static CommandLine createNestedCommand() { CommandLine commandLine = new CommandLine(new MainCommand()); @@ -3222,8 +2473,7 @@ public class CommandLineTest { "Usage: <main class> [--foo-bar-baz=<foo>]\n" + " --foo-bar-baz=<foo> Default:\n" + " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + - " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + - "\n"; + " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"; assertEquals(expectedOutput, content); } @@ -3511,7 +2761,7 @@ public class CommandLineTest { "-d", "/path/to/file", "-e", "12345=67890", "-f", "12345=67.89", - "-g", "DAYS=12.34"); + "-g", "MILLISECONDS=12.34"); assertEquals(app.a.size(), 2); assertEquals(URI.create("/path"), app.a.get(8)); assertEquals(URI.create("/path/to/resource"), app.a.get(98765432)); @@ -3532,7 +2782,7 @@ public class CommandLineTest { assertEquals(67.89f, app.f.get(new Long(12345))); assertEquals(app.g.size(), 1); - assertEquals(12.34f, app.g.get(TimeUnit.DAYS)); + assertEquals(12.34f, app.g.get(TimeUnit.MILLISECONDS)); } @Test public void testUseTypeAttributeInsteadOfFieldType() { @@ -3671,6 +2921,7 @@ public class CommandLineTest { assertEquals("Unmatched argument [--ccd]", ex.getMessage()); } } + @Test public void test149OnlyUnmatchedOptionStoredOthersParsed() throws Exception { class App { @@ -3755,55 +3006,6 @@ public class CommandLineTest { } @Test - public void test130MixPositionalParamsWithOptions() { - @Command(name = "test-command", description = "tests help from a command script") - class Arg { - - @Parameters(description = "some parameters") - List<String> parameters; - - @Option(names = {"-cp", "--codepath"}, description = "the codepath") - List<String> codepath; - } - Arg result = CommandLine.populateCommand(new Arg(), "--codepath", "/usr/x.jar", "placeholder", "-cp", "/bin/y.jar", "another"); - assertEquals(Arrays.asList("/usr/x.jar", "/bin/y.jar"), result.codepath); - assertEquals(Arrays.asList("placeholder", "another"), result.parameters); - } - - @Test - public void test130MixPositionalParamsWithOptions1() { - class Arg { - @Parameters List<String> parameters; - @Option(names = "-o") List<String> options; - } - Arg result = CommandLine.populateCommand(new Arg(), "-o", "v1", "p1", "p2", "-o", "v2", "p3"); - assertEquals(Arrays.asList("v1", "v2"), result.options); - assertEquals(Arrays.asList("p1", "p2", "p3"), result.parameters); - } - - @Test - public void test130MixPositionalParamsWithOptionsArity() { - class Arg { - @Parameters(arity = "2") List<String> parameters; - @Option(names = "-o") List<String> options; - } - Arg result = CommandLine.populateCommand(new Arg(), "-o", "v1", "p1", "p2", "-o", "v2", "p3", "p4"); - assertEquals(Arrays.asList("v1", "v2"), result.options); - assertEquals(Arrays.asList("p1", "p2", "p3", "p4"), result.parameters); - - Arg result2 = CommandLine.populateCommand(new Arg(), "-o", "v1", "p1", "-o", "v2", "p3"); - assertEquals(Arrays.asList("v1"), result2.options); - assertEquals(Arrays.asList("p1", "-o", "v2", "p3"), result2.parameters); - - try { - CommandLine.populateCommand(new Arg(), "-o", "v1", "p1", "p2", "-o", "v2", "p3"); - fail("Expected MissingParameterException"); - } catch (MissingParameterException ex) { - assertEquals("positional parameter at index 0..* (<parameters>) requires at least 2 values, but only 1 were specified: [p3]", ex.getMessage()); - } - } - - @Test public void testIssue203InconsistentExceptions() { class Example { @Option(names = {"-h", "--help"}, help = true, // NOTE: this should be usageHelp = true @@ -3945,4 +3147,21 @@ public class CommandLineTest { assertEquals("OPT", ((Top) parsed.get(0).getCommand()).option); assertEquals("ABC", ((Sub207A) parsed.get(1).getCommand()).x); } + @Test + public void testIssue226EmptyStackWithClusteredOptions() { + class Options { + @Option(names = "-b") + private boolean buffered = false; + + @Option(names = "-o") + private boolean overwriteOutput = true; + + @Option(names = "-v") + private boolean verbose = false; + } + Options options = CommandLine.populateCommand(new Options(), "-bov"); + assertTrue(options.buffered); + assertFalse(options.overwriteOutput); + assertTrue(options.verbose); + } } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/23bcd257/log4j-core/src/test/java/org/apache/logging/log4j/core/tools/picocli/Demo.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/tools/picocli/Demo.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/tools/picocli/Demo.java index 6f593e2..73caa9d 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/tools/picocli/Demo.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/tools/picocli/Demo.java @@ -33,6 +33,9 @@ import java.util.concurrent.Callable; /** * Demonstrates picocli subcommands. + * <p> + * Banner ascii art thanks to <a href="http://patorjk.com/software/taag/">http://patorjk.com/software/taag/</a>. + * </p> */ @Command(name = "picocli.Demo", sortOptions = false, header = { http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/23bcd257/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 070e4a1..184432b 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -52,9 +52,6 @@ <action issue="LOG4J2-2100" dev="ggregory" type="fix"> LevelMixIn class for Jackson is coded incorrectly </action> - <action issue="LOG4J2-2088" dev="rpopma" type="update"> - Upgrade picocli to 2.0 from 0.9.8. - </action> <action issue="LOG4J2-2087" dev="rpopma" type="fix" due-to="Andy Gumbrecht"> Jansi now needs to be enabled explicitly (by setting system property `log4j.skipJansi` to `false`). To avoid causing problems for web applications, Log4j will no longer automatically try to load Jansi without explicit configuration. </action> @@ -64,6 +61,9 @@ <action issue="LOG4J2-2076" dev="mikes" type="update"> Split up log4j-nosql into one module per appender. </action> + <action issue="LOG4J2-2088" dev="rpopma" type="update"> + Upgrade picocli to 2.0.3 from 0.9.8. + </action> <action issue="LOG4J2-2062" dev="mikes" type="add" due-to="Jorge Sanchez"> Add possibility of sending the key of a message to Kafka using KafkaAppender. </action>