@Test(expected = InitializationException.class) public void testPopulateCommandRequiresAnnotatedCommand() { class App { } CommandLine.populateCommand(new App()); }
@Test public void testPotentiallyNestedOptionParsedCorrectly() { class MyOption { @Option(names = "-p") String path; } MyOption opt = CommandLine.populateCommand(new MyOption(), "-pa-p"); assertEquals("a-p", opt.path); opt = CommandLine.populateCommand(new MyOption(), "-p-ap"); assertEquals("-ap", opt.path); }
@Test public void testTimeFormatHHmmssDotSSSSupported() throws ParseException { SupportedTypes bean = CommandLine.populateCommand(new SupportedTypes(), "-Time", "23:59:58.123"); assertEquals("Time", new Time(new SimpleDateFormat("HH:mm:ss.SSS").parse("23:59:58.123").getTime()), bean.aTimeField); } @Test
@Test public void testPrimitiveParameters() { class PrimitiveIntParameters { @Parameters int[] intParams; } PrimitiveIntParameters params = CommandLine.populateCommand(new PrimitiveIntParameters(), "1 2 3 4".split(" ")); assertArrayEquals(new int[] {1, 2, 3, 4}, params.intParams); }
@Test public void testVarargCanConsumeNextValue() { class App { @Parameters(arity = "*") List<String> all; } App app1 = CommandLine.populateCommand(new App(), "--", "a", "b"); assertEquals(Arrays.asList("a", "b"), app1.all); }
@Test public void testVarargPositionalShouldCaptureDoubleDashAfterDoubleDash() { class Cmd { @Parameters(index = "0..*", arity = "*") List<String> params; } Cmd cmd = CommandLine.populateCommand(new Cmd(), "foo", "--", "--", "--"); assertEquals(Arrays.asList("foo", "--", "--"), cmd.params); }
@Test public void testSplitIgnoredInOptionSingleValueField() { class Args { @Option(names = "-a", split = ",") String value; } Args args = CommandLine.populateCommand(new Args(), "-a=a,b,c"); assertEquals("a,b,c", args.value); }
@Test public void testEnumTypeConversionSuceedsForValidInput() { EnumParams params = CommandLine.populateCommand(new EnumParams(), "-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); } @Test
@Test public void testMapArgumentsMustContainEquals2() { class App { @Parameters(split = "==") Map<String, String> map; } try { CommandLine.populateCommand(new App(), "a:c", "1:3"); } catch (UnmatchedArgumentException ex) { assertEquals("Unmatched arguments: a:c, 1:3", ex.getMessage()); } } }
@Test public void test70MultiplePositionalsConsumeSamePosition() { class App { @Parameters(index = "0..3") String[] posA; @Parameters(index = "2..4") String[] posB; @Unmatched String[] unmatched; } App app = CommandLine.populateCommand(new App(), "A B C D E F".split(" ")); assertArrayEquals(new String[]{"A", "B", "C", "D"}, app.posA); assertArrayEquals(new String[]{"C", "D", "E"}, app.posB); assertArrayEquals(new String[]{"F"}, app.unmatched); }
@Test public void testPositionalParamWithIndexGap_VariableRangeIndexNoGap() throws Exception { class NoGap { @Parameters(index = "0..*") String[] str0; @Parameters(index = "3") String str2; } NoGap noGap = CommandLine.populateCommand(new NoGap(),"val0", "val1", "val2", "val3"); assertArrayEquals(new String[] {"val0", "val1", "val2", "val3"}, noGap.str0); assertEquals("val3", noGap.str2); }
@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
private void assertMissing(String expected, Object command, String... args) { try { CommandLine.populateCommand(command, args); fail("Expected missing param exception"); } catch (MissingParameterException ex) { assertEquals(expected, ex.getMessage()); } }
@Test public void test285VarargPositionalShouldNotConsumeOptions() { class Cmd { @Option(names = "--alpha") String alpha; @Parameters(index = "0", arity = "1") String foo; @Parameters(index = "1..*", arity = "*") List<String> params; } Cmd cmd = CommandLine.populateCommand(new Cmd(), "foo", "xx", "--alpha", "--beta"); assertEquals("foo", cmd.foo); assertEquals("--beta", cmd.alpha); assertEquals(Arrays.asList("xx"), cmd.params); }
@Test public void test285VarargPositionalShouldConsumeOptionsAfterDoubleDash() { class Cmd { @Option(names = "--alpha") String alpha; @Parameters(index = "0", arity = "1") String foo; @Parameters(index = "1..*", arity = "*") List<String> params; } Cmd cmd = CommandLine.populateCommand(new Cmd(), "foo", "--", "xx", "--alpha", "--beta"); assertEquals("foo", cmd.foo); assertEquals(null, cmd.alpha); assertEquals(Arrays.asList("xx", "--alpha", "--beta"), cmd.params); }
@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
@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
@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 (CommandLine.ParameterException ex) { assertEquals("Invalid value for option '-bool': '123' is not a boolean", ex.getMessage()); } } @Test
@Test public void testByteFieldsAreDecimal() { try { CommandLine.populateCommand(new SupportedTypes(), "-byte", "0x1F", "-Byte", "0x0F"); fail("Should fail on hex input"); } catch (CommandLine.ParameterException expected) { assertEquals("Invalid value for option '-byte': '0x1F' is not a byte", expected.getMessage()); } } @Test
@Test public void testTimeFormatHHmmssColonInvalidError() throws ParseException { try { CommandLine.populateCommand(new SupportedTypes(), "-Time", "23:59:"); fail("Invalid format was accepted"); } catch (CommandLine.ParameterException expected) { assertEquals("Invalid value for option '-Time': '23:59:' is not a HH:mm[:ss[.SSS]] time", expected.getMessage()); } } @Test