@SuppressWarnings("unchecked") @Test public void testInterpreterApplyValueToSingleValuedField() throws Exception { Class c = Class.forName("picocli.CommandLine$Interpreter"); Class lookBehindClass = Class.forName("picocli.CommandLine$LookBehind"); Method applyValueToSingleValuedField = c.getDeclaredMethod("applyValueToSingleValuedField", ArgSpec.class, lookBehindClass, Range.class, Stack.class, Set.class, String.class); applyValueToSingleValuedField.setAccessible(true); CommandSpec spec = CommandSpec.create(); spec.parser().trimQuotes(true); CommandLine cmd = new CommandLine(spec); Object interpreter = PicocliTestUtil.interpreter(cmd); Method clear = c.getDeclaredMethod("clear"); clear.setAccessible(true); clear.invoke(interpreter); // initializes the interpreter instance PositionalParamSpec arg = PositionalParamSpec.builder().arity("1").build(); Object SEPARATE = lookBehindClass.getDeclaredField("SEPARATE").get(null); int value = (Integer) applyValueToSingleValuedField.invoke(interpreter, arg, SEPARATE, Range.valueOf("1"), new Stack<String>(), new HashSet<String>(), ""); assertEquals(0, value); }
@Test public void testParameterCapacity() throws Exception { PositionalParamSpec paramSpec = PositionalParamSpec.builder().index(Range.valueOf("1..2")).arity(Range.valueOf("*")).build(); Method capacity = PositionalParamSpec.class.getDeclaredMethod("capacity"); capacity.setAccessible(true); Range c = (Range) capacity.invoke(paramSpec); assertEquals(Range.valueOf("*"), c); }
@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()); }
.description("Description") .paramLabel("param") .arity("1") .hidden(true) .setter(setter) assertArrayEquals(new String[]{"Description"}, builder.description()); assertEquals("param", builder.paramLabel()); assertEquals(Range.valueOf("1"), builder.arity()); assertTrue(builder.hidden()); assertSame(getter, builder.getter());
@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()); } }
@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()); }
@Test public void testPositionalInteractiveNotSupportedForMultiValue() { PositionalParamSpec.Builder[] options = new PositionalParamSpec.Builder[]{ PositionalParamSpec.builder().arity("0").interactive(true), PositionalParamSpec.builder().arity("0..1").interactive(true), PositionalParamSpec.builder().arity("2").interactive(true), PositionalParamSpec.builder().arity("3").interactive(true), PositionalParamSpec.builder().arity("1..2").interactive(true), PositionalParamSpec.builder().arity("1..*").interactive(true), PositionalParamSpec.builder().arity("0..*").interactive(true), }; for (PositionalParamSpec.Builder opt : options) { try { opt.build(); fail("Expected exception"); } catch (CommandLine.InitializationException ex) { assertEquals("Interactive options and positional parameters are only supported for arity=1, not for arity=" + opt.arity(), ex.getMessage()); } } }
@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 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() { 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 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
@Test public void testPositionalDefaultTypeIsString_withArityOne() { assertEquals(String.class, CommandLine.Model.PositionalParamSpec.builder().arity("1").build().type()); }
@Test public void testPositionalDefaultTypeIsString_withArityZero() { assertEquals(String.class, CommandLine.Model.PositionalParamSpec.builder().arity("0").build().type()); }
@Test public void testPositionalDefaultTypeIsStringArray_withArityTwo() { assertEquals(String[].class, CommandLine.Model.PositionalParamSpec.builder().arity("2").build().type()); }
@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()); }
@Test public void testPositionalCopyBuilder() { PositionalParamSpec option = PositionalParamSpec.builder().index("0..34").arity("1").type(int.class).description("abc").paramLabel("ABC").build(); PositionalParamSpec copy = option.toBuilder().build(); assertEquals(option, copy); assertNotSame(option, copy); }
@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()); }
@Test public void testPositionalAuxiliaryTypeOverridesDefaultType() { assertEquals(int.class, CommandLine.Model.PositionalParamSpec.builder().auxiliaryTypes(int.class).build().type()); assertEquals(int.class, CommandLine.Model.PositionalParamSpec.builder().arity("0").auxiliaryTypes(int.class).build().type()); assertEquals(int.class, CommandLine.Model.PositionalParamSpec.builder().arity("1").auxiliaryTypes(int.class).build().type()); assertEquals(int.class, CommandLine.Model.PositionalParamSpec.builder().arity("0..1").auxiliaryTypes(int.class).build().type()); assertEquals(int.class, CommandLine.Model.PositionalParamSpec.builder().arity("2").auxiliaryTypes(int.class).build().type()); assertEquals(int.class, CommandLine.Model.PositionalParamSpec.builder().arity("0..2").auxiliaryTypes(int.class).build().type()); assertEquals(int.class, CommandLine.Model.PositionalParamSpec.builder().arity("*").auxiliaryTypes(int.class).build().type()); } @Test
@Test public void testPositionalWithArityHasDefaultTypeString() { assertEquals(String.class, CommandLine.Model.PositionalParamSpec.builder().arity("0").build().type()); assertEquals(String.class, CommandLine.Model.PositionalParamSpec.builder().arity("1").build().type()); assertEquals(String.class, CommandLine.Model.PositionalParamSpec.builder().arity("0..1").build().type()); assertEquals(String[].class, CommandLine.Model.PositionalParamSpec.builder().arity("2").build().type()); assertEquals(String[].class, CommandLine.Model.PositionalParamSpec.builder().arity("0..2").build().type()); assertEquals(String[].class, CommandLine.Model.PositionalParamSpec.builder().arity("*").build().type()); }
@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()); }