private static void addCandidatesForArgsFollowing(CommandSpec commandSpec, List<CharSequence> candidates) { if (commandSpec == null) { return; } for (Map.Entry<String, CommandLine> entry : commandSpec.subcommands().entrySet()) { candidates.add(entry.getKey()); candidates.addAll(Arrays.asList(entry.getValue().getCommandSpec().aliases())); } candidates.addAll(commandSpec.optionsMap().keySet()); for (PositionalParamSpec positional : commandSpec.positionalParameters()) { addCandidatesForArgsFollowing(positional, candidates); } } private static void addCandidatesForArgsFollowing(OptionSpec optionSpec, List<CharSequence> candidates) {
private static boolean isMixedIn(PositionalParamSpec positional, CommandSpec spec) { for (CommandSpec mixin : spec.mixins().values()) { for (PositionalParamSpec mixedIn : mixin.positionalParameters()) { if (mixedIn.equals(positional)) { return true; } } } return false; }
private static CommandSpec findCommandFor(PositionalParamSpec positional, CommandSpec commandSpec) { for (PositionalParamSpec defined : commandSpec.positionalParameters()) { if (defined == positional) { return commandSpec; } } for (CommandLine sub : commandSpec.subcommands().values()) { CommandSpec result = findCommandFor(positional, sub.getCommandSpec()); if (result != null) { return result; } } return null; } private static boolean isPicocliModelObject(Object obj) {
@Test public void testPositionalInteractiveReadFromAnnotation() { class App { @Parameters(index = "0", interactive = true) int x; @Parameters(index = "1", interactive = false) int y; @Parameters(index = "2") int z; } CommandLine cmd = new CommandLine(new App()); assertTrue(cmd.getCommandSpec().positionalParameters().get(0).interactive()); assertFalse(cmd.getCommandSpec().positionalParameters().get(1).interactive()); assertFalse(cmd.getCommandSpec().positionalParameters().get(2).interactive()); }
@Test public void testPositionalConvertersOverridesRegisteredTypeConverter() { CommandSpec spec = CommandSpec.create(); spec.addPositional(PositionalParamSpec.builder().paramLabel("COUNT").index("0").type(int.class).description("number of times to execute").build()); spec.addPositional(PositionalParamSpec.builder().paramLabel("SQLTYPE").index("1").type(int.class).converters( new CommandLineTypeConversionTest.SqlTypeConverter()).description("sql type converter").build()); CommandLine commandLine = new CommandLine(spec); commandLine.parse("33", "BLOB"); assertEquals(Integer.valueOf(33), spec.positionalParameters().get(0).getValue()); assertEquals(Integer.valueOf(Types.BLOB), spec.positionalParameters().get(1).getValue()); }
@Test public void testMultiValuePositionalParamWithArray() { CommandSpec spec = CommandSpec.create(); PositionalParamSpec positional = PositionalParamSpec.builder().index("0").arity("3").type(int[].class).build(); assertTrue(positional.isMultiValue()); spec.addPositional(positional); CommandLine commandLine = new CommandLine(spec); commandLine.parse("1", "2", "3"); assertArrayEquals(new int[] {1, 2, 3}, (int[]) spec.positionalParameters().get(0).getValue()); }
private void clear() { position = 0; endOfOptions = false; isHelpRequested = false; parseResult = ParseResult.builder(getCommandSpec()); for (OptionSpec option : getCommandSpec().options()) { clear(option); } for (PositionalParamSpec positional : getCommandSpec().positionalParameters()) { clear(positional); } } private void clear(ArgSpec argSpec) {
@Test public void testCompletionCandidatesValues_forParameters() { class App { @Parameters(completionCandidates = MyAbcdCandidates.class) String x; } CommandLine cmd = new CommandLine(new App()); assertEquals(Arrays.asList("A", "B", "C", "D"), extract(cmd.getCommandSpec().positionalParameters().get(0).completionCandidates())); } @Test
@Test public void testInferTypes() { class App { @CommandLine.Parameters List<Class<? extends Class<? extends String>[]>> list; } assertEquals("<list>", CommandLine.Model.CommandSpec.forAnnotatedObject(new App()).positionalParameters().get(0).paramLabel()); } }
@Test public void testPositionalParamSpec_setsDefaultValue_ifNotMatched() { CommandSpec cmd = CommandSpec.create().add(PositionalParamSpec.builder().defaultValue("123").type(int.class).build()); ParseResult parseResult = new CommandLine(cmd).parseArgs(); assertFalse(parseResult.hasMatchedPositional(0)); // TODO this method should be renamed to matchedPositionalValue assertEquals(Integer.valueOf(-1), parseResult.matchedPositionalValue(0, -1)); // TODO positionalValue should return the value of the option, matched or not //assertEquals(Integer.valueOf(123), parseResult.positionalValue(0)); assertEquals(Integer.valueOf(123), parseResult.commandSpec().positionalParameters().get(0).getValue()); }
@Test public void testMultiValuePositionalParamWithListWithoutAuxTypes() { CommandSpec spec = CommandSpec.create(); PositionalParamSpec positional = PositionalParamSpec.builder().index("0").arity("3").type(List.class).build(); assertTrue(positional.isMultiValue()); spec.addPositional(positional); CommandLine commandLine = new CommandLine(spec); commandLine.parse("1", "2", "3"); assertEquals(Arrays.asList("1", "2", "3"), spec.positionalParameters().get(0).getValue()); }
/** * Returns the section of the usage help message that lists the parameters with their descriptions. * @param layout the layout to use * @param paramLabelRenderer for rendering parameter names * @return the section of the usage help message that lists the parameters */ public String parameterList(Layout layout, IParamLabelRenderer paramLabelRenderer) { layout.addPositionalParameters(commandSpec.positionalParameters(), paramLabelRenderer); return layout.toString(); }
@Test public void testParamIndex() { CommandLine git = new CommandLine(new Git()); CommandLine clone = git.getSubcommands().get("clone"); Model.PositionalParamSpec repo = clone.getCommandSpec().positionalParameters().get(0); assertEquals(CommandLine.Range.valueOf("0"), repo.index()); }
@Test public void testAnnotateMethod_mixinParameterFirst() { Method m = CommandLine.getCommandMethods(UnannotatedClassWithMixinParameters.class, "mixinFirst").get(0); CommandLine cmd = new CommandLine(m); CommandSpec spec = cmd.getCommandSpec(); assertEquals(1, spec.mixins().size()); assertEquals(1, spec.positionalParameters().size()); assertEquals(3, spec.options().size()); spec = spec.mixins().get("arg0"); assertEquals(SomeMixin.class, spec.userObject().getClass()); }
@Test public void testAnnotateMethod_positionalAndMixinParameter() { Method m = CommandLine.getCommandMethods(UnannotatedClassWithMixinParameters.class, "posAndMixin").get(0); CommandLine cmd = new CommandLine(m); CommandSpec spec = cmd.getCommandSpec(); assertEquals(1, spec.mixins().size()); assertEquals(1, spec.positionalParameters().size()); spec = spec.mixins().get("arg1"); assertEquals(SomeMixin.class, spec.userObject().getClass()); }
@Test public void testParamIndexAnnotatedAndUnAnnotated() { CommandLine git = new CommandLine(new AnnotatedParams()); CommandLine method = git.getSubcommands().get("method"); List<Model.PositionalParamSpec> positionals = method.getCommandSpec().positionalParameters(); for (int i = 0; i < positionals.size(); i++) { assertEquals(CommandLine.Range.valueOf("" + i), positionals.get(i).index()); } }
@Test public void testAnnotateMethod_positionalAndOptionsAndMixinParameter() { Method m = CommandLine.getCommandMethods(UnannotatedClassWithMixinParameters.class, "posAndOptAndMixin").get(0); CommandLine cmd = new CommandLine(m); CommandSpec spec = cmd.getCommandSpec(); assertEquals(1, spec.mixins().size()); assertEquals(1, spec.positionalParameters().size()); assertEquals(3, spec.options().size()); spec = spec.mixins().get("arg2"); assertEquals(SomeMixin.class, spec.userObject().getClass()); }
@Test public void testMultiValuePositionalParamWithListAndAuxTypes() { CommandSpec spec = CommandSpec.create(); PositionalParamSpec positional = PositionalParamSpec.builder().index("0").arity("3").type(List.class).auxiliaryTypes(Integer.class).build(); assertTrue(positional.isMultiValue()); spec.addPositional(positional); CommandLine commandLine = new CommandLine(spec); commandLine.parse("1", "2", "3"); assertEquals(Arrays.asList(1, 2, 3), spec.positionalParameters().get(0).getValue()); }
/** Returns the text displayed before the positional parameter list; an empty string if there are no positional * parameters, otherwise the result of {@code String.format(parameterListHeading, params)}. * @param params the parameters to use to format the parameter list heading * @return the formatted parameter list heading */ public String parameterListHeading(Object... params) { return commandSpec.positionalParameters().isEmpty() ? "" : heading(ansi(), width(), commandSpec.usageMessage().parameterListHeading(), params); }
@Test public void testCompletionCandidatesPriority_forParameters() { class App { @Parameters(completionCandidates = MyAbcdCandidates.class) MyEfgEnum x; } App app = new App(); CommandLine cmd = new CommandLine(app); assertEquals(Arrays.asList("A", "B", "C", "D"), cmd.getCommandSpec().positionalParameters().get(0).completionCandidates()); } @Test