@Test public void testBuilderAddUnmatchedStack() { Stack<String> stack = new Stack<String>(); stack.push("a"); stack.push("b"); stack.push("c"); ParseResult.Builder builder = ParseResult.builder(CommandSpec.create()); builder.addUnmatched(stack); ParseResult parseResult = builder.build(); assertEquals(Arrays.asList("c", "b", "a"), parseResult.unmatched()); } }
@Test public void testUnknownOption() { class App { @Option(names = "-x") int x; @Parameters(index = "0") int first; @Parameters(index = "*") String all; } CommandLine cmd = new CommandLine(new App()); cmd.getCommandSpec().parser().collectErrors(true); cmd.parse("NOT_AN_INT", "-x=b", "-unknown", "1", "2", "3"); ParseResult parseResult = cmd.getParseResult(); assertEquals(Arrays.asList("NOT_AN_INT", "-unknown", "2", "3"), parseResult.unmatched()); assertEquals(6, parseResult.errors().size()); assertEquals("Invalid value for positional parameter at index 0 (<first>): 'NOT_AN_INT' is not an int", parseResult.errors().get(0).getMessage()); assertEquals("Invalid value for option '-x': 'b' is not an int", parseResult.errors().get(1).getMessage()); assertEquals("positional parameter at index 0..* (<all>) should be specified only once", parseResult.errors().get(2).getMessage()); assertEquals("positional parameter at index 0..* (<all>) should be specified only once", parseResult.errors().get(3).getMessage()); assertEquals("positional parameter at index 0..* (<all>) should be specified only once", parseResult.errors().get(4).getMessage()); assertEquals("Unmatched arguments: NOT_AN_INT, -unknown, 2, 3", parseResult.errors().get(5).getMessage()); } @Test
@Test public void testAnyExceptionWrappedInParameterException() { class App { @Option(names = "-queue", type = String.class, split = ",") ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(2); } CommandLine cmd = new CommandLine(new App()); cmd.getCommandSpec().parser().collectErrors(true); cmd.parse("-queue", "a,b,c"); ParseResult parseResult = cmd.getParseResult(); assertTrue(parseResult.unmatched().isEmpty()); assertEquals(1, parseResult.errors().size()); assertTrue(parseResult.errors().get(0) instanceof ParameterException); assertTrue(parseResult.errors().get(0).getCause() instanceof IllegalStateException); assertEquals("IllegalStateException: Queue full while processing argument " + "at or before arg[1] 'a,b,c' in [-queue, a,b,c]: java.lang.IllegalStateException: Queue full", parseResult.errors().get(0).getMessage()); assertEquals("Queue full", parseResult.errors().get(0).getCause().getMessage()); }
assertSame(result.commandSpec().positionalParameters().get(1), result.tentativeMatch.get(4)); assertTrue(result.unmatched().isEmpty()); assertFalse(result.hasSubcommand()); assertFalse(result.isUsageHelpRequested());
@Test public void testBasicUsage() { class App { @Option(names = {"-t", "-ttt"}) boolean boolVal; @Option(names = {"-i", "-int"}) int intVal; @Parameters String[] positional; } ParseResult result = new CommandLine(new App()).parseArgs("-t", "-i", "1", "a", "b"); assertEquals(Arrays.asList("-t", "-i", "1", "a", "b"), result.originalArgs()); assertSame(result.commandSpec().findOption("-t"), result.tentativeMatch.get(0)); assertSame(result.commandSpec().findOption("-i"), result.tentativeMatch.get(1)); assertSame(result.originalArgs().get(2), result.tentativeMatch.get(2)); assertSame(result.commandSpec().positionalParameters().get(0), result.tentativeMatch.get(3)); assertSame(result.commandSpec().positionalParameters().get(0), result.tentativeMatch.get(4)); assertTrue(result.unmatched().isEmpty()); assertFalse(result.hasSubcommand()); assertFalse(result.isUsageHelpRequested()); assertFalse(result.isVersionHelpRequested()); assertTrue(result.hasMatchedOption("-ttt")); assertTrue(result.hasMatchedOption("-t")); assertTrue(result.hasMatchedOption("-i")); assertTrue(result.hasMatchedOption("-int")); assertFalse(result.hasMatchedOption("-unknown")); assertTrue(result.hasMatchedPositional(0)); assertTrue(result.hasMatchedPositional(1)); } @Test
@Test public void testUnmatchedArgsBinding_forStringArrayConsumer() { setTraceLevel("OFF"); class ArrayBinding implements ISetter { String[] array; @SuppressWarnings("unchecked") public <T> T set(T value) { T old = (T) array; array = (String[]) value; return old; } } ArrayBinding setter = new ArrayBinding(); CommandSpec cmd = CommandSpec.create(); UnmatchedArgsBinding unmatched = UnmatchedArgsBinding.forStringArrayConsumer(setter); assertSame(setter, unmatched.setter()); cmd.addUnmatchedArgsBinding(unmatched); cmd.addOption(CommandLine.Model.OptionSpec.builder("-x").build()); CommandLine.ParseResult result = new CommandLine(cmd).parseArgs("-x", "a", "b", "c"); assertEquals(Arrays.asList("a", "b", "c"), result.unmatched()); assertArrayEquals(new String[]{"a", "b", "c"}, setter.array); assertSame(unmatched, cmd.unmatchedArgsBindings().get(0)); assertEquals(1, cmd.unmatchedArgsBindings().size()); }
@Test public void testUnknownOption() { class App { @Option(names = "-x") int x; @Parameters(index = "0") int first; @Parameters(index = "*") String all; } CommandLine cmd = new CommandLine(new App()); cmd.getCommandSpec().parser().collectErrors(true); cmd.parse("NOT_AN_INT", "-x=b", "-unknown", "1", "2", "3"); ParseResult parseResult = cmd.getParseResult(); assertEquals(Arrays.asList("NOT_AN_INT", "-unknown", "2", "3"), parseResult.unmatched()); assertEquals(6, parseResult.errors().size()); assertEquals("Invalid value for positional parameter at index 0 (<first>): 'NOT_AN_INT' is not an int", parseResult.errors().get(0).getMessage()); assertEquals("Invalid value for option '-x': 'b' is not an int", parseResult.errors().get(1).getMessage()); assertEquals("positional parameter at index 0..* (<all>) should be specified only once", parseResult.errors().get(2).getMessage()); assertEquals("positional parameter at index 0..* (<all>) should be specified only once", parseResult.errors().get(3).getMessage()); assertEquals("positional parameter at index 0..* (<all>) should be specified only once", parseResult.errors().get(4).getMessage()); assertEquals("Unmatched arguments: NOT_AN_INT, -unknown, 2, 3", parseResult.errors().get(5).getMessage()); } @Test
@Test public void testUnmatchedArgsBinding_forStringCollectionSupplier() { setTraceLevel("OFF"); class ArrayBinding implements IGetter { List<String> list = new ArrayList<String>(); @SuppressWarnings("unchecked") public <T> T get() { return (T) list; } } ArrayBinding binding = new ArrayBinding(); CommandSpec cmd = CommandSpec.create(); UnmatchedArgsBinding unmatched = UnmatchedArgsBinding.forStringCollectionSupplier(binding); assertSame(binding, unmatched.getter()); cmd.addUnmatchedArgsBinding(unmatched); cmd.addOption(CommandLine.Model.OptionSpec.builder("-x").build()); CommandLine.ParseResult result = new CommandLine(cmd).parseArgs("-x", "a", "b", "c"); assertEquals(Arrays.asList("a", "b", "c"), result.unmatched()); assertEquals(Arrays.asList("a", "b", "c"), binding.list); assertSame(unmatched, cmd.unmatchedArgsBindings().get(0)); assertEquals(1, cmd.unmatchedArgsBindings().size()); }
@Test public void testAnyExceptionWrappedInParameterException() { class App { @Option(names = "-queue", type = String.class, split = ",") ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(2); } CommandLine cmd = new CommandLine(new App()); cmd.getCommandSpec().parser().collectErrors(true); cmd.parse("-queue", "a,b,c"); ParseResult parseResult = cmd.getParseResult(); assertTrue(parseResult.unmatched().isEmpty()); assertEquals(1, parseResult.errors().size()); assertTrue(parseResult.errors().get(0) instanceof ParameterException); assertTrue(parseResult.errors().get(0).getCause() instanceof IllegalStateException); assertEquals("IllegalStateException: Queue full while processing argument " + "at or before arg[1] 'a,b,c' in [-queue, a,b,c]: java.lang.IllegalStateException: Queue full", parseResult.errors().get(0).getMessage()); assertEquals("Queue full", parseResult.errors().get(0).getCause().getMessage()); }
@Test public void testIsUsageHelpRequested() { @Command(mixinStandardHelpOptions = true) class App { @Option(names = "-x") String x; } CommandLine cmd = new CommandLine(new App()); ParseResult parseResult = cmd.parseArgs("-h"); assertTrue(parseResult.isUsageHelpRequested()); assertFalse(parseResult.isVersionHelpRequested()); assertSame(cmd.getCommandSpec().optionsMap().get("-h"), parseResult.matchedOption('h')); assertTrue(parseResult.unmatched().isEmpty()); assertTrue(parseResult.matchedPositionals().isEmpty()); }
@Test public void testBuilderAddUnmatched() { ParseResult.Builder builder = ParseResult.builder(CommandSpec.create()); builder.addUnmatched("abc"); ParseResult parseResult = builder.build(); assertEquals(Arrays.asList("abc"), parseResult.unmatched()); }
@Test public void testBuilderAddUnmatchedStack() { Stack<String> stack = new Stack<String>(); stack.push("a"); stack.push("b"); stack.push("c"); ParseResult.Builder builder = ParseResult.builder(CommandSpec.create()); builder.addUnmatched(stack); ParseResult parseResult = builder.build(); assertEquals(Arrays.asList("c", "b", "a"), parseResult.unmatched()); } }
assertSame(result.commandSpec().positionalParameters().get(1), result.tentativeMatch.get(4)); assertTrue(result.unmatched().isEmpty()); assertFalse(result.hasSubcommand()); assertFalse(result.isUsageHelpRequested());
@Test public void testBasicUsage() { class App { @Option(names = {"-t", "-ttt"}) boolean boolVal; @Option(names = {"-i", "-int"}) int intVal; @Parameters String[] positional; } ParseResult result = new CommandLine(new App()).parseArgs("-t", "-i", "1", "a", "b"); assertEquals(Arrays.asList("-t", "-i", "1", "a", "b"), result.originalArgs()); assertSame(result.commandSpec().findOption("-t"), result.tentativeMatch.get(0)); assertSame(result.commandSpec().findOption("-i"), result.tentativeMatch.get(1)); assertSame(result.originalArgs().get(2), result.tentativeMatch.get(2)); assertSame(result.commandSpec().positionalParameters().get(0), result.tentativeMatch.get(3)); assertSame(result.commandSpec().positionalParameters().get(0), result.tentativeMatch.get(4)); assertTrue(result.unmatched().isEmpty()); assertFalse(result.hasSubcommand()); assertFalse(result.isUsageHelpRequested()); assertFalse(result.isVersionHelpRequested()); assertTrue(result.hasMatchedOption("-ttt")); assertTrue(result.hasMatchedOption("-t")); assertTrue(result.hasMatchedOption("-i")); assertTrue(result.hasMatchedOption("-int")); assertFalse(result.hasMatchedOption("-unknown")); assertTrue(result.hasMatchedPositional(0)); assertTrue(result.hasMatchedPositional(1)); } @Test
@Test public void testUnmatchedArgsBinding_forStringCollectionSupplier() { setTraceLevel("OFF"); class ArrayBinding implements IGetter { List<String> list = new ArrayList<String>(); @SuppressWarnings("unchecked") public <T> T get() { return (T) list; } } ArrayBinding binding = new ArrayBinding(); CommandSpec cmd = CommandSpec.create(); UnmatchedArgsBinding unmatched = UnmatchedArgsBinding.forStringCollectionSupplier(binding); assertSame(binding, unmatched.getter()); cmd.addUnmatchedArgsBinding(unmatched); cmd.addOption(CommandLine.Model.OptionSpec.builder("-x").build()); CommandLine.ParseResult result = new CommandLine(cmd).parseArgs("-x", "a", "b", "c"); assertEquals(Arrays.asList("a", "b", "c"), result.unmatched()); assertEquals(Arrays.asList("a", "b", "c"), binding.list); assertSame(unmatched, cmd.unmatchedArgsBindings().get(0)); assertEquals(1, cmd.unmatchedArgsBindings().size()); }
@Test public void testUnmatchedArgsBinding_forStringArrayConsumer() { setTraceLevel("OFF"); class ArrayBinding implements ISetter { String[] array; @SuppressWarnings("unchecked") public <T> T set(T value) { T old = (T) array; array = (String[]) value; return old; } } ArrayBinding setter = new ArrayBinding(); CommandSpec cmd = CommandSpec.create(); UnmatchedArgsBinding unmatched = UnmatchedArgsBinding.forStringArrayConsumer(setter); assertSame(setter, unmatched.setter()); cmd.addUnmatchedArgsBinding(unmatched); cmd.addOption(CommandLine.Model.OptionSpec.builder("-x").build()); CommandLine.ParseResult result = new CommandLine(cmd).parseArgs("-x", "a", "b", "c"); assertEquals(Arrays.asList("a", "b", "c"), result.unmatched()); assertArrayEquals(new String[]{"a", "b", "c"}, setter.array); assertSame(unmatched, cmd.unmatchedArgsBindings().get(0)); assertEquals(1, cmd.unmatchedArgsBindings().size()); }
@Test public void testIsUsageHelpRequested() { @Command(mixinStandardHelpOptions = true) class App { @Option(names = "-x") String x; } CommandLine cmd = new CommandLine(new App()); ParseResult parseResult = cmd.parseArgs("-h"); assertTrue(parseResult.isUsageHelpRequested()); assertFalse(parseResult.isVersionHelpRequested()); assertSame(cmd.getCommandSpec().optionsMap().get("-h"), parseResult.matchedOption('h')); assertTrue(parseResult.unmatched().isEmpty()); assertTrue(parseResult.matchedPositionals().isEmpty()); }
@Test public void testBuilderAddUnmatched() { ParseResult.Builder builder = ParseResult.builder(CommandSpec.create()); builder.addUnmatched("abc"); ParseResult parseResult = builder.build(); assertEquals(Arrays.asList("abc"), parseResult.unmatched()); }