.description("number of times to execute").build()); spec.addPositional(PositionalParamSpec.builder() .paramLabel("FILES") .type(List.class) .auxiliaryTypes(File.class) .description("The files to process").build()); CommandLine commandLine = new CommandLine(spec);
TypedMember typedMember = new TypedMember(variable, position); PositionalParamSpec.Builder builder = PositionalParamSpec.builder(typedMember, factory); builder.completionCandidates(extractCompletionCandidates(variable, variable.getAnnotationMirrors())); builder.converters(extractConverters(variable, variable.getAnnotationMirrors())); parameters.put(variable, builder);
@Test public void testMultiValuePositionalParamWithMapWithoutAuxTypes() { CommandSpec spec = CommandSpec.create(); PositionalParamSpec positional = PositionalParamSpec.builder().index("0").arity("3").type(Map.class).build(); assertTrue(positional.isMultiValue()); spec.addPositional(positional); CommandLine commandLine = new CommandLine(spec); commandLine.parse("1=1.0", "2=2.0", "3=3.0"); Map<String, String> expected = new LinkedHashMap<String, String>(); expected.put("1", "1.0"); expected.put("2", "2.0"); expected.put("3", "3.0"); assertEquals(expected, spec.positionalParameters().get(0).getValue()); }
builder.auxiliaryTypes(Integer.class, Integer.TYPE) .type(Double.TYPE) .splitRegex(",,,") .required(true) .defaultValue("DEF") .description("Description") .paramLabel("param") .arity("1") .hidden(true) .setter(setter) .getter(getter) .converters(converter) .initialValue("ABC") .showDefaultValue(Visibility.NEVER) .index("3..4") .withToString("TOSTRING"); assertArrayEquals(new Class[]{Integer.class, Integer.TYPE}, builder.auxiliaryTypes()); assertEquals(Double.TYPE, builder.type()); assertEquals(",,,", builder.splitRegex()); assertTrue(builder.required()); assertEquals("DEF", builder.defaultValue()); assertArrayEquals(new String[]{"Description"}, builder.description()); assertEquals("param", builder.paramLabel()); assertEquals(Range.valueOf("1"), builder.arity()); assertTrue(builder.hidden()); assertSame(getter, builder.getter()); assertSame(setter, builder.setter()); assertSame(converter, builder.converters()[0]); assertEquals("ABC", builder.initialValue());
.optionListHeading("Options%n") .parameterListHeading("Positional Parameters%n"); spec.addPositional(PositionalParamSpec.builder().description("positional param").build()); CommandLine commandLine = new CommandLine(spec); String actual = usageString(commandLine, Ansi.OFF);
@Test public void testPositionalParamSpecEquals() { PositionalParamSpec.Builder positional = PositionalParamSpec.builder() .arity("1") .hideParamSyntax(true) .required(true) .splitRegex(";") .description("desc") .descriptionKey("key") .auxiliaryTypes(Integer.class, Double.class) .index("1..3"); PositionalParamSpec p1 = positional.build(); assertEquals(p1, p1); assertEquals(p1, positional.build()); assertNotEquals(p1, positional.arity("2").build()); assertNotEquals(p1, positional.arity("1").hideParamSyntax(false).build()); assertNotEquals(p1, positional.hideParamSyntax(true).required(false).build()); assertNotEquals(p1, positional.required(true).splitRegex(",").build()); assertNotEquals(p1, positional.splitRegex(";").description("xyz").build()); assertNotEquals(p1, positional.description("desc").descriptionKey("XX").build()); assertNotEquals(p1, positional.descriptionKey("key").auxiliaryTypes(Short.class).build()); assertEquals(p1, positional.auxiliaryTypes(Integer.class, Double.class).build()); assertNotEquals(p1, positional.index("0..*").build()); assertEquals(p1, positional.index("1..3").build()); } }
static PositionalParamSpec extractPositionalParamSpec(TypedMember member, IFactory factory) { PositionalParamSpec.Builder builder = PositionalParamSpec.builder(); initCommon(builder, member); Range arity = Range.parameterArity(member); builder.arity(arity); builder.index(Range.parameterIndex(member)); builder.capacity(Range.parameterCapacity(member)); builder.required(arity.min > 0); Parameters parameters = member.getAnnotation(Parameters.class); builder.interactive(parameters.interactive()); Class<?>[] elementTypes = inferTypes(member.getType(), parameters.type(), member.getGenericType()); builder.auxiliaryTypes(elementTypes); builder.paramLabel(inferLabel(parameters.paramLabel(), member.name(), member.getType(), elementTypes)); builder.hideParamSyntax(parameters.hideParamSyntax()); builder.description(parameters.description()); builder.descriptionKey(parameters.descriptionKey()); builder.splitRegex(parameters.split()); builder.hidden(parameters.hidden()); builder.defaultValue(parameters.defaultValue()); builder.converters(DefaultFactory.createConverter(factory, parameters.converter())); builder.showDefaultValue(parameters.showDefaultValue()); if (!NoCompletionCandidates.class.equals(parameters.completionCandidates())) { builder.completionCandidates(DefaultFactory.createCompletionCandidates(factory, parameters.completionCandidates())); } return builder.build(); } static PositionalParamSpec extractUnannotatedPositionalParamSpec(TypedMember member, IFactory factory) {
@Test public void testArgSpecEquals() { PositionalParamSpec.Builder positional = PositionalParamSpec.builder() .arity("1") .hideParamSyntax(true) .required(true) .splitRegex(";") .description("desc") .descriptionKey("key") .auxiliaryTypes(Integer.class, Double.class); PositionalParamSpec p1 = positional.build(); assertEquals(p1, p1); assertEquals(p1, positional.build()); assertNotEquals(p1, positional.arity("2").build()); assertNotEquals(p1, positional.arity("1").hideParamSyntax(false).build()); assertNotEquals(p1, positional.hideParamSyntax(true).required(false).build()); assertNotEquals(p1, positional.required(true).splitRegex(",").build()); assertNotEquals(p1, positional.splitRegex(";").description("xyz").build()); assertNotEquals(p1, positional.description("desc").descriptionKey("XX").build()); assertNotEquals(p1, positional.descriptionKey("key").auxiliaryTypes(Short.class).build()); assertEquals(p1, positional.auxiliaryTypes(Integer.class, Double.class).build()); }
static PositionalParamSpec extractUnannotatedPositionalParamSpec(TypedMember member, IFactory factory) { PositionalParamSpec.Builder builder = PositionalParamSpec.builder(); initCommon(builder, member); Range arity = Range.parameterArity(member); builder.arity(arity); builder.index(Range.parameterIndex(member)); builder.capacity(Range.parameterCapacity(member)); builder.required(arity.min > 0); builder.interactive(false); Class<?>[] elementTypes = inferTypes(member.getType(), new Class<?>[] {}, member.getGenericType()); builder.auxiliaryTypes(elementTypes); builder.paramLabel(inferLabel(null, member.name(), member.getType(), elementTypes)); builder.hideParamSyntax(false); builder.description(new String[0]); builder.splitRegex(""); builder.hidden(false); builder.defaultValue(null); builder.converters(); builder.showDefaultValue(Help.Visibility.ON_DEMAND); return builder.build(); } private static void initCommon(ArgSpec.Builder<?> builder, TypedMember member) {
@Test public void testPositionalParamSpec_defaultValue_overwritesInitialValue() { @Command(showDefaultValues = true) class Params { @Parameters(paramLabel = "INT", description = "the array") int[] value = {1, 5, 11, 23}; } CommandLine cmd = new CommandLine(new Params()); PositionalParamSpec x = cmd.getCommandSpec().positionalParameters().get(0).toBuilder().defaultValue("5,4,3,2,1").splitRegex(",").build(); cmd = new CommandLine(CommandSpec.create().add(x)); cmd.getCommandSpec().usageMessage().showDefaultValues(true); String result = usageString(cmd, Help.Ansi.OFF); assertEquals(format("" + "Usage: <main class> [INT[,INT...]...]%n" + " [INT[,INT...]...] the array%n" + " Default: 5,4,3,2,1%n"), result); }
/** Sets the index or range specifying which of the command line arguments should be assigned to this positional parameter, and returns this builder. */ public Builder index(String range) { return index(Range.valueOf(range)); }
@Test public void testPositionalParamSpec_defaultValue_overwritesInitialValue() { class Params { @Parameters int num = 12345; } CommandLine cmd = new CommandLine(new Params()); PositionalParamSpec x = cmd.getCommandSpec().positionalParameters().get(0).toBuilder().defaultValue("54321").build(); cmd = new CommandLine(CommandSpec.create().add(x)); ParseResult parseResult = cmd.parseArgs(); // default not in the parse result assertFalse(parseResult.hasMatchedPositional(0)); assertEquals(Integer.valueOf(-1), parseResult.matchedPositionalValue(0, -1)); // but positional spec does have the default value assertEquals(Integer.valueOf(54321), parseResult.commandSpec().positionalParameters().get(0).getValue()); }
@Test public void testAddCandidatesForArgsFollowingObject() throws Exception { Method m = AutoComplete.class.getDeclaredMethod("addCandidatesForArgsFollowing", Object.class, List.class); m.setAccessible(true); List<String> candidates = new ArrayList<String>(); m.invoke(null, null, candidates); assertTrue("null Object adds no candidates", candidates.isEmpty()); m.invoke(null, new Object(), candidates); assertTrue("non-PicocliModelObject Object adds no candidates", candidates.isEmpty()); List<String> completions = Arrays.asList("x", "y", "z"); PositionalParamSpec positional = PositionalParamSpec.builder().completionCandidates(completions).build(); m.invoke(null, positional, candidates); assertEquals("PositionalParamSpec adds completion candidates", completions, candidates); }
@Test public void testMultiValuePositionalParamWithMapWithoutAuxTypes() { CommandSpec spec = CommandSpec.create(); PositionalParamSpec positional = PositionalParamSpec.builder().index("0").arity("3").type(Map.class).build(); assertTrue(positional.isMultiValue()); spec.addPositional(positional); CommandLine commandLine = new CommandLine(spec); commandLine.parse("1=1.0", "2=2.0", "3=3.0"); Map<String, String> expected = new LinkedHashMap<String, String>(); expected.put("1", "1.0"); expected.put("2", "2.0"); expected.put("3", "3.0"); assertEquals(expected, spec.positionalParameters().get(0).getValue()); }
@Test public void testUsageHelp_abbreviateSynopsisWithPositional() throws UnsupportedEncodingException { CommandSpec spec = CommandSpec.create(); spec.usageMessage().abbreviateSynopsis(true).requiredOptionMarker('!').sortOptions(false); spec.addOption(OptionSpec.builder("-x").required(true).description("required").build()); spec.addPositional(PositionalParamSpec.builder().arity("1").paramLabel("POSITIONAL").description("positional").build()); CommandLine commandLine = new CommandLine(spec); String actual = usageString(commandLine, Ansi.OFF); String expected = String.format("" + "Usage: <main class> [OPTIONS] POSITIONAL...%n" + "! POSITIONAL... positional%n" + "! -x required%n"); assertEquals(expected, actual); }
@Test public void testMultiValuePositionalParamArityAloneIsInsufficient() { CommandSpec spec = CommandSpec.create(); PositionalParamSpec positional = PositionalParamSpec.builder().index("0").arity("3").type(int.class).build(); assertFalse(positional.isMultiValue()); spec.addPositional(positional); CommandLine commandLine = new CommandLine(spec); try { commandLine.parse("1", "2", "3"); fail("Expected exception"); } catch (UnmatchedArgumentException ex) { assertEquals("Unmatched arguments: 2, 3", ex.getMessage()); } }
@Test public void testMultiValuePositionalParamWithMapAndAuxTypes() { CommandSpec spec = CommandSpec.create(); PositionalParamSpec positional = PositionalParamSpec.builder().index("0").arity("3").type(Map.class).auxiliaryTypes(Integer.class, Double.class).build(); assertTrue(positional.isMultiValue()); spec.addPositional(positional); CommandLine commandLine = new CommandLine(spec); commandLine.parse("1=1.0", "2=2.0", "3=3.0"); Map<Integer, Double> expected = new LinkedHashMap<Integer, Double>(); expected.put(1, 1.0); expected.put(2, 2.0); expected.put(3, 3.0); assertEquals(expected, spec.positionalParameters().get(0).getValue()); }
@Test public void testMultiValuePositionalParamArityAloneIsInsufficient() throws Exception { CommandLine.Model.CommandSpec spec = CommandLine.Model.CommandSpec.create(); CommandLine.Model.PositionalParamSpec positional = CommandLine.Model.PositionalParamSpec.builder().index("0").arity("3").type(int.class).build(); assertFalse(positional.isMultiValue()); spec.addPositional(positional); spec.parser().collectErrors(true); CommandLine commandLine = new CommandLine(spec); commandLine.parse("1", "2", "3"); assertEquals(1, commandLine.getParseResult().errors().size()); assertEquals("Unmatched arguments: 2, 3", commandLine.getParseResult().errors().get(0).getMessage()); } @Test