summaryrefslogtreecommitdiffstats
path: root/src/test/java/com/beust/jcommander
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/com/beust/jcommander')
-rw-r--r--src/test/java/com/beust/jcommander/ArgsRequiredWrongMain.java6
-rw-r--r--src/test/java/com/beust/jcommander/ArgsValidate2.java24
-rw-r--r--src/test/java/com/beust/jcommander/CmdTest.java86
-rw-r--r--src/test/java/com/beust/jcommander/ConverterFactoryTest.java86
-rw-r--r--src/test/java/com/beust/jcommander/DefaultProviderTest.java120
-rw-r--r--src/test/java/com/beust/jcommander/DefaultValueTest.java113
-rw-r--r--src/test/java/com/beust/jcommander/FinderTest.java97
-rw-r--r--src/test/java/com/beust/jcommander/HostPort.java29
-rw-r--r--src/test/java/com/beust/jcommander/HostPortConverter.java32
-rw-r--r--src/test/java/com/beust/jcommander/JCommanderTest.java1081
-rw-r--r--src/test/java/com/beust/jcommander/MethodSetterTest.java100
-rw-r--r--src/test/java/com/beust/jcommander/MyClass.java24
-rw-r--r--src/test/java/com/beust/jcommander/ParametersDelegateTest.java227
-rw-r--r--src/test/java/com/beust/jcommander/PositiveIntegerTest.java65
-rw-r--r--src/test/java/com/beust/jcommander/SetConverter.java16
-rw-r--r--src/test/java/com/beust/jcommander/ValidatePropertiesWhenParsingTest.java42
-rw-r--r--src/test/java/com/beust/jcommander/VariableArityTest.java66
-rw-r--r--src/test/java/com/beust/jcommander/args/AlternateNamesForListArgs.java32
-rw-r--r--src/test/java/com/beust/jcommander/args/Args1.java56
-rw-r--r--src/test/java/com/beust/jcommander/args/Args1Setter.java93
-rw-r--r--src/test/java/com/beust/jcommander/args/Args2.java42
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsArityInteger.java37
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsArityString.java37
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsBooleanArity.java26
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsBooleanArity0.java26
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsConverter.java57
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsConverterFactory.java28
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsDefault.java43
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsEnum.java55
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsEquals.java11
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsHelp.java30
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsI18N1.java27
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsI18N2.java30
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsI18N2New.java34
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsInherited.java28
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsList.java49
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsLongDescription.java25
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsMainParameter1.java40
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsMainParameter2.java41
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsMaster.java31
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsMultipleUnparsed.java35
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsOutOfMemory.java13
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsPassword.java26
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsPrivate.java30
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsRequired.java31
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsSlave.java31
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsSlaveBogus.java31
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsValidate1.java10
-rw-r--r--src/test/java/com/beust/jcommander/args/ArgsWithSet.java11
-rw-r--r--src/test/java/com/beust/jcommander/args/Arity1.java9
-rw-r--r--src/test/java/com/beust/jcommander/args/CommandLineArgs.java120
-rw-r--r--src/test/java/com/beust/jcommander/args/CommandLineArgs2.java72
-rw-r--r--src/test/java/com/beust/jcommander/args/IHostPorts.java27
-rw-r--r--src/test/java/com/beust/jcommander/args/SeparatorColon.java29
-rw-r--r--src/test/java/com/beust/jcommander/args/SeparatorEqual.java32
-rw-r--r--src/test/java/com/beust/jcommander/args/SeparatorMixed.java32
-rw-r--r--src/test/java/com/beust/jcommander/args/SlashSeparator.java32
-rw-r--r--src/test/java/com/beust/jcommander/args/VariableArity.java26
-rw-r--r--src/test/java/com/beust/jcommander/command/CommandAdd.java35
-rw-r--r--src/test/java/com/beust/jcommander/command/CommandAliasTest.java175
-rw-r--r--src/test/java/com/beust/jcommander/command/CommandCommit.java37
-rw-r--r--src/test/java/com/beust/jcommander/command/CommandHidden.java17
-rw-r--r--src/test/java/com/beust/jcommander/command/CommandMain.java27
-rw-r--r--src/test/java/com/beust/jcommander/command/CommandTest.java115
-rw-r--r--src/test/java/com/beust/jcommander/command/NamedCommandAdd.java17
-rw-r--r--src/test/java/com/beust/jcommander/dynamic/DSimple.java16
-rw-r--r--src/test/java/com/beust/jcommander/dynamic/DSimpleBad.java11
-rw-r--r--src/test/java/com/beust/jcommander/dynamic/DynamicParameterTest.java60
-rw-r--r--src/test/java/com/beust/jcommander/internal/DefaultConsoleTest.java64
69 files changed, 4263 insertions, 0 deletions
diff --git a/src/test/java/com/beust/jcommander/ArgsRequiredWrongMain.java b/src/test/java/com/beust/jcommander/ArgsRequiredWrongMain.java
new file mode 100644
index 0000000..c2124d9
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/ArgsRequiredWrongMain.java
@@ -0,0 +1,6 @@
+package com.beust.jcommander;
+
+public class ArgsRequiredWrongMain {
+ @Parameter(required = true)
+ public String[] file;
+} \ No newline at end of file
diff --git a/src/test/java/com/beust/jcommander/ArgsValidate2.java b/src/test/java/com/beust/jcommander/ArgsValidate2.java
new file mode 100644
index 0000000..2b8f07b
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/ArgsValidate2.java
@@ -0,0 +1,24 @@
+package com.beust.jcommander;
+
+import com.beust.jcommander.converters.FileConverter;
+
+import java.io.File;
+
+public class ArgsValidate2 {
+ public static class FailingValidator implements IValueValidator<File> {
+
+ public void validate(String name, File value) throws ParameterException {
+ throw new ParameterException("Validation will always fail:" + name + " " + value);
+ }
+
+ }
+
+ public static final String POSSIBLE_TEMPLATE_FILE = "mayOrMayNotExist.template";
+
+ @Parameter(names = { "-template"},
+ description = "The default file may or may not exist",
+ converter = FileConverter.class,
+ validateValueWith = FailingValidator.class
+ )
+ public File template = new File(POSSIBLE_TEMPLATE_FILE);
+}
diff --git a/src/test/java/com/beust/jcommander/CmdTest.java b/src/test/java/com/beust/jcommander/CmdTest.java
new file mode 100644
index 0000000..6601193
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/CmdTest.java
@@ -0,0 +1,86 @@
+package com.beust.jcommander;
+
+import org.testng.Assert;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+public class CmdTest {
+
+ @Parameters(commandNames = "--cmd-one")
+ public static class CmdOne {
+ }
+
+ @Parameters(commandNames = "--cmd-two")
+ class CmdTwo {
+ @Parameter
+ List<String> params = new java.util.LinkedList<String>();
+ }
+
+ public String parseArgs(boolean withDefault, String[] args) {
+ JCommander jc = new JCommander();
+ jc.addCommand(new CmdOne());
+ jc.addCommand(new CmdTwo());
+
+ if (withDefault) {
+ // First check if a command was given, when not prepend default
+ // command (--cmd-two")
+ // In version up to 1.23 JCommander throws an Exception in this
+ // line,
+ // which might be incorrect, at least its not reasonable if the
+ // method
+ // is named "WithoutValidation".
+ jc.parseWithoutValidation(args);
+ if (jc.getParsedCommand() == null) {
+ LinkedList<String> newArgs = new LinkedList<String>();
+ newArgs.add("--cmd-two");
+ newArgs.addAll(Arrays.asList(args));
+ jc.parse(newArgs.toArray(new String[0]));
+ }
+ } else {
+ jc.parse(args);
+ }
+ return jc.getParsedCommand();
+ }
+
+ @DataProvider
+ public Object[][] testData() {
+ return new Object[][] {
+ new Object[] { "--cmd-one", false, new String[] { "--cmd-one" } },
+ new Object[] { "--cmd-two", false, new String[] { "--cmd-two" } },
+ new Object[] { "--cmd-two", false,
+ new String[] { "--cmd-two", "param1", "param2" } },
+ // This is the relevant test case to test default commands
+ new Object[] { "--cmd-two", true,
+ new String[] { "param1", "param2" } } };
+ }
+
+ @Test(dataProvider = "testData")
+ public void testArgsWithoutDefaultCmd(String expected,
+ boolean requireDefault, String[] args) {
+ if (!requireDefault) {
+ Assert.assertEquals(parseArgs(false, args), expected);
+ }
+ }
+
+ @Test(dataProvider = "testData", expectedExceptions = MissingCommandException.class)
+ public void testArgsWithoutDefaultCmdFail(String expected,
+ boolean requireDefault, String[] args) {
+ if (requireDefault) {
+ parseArgs(false, args);
+ } else {
+ throw new MissingCommandException("irrelevant test case");
+ }
+ }
+
+ // We do not expect a MissingCommandException!
+ @Test(dataProvider = "testData")
+ public void testArgsWithDefaultCmd(String expected, boolean requireDefault,
+ String[] args) {
+ Assert.assertEquals(parseArgs(true, args), expected);
+ }
+
+} \ No newline at end of file
diff --git a/src/test/java/com/beust/jcommander/ConverterFactoryTest.java b/src/test/java/com/beust/jcommander/ConverterFactoryTest.java
new file mode 100644
index 0000000..e02166e
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/ConverterFactoryTest.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander;
+
+import com.beust.jcommander.args.ArgsConverterFactory;
+import com.beust.jcommander.args.ArgsMainParameter1;
+import com.beust.jcommander.args.ArgsMainParameter2;
+import com.beust.jcommander.args.IHostPorts;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Test the converter factory feature.
+ *
+ * @author cbeust
+ */
+public class ConverterFactoryTest {
+ private static final Map<Class, Class<? extends IStringConverter<?>>> MAP = new HashMap() {{
+ put(HostPort.class, HostPortConverter.class);
+ }};
+
+ private static final IStringConverterFactory CONVERTER_FACTORY = new IStringConverterFactory() {
+
+ public Class<? extends IStringConverter<?>> getConverter(Class forType) {
+ return MAP.get(forType);
+ }
+
+ };
+
+ @Test
+ public void parameterWithHostPortParameters() {
+ ArgsConverterFactory a = new ArgsConverterFactory();
+ JCommander jc = new JCommander(a);
+ jc.addConverterFactory(CONVERTER_FACTORY);
+ jc.parse("-hostport", "example.com:8080");
+
+ Assert.assertEquals(a.hostPort.host, "example.com");
+ Assert.assertEquals(a.hostPort.port.intValue(), 8080);
+ }
+
+ /**
+ * Test that main parameters can be used with string converters,
+ * either with a factory or from the annotation.
+ */
+ private void mainWithHostPortParameters(IStringConverterFactory f, IHostPorts a) {
+ JCommander jc = new JCommander(a);
+ if (f != null) jc.addConverterFactory(f);
+ jc.parse("a.com:10", "b.com:20");
+ Assert.assertEquals(a.getHostPorts().get(0).host, "a.com");
+ Assert.assertEquals(a.getHostPorts().get(0).port.intValue(), 10);
+ Assert.assertEquals(a.getHostPorts().get(1).host, "b.com");
+ Assert.assertEquals(a.getHostPorts().get(1).port.intValue(), 20);
+ }
+
+ @Test
+ public void mainWithoutFactory() {
+ mainWithHostPortParameters(null, new ArgsMainParameter1());
+ }
+
+ @Test
+ public void mainWithFactory() {
+ mainWithHostPortParameters(CONVERTER_FACTORY, new ArgsMainParameter2());
+ }
+
+}
+
diff --git a/src/test/java/com/beust/jcommander/DefaultProviderTest.java b/src/test/java/com/beust/jcommander/DefaultProviderTest.java
new file mode 100644
index 0000000..45ab6b6
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/DefaultProviderTest.java
@@ -0,0 +1,120 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander;
+
+import com.beust.jcommander.args.ArgsDefault;
+import com.beust.jcommander.defaultprovider.PropertyFileDefaultProvider;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+public class DefaultProviderTest {
+ private static final IDefaultProvider DEFAULT_PROVIDER = new IDefaultProvider() {
+
+ public String getDefaultValueFor(String optionName) {
+ return "-debug".equals(optionName) ? "false" : "42";
+ }
+
+ };
+
+ private ArgsDefault defaultProvider(IDefaultProvider provider, String... args) {
+ ArgsDefault a = new ArgsDefault();
+ JCommander jc = new JCommander(a);
+ jc.setDefaultProvider(provider);
+
+ jc.parse(args);
+ return a;
+ }
+
+ @Test
+ public void defaultProvider1() {
+ ArgsDefault a = defaultProvider(DEFAULT_PROVIDER, "f");
+
+ Assert.assertEquals(a.groups, "42");
+ Assert.assertEquals(a.level, 42);
+ Assert.assertEquals(a.log.intValue(), 42);
+ }
+
+ @Test
+ public void defaultProvider2() {
+ ArgsDefault a = defaultProvider(DEFAULT_PROVIDER, "-groups", "foo", "f");
+
+ Assert.assertEquals(a.groups, "foo");
+ Assert.assertEquals(a.level, 42);
+ Assert.assertEquals(a.log.intValue(), 42);
+ }
+
+ @Test
+ public void defaultProvider3() {
+ ArgsDefault a = defaultProvider(DEFAULT_PROVIDER, "-groups", "foo", "-level", "13", "f");
+
+ Assert.assertEquals(a.groups, "foo");
+ Assert.assertEquals(a.level, 13);
+ Assert.assertEquals(a.log.intValue(), 42);
+ }
+
+ @Test
+ public void defaultProvider4() {
+ ArgsDefault a = defaultProvider(DEFAULT_PROVIDER,
+ "-log", "19", "-groups", "foo", "-level", "13", "f");
+
+ Assert.assertEquals(a.groups, "foo");
+ Assert.assertEquals(a.level, 13);
+ Assert.assertEquals(a.log.intValue(), 19);
+ }
+
+ @Test
+ public void propertyFileDefaultProvider1() {
+ ArgsDefault a = defaultProvider(new PropertyFileDefaultProvider(), "f");
+
+ Assert.assertEquals(a.groups, "unit");
+ Assert.assertEquals(a.level, 17);
+ Assert.assertEquals(a.log.intValue(), 18);
+ }
+
+ @Test
+ public void propertyFileDefaultProvider2() {
+ ArgsDefault a = defaultProvider(new PropertyFileDefaultProvider(), "-groups", "foo", "f");
+
+ Assert.assertEquals(a.groups, "foo");
+ Assert.assertEquals(a.level, 17);
+ Assert.assertEquals(a.log.intValue(), 18);
+ }
+
+ @Test
+ public void propertyFileDefaultProvider3() {
+ ArgsDefault a = defaultProvider(new PropertyFileDefaultProvider(),
+ "-groups", "foo", "-level", "13", "f");
+
+ Assert.assertEquals(a.groups, "foo");
+ Assert.assertEquals(a.level, 13);
+ Assert.assertEquals(a.log.intValue(), 18);
+ }
+
+ @Test
+ public void propertyFileDefaultProvider4() {
+ ArgsDefault a = defaultProvider(new PropertyFileDefaultProvider(),
+ "-log", "19", "-groups", "foo", "-level", "13", "f");
+
+ Assert.assertEquals(a.groups, "foo");
+ Assert.assertEquals(a.level, 13);
+ Assert.assertEquals(a.log.intValue(), 19);
+ }
+
+}
diff --git a/src/test/java/com/beust/jcommander/DefaultValueTest.java b/src/test/java/com/beust/jcommander/DefaultValueTest.java
new file mode 100644
index 0000000..3b1f29c
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/DefaultValueTest.java
@@ -0,0 +1,113 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander;
+
+import com.beust.jcommander.internal.Lists;
+import com.beust.jcommander.internal.Sets;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Test behaviour of default parameter values
+ * @author rodionmoiseev
+ */
+public class DefaultValueTest {
+ @Test
+ public void emptyDefaultValueForListParameterStaysEmptyIfNotAssignedOrIsSetOtherwise() {
+ MyOptsWithEmptyDefaults opts = new MyOptsWithEmptyDefaults();
+ JCommander cmd = new JCommander(opts);
+ cmd.parse(new String[]{"-a", "anotherValue"});
+ Assert.assertEquals(opts.list.size(), 1);
+ Assert.assertEquals(opts.list.get(0), "anotherValue");
+ Assert.assertEquals(opts.set.size(), 0);
+ }
+
+ @Test
+ public void defaultValueForListParametersGetsOverwrittenWithSpecifiedValueOrStaysAsDefaultOtherwise() {
+ MyOptsWithDefaultValues opts = new MyOptsWithDefaultValues();
+ JCommander cmd = new JCommander(opts);
+ cmd.parse(new String[]{"-a", "anotherValue"});
+ Assert.assertEquals(opts.list.size(), 1);
+ Assert.assertEquals(opts.list.get(0), "anotherValue");
+ Assert.assertEquals(opts.set.size(), 1);
+ Assert.assertEquals(opts.set.iterator().next(), "defaultValue");
+ }
+
+ @Test
+ public void anyNumberOfValuesCanBeSetToListParameters_ForEmptyDefaults(){
+ MyOptsWithEmptyDefaults opts = new MyOptsWithEmptyDefaults();
+ testSettingMultipleValuesToListTypeParameters(opts);
+ }
+
+ @Test
+ public void anyNumberOfValuesCanBeSetToListParameters_ForNonEmptyDefaults(){
+ MyOptsWithDefaultValues opts = new MyOptsWithDefaultValues();
+ testSettingMultipleValuesToListTypeParameters(opts);
+ }
+
+ private void testSettingMultipleValuesToListTypeParameters(MyOpts opts) {
+ JCommander cmd = new JCommander(opts);
+ cmd.parse(new String[]{"-a", "anotherValue", "-a", "anotherValue2",
+ "-b", "anotherValue3", "-b", "anotherValue4"});
+ Assert.assertEquals(opts.list.size(), 2);
+ Assert.assertEquals(opts.list.get(0), "anotherValue");
+ Assert.assertEquals(opts.list.get(1), "anotherValue2");
+ Assert.assertEquals(opts.set.size(), 2);
+ Iterator<String> arg2it = opts.set.iterator();
+ Assert.assertEquals(arg2it.next(), "anotherValue3");
+ Assert.assertEquals(arg2it.next(), "anotherValue4");
+ }
+
+ public static class MyOpts {
+ @Parameter(names = "-a")
+ public List<String> list;
+ @Parameter(names = "-b")
+ public Set<String> set;
+ }
+
+ public static final class MyOptsWithDefaultValues extends MyOpts {
+ public MyOptsWithDefaultValues(){
+ this.list = singletonList("defaultValue");
+ this.set = singletonSet("defaultValue");
+ }
+ }
+
+ public static final class MyOptsWithEmptyDefaults extends MyOpts {
+ public MyOptsWithEmptyDefaults(){
+ this.list = Lists.newArrayList();
+ this.set = Sets.newLinkedHashSet();
+ }
+ }
+
+ public static final List<String> singletonList(String value) {
+ List<String> list = Lists.newArrayList();
+ list.add(value);
+ return list;
+ }
+
+ public static final Set<String> singletonSet(String value){
+ Set<String> set = Sets.newLinkedHashSet();
+ set.add(value);
+ return set;
+ }
+}
diff --git a/src/test/java/com/beust/jcommander/FinderTest.java b/src/test/java/com/beust/jcommander/FinderTest.java
new file mode 100644
index 0000000..94bf812
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/FinderTest.java
@@ -0,0 +1,97 @@
+package com.beust.jcommander;
+
+import com.beust.jcommander.JCommanderTest.BaseArgs;
+import com.beust.jcommander.JCommanderTest.ConfigureArgs;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+@Test
+public class FinderTest {
+ public void caseInsensitiveOption() {
+ class Arg {
+
+ @Parameter(names = { "-p", "--param" })
+ private String param;
+ }
+ Arg a = new Arg();
+ JCommander jc = new JCommander(a);
+ jc.setCaseSensitiveOptions(false);
+ jc.parse(new String[] { "--PARAM", "foo" });
+ Assert.assertEquals(a.param, "foo");
+ }
+
+ public void caseInsensitiveCommand() {
+ BaseArgs a = new BaseArgs();
+ ConfigureArgs conf = new ConfigureArgs();
+ JCommander jc = new JCommander(a);
+ jc.addCommand(conf);
+ jc.setCaseSensitiveOptions(false);
+// jc.setCaseSensitiveCommands(false);
+ jc.parse("--CONFIGURE");
+ String command = jc.getParsedCommand();
+ Assert.assertEquals(command, "--configure");
+ }
+
+ public void abbreviatedOptions() {
+ class Arg {
+ @Parameter(names = { "-p", "--param" })
+ private String param;
+ }
+ Arg a = new Arg();
+ JCommander jc = new JCommander(a);
+ jc.setAllowAbbreviatedOptions(true);
+ jc.parse(new String[] { "--par", "foo" });
+ Assert.assertEquals(a.param, "foo");
+ }
+
+ public void abbreviatedOptionsCaseInsensitive() {
+ class Arg {
+ @Parameter(names = { "-p", "--param" })
+ private String param;
+ }
+ Arg a = new Arg();
+ JCommander jc = new JCommander(a);
+ jc.setCaseSensitiveOptions(false);
+ jc.setAllowAbbreviatedOptions(true);
+ jc.parse(new String[] { "--PAR", "foo" });
+ Assert.assertEquals(a.param, "foo");
+ }
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void ambiguousAbbreviatedOptions() {
+ class Arg {
+ @Parameter(names = { "--param" })
+ private String param;
+ @Parameter(names = { "--parb" })
+ private String parb;
+ }
+ Arg a = new Arg();
+ JCommander jc = new JCommander(a);
+ jc.setAllowAbbreviatedOptions(true);
+ jc.parse(new String[] { "--par", "foo" });
+ Assert.assertEquals(a.param, "foo");
+ }
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void ambiguousAbbreviatedOptionsCaseInsensitive() {
+ class Arg {
+ @Parameter(names = { "--param" })
+ private String param;
+ @Parameter(names = { "--parb" })
+ private String parb;
+ }
+ Arg a = new Arg();
+ JCommander jc = new JCommander(a);
+ jc.setCaseSensitiveOptions(false);
+ jc.setAllowAbbreviatedOptions(true);
+ jc.parse(new String[] { "--PAR", "foo" });
+ Assert.assertEquals(a.param, "foo");
+ }
+
+ @Test(enabled = false)
+ public static void main(String[] args) throws Exception {
+ new FinderTest().ambiguousAbbreviatedOptionsCaseInsensitive();
+ }
+
+}
diff --git a/src/test/java/com/beust/jcommander/HostPort.java b/src/test/java/com/beust/jcommander/HostPort.java
new file mode 100644
index 0000000..a18018e
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/HostPort.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander;
+
+public class HostPort {
+ public String host;
+ public Integer port;
+ @Override
+
+ public String toString() {
+ return "[Host:" + host + " port:" + port + "]";
+ }
+}
diff --git a/src/test/java/com/beust/jcommander/HostPortConverter.java b/src/test/java/com/beust/jcommander/HostPortConverter.java
new file mode 100644
index 0000000..f45e3ba
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/HostPortConverter.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander;
+
+public class HostPortConverter implements IStringConverter<HostPort> {
+
+ public HostPort convert(String value) {
+ HostPort result = new HostPort();
+ String[] s = value.split(":");
+ result.host = s[0];
+ result.port = Integer.parseInt(s[1]);
+
+ return result;
+ }
+
+} \ No newline at end of file
diff --git a/src/test/java/com/beust/jcommander/JCommanderTest.java b/src/test/java/com/beust/jcommander/JCommanderTest.java
new file mode 100644
index 0000000..ad2c5e8
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/JCommanderTest.java
@@ -0,0 +1,1081 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.ResourceBundle;
+import java.util.TreeSet;
+
+import org.testng.Assert;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import com.beust.jcommander.args.AlternateNamesForListArgs;
+import com.beust.jcommander.args.Args1;
+import com.beust.jcommander.args.Args1Setter;
+import com.beust.jcommander.args.Args2;
+import com.beust.jcommander.args.ArgsArityString;
+import com.beust.jcommander.args.ArgsBooleanArity;
+import com.beust.jcommander.args.ArgsBooleanArity0;
+import com.beust.jcommander.args.ArgsConverter;
+import com.beust.jcommander.args.ArgsEnum;
+import com.beust.jcommander.args.ArgsEnum.ChoiceType;
+import com.beust.jcommander.args.ArgsEquals;
+import com.beust.jcommander.args.ArgsHelp;
+import com.beust.jcommander.args.ArgsI18N1;
+import com.beust.jcommander.args.ArgsI18N2;
+import com.beust.jcommander.args.ArgsI18N2New;
+import com.beust.jcommander.args.ArgsInherited;
+import com.beust.jcommander.args.ArgsList;
+import com.beust.jcommander.args.ArgsMainParameter1;
+import com.beust.jcommander.args.ArgsMaster;
+import com.beust.jcommander.args.ArgsMultipleUnparsed;
+import com.beust.jcommander.args.ArgsOutOfMemory;
+import com.beust.jcommander.args.ArgsPrivate;
+import com.beust.jcommander.args.ArgsRequired;
+import com.beust.jcommander.args.ArgsSlave;
+import com.beust.jcommander.args.ArgsSlaveBogus;
+import com.beust.jcommander.args.ArgsValidate1;
+import com.beust.jcommander.args.ArgsWithSet;
+import com.beust.jcommander.args.Arity1;
+import com.beust.jcommander.args.SeparatorColon;
+import com.beust.jcommander.args.SeparatorEqual;
+import com.beust.jcommander.args.SeparatorMixed;
+import com.beust.jcommander.args.SlashSeparator;
+import com.beust.jcommander.args.VariableArity;
+import com.beust.jcommander.command.CommandAdd;
+import com.beust.jcommander.command.CommandCommit;
+import com.beust.jcommander.command.CommandMain;
+import com.beust.jcommander.internal.Lists;
+import com.beust.jcommander.internal.Maps;
+
+@Test
+public class JCommanderTest {
+ public void simpleArgs() throws ParseException {
+ Args1 args = new Args1();
+ String[] argv = { "-debug", "-log", "2", "-float", "1.2", "-double", "1.3", "-bigdecimal", "1.4",
+ "-date", "2011-10-26", "-groups", "unit", "a", "b", "c" };
+ new JCommander(args, argv);
+
+ Assert.assertTrue(args.debug);
+ Assert.assertEquals(args.verbose.intValue(), 2);
+ Assert.assertEquals(args.groups, "unit");
+ Assert.assertEquals(args.parameters, Arrays.asList("a", "b", "c"));
+ Assert.assertEquals(args.floa, 1.2f, 0.1f);
+ Assert.assertEquals(args.doub, 1.3f, 0.1f);
+ Assert.assertEquals(args.bigd, new BigDecimal("1.4"));
+ Assert.assertEquals(args.date, new SimpleDateFormat("yyyy-MM-dd").parse("2011-10-26"));
+ }
+
+ @DataProvider
+ public Object[][] alternateNamesListArgs() {
+ return new Object[][] {
+ new String[][] {new String[] {"--servers", "1", "-s", "2", "--servers", "3"}},
+ new String[][] {new String[] {"-s", "1", "-s", "2", "--servers", "3"}},
+ new String[][] {new String[] {"--servers", "1", "--servers", "2", "-s", "3"}},
+ new String[][] {new String[] {"-s", "1", "--servers", "2", "-s", "3"}},
+ new String[][] {new String[] {"-s", "1", "-s", "2", "--servers", "3"}},
+ };
+ }
+
+ /**
+ * Confirm that List<?> parameters with alternate names return the correct
+ * List regardless of how the arguments are specified
+ */
+
+ @Test(dataProvider = "alternateNamesListArgs")
+ public void testAlternateNamesForListArguments(String[] argv) {
+ AlternateNamesForListArgs args = new AlternateNamesForListArgs();
+
+ new JCommander(args, argv);
+
+ Assert.assertEquals(args.serverNames.size(), 3);
+ Assert.assertEquals(args.serverNames.get(0), argv[1]);
+ Assert.assertEquals(args.serverNames.get(1), argv[3]);
+ Assert.assertEquals(args.serverNames.get(2), argv[5]);
+ }
+
+
+ /**
+ * Make sure that if there are args with multiple names (e.g. "-log" and "-verbose"),
+ * the usage will only display it once.
+ */
+ public void repeatedArgs() {
+ Args1 args = new Args1();
+ String[] argv = { "-log", "2" };
+ JCommander jc = new JCommander(args, argv);
+ Assert.assertEquals(jc.getParameters().size(), 8);
+ }
+
+ /**
+ * Not specifying a required option should throw an exception.
+ */
+ @Test(expectedExceptions = ParameterException.class)
+ public void requiredFields1Fail() {
+ Args1 args = new Args1();
+ String[] argv = { "-debug" };
+ new JCommander(args, argv);
+ }
+
+ /**
+ * Getting the description of a nonexistent command should throw an exception.
+ */
+ @Test(expectedExceptions = ParameterException.class)
+ public void nonexistentCommandShouldThrow() {
+ String[] argv = { };
+ JCommander jc = new JCommander(new Object(), argv);
+ jc.getCommandDescription("foo");
+ }
+
+ /**
+ * Required options with multiple names should work with all names.
+ */
+ private void multipleNames(String option) {
+ Args1 args = new Args1();
+ String[] argv = { option, "2" };
+ new JCommander(args, argv);
+ Assert.assertEquals(args.verbose.intValue(), 2);
+ }
+
+ public void multipleNames1() {
+ multipleNames("-log");
+ }
+
+ public void multipleNames2() {
+ multipleNames("-verbose");
+ }
+
+ private void i18n1(String bundleName, Locale locale, String expectedString) {
+ ResourceBundle bundle = locale != null ? ResourceBundle.getBundle(bundleName, locale)
+ : null;
+
+ ArgsI18N1 i18n = new ArgsI18N1();
+ String[] argv = { "-host", "localhost" };
+ JCommander jc = new JCommander(i18n, bundle, argv);
+// jc.usage();
+
+ ParameterDescription pd = jc.getParameters().get(0);
+ Assert.assertEquals(pd.getDescription(), expectedString);
+ }
+
+ public void i18nNoLocale() {
+ i18n1("MessageBundle", null, "Host");
+ }
+
+ public void i18nUsLocale() {
+ i18n1("MessageBundle", new Locale("en", "US"), "Host");
+ }
+
+ public void i18nFrLocale() {
+ i18n1("MessageBundle", new Locale("fr", "FR"), "Hôte");
+ }
+
+ private void i18n2(Object i18n) {
+ String[] argv = { "-host", "localhost" };
+ Locale.setDefault(new Locale("fr", "FR"));
+ JCommander jc = new JCommander(i18n, argv);
+ ParameterDescription pd = jc.getParameters().get(0);
+ Assert.assertEquals(pd.getDescription(), "Hôte");
+ }
+
+ public void i18nWithResourceAnnotation() {
+ i18n2(new ArgsI18N2());
+ }
+
+ public void i18nWithResourceAnnotationNew() {
+ i18n2(new ArgsI18N2New());
+ }
+
+ public void noParseConstructor() {
+ JCommander jCommander = new JCommander(new ArgsMainParameter1());
+ jCommander.usage(new StringBuilder());
+ // Before fix, this parse would throw an exception, because it calls createDescription, which
+ // was already called by usage(), and can only be called once.
+ jCommander.parse();
+ }
+
+ /**
+ * Test a use case where there are required parameters, but you still want
+ * to interrogate the options which are specified.
+ */
+ public void usageWithRequiredArgsAndResourceBundle() {
+ ArgsHelp argsHelp = new ArgsHelp();
+ JCommander jc = new JCommander(new Object[]{argsHelp, new ArgsRequired()},
+ java.util.ResourceBundle.getBundle("MessageBundle"));
+ // Should be able to display usage without triggering validation
+ jc.usage(new StringBuilder());
+ try {
+ jc.parse("-h");
+ Assert.fail("Should have thrown a required parameter exception");
+ } catch (ParameterException e) {
+ Assert.assertTrue(e.getMessage().contains("are required"));
+ }
+ Assert.assertTrue(argsHelp.help);
+ }
+
+ public void multiObjects() {
+ ArgsMaster m = new ArgsMaster();
+ ArgsSlave s = new ArgsSlave();
+ String[] argv = { "-master", "master", "-slave", "slave" };
+ new JCommander(new Object[] { m , s }, argv);
+
+ Assert.assertEquals(m.master, "master");
+ Assert.assertEquals(s.slave, "slave");
+ }
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void multiObjectsWithDuplicatesFail() {
+ ArgsMaster m = new ArgsMaster();
+ ArgsSlave s = new ArgsSlaveBogus();
+ String[] argv = { "-master", "master", "-slave", "slave" };
+ new JCommander(new Object[] { m , s }, argv);
+ }
+
+ public void arityString() {
+ ArgsArityString args = new ArgsArityString();
+ String[] argv = { "-pairs", "pair0", "pair1", "rest" };
+ new JCommander(args, argv);
+
+ Assert.assertEquals(args.pairs.size(), 2);
+ Assert.assertEquals(args.pairs.get(0), "pair0");
+ Assert.assertEquals(args.pairs.get(1), "pair1");
+ Assert.assertEquals(args.rest.size(), 1);
+ Assert.assertEquals(args.rest.get(0), "rest");
+ }
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void arity2Fail() {
+ ArgsArityString args = new ArgsArityString();
+ String[] argv = { "-pairs", "pair0" };
+ new JCommander(args, argv);
+ }
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void multipleUnparsedFail() {
+ ArgsMultipleUnparsed args = new ArgsMultipleUnparsed();
+ String[] argv = { };
+ new JCommander(args, argv);
+ }
+
+ public void privateArgs() {
+ ArgsPrivate args = new ArgsPrivate();
+ new JCommander(args, "-verbose", "3");
+ Assert.assertEquals(args.getVerbose().intValue(), 3);
+ }
+
+ public void converterArgs() {
+ ArgsConverter args = new ArgsConverter();
+ String fileName = "a";
+ new JCommander(args, "-file", "/tmp/" + fileName,
+ "-listStrings", "Tuesday,Thursday",
+ "-listInts", "-1,8",
+ "-listBigDecimals", "-11.52,100.12");
+ Assert.assertEquals(args.file.getName(), fileName);
+ Assert.assertEquals(args.listStrings.size(), 2);
+ Assert.assertEquals(args.listStrings.get(0), "Tuesday");
+ Assert.assertEquals(args.listStrings.get(1), "Thursday");
+ Assert.assertEquals(args.listInts.size(), 2);
+ Assert.assertEquals(args.listInts.get(0).intValue(), -1);
+ Assert.assertEquals(args.listInts.get(1).intValue(), 8);
+ Assert.assertEquals(args.listBigDecimals.size(), 2);
+ Assert.assertEquals(args.listBigDecimals.get(0), new BigDecimal("-11.52"));
+ Assert.assertEquals(args.listBigDecimals.get(1), new BigDecimal("100.12"));
+ }
+
+ private void argsBoolean1(String[] params, Boolean expected) {
+ ArgsBooleanArity args = new ArgsBooleanArity();
+ new JCommander(args, params);
+ Assert.assertEquals(args.debug, expected);
+ }
+
+ private void argsBoolean0(String[] params, Boolean expected) {
+ ArgsBooleanArity0 args = new ArgsBooleanArity0();
+ new JCommander(args, params);
+ Assert.assertEquals(args.debug, expected);
+ }
+
+ public void booleanArity1() {
+ argsBoolean1(new String[] {}, Boolean.FALSE);
+ argsBoolean1(new String[] { "-debug", "true" }, Boolean.TRUE);
+ }
+
+ public void booleanArity0() {
+ argsBoolean0(new String[] {}, Boolean.FALSE);
+ argsBoolean0(new String[] { "-debug"}, Boolean.TRUE);
+ }
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void badParameterShouldThrowParameter1Exception() {
+ Args1 args = new Args1();
+ String[] argv = { "-log", "foo" };
+ new JCommander(args, argv);
+ }
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void badParameterShouldThrowParameter2Exception() {
+ Args1 args = new Args1();
+ String[] argv = { "-long", "foo" };
+ new JCommander(args, argv);
+ }
+
+ public void listParameters() {
+ Args2 a = new Args2();
+ String[] argv = {"-log", "2", "-groups", "unit", "a", "b", "c", "-host", "host2"};
+ new JCommander(a, argv);
+ Assert.assertEquals(a.verbose.intValue(), 2);
+ Assert.assertEquals(a.groups, "unit");
+ Assert.assertEquals(a.hosts, Arrays.asList("host2"));
+ Assert.assertEquals(a.parameters, Arrays.asList("a", "b", "c"));
+ }
+
+ public void separatorEqual() {
+ SeparatorEqual s = new SeparatorEqual();
+ String[] argv = { "-log=3", "--longoption=10" };
+ new JCommander(s, argv);
+ Assert.assertEquals(s.log.intValue(), 3);
+ Assert.assertEquals(s.longOption.intValue(), 10);
+ }
+
+ public void separatorColon() {
+ SeparatorColon s = new SeparatorColon();
+ String[] argv = { "-verbose:true" };
+ new JCommander(s, argv);
+ Assert.assertTrue(s.verbose);
+ }
+
+ public void separatorBoth() {
+ SeparatorColon s = new SeparatorColon();
+ SeparatorEqual s2 = new SeparatorEqual();
+ String[] argv = { "-verbose:true", "-log=3" };
+ new JCommander(new Object[] { s, s2 }, argv);
+ Assert.assertTrue(s.verbose);
+ Assert.assertEquals(s2.log.intValue(), 3);
+ }
+
+ public void separatorMixed1() {
+ SeparatorMixed s = new SeparatorMixed();
+ String[] argv = { "-long:1", "-level=42" };
+ new JCommander(s, argv);
+ Assert.assertEquals(s.l.longValue(), 1l);
+ Assert.assertEquals(s.level.intValue(), 42);
+ }
+
+ public void slashParameters() {
+ SlashSeparator a = new SlashSeparator();
+ String[] argv = { "/verbose", "/file", "/tmp/a" };
+ new JCommander(a, argv);
+ Assert.assertTrue(a.verbose);
+ Assert.assertEquals(a.file, "/tmp/a");
+ }
+
+ public void inheritance() {
+ ArgsInherited args = new ArgsInherited();
+ String[] argv = { "-log", "3", "-child", "2" };
+ new JCommander(args, argv);
+ Assert.assertEquals(args.child.intValue(), 2);
+ Assert.assertEquals(args.log.intValue(), 3);
+ }
+
+ public void negativeNumber() {
+ Args1 a = new Args1();
+ String[] argv = { "-verbose", "-3" };
+ new JCommander(a, argv);
+ Assert.assertEquals(a.verbose.intValue(), -3);
+ }
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void requiredMainParameters() {
+ ArgsRequired a = new ArgsRequired();
+ String[] argv = {};
+ new JCommander(a, argv);
+ }
+
+ public void usageShouldNotChange() {
+ JCommander jc = new JCommander(new Args1(), new String[]{"-log", "1"});
+ StringBuilder sb = new StringBuilder();
+ jc.usage(sb);
+ String expected = sb.toString();
+ jc = new JCommander(new Args1(), new String[]{"-debug", "-log", "2", "-long", "5"});
+ sb = new StringBuilder();
+ jc.usage(sb);
+ String actual = sb.toString();
+ Assert.assertEquals(actual, expected);
+ }
+
+ private void verifyCommandOrdering(String[] commandNames, Object[] commands) {
+ CommandMain cm = new CommandMain();
+ JCommander jc = new JCommander(cm);
+
+ for (int i = 0; i < commands.length; i++) {
+ jc.addCommand(commandNames[i], commands[i]);
+ }
+
+ Map<String, JCommander> c = jc.getCommands();
+ Assert.assertEquals(c.size(), commands.length);
+
+ Iterator<String> it = c.keySet().iterator();
+ for (int i = 0; i < commands.length; i++) {
+ Assert.assertEquals(it.next(), commandNames[i]);
+ }
+ }
+
+ public void commandsShouldBeShownInOrderOfInsertion() {
+ verifyCommandOrdering(new String[] { "add", "commit" },
+ new Object[] { new CommandAdd(), new CommandCommit() });
+ verifyCommandOrdering(new String[] { "commit", "add" },
+ new Object[] { new CommandCommit(), new CommandAdd() });
+ }
+
+ @DataProvider
+ public static Object[][] f() {
+ return new Integer[][] {
+ new Integer[] { 3, 5, 1 },
+ new Integer[] { 3, 8, 1 },
+ new Integer[] { 3, 12, 2 },
+ new Integer[] { 8, 12, 2 },
+ new Integer[] { 9, 10, 1 },
+ };
+ }
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void arity1Fail() {
+ final Arity1 arguments = new Arity1();
+ final JCommander jCommander = new JCommander(arguments);
+ final String[] commands = {
+ "-inspect"
+ };
+ jCommander.parse(commands);
+ }
+
+ public void arity1Success1() {
+ final Arity1 arguments = new Arity1();
+ final JCommander jCommander = new JCommander(arguments);
+ final String[] commands = {
+ "-inspect", "true"
+ };
+ jCommander.parse(commands);
+ Assert.assertTrue(arguments.inspect);
+ }
+
+ public void arity1Success2() {
+ final Arity1 arguments = new Arity1();
+ final JCommander jCommander = new JCommander(arguments);
+ final String[] commands = {
+ "-inspect", "false"
+ };
+ jCommander.parse(commands);
+ Assert.assertFalse(arguments.inspect);
+ }
+
+ @Parameters(commandDescription = "Help for the given commands.")
+ public static class Help {
+ public static final String NAME = "help";
+
+ @Parameter(description = "List of commands.")
+ public List<String> commands=new ArrayList<String>();
+ }
+
+ @Test(expectedExceptions = ParameterException.class,
+ description = "Verify that the main parameter's type is checked to be a List")
+ public void wrongMainTypeShouldThrow() {
+ JCommander jc = new JCommander(new ArgsRequiredWrongMain());
+ jc.parse(new String[] { "f1", "f2" });
+ }
+
+ @Test(description = "This used to run out of memory")
+ public void oom() {
+ JCommander jc = new JCommander(new ArgsOutOfMemory());
+ jc.usage(new StringBuilder());
+ }
+
+ @Test
+ public void getParametersShouldNotNpe() {
+ JCommander jc = new JCommander(new Args1());
+ List<ParameterDescription> parameters = jc.getParameters();
+ }
+
+ public void validationShouldWork1() {
+ ArgsValidate1 a = new ArgsValidate1();
+ JCommander jc = new JCommander(a);
+ jc.parse(new String[] { "-age", "2 "});
+ Assert.assertEquals(a.age, new Integer(2));
+ }
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void validationShouldWorkWithDefaultValues() {
+ ArgsValidate2 a = new ArgsValidate2();
+ new JCommander(a);
+ }
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void validationShouldWork2() {
+ ArgsValidate1 a = new ArgsValidate1();
+ JCommander jc = new JCommander(a);
+ jc.parse(new String[] { "-age", "-2 "});
+ }
+
+ public void atFileCanContainEmptyLines() throws IOException {
+ File f = File.createTempFile("JCommander", null);
+ f.deleteOnExit();
+ FileWriter fw = new FileWriter(f);
+ fw.write("-log\n");
+ fw.write("\n");
+ fw.write("2\n");
+ fw.close();
+ new JCommander(new Args1(), "@" + f.getAbsolutePath());
+ }
+
+ public void handleEqualSigns() {
+ ArgsEquals a = new ArgsEquals();
+ JCommander jc = new JCommander(a);
+ jc.parse(new String[] { "-args=a=b,b=c" });
+ Assert.assertEquals(a.args, "a=b,b=c");
+ }
+
+ @SuppressWarnings("serial")
+ public void handleSets() {
+ ArgsWithSet a = new ArgsWithSet();
+ new JCommander(a, new String[] { "-s", "3,1,2" });
+ Assert.assertEquals(a.set, new TreeSet<Integer>() {{ add(1); add(2); add(3); }});
+ }
+
+ private static final List<String> V = Arrays.asList("a", "b", "c", "d");
+
+ @DataProvider
+ public Object[][] variable() {
+ return new Object[][] {
+ new Object[] { 0, V.subList(0, 0), V },
+ new Object[] { 1, V.subList(0, 1), V.subList(1, 4) },
+ new Object[] { 2, V.subList(0, 2), V.subList(2, 4) },
+ new Object[] { 3, V.subList(0, 3), V.subList(3, 4) },
+ new Object[] { 4, V.subList(0, 4), V.subList(4, 4) },
+ };
+ }
+
+ @Test(dataProvider = "variable")
+ public void variableArity(int count, List<String> var, List<String> main) {
+ VariableArity va = new VariableArity(count);
+ new JCommander(va).parse("-variable", "a", "b", "c", "d");
+ Assert.assertEquals(var, va.var);
+ Assert.assertEquals(main, va.main);
+ }
+
+ public void enumArgs() {
+ ArgsEnum args = new ArgsEnum();
+ String[] argv = { "-choice", "ONE", "-choices", "ONE", "Two" };
+ JCommander jc = new JCommander(args, argv);
+
+ Assert.assertEquals(args.choice, ArgsEnum.ChoiceType.ONE);
+
+ List<ChoiceType> expected = Arrays.asList(ChoiceType.ONE, ChoiceType.Two);
+ Assert.assertEquals(expected, args.choices);
+ Assert.assertEquals(jc.getParameters().get(0).getDescription(),
+ "Options: " + EnumSet.allOf((Class<? extends Enum>) ArgsEnum.ChoiceType.class));
+
+ }
+
+ public void enumArgsCaseInsensitive() {
+ ArgsEnum args = new ArgsEnum();
+ String[] argv = { "-choice", "one"};
+ JCommander jc = new JCommander(args, argv);
+
+ Assert.assertEquals(args.choice, ArgsEnum.ChoiceType.ONE);
+ }
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void enumArgsFail() {
+ ArgsEnum args = new ArgsEnum();
+ String[] argv = { "-choice", "A" };
+ new JCommander(args, argv);
+ }
+
+ public void testListAndSplitters() {
+ ArgsList al = new ArgsList();
+ JCommander j = new JCommander(al);
+ j.parse("-groups", "a,b", "-ints", "41,42", "-hp", "localhost:1000;example.com:1001",
+ "-hp2", "localhost:1000,example.com:1001", "-uppercase", "ab,cd");
+ Assert.assertEquals(al.groups.get(0), "a");
+ Assert.assertEquals(al.groups.get(1), "b");
+ Assert.assertEquals(al.ints.get(0).intValue(), 41);
+ Assert.assertEquals(al.ints.get(1).intValue(), 42);
+ Assert.assertEquals(al.hostPorts.get(0).host, "localhost");
+ Assert.assertEquals(al.hostPorts.get(0).port.intValue(), 1000);
+ Assert.assertEquals(al.hostPorts.get(1).host, "example.com");
+ Assert.assertEquals(al.hostPorts.get(1).port.intValue(), 1001);
+ Assert.assertEquals(al.hp2.get(1).host, "example.com");
+ Assert.assertEquals(al.hp2.get(1).port.intValue(), 1001);
+ Assert.assertEquals(al.uppercase.get(0), "AB");
+ Assert.assertEquals(al.uppercase.get(1), "CD");
+ }
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void shouldThrowIfUnknownOption() {
+ class A {
+ @Parameter(names = "-long")
+ public long l;
+ }
+ A a = new A();
+ new JCommander(a).parse("-lon", "32");
+ }
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void mainParameterShouldBeValidate() {
+ class V implements IParameterValidator {
+
+ @Override
+ public void validate(String name, String value) throws ParameterException {
+ Assert.assertEquals("a", value);
+ }
+ }
+
+ class A {
+ @Parameter(validateWith = V.class)
+ public List<String> m;
+ }
+
+ A a = new A();
+ new JCommander(a).parse("b");
+ }
+
+ @Parameters(commandNames = { "--configure" })
+ public static class ConfigureArgs {
+ }
+
+ public static class BaseArgs {
+ @Parameter(names = { "-h", "--help" }, description = "Show this help screen")
+ private boolean help = false;
+
+ @Parameter(names = { "--version", "-version" }, description = "Show the program version")
+ private boolean version;
+ }
+
+ public void commandsWithSamePrefixAsOptionsShouldWork() {
+ BaseArgs a = new BaseArgs();
+ ConfigureArgs conf = new ConfigureArgs();
+ JCommander jc = new JCommander(a);
+ jc.addCommand(conf);
+ jc.parse("--configure");
+ }
+
+ // Tests:
+ // required unparsed parameter
+ @Test(enabled = false,
+ description = "For some reason, this test still asks the password on stdin")
+ public void askedRequiredPassword() {
+ class A {
+ @Parameter(names = { "--password", "-p" }, description = "Private key password",
+ password = true, required = true)
+ public String password;
+
+ @Parameter(names = { "--port", "-o" }, description = "Port to bind server to",
+ required = true)
+ public int port;
+ }
+ A a = new A();
+ InputStream stdin = System.in;
+ try {
+ System.setIn(new ByteArrayInputStream("password".getBytes()));
+ new JCommander(a,new String[]{"--port", "7","--password"});
+ Assert.assertEquals(a.port, 7);
+ Assert.assertEquals(a.password, "password");
+ } finally {
+ System.setIn(stdin);
+ }
+ }
+
+ public void dynamicParameters() {
+ class Command {
+ @DynamicParameter(names = {"-P"}, description = "Additional command parameters")
+ private Map<String, String> params = Maps.newHashMap();
+ }
+ JCommander commander = new JCommander();
+ Command c = new Command();
+ commander.addCommand("command", c);
+ commander.parse(new String[] { "command", "-Pparam='name=value'" });
+ Assert.assertEquals(c.params.get("param"), "'name=value'");
+ }
+
+ public void exeParser() {
+ class Params {
+ @Parameter( names= "-i")
+ private String inputFile;
+ }
+
+ String args[] = { "-i", "" };
+ Params p = new Params();
+ new JCommander(p, args);
+ }
+
+ public void multiVariableArityList() {
+ class Params {
+ @Parameter(names = "-paramA", description = "ParamA", variableArity = true)
+ private List<String> paramA = Lists.newArrayList();
+
+ @Parameter(names = "-paramB", description = "ParamB", variableArity = true)
+ private List<String> paramB = Lists.newArrayList();
+ }
+
+ {
+ String args[] = { "-paramA", "a1", "a2", "-paramB", "b1", "b2", "b3" };
+ Params p = new Params();
+ new JCommander(p, args).parse();
+ Assert.assertEquals(p.paramA, Arrays.asList(new String[] { "a1", "a2" }));
+ Assert.assertEquals(p.paramB, Arrays.asList(new String[] { "b1", "b2", "b3" }));
+ }
+
+ {
+ String args[] = { "-paramA", "a1", "a2", "-paramB", "b1", "-paramA", "a3" };
+ Params p = new Params();
+ new JCommander(p, args).parse();
+ Assert.assertEquals(p.paramA, Arrays.asList(new String[] { "a1", "a2", "a3" }));
+ Assert.assertEquals(p.paramB, Arrays.asList(new String[] { "b1" }));
+ }
+ }
+
+ @Test(enabled = false,
+ description = "Need to double check that the command description is i18n'ed in the usage")
+ public void commandKey() {
+ @Parameters(resourceBundle = "MessageBundle", commandDescriptionKey = "command")
+ class Args {
+ @Parameter(names="-myoption", descriptionKey="myoption")
+ private boolean option;
+ }
+ JCommander j = new JCommander();
+ Args a = new Args();
+ j.addCommand("comm", a);
+ j.usage();
+ }
+
+ public void tmp() {
+ class A {
+ @Parameter(names = "-b")
+ public String b;
+ }
+ new JCommander(new A()).parse("");
+ }
+
+ public void unknownOptionWithDifferentPrefix() {
+ @Parameters(optionPrefixes = "/")
+ class SlashSeparator {
+
+ @Parameter(names = "/verbose")
+ public boolean verbose = false;
+
+ @Parameter(names = "/file")
+ public String file;
+ }
+ SlashSeparator ss = new SlashSeparator();
+ try {
+ new JCommander(ss).parse("/notAParam");
+ } catch (ParameterException ex) {
+ boolean result = ex.getMessage().contains("Unknown option");
+ Assert.assertTrue(result);
+ }
+ }
+
+ public void equalSeparator() {
+ @Parameters(separators = "=", commandDescription = "My command")
+ class MyClass {
+
+ @Parameter(names = { "-p", "--param" }, required = true, description = "param desc...")
+ private String param;
+ }
+ MyClass c = new MyClass();
+ String expected = "\"hello\"world";
+ new JCommander(c).parse("--param=" + expected);
+ Assert.assertEquals(expected, c.param);
+ }
+
+ public void simpleArgsSetter() throws ParseException {
+ Args1Setter args = new Args1Setter();
+ String[] argv = { "-debug", "-log", "2", "-float", "1.2", "-double", "1.3", "-bigdecimal", "1.4",
+ "-date", "2011-10-26", "-groups", "unit", "a", "b", "c" };
+ new JCommander(args, argv);
+
+ Assert.assertTrue(args.debug);
+ Assert.assertEquals(args.verbose.intValue(), 2);
+ Assert.assertEquals(args.groups, "unit");
+ Assert.assertEquals(args.parameters, Arrays.asList("a", "b", "c"));
+ Assert.assertEquals(args.floa, 1.2f, 0.1f);
+ Assert.assertEquals(args.doub, 1.3f, 0.1f);
+ Assert.assertEquals(args.bigd, new BigDecimal("1.4"));
+ Assert.assertEquals(args.date, new SimpleDateFormat("yyyy-MM-dd").parse("2011-10-26"));
+ }
+
+ public void verifyHelp() {
+ class Arg {
+ @Parameter(names = "--help", help = true)
+ public boolean help = false;
+
+ @Parameter(names = "file", required = true)
+ public String file;
+ }
+ Arg arg = new Arg();
+ String[] argv = { "--help" };
+ new JCommander(arg, argv);
+
+ Assert.assertTrue(arg.help);
+ }
+
+ public void helpTest() {
+ class Arg {
+ @Parameter(names = { "?", "-help", "--help" }, description = "Shows help", help = true)
+ private boolean help = false;
+ }
+ Arg arg = new Arg();
+ JCommander jc = new JCommander(arg);
+ jc.parse(new String[] { "-help" });
+// System.out.println("helpTest:" + arg.help);
+ }
+
+ @Test(enabled = false, description = "Should only be enable once multiple parameters are allowed")
+ public void duplicateParameterNames() {
+ class ArgBase {
+ @Parameter(names = { "-host" })
+ protected String host;
+ }
+
+ class Arg1 extends ArgBase {}
+ Arg1 arg1 = new Arg1();
+
+ class Arg2 extends ArgBase {}
+ Arg2 arg2 = new Arg2();
+
+ JCommander jc = new JCommander(new Object[] { arg1, arg2});
+ jc.parse(new String[] { "-host", "foo" });
+ Assert.assertEquals(arg1.host, "foo");
+ Assert.assertEquals(arg2.host, "foo");
+ }
+
+ public void parameterWithOneDoubleQuote() {
+ @Parameters(separators = "=")
+ class Arg {
+ @Parameter(names = { "-p", "--param" })
+ private String param;
+ }
+ JCommander jc = new JCommander(new MyClass());
+ jc.parse("-p=\"");
+ }
+
+ public void emptyStringAsDefault() {
+ class Arg {
+ @Parameter(names = "-x")
+ String s = "";
+ }
+ Arg a = new Arg();
+ StringBuilder sb = new StringBuilder();
+ new JCommander(a).usage(sb);
+ Assert.assertTrue(sb.toString().contains("Default: <empty string>"));
+ }
+
+ public void spaces() {
+ class Arg {
+ @Parameter(names = "-rule", description = "rule")
+ private List<String> rules = new ArrayList<String>();
+ }
+ Arg a = new Arg();
+ new JCommander(a, "-rule", "some test");
+ Assert.assertEquals(a.rules, Arrays.asList("some test"));
+ }
+
+ static class V2 implements IParameterValidator2 {
+ final static List<String> names = Lists.newArrayList();
+ static boolean validateCalled = false;
+
+ @Override
+ public void validate(String name, String value) throws ParameterException {
+ validateCalled = true;
+ }
+
+ @Override
+ public void validate(String name, String value, ParameterDescription pd)
+ throws ParameterException {
+ names.addAll(Arrays.asList(pd.getParameter().names()));
+ }
+ }
+
+ public void validator2() {
+ class Arg {
+ @Parameter(names = { "-h", "--host" }, validateWith = V2.class)
+ String host;
+ }
+ Arg a = new Arg();
+ V2.names.clear();
+ V2.validateCalled = false;
+ JCommander jc = new JCommander(a, "--host", "h");
+ jc.setAcceptUnknownOptions(true);
+ Assert.assertEquals(V2.names, Arrays.asList(new String[] { "-h", "--host" }));
+ Assert.assertTrue(V2.validateCalled);
+ }
+
+ public void usageCommandsUnderUsage() {
+ class Arg {
+ }
+ @Parameters(commandDescription = "command a")
+ class ArgCommandA {
+ @Parameter(description = "command a parameters")
+ List<String> parameters;
+ }
+ @Parameters(commandDescription = "command b")
+ class ArgCommandB {
+ @Parameter(description = "command b parameters")
+ List<String> parameters;
+ }
+
+ Arg a = new Arg();
+
+ JCommander c = new JCommander(a);
+ c.addCommand("a", new ArgCommandA());
+ c.addCommand("b", new ArgCommandB());
+
+ StringBuilder sb = new StringBuilder();
+ c.usage(sb);
+ Assert.assertTrue(sb.toString().contains("[command options]\n Commands:"));
+ }
+
+ public void usageWithEmpytLine() {
+ class Arg {
+ }
+ @Parameters(commandDescription = "command a")
+ class ArgCommandA {
+ @Parameter(description = "command a parameters")
+ List<String> parameters;
+ }
+ @Parameters(commandDescription = "command b")
+ class ArgCommandB {
+ @Parameter(description = "command b parameters")
+ List<String> parameters;
+ }
+
+ Arg a = new Arg();
+
+ JCommander c = new JCommander(a);
+ c.addCommand("a", new ArgCommandA());
+ c.addCommand("b", new ArgCommandB());
+
+ StringBuilder sb = new StringBuilder();
+ c.usage(sb);
+ Assert.assertTrue(sb.toString().contains("command a parameters\n\n b"));
+ }
+
+ public void partialValidation() {
+ class Arg {
+ @Parameter(names = { "-h", "--host" })
+ String host;
+ }
+ Arg a = new Arg();
+ JCommander jc = new JCommander();
+ jc.setAcceptUnknownOptions(true);
+ jc.addObject(a);
+ jc.parse("-a", "foo", "-h", "host");
+ Assert.assertEquals(a.host, "host");
+ Assert.assertEquals(jc.getUnknownOptions(), Lists.newArrayList("-a", "foo"));
+ }
+
+ /**
+ * GITHUB-137.
+ */
+ public void listArgShouldBeCleared() {
+ class Args {
+ @Parameter(description = "[endpoint]")
+ public List<String> endpoint = Lists.newArrayList("prod");
+ }
+ Args a = new Args();
+ new JCommander(a, new String[] { "dev" });
+ Assert.assertEquals(a.endpoint, Lists.newArrayList("dev"));
+ }
+
+ public void dashDashParameter() {
+ class Arguments {
+ @Parameter(names = { "-name" })
+ public String name;
+ @Parameter
+ public List<String> mainParameters;
+ }
+
+ Arguments a = new Arguments();
+ new JCommander(a, new String[] {
+ "-name", "theName", "--", "param1", "param2"}
+ );
+ Assert.assertEquals(a.name, "theName");
+ Assert.assertEquals(a.mainParameters.size(), 2);
+ Assert.assertEquals(a.mainParameters.get(0), "param1");
+ Assert.assertEquals(a.mainParameters.get(1), "param2");
+ }
+
+ public void dashDashParameter2() {
+ class Arguments {
+ @Parameter(names = { "-name" })
+ public String name;
+ @Parameter
+ public List<String> mainParameters;
+ }
+
+ Arguments a = new Arguments();
+ new JCommander(a, new String[] {
+ "param1", "param2", "--", "param3", "-name", "theName"}
+ );
+ Assert.assertNull(a.name);
+ Assert.assertEquals(a.mainParameters.size(), 5);
+ Assert.assertEquals(a.mainParameters.get(0), "param1");
+ Assert.assertEquals(a.mainParameters.get(1), "param2");
+ Assert.assertEquals(a.mainParameters.get(2), "param3");
+ Assert.assertEquals(a.mainParameters.get(3), "-name");
+ Assert.assertEquals(a.mainParameters.get(4), "theName");
+ }
+
+ @Test(enabled = false)
+ public static void main(String[] args) throws Exception {
+ new JCommanderTest().enumArgsFail();
+// class A {
+// @Parameter(names = "-short", required = true)
+// List<String> parameters;
+//
+// @Parameter(names = "-long", required = true)
+// public long l;
+// }
+// A a = new A();
+// new JCommander(a).parse();
+// System.out.println(a.l);
+// System.out.println(a.parameters);
+// ArgsList al = new ArgsList();
+// JCommander j = new JCommander(al);
+// j.setColumnSize(40);
+// j.usage();
+// new JCommanderTest().testListAndSplitters();
+// new JCommanderTest().converterArgs();
+ }
+
+ // Tests:
+ // required unparsed parameter
+}
diff --git a/src/test/java/com/beust/jcommander/MethodSetterTest.java b/src/test/java/com/beust/jcommander/MethodSetterTest.java
new file mode 100644
index 0000000..f995ad6
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/MethodSetterTest.java
@@ -0,0 +1,100 @@
+package com.beust.jcommander;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import java.util.List;
+
+/**
+ * Tests for @Parameter on top of methods.
+ */
+@Test
+public class MethodSetterTest {
+ public void arityStringsSetter() {
+ class ArgsArityStringSetter {
+
+ @Parameter(names = "-pairs", arity = 2, description = "Pairs")
+ public void setPairs(List<String> pairs) {
+ this.pairs = pairs;
+ }
+ public List<String> getPairs() {
+ return this.pairs;
+ }
+ public List<String> pairs;
+
+ @Parameter(description = "Rest")
+ public void setRest(List<String> rest) {
+ this.rest = rest;
+ }
+// public List<String> getRest() {
+// return this.rest;
+// }
+ public List<String> rest;
+ }
+ ArgsArityStringSetter args = new ArgsArityStringSetter();
+ String[] argv = { "-pairs", "pair0", "pair1", "rest" };
+ new JCommander(args, argv);
+
+ Assert.assertEquals(args.pairs.size(), 2);
+ Assert.assertEquals(args.pairs.get(0), "pair0");
+ Assert.assertEquals(args.pairs.get(1), "pair1");
+ Assert.assertEquals(args.rest.size(), 1);
+ Assert.assertEquals(args.rest.get(0), "rest");
+ }
+
+ public void setterThatThrows() {
+ class Arg {
+ @Parameter(names = "--host")
+ public void setHost(String host) {
+ throw new ParameterException("Illegal host");
+ }
+ }
+ boolean passed = false;
+ try {
+ new JCommander(new Arg(), new String[] { "--host", "host" });
+ } catch(ParameterException ex) {
+ Assert.assertEquals(ex.getCause(), null);
+ passed = true;
+ }
+ Assert.assertTrue(passed, "Should have thrown an exception");
+ }
+
+ public void getterReturningNonString() {
+ class Arg {
+ private Integer port;
+
+ @Parameter(names = "--port")
+ public void setPort(String port) {
+ this.port = Integer.parseInt(port);
+ }
+
+ public Integer getPort() {
+ return port;
+ }
+ }
+ Arg arg = new Arg();
+ new JCommander(arg, new String[] { "--port", "42" });
+
+ Assert.assertEquals(arg.port, new Integer(42));
+ }
+
+ public void noGetterButWithField() {
+ class Arg {
+ private Integer port = 43;
+
+ @Parameter(names = "--port")
+ public void setPort(String port) {
+ this.port = Integer.parseInt(port);
+ }
+ }
+ Arg arg = new Arg();
+ JCommander jc = new JCommander(arg, new String[] { "--port", "42" });
+ ParameterDescription pd = jc.getParameters().get(0);
+ Assert.assertEquals(pd.getDefault(), 43);
+ }
+
+ @Test(enabled = false)
+ public static void main(String[] args) throws Exception {
+ new MethodSetterTest().noGetterButWithField();
+ }
+}
diff --git a/src/test/java/com/beust/jcommander/MyClass.java b/src/test/java/com/beust/jcommander/MyClass.java
new file mode 100644
index 0000000..c2d3371
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/MyClass.java
@@ -0,0 +1,24 @@
+package com.beust.jcommander;
+
+import org.testng.Assert;
+
+
+@Parameters(separators = "=")
+public class MyClass {
+
+ @Parameter(names = { "-p", "--param" }, validateWith = MyValidator.class)
+ private String param;
+
+ public static void main(String[] args) {
+ JCommander jCommander = new JCommander(new MyClass());
+ jCommander.parse("--param=value");
+ }
+
+ public static class MyValidator implements IParameterValidator {
+ @Override
+ public void validate(String name, String value) throws ParameterException {
+ Assert.assertEquals(value, "\"");
+ }
+ }
+
+} \ No newline at end of file
diff --git a/src/test/java/com/beust/jcommander/ParametersDelegateTest.java b/src/test/java/com/beust/jcommander/ParametersDelegateTest.java
new file mode 100644
index 0000000..46c7c6a
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/ParametersDelegateTest.java
@@ -0,0 +1,227 @@
+package com.beust.jcommander;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author rodionmoiseev
+ */
+public class ParametersDelegateTest {
+
+ @Test
+ public void delegatingEmptyClassHasNoEffect() {
+ class EmptyDelegate {
+ public String nonParamString = "a";
+ }
+ class MainParams {
+ @Parameter(names = "-a")
+ public boolean isA;
+ @Parameter(names = {"-b", "--long-b"})
+ public String bValue = "";
+ @ParametersDelegate
+ public EmptyDelegate delegate = new EmptyDelegate();
+ }
+
+ MainParams p = new MainParams();
+ JCommander cmd = new JCommander(p);
+ cmd.parse("-a", "-b", "someValue");
+ Assert.assertTrue(p.isA);
+ Assert.assertEquals(p.bValue, "someValue");
+ Assert.assertEquals(p.delegate.nonParamString, "a");
+ }
+
+ @Test
+ public void delegatingSetsFieldsOnBothMainParamsAndTheDelegatedParams() {
+ class ComplexDelegate {
+ @Parameter(names = "-c")
+ public boolean isC;
+ @Parameter(names = {"-d", "--long-d"})
+ public Integer d;
+ }
+ class MainParams {
+ @Parameter(names = "-a")
+ public boolean isA;
+ @Parameter(names = {"-b", "--long-b"})
+ public String bValue = "";
+ @ParametersDelegate
+ public ComplexDelegate delegate = new ComplexDelegate();
+ }
+
+ MainParams p = new MainParams();
+ JCommander cmd = new JCommander(p);
+ cmd.parse("-c", "--long-d", "123", "--long-b", "bValue");
+ Assert.assertFalse(p.isA);
+ Assert.assertEquals(p.bValue, "bValue");
+ Assert.assertTrue(p.delegate.isC);
+ Assert.assertEquals(p.delegate.d, Integer.valueOf(123));
+ }
+
+ @Test
+ public void combinedAndNestedDelegates() {
+ abstract class LeafAbstractDelegate {
+ abstract float getFloat();
+ }
+ class LeafDelegate {
+ @Parameter(names = "--list")
+ public List<String> list = new ArrayList<String>() {{
+ add("value1");
+ add("value2");
+ }};
+ @Parameter(names = "--bool")
+ public boolean bool;
+ }
+ class NestedDelegate1 {
+ @ParametersDelegate
+ public LeafDelegate leafDelegate = new LeafDelegate();
+ @Parameter(names = {"-d", "--long-d"})
+ public Integer d;
+ }
+ class NestedDelegate2 {
+ @Parameter(names = "-c")
+ public boolean isC;
+ @ParametersDelegate
+ public NestedDelegate1 nestedDelegate1 = new NestedDelegate1();
+ @ParametersDelegate
+ public LeafAbstractDelegate anonymousDelegate = new LeafAbstractDelegate() {
+ @Parameter(names = "--anon-float")
+ public float anon = 999f;
+
+ @Override
+ float getFloat() {
+ return anon;
+ }
+ };
+ }
+ class MainParams {
+ @Parameter(names = "-a")
+ public boolean isA;
+ @Parameter(names = {"-b", "--long-b"})
+ public String bValue = "";
+ @ParametersDelegate
+ public NestedDelegate2 nestedDelegate2 = new NestedDelegate2();
+ }
+
+ MainParams p = new MainParams();
+ JCommander cmd = new JCommander(p);
+ cmd.parse("--anon-float 1.2 -d 234 --list a --list b -a".split(" "));
+ Assert.assertEquals(p.nestedDelegate2.anonymousDelegate.getFloat(), 1.2f);
+ Assert.assertEquals(p.nestedDelegate2.nestedDelegate1.leafDelegate.list, new ArrayList<String>() {{
+ add("a");
+ add("b");
+ }});
+ Assert.assertFalse(p.nestedDelegate2.nestedDelegate1.leafDelegate.bool);
+ Assert.assertEquals(p.nestedDelegate2.nestedDelegate1.d, Integer.valueOf(234));
+ Assert.assertFalse(p.nestedDelegate2.isC);
+ Assert.assertTrue(p.isA);
+ Assert.assertEquals(p.bValue, "");
+ }
+
+ @Test
+ public void commandTest() {
+ class Delegate {
+ @Parameter(names = "-a")
+ public String a = "b";
+ }
+ class Command {
+ @ParametersDelegate
+ public Delegate delegate = new Delegate();
+ }
+
+ Command c = new Command();
+
+ JCommander cmd = new JCommander();
+ cmd.addCommand("command", c);
+
+ cmd.parse("command -a a".split(" "));
+ Assert.assertEquals(c.delegate.a, "a");
+ }
+
+ @Test
+ public void mainParametersTest() {
+ class Delegate {
+ @Parameter
+ public List<String> mainParams = new ArrayList<String>();
+ }
+ class Command {
+ @ParametersDelegate
+ public Delegate delegate = new Delegate();
+ }
+
+ Command c = new Command();
+
+ JCommander cmd = new JCommander();
+ cmd.addCommand("command", c);
+
+ cmd.parse("command main params".split(" "));
+ Assert.assertEquals(c.delegate.mainParams, new ArrayList<String>() {{
+ add("main");
+ add("params");
+ }});
+ }
+
+ @Test(expectedExceptions = ParameterException.class,
+ expectedExceptionsMessageRegExp = ".*delegate.*null.*")
+ public void nullDelegatesAreProhibited() {
+ class ComplexDelegate {
+ }
+ class MainParams {
+ @ParametersDelegate
+ public ComplexDelegate delegate;
+ }
+
+ MainParams p = new MainParams();
+ JCommander cmd = new JCommander(p);
+ cmd.parse();
+ }
+
+ @Test(expectedExceptions = ParameterException.class,
+ expectedExceptionsMessageRegExp = ".*-a.*")
+ public void duplicateDelegateThrowDuplicateOptionException() {
+ class Delegate {
+ @Parameter(names = "-a")
+ public String a;
+ }
+ class MainParams {
+ @ParametersDelegate
+ public Delegate d1 = new Delegate();
+ @ParametersDelegate
+ public Delegate d2 = new Delegate();
+ }
+
+ MainParams p = new MainParams();
+ JCommander cmd = new JCommander(p);
+ cmd.parse("-a value".split(" "));
+ }
+
+ @Test(expectedExceptions = ParameterException.class, expectedExceptionsMessageRegExp = "Only one.*is allowed.*")
+ public void duplicateMainParametersAreNotAllowed() {
+ class Delegate1 {
+ @Parameter
+ public List<String> mainParams1 = new ArrayList<String>();
+ }
+ class Delegate2 {
+ @Parameter
+ public List<String> mainParams2 = new ArrayList<String>();
+ }
+ class Command {
+ @ParametersDelegate
+ public Delegate1 delegate1 = new Delegate1();
+ @ParametersDelegate
+ public Delegate2 delegate2 = new Delegate2();
+ }
+
+ Command c = new Command();
+
+ JCommander cmd = new JCommander();
+ cmd.addCommand("command", c);
+
+ cmd.parse("command main params".split(" "));
+ }
+
+ public static void main(String[] args) {
+ new ParametersDelegateTest().commandTest();
+ }
+}
diff --git a/src/test/java/com/beust/jcommander/PositiveIntegerTest.java b/src/test/java/com/beust/jcommander/PositiveIntegerTest.java
new file mode 100644
index 0000000..ec7d273
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/PositiveIntegerTest.java
@@ -0,0 +1,65 @@
+package com.beust.jcommander;
+
+import com.beust.jcommander.validators.PositiveInteger;
+
+import org.testng.annotations.Test;
+
+public class PositiveIntegerTest {
+
+ @Test
+ public void validateTest() {
+ class Arg {
+ @Parameter(names = { "-p", "--port" }, description = "Shows help", validateWith = PositiveInteger.class)
+ private int port = 0;
+ }
+ Arg arg = new Arg();
+ JCommander jc = new JCommander(arg);
+ jc.parse(new String[] { "-p", "8080" });
+
+ }
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void validateTest2() {
+ class Arg {
+ @Parameter(names = { "-p", "--port" }, description = "Shows help", validateWith = PositiveInteger.class)
+ private int port = 0;
+ }
+ Arg arg = new Arg();
+ JCommander jc = new JCommander(arg);
+ jc.parse(new String[] { "-p", "" });
+ }
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void validateTest3() {
+ class Arg {
+ @Parameter(names = { "-p", "--port" }, description = "Shows help", validateWith = PositiveInteger.class)
+ private int port = 0;
+ }
+ Arg arg = new Arg();
+ JCommander jc = new JCommander(arg);
+ jc.parse(new String[] { "-p", "-1" });
+ }
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void validateTest4() {
+ class Arg {
+ @Parameter(names = { "-p", "--port" }, description = "Port Number", validateWith = PositiveInteger.class)
+ private int port = 0;
+ }
+ Arg arg = new Arg();
+ JCommander jc = new JCommander(arg);
+ jc.parse(new String[] { "-p", "abc" });
+ }
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void validateTest5() {
+ class Arg {
+ @Parameter(names = { "-p", "--port" }, description = "Port Number", validateWith = PositiveInteger.class)
+ private int port = 0;
+ }
+
+ Arg arg = new Arg();
+ JCommander jc = new JCommander(arg);
+ jc.parse(new String[] { "--port", " " });
+ }
+} \ No newline at end of file
diff --git a/src/test/java/com/beust/jcommander/SetConverter.java b/src/test/java/com/beust/jcommander/SetConverter.java
new file mode 100644
index 0000000..c19df11
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/SetConverter.java
@@ -0,0 +1,16 @@
+package com.beust.jcommander;
+
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+public class SetConverter implements IStringConverter<SortedSet<Integer>> {
+
+ public SortedSet<Integer> convert(String value) {
+ SortedSet<Integer> set = new TreeSet<Integer>();
+ String[] values = value.split(",");
+ for (String num : values) {
+ set.add(Integer.parseInt(num));
+ }
+ return set;
+ }
+}
diff --git a/src/test/java/com/beust/jcommander/ValidatePropertiesWhenParsingTest.java b/src/test/java/com/beust/jcommander/ValidatePropertiesWhenParsingTest.java
new file mode 100644
index 0000000..6a3a98f
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/ValidatePropertiesWhenParsingTest.java
@@ -0,0 +1,42 @@
+package com.beust.jcommander;
+
+import org.testng.annotations.Test;
+
+public class ValidatePropertiesWhenParsingTest {
+ @Test
+ public void f()
+ throws Exception {
+
+ JCommander cmd = new JCommander();
+
+ cmd.addCommand("a", new A());
+// cmd.addCommand("b", new B());
+
+ cmd.parse(new String[] { "a", "-path", "myPathToHappiness" });
+ }
+
+ public static class MyPathValidator implements IParameterValidator {
+
+ public void validate(String name, String value) throws ParameterException {
+ throw new RuntimeException("I shouldn't be called for command A!");
+ }
+ }
+
+ @Parameters
+ public static class A {
+
+ @Parameter(names = "-path")
+ private String path = "W";
+ }
+
+ @Parameters
+ public static class B {
+
+ @Parameter(names = "-path", validateWith = MyPathValidator.class)
+ private String path = "W";
+ }
+
+ public static void main(String[] args) throws Exception {
+ new ValidatePropertiesWhenParsingTest().f();
+ }
+} \ No newline at end of file
diff --git a/src/test/java/com/beust/jcommander/VariableArityTest.java b/src/test/java/com/beust/jcommander/VariableArityTest.java
new file mode 100644
index 0000000..a90392f
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/VariableArityTest.java
@@ -0,0 +1,66 @@
+package com.beust.jcommander;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+public class VariableArityTest {
+
+ public static class ModelGenerationConfig {
+
+ @Parameter(names = { "-m", "--matrixData" }, variableArity = true,
+ description = "File containing a list of instances and their runtimes on various configurations", required = false)
+ public List<String> modelMatrixFile = new LinkedList<String>();
+
+ @Parameter(names = { "-f", "--featureData" }, variableArity = true,
+ description = "File containing a list of instances and their corresponding features", required = true)
+ public List<String> featureFile = new LinkedList<String>();
+
+ @Parameter(names = { "-c", "--configData" }, variableArity = true,
+ description = "File containing a list of configuration parameter values")
+ public List<String> configFile = new LinkedList<String>();
+
+ @Parameter(names = { "-o", "--outputFile" },
+ description = "File to output the resulting data to. Defaults to ./matrix-generation.zip", required = false)
+ public String outputFile = "matrix-generation.zip";
+
+ @Parameter(names = { "--seed" }, description = "Seed used for PRNG [0 means don't use a Seed]")
+ public long seed = 0;
+
+ public void print() {
+ System.out.println("modelMatrixFile: " + modelMatrixFile);
+ System.out.println("featureData: " + featureFile);
+ System.out.println("configFile: " + configFile);
+ System.out.println("output: " + outputFile);
+ System.out.println("seed: " + seed);
+
+ }
+ }
+
+ @Test
+ public void verifyVariableArity() {
+ String input = "-m foo --seed 1024 -c foo -o foo -f foo ";
+
+ String[] split = input.split("\\s+");
+
+ ModelGenerationConfig config = new ModelGenerationConfig();
+ JCommander com = new JCommander(config);
+ com.setProgramName("modelgen");
+
+ com.parse(split);
+
+// config.print();
+ Assert.assertNotEquals(config.seed, 0);
+ Assert.assertEquals(config.modelMatrixFile, Arrays.asList(new String[] { "foo" }));
+ Assert.assertEquals(config.featureFile, Arrays.asList(new String[] { "foo" }));
+ Assert.assertEquals(config.seed, 1024);
+ Assert.assertEquals(config.outputFile, "foo");
+ }
+
+ public static void main(String[] args) {
+ new VariableArityTest().verifyVariableArity();
+ }
+} \ No newline at end of file
diff --git a/src/test/java/com/beust/jcommander/args/AlternateNamesForListArgs.java b/src/test/java/com/beust/jcommander/args/AlternateNamesForListArgs.java
new file mode 100644
index 0000000..18a1655
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/AlternateNamesForListArgs.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2014 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.internal.Lists;
+import java.util.List;
+
+/**
+ *
+ * @author Andy Law <andy.law@roslin.ed.ac.uk>
+ */
+public class AlternateNamesForListArgs {
+
+ @Parameter(names = {"-s", "--servers"}, description = "blah")
+ public List<String> serverNames = Lists.newLinkedList();
+}
diff --git a/src/test/java/com/beust/jcommander/args/Args1.java b/src/test/java/com/beust/jcommander/args/Args1.java
new file mode 100644
index 0000000..093abec
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/Args1.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+import org.testng.collections.Lists;
+
+import com.beust.jcommander.Parameter;
+
+public class Args1 {
+ @Parameter
+ public List<String> parameters = Lists.newArrayList();
+
+ @Parameter(names = { "-log", "-verbose" }, description = "Level of verbosity", required = true)
+ public Integer verbose = 1;
+
+ @Parameter(names = "-groups", description = "Comma-separated list of group names to be run")
+ public String groups;
+
+ @Parameter(names = "-debug", description = "Debug mode")
+ public boolean debug = false;
+
+ @Parameter(names = "-long", description = "A long number")
+ public long l;
+
+ @Parameter(names = "-double", description = "A double number")
+ public double doub;
+
+ @Parameter(names = "-float", description = "A float number")
+ public float floa;
+
+ @Parameter(names = "-bigdecimal", description = "A BigDecimal number")
+ public BigDecimal bigd;
+
+ @Parameter(names = "-date", description = "An ISO 8601 formatted date.")
+ public Date date;
+}
diff --git a/src/test/java/com/beust/jcommander/args/Args1Setter.java b/src/test/java/com/beust/jcommander/args/Args1Setter.java
new file mode 100644
index 0000000..10f9ef3
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/Args1Setter.java
@@ -0,0 +1,93 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.internal.Lists;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+public class Args1Setter {
+ @Parameter
+ public void setParameters(List<String> p) {
+ parameters = p;
+ }
+
+ public List<String> getParameters() {
+ return this.parameters;
+ }
+ public List<String> parameters = Lists.newArrayList();
+
+ @Parameter(names = { "-log", "-verbose" }, description = "Level of verbosity", required = true)
+ public void setVerbose(Integer v) {
+ verbose = v;
+ }
+ public Integer verbose = 1;
+
+ @Parameter(names = "-groups", description = "Comma-separated list of group names to be run")
+ public void setGroups(String g) {
+ groups = g;
+ }
+
+ public String groups;
+
+ @Parameter(names = "-debug", description = "Debug mode")
+ public void setDebug(boolean d) {
+ debug = d;
+ }
+
+ public boolean debug = false;
+
+ @Parameter(names = "-long", description = "A long number")
+ public void setLong(long ll) {
+ l = ll;
+ }
+
+ public long l;
+
+ @Parameter(names = "-double", description = "A double number")
+ public void setDouble(double d) {
+ doub = d;
+ }
+
+ public double doub;
+
+ @Parameter(names = "-float", description = "A float number")
+ public void setFloat(float f) {
+ floa = f;
+ }
+
+ public float floa;
+
+ @Parameter(names = "-bigdecimal", description = "A BigDecimal number")
+ public void setBigDecimal(BigDecimal bd) {
+ bigd = bd;
+ }
+
+ public BigDecimal bigd;
+
+ @Parameter(names = "-date", description = "An ISO 8601 formatted date.")
+ public void setDate(Date d) {
+ date = d;
+ }
+
+ public Date date;
+}
diff --git a/src/test/java/com/beust/jcommander/args/Args2.java b/src/test/java/com/beust/jcommander/args/Args2.java
new file mode 100644
index 0000000..89f622b
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/Args2.java
@@ -0,0 +1,42 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.internal.Lists;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Args2 {
+ @Parameter(description = "List of parameters")
+ public List parameters = Lists.newArrayList();
+
+ @Parameter(names = {"-log", "-verbose"}, description = "Level of verbosity")
+ public Integer verbose = 1;
+
+ @Parameter(names = "-groups", description = "Comma-separated list of group names to be run")
+ public String groups;
+
+ @Parameter(names = "-debug", description = "Debug mode")
+ public boolean debug = false;
+
+ @Parameter(names = "-host", description = "The host")
+ public List hosts = new ArrayList();
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsArityInteger.java b/src/test/java/com/beust/jcommander/args/ArgsArityInteger.java
new file mode 100644
index 0000000..9c1611f
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsArityInteger.java
@@ -0,0 +1,37 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+
+import java.util.List;
+
+/**
+ * Test parameter arity.
+ *
+ * @author cbeust
+ */
+public class ArgsArityInteger {
+
+ @Parameter(names = "-pairs", arity = 2, description = "Pairs")
+ public List<Integer> pairs;
+
+ @Parameter(description = "Rest")
+ public List<String> rest;
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsArityString.java b/src/test/java/com/beust/jcommander/args/ArgsArityString.java
new file mode 100644
index 0000000..056ae85
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsArityString.java
@@ -0,0 +1,37 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+
+import java.util.List;
+
+/**
+ * Test parameter arity.
+ *
+ * @author cbeust
+ */
+public class ArgsArityString {
+
+ @Parameter(names = "-pairs", arity = 2, description = "Pairs")
+ public List<String> pairs;
+
+ @Parameter(description = "Rest")
+ public List<String> rest;
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsBooleanArity.java b/src/test/java/com/beust/jcommander/args/ArgsBooleanArity.java
new file mode 100644
index 0000000..242e347
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsBooleanArity.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+
+public class ArgsBooleanArity {
+ @Parameter(names = "-debug", arity = 1)
+ public Boolean debug = false;
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsBooleanArity0.java b/src/test/java/com/beust/jcommander/args/ArgsBooleanArity0.java
new file mode 100644
index 0000000..62895ec
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsBooleanArity0.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+
+public class ArgsBooleanArity0 {
+ @Parameter(names = "-debug", arity = 0)
+ public Boolean debug = false;
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsConverter.java b/src/test/java/com/beust/jcommander/args/ArgsConverter.java
new file mode 100644
index 0000000..677cf9b
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsConverter.java
@@ -0,0 +1,57 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.converters.FileConverter;
+import com.beust.jcommander.converters.PathConverter;
+import com.beust.jcommander.converters.URIConverter;
+import com.beust.jcommander.converters.URLConverter;
+
+import java.io.File;
+import java.math.BigDecimal;
+import java.net.URI;
+import java.net.URL;
+import java.nio.file.Path;
+import java.util.List;
+
+public class ArgsConverter {
+
+ @Parameter(names = "-file", converter = FileConverter.class)
+ public File file;
+
+ @Parameter(names = "-url", converter = URLConverter.class)
+ public URL url;
+
+ @Parameter(names = "-uri", converter = URIConverter.class)
+ public URI uri;
+
+ @Parameter(names = "-path", converter = PathConverter.class)
+ public Path path;
+
+ @Parameter(names = "-listStrings")
+ public List<String> listStrings;
+
+ @Parameter(names = "-listInts")
+ public List<Integer> listInts;
+
+ @Parameter(names = "-listBigDecimals")
+ public List<BigDecimal> listBigDecimals;
+
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsConverterFactory.java b/src/test/java/com/beust/jcommander/args/ArgsConverterFactory.java
new file mode 100644
index 0000000..f8463a0
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsConverterFactory.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.HostPort;
+import com.beust.jcommander.Parameter;
+
+public class ArgsConverterFactory {
+
+ @Parameter(names = "-hostport")
+ public HostPort hostPort;
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsDefault.java b/src/test/java/com/beust/jcommander/args/ArgsDefault.java
new file mode 100644
index 0000000..1adcd73
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsDefault.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+
+import org.testng.collections.Lists;
+
+import java.util.List;
+
+public class ArgsDefault {
+ @Parameter
+ public List<String> parameters = Lists.newArrayList();
+
+ @Parameter(names = "-log", description = "Level of verbosity")
+ public Integer log = 1;
+
+ @Parameter(names = "-groups", description = "Comma-separated list of group names to be run")
+ public String groups;
+
+ @Parameter(names = "-debug", description = "Debug mode")
+ public boolean debug = false;
+
+ @Parameter(names = "-level", description = "A long number")
+ public long level;
+
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsEnum.java b/src/test/java/com/beust/jcommander/args/ArgsEnum.java
new file mode 100644
index 0000000..bef663b
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsEnum.java
@@ -0,0 +1,55 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.List;
+
+import org.testng.Assert;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+
+/**
+ * Test enums.
+ *
+ * @author Adrian Muraru
+ */
+public class ArgsEnum {
+
+ public enum ChoiceType { ONE, Two, THREE };
+ @Parameter(names = "-choice")
+ public ChoiceType choice = ChoiceType.ONE;
+
+ @Parameter(names = "-choices", variableArity = true)
+ public List<ChoiceType> choices = new ArrayList<ChoiceType>();
+
+ public static void main(String[] args1) {
+ ArgsEnum args = new ArgsEnum();
+ String[] argv = { "-choice", "ONE"};
+ JCommander jc = new JCommander(args, argv);
+ jc.usage();
+ Assert.assertEquals(jc.getParameters().get(0).getDescription(),
+ "Options: " + EnumSet.allOf((Class<? extends Enum>) ArgsEnum.ChoiceType.class));
+ }
+
+}
+
+
diff --git a/src/test/java/com/beust/jcommander/args/ArgsEquals.java b/src/test/java/com/beust/jcommander/args/ArgsEquals.java
new file mode 100644
index 0000000..016166d
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsEquals.java
@@ -0,0 +1,11 @@
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+
+@Parameters(separators = "=")
+public class ArgsEquals {
+
+ @Parameter(names = "-args")
+ public String args;
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsHelp.java b/src/test/java/com/beust/jcommander/args/ArgsHelp.java
new file mode 100644
index 0000000..4baaddd
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsHelp.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+
+/**
+ * Test a help option which overrides other options and option validations
+ */
+public class ArgsHelp {
+
+ @Parameter(names = "-h", description = "Display help")
+ public boolean help;
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsI18N1.java b/src/test/java/com/beust/jcommander/args/ArgsI18N1.java
new file mode 100644
index 0000000..80e29e2
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsI18N1.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+
+public class ArgsI18N1 {
+
+ @Parameter(names = "-host", description = "Host", descriptionKey = "host")
+ String hostName;
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsI18N2.java b/src/test/java/com/beust/jcommander/args/ArgsI18N2.java
new file mode 100644
index 0000000..1ccfd43
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsI18N2.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.ResourceBundle;
+
+@SuppressWarnings("deprecation")
+@ResourceBundle("MessageBundle")
+public class ArgsI18N2 {
+
+ @Parameter(names = "-host", description = "Host", descriptionKey = "host")
+ String hostName;
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsI18N2New.java b/src/test/java/com/beust/jcommander/args/ArgsI18N2New.java
new file mode 100644
index 0000000..c760973
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsI18N2New.java
@@ -0,0 +1,34 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+
+import java.util.List;
+
+@Parameters(resourceBundle = "MessageBundle")
+public class ArgsI18N2New {
+
+ @Parameter(names = "-host", description = "Host", descriptionKey = "host")
+ String hostName;
+
+ @Parameter(descriptionKey = "files")
+ List<String> files;
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsInherited.java b/src/test/java/com/beust/jcommander/args/ArgsInherited.java
new file mode 100644
index 0000000..abc0e82
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsInherited.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+
+public class ArgsInherited extends ArgsDefault {
+
+ @Parameter(names = "-child", description = "Child parameter")
+ public Integer child = 1;
+
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsList.java b/src/test/java/com/beust/jcommander/args/ArgsList.java
new file mode 100644
index 0000000..e827773
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsList.java
@@ -0,0 +1,49 @@
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.HostPort;
+import com.beust.jcommander.HostPortConverter;
+import com.beust.jcommander.IStringConverter;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.converters.IParameterSplitter;
+
+import org.testng.collections.Lists;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class ArgsList {
+ @Parameter(names = "-groups", description = "Comma-separated list of group names to be run")
+ public List<String> groups;
+
+ @Parameter(names = "-ints")
+ public List<Integer> ints;
+
+ @Parameter(names = "-hp", converter = HostPortConverter.class, splitter = SemiColonSplitter.class)
+ public List<HostPort> hostPorts;
+
+ @Parameter(names = "-hp2", converter = HostPortConverter.class)
+ public List<HostPort> hp2;
+
+ @Parameter(names = "-uppercase", listConverter = UppercaseConverter.class)
+ public List<String> uppercase;
+
+ public static class UppercaseConverter implements IStringConverter<List<String>> {
+ public List<String> convert(String value) {
+ List<String> result = Lists.newArrayList();
+ String[] s = value.split(",");
+ for (String p : s) {
+ result.add(p.toUpperCase());
+ }
+ return result;
+ }
+ }
+
+ public static class SemiColonSplitter implements IParameterSplitter {
+
+ public List<String> split(String value) {
+ return Arrays.asList(value.split(";"));
+ }
+
+ }
+
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsLongDescription.java b/src/test/java/com/beust/jcommander/args/ArgsLongDescription.java
new file mode 100644
index 0000000..e961016
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsLongDescription.java
@@ -0,0 +1,25 @@
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+
+public class ArgsLongDescription {
+
+ @Parameter(names = "--classpath", description = "The classpath. This is a very long "
+ + "description in order to test the line wrapping. Let's see how this works."
+ + "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor"
+ + " incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis "
+ + "nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.")
+ public String classpath = "/tmp";
+
+ @Parameter(names = { "-c", "--convention" }, description = "The convention", required = true)
+ public String convention = "Java";
+
+ @Parameter(names = { "-d", "--destination" }, description = "The destination to go to")
+ public String destination;
+
+ @Parameter(names = "--configure", description = "How to configure")
+ public String configure;
+
+ @Parameter(names = "--filespec")
+ public String filespec;
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsMainParameter1.java b/src/test/java/com/beust/jcommander/args/ArgsMainParameter1.java
new file mode 100644
index 0000000..cd5c52d
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsMainParameter1.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.HostPort;
+import com.beust.jcommander.Parameter;
+
+import org.testng.collections.Lists;
+
+import java.util.List;
+
+/**
+ * A class with main parameter that is not a List<String>
+ *
+ * @author cbeust
+ */
+public class ArgsMainParameter1 implements IHostPorts {
+ @Parameter
+ public List<HostPort> parameters = Lists.newArrayList();
+
+ public List<HostPort> getHostPorts() {
+ return parameters;
+ }
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsMainParameter2.java b/src/test/java/com/beust/jcommander/args/ArgsMainParameter2.java
new file mode 100644
index 0000000..57422e3
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsMainParameter2.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.HostPort;
+import com.beust.jcommander.HostPortConverter;
+import com.beust.jcommander.Parameter;
+
+import org.testng.collections.Lists;
+
+import java.util.List;
+
+/**
+ * A class with main parameter that is not a List<String>
+ *
+ * @author cbeust
+ */
+public class ArgsMainParameter2 implements IHostPorts {
+ @Parameter(converter = HostPortConverter.class)
+ public List<HostPort> parameters = Lists.newArrayList();
+
+ public List<HostPort> getHostPorts() {
+ return parameters;
+ }
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsMaster.java b/src/test/java/com/beust/jcommander/args/ArgsMaster.java
new file mode 100644
index 0000000..ebcba67
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsMaster.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+
+/**
+ * Test multi-object parsing, along with ArgsSlave.
+ *
+ * @author cbeust
+ */
+public class ArgsMaster {
+ @Parameter(names = "-master")
+ public String master;
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsMultipleUnparsed.java b/src/test/java/com/beust/jcommander/args/ArgsMultipleUnparsed.java
new file mode 100644
index 0000000..f7b0628
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsMultipleUnparsed.java
@@ -0,0 +1,35 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+
+/**
+ * Error case if multiple unparsed (without a names attribute) arguments are defined.
+ *
+ * @author cbeust
+ */
+public class ArgsMultipleUnparsed {
+
+ @Parameter(description = "Bogus1")
+ public String unparsed1;
+
+ @Parameter(description = "Bogus2")
+ public String unparsed2;
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsOutOfMemory.java b/src/test/java/com/beust/jcommander/args/ArgsOutOfMemory.java
new file mode 100644
index 0000000..f059ebb
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsOutOfMemory.java
@@ -0,0 +1,13 @@
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+
+public class ArgsOutOfMemory
+{
+ @Parameter(names = { "-p", "--pattern" },
+ description = "pattern used by 'tail'. See http://logback.qos.ch/manual/layouts.html#ClassicPatternLayout and http://logback.qos.ch/manual/layouts.html#AccessPatternLayout")
+ public String pattern;
+
+ @Parameter(names = "-q", description = "Filler arg")
+ public String filler;
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsPassword.java b/src/test/java/com/beust/jcommander/args/ArgsPassword.java
new file mode 100644
index 0000000..06c468e
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsPassword.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+
+public class ArgsPassword {
+ @Parameter(names = "-password", description = "Connection password", password = true)
+ public String password;
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsPrivate.java b/src/test/java/com/beust/jcommander/args/ArgsPrivate.java
new file mode 100644
index 0000000..16e4b4e
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsPrivate.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+
+public class ArgsPrivate {
+ @Parameter(names = "-verbose")
+ private Integer verbose = 1;
+
+ public Integer getVerbose() {
+ return verbose;
+ }
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsRequired.java b/src/test/java/com/beust/jcommander/args/ArgsRequired.java
new file mode 100644
index 0000000..69cb814
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsRequired.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.internal.Lists;
+
+import java.util.List;
+
+public class ArgsRequired {
+
+ @Parameter(description = "List of files", required = true)
+ public List<String> parameters = Lists.newArrayList();
+
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsSlave.java b/src/test/java/com/beust/jcommander/args/ArgsSlave.java
new file mode 100644
index 0000000..dabeb57
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsSlave.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+
+/**
+ * Test multi-object parsing, along with ArgsSlave.
+ *
+ * @author cbeust
+ */
+public class ArgsSlave {
+ @Parameter(names = "-slave")
+ public String slave;
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsSlaveBogus.java b/src/test/java/com/beust/jcommander/args/ArgsSlaveBogus.java
new file mode 100644
index 0000000..1abdf1f
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsSlaveBogus.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+
+/**
+ * Same as ArgsMaster class, should cause an error.
+ *
+ * @author cbeust
+ */
+public class ArgsSlaveBogus extends ArgsSlave {
+ @Parameter(names = "-master")
+ public String master;
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsValidate1.java b/src/test/java/com/beust/jcommander/args/ArgsValidate1.java
new file mode 100644
index 0000000..5274220
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsValidate1.java
@@ -0,0 +1,10 @@
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.validators.PositiveInteger;
+
+public class ArgsValidate1 {
+
+ @Parameter(names = "-age", validateWith = PositiveInteger.class)
+ public Integer age;
+}
diff --git a/src/test/java/com/beust/jcommander/args/ArgsWithSet.java b/src/test/java/com/beust/jcommander/args/ArgsWithSet.java
new file mode 100644
index 0000000..1e41cd3
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/ArgsWithSet.java
@@ -0,0 +1,11 @@
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.SetConverter;
+
+import java.util.SortedSet;
+
+public class ArgsWithSet {
+ @Parameter(names = "-s", converter = SetConverter.class)
+ public SortedSet<Integer> set;
+} \ No newline at end of file
diff --git a/src/test/java/com/beust/jcommander/args/Arity1.java b/src/test/java/com/beust/jcommander/args/Arity1.java
new file mode 100644
index 0000000..8cbf086
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/Arity1.java
@@ -0,0 +1,9 @@
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+
+public class Arity1
+{
+ @Parameter(arity = 1, names = "-inspect", description = "", required = false)
+ public boolean inspect;
+}
diff --git a/src/test/java/com/beust/jcommander/args/CommandLineArgs.java b/src/test/java/com/beust/jcommander/args/CommandLineArgs.java
new file mode 100644
index 0000000..7c8414f
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/CommandLineArgs.java
@@ -0,0 +1,120 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.internal.Lists;
+
+import java.util.List;
+
+public class CommandLineArgs {
+
+ @Parameter(description = "The XML suite files to run")
+ public List<String> suiteFiles = Lists.newArrayList();
+
+ @Parameter(names = { "-log", "-verbose" }, description = "Level of verbosity")
+ public Integer verbose;
+
+ @Parameter(names = "-groups", description = "Comma-separated list of group names to be run")
+ public String groups;
+
+ @Parameter(names = "-excludedgroups", description ="Comma-separated list of group names to be " +
+ "run")
+ public String excludedGroups;
+
+ @Parameter(names = "-d", description ="Output directory")
+ public String outputDirectory;
+
+ @Parameter(names = "-junit", description ="JUnit mode")
+ public Boolean junit = Boolean.FALSE;
+
+ @Parameter(names = "-listener", description = "List of .class files or list of class names" +
+ " implementing ITestListener or ISuiteListener")
+ public String listener;
+
+ @Parameter(names = "-methodselectors", description = "List of .class files or list of class " +
+ "names implementing IMethodSelector")
+ public String methodSelectors;
+
+ @Parameter(names = "-objectfactory", description = "List of .class files or list of class " +
+ "names implementing ITestRunnerFactory")
+ public String objectFactory;
+
+ @Parameter(names = "-parallel", description = "Parallel mode (methods, tests or classes)")
+ public String parallelMode;
+
+ @Parameter(names = "-configfailurepolicy", description = "Configuration failure policy (skip or continue)")
+ public String configFailurePolicy;
+
+ @Parameter(names = "-threadcount", description = "Number of threads to use when running tests " +
+ "in parallel")
+ public Integer threadCount;
+
+ @Parameter(names = "-dataproviderthreadcount", description = "Number of threads to use when " +
+ "running data providers")
+ public Integer dataProviderThreadCount;
+
+ @Parameter(names = "-suitename", description = "Default name of test suite, if not specified " +
+ "in suite definition file or source code")
+ public String suiteName;
+
+ @Parameter(names = "-testname", description = "Default name of test, if not specified in suite" +
+ "definition file or source code")
+ public String testName;
+
+ @Parameter(names = "-reporter", description = "Extended configuration for custom report listener")
+ public String reporter;
+
+ /**
+ * Used as map key for the complete list of report listeners provided with the above argument
+ */
+ @Parameter(names = "-reporterslist")
+ public String reportersList;
+
+ @Parameter(names = "-usedefaultlisteners", description = "Whether to use the default listeners")
+ public String useDefaultListeners = "true";
+
+ @Parameter(names = "-skipfailedinvocationcounts")
+ public Boolean skipFailedInvocationCounts;
+
+ @Parameter(names = "-testclass", description = "The list of test classes")
+ public String testClass;
+
+ @Parameter(names = "-testnames", description = "The list of test names to run")
+ public String testNames;
+
+ @Parameter(names = "-testjar", description = "")
+ public String testJar;
+
+ @Parameter(names = "-testRunFactory", description = "")
+ public String testRunFactory;
+
+ @Parameter(names = "-port", description = "The port")
+ public Integer port;
+
+ @Parameter(names = "-host", description = "The host")
+ public String host;
+
+ @Parameter(names = "-master", description ="Host where the master is")
+ public String master;
+
+ @Parameter(names = "-slave", description ="Host where the slave is")
+ public String slave;
+
+}
diff --git a/src/test/java/com/beust/jcommander/args/CommandLineArgs2.java b/src/test/java/com/beust/jcommander/args/CommandLineArgs2.java
new file mode 100644
index 0000000..ac62792
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/CommandLineArgs2.java
@@ -0,0 +1,72 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.converters.FileConverter;
+
+import java.io.File;
+import java.util.List;
+
+public class CommandLineArgs2 {
+ @Parameter(description = "list of files")
+ List<String> list;
+
+ @Parameter(names = { "-v", "--verbose" }, description = "print verbose log messages.", arity = 1)
+ public boolean verbose = false;
+
+ @Parameter(names = { "-h", "--help" }, description = "show this help.")
+ public boolean showHelp = false;
+
+ @Parameter(names = { "-F", "--flush-preferences" }, description = "flush gui preferences.")
+ public boolean flushPreferences = false;
+
+ @Parameter(names = { "-L", "--flush-licensed" }, description = "flush licensed.")
+ public boolean flushLicensed = false;
+
+ @Parameter(names = { "-I", "--index-file" }, description = "indexes the given file.")
+ public Long indexFile;
+
+ @Parameter(names = { "-b", "--bonjour" }, description = "enable Bonjour.")
+ public boolean enableBonjour = false;
+
+ @Parameter(names = { "-m", "--md5" }, description = "create an MD5 checksum for the given file.", converter = FileConverter.class)
+ public File md5File;
+
+ @Parameter(names = { "-c", "--cat" }, description = "'cat' the given Lilith logfile.", converter = FileConverter.class)
+ public File catFile;
+
+ @Parameter(names = { "-t", "--tail" }, description = "'tail' the given Lilith logfile.", converter = FileConverter.class)
+ public File tailFile;
+
+ @Parameter(names = { "-p", "--pattern" }, description = "pattern used by 'cat' or 'tail'.")
+ public String pattern;
+
+ @Parameter(names = { "-f", "--keep-running" }, description = "keep tailing the given Lilith logfile.")
+ public boolean keepRunning = false;
+
+ @Parameter(names = { "-n", "--number-of-lines" }, description = "number of entries printed by cat or tail")
+ public Integer numberOfLines = -1;
+
+ @Parameter(names = { "-e", "--export-preferences" }, description = "export preferences into the given file.")
+ public String exportPreferencesFile;
+
+ @Parameter(names = { "-i", "--import-preferences" }, description = "import preferences from the given file.")
+ public String importPreferencesFile;
+}
diff --git a/src/test/java/com/beust/jcommander/args/IHostPorts.java b/src/test/java/com/beust/jcommander/args/IHostPorts.java
new file mode 100644
index 0000000..2020c77
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/IHostPorts.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.HostPort;
+
+import java.util.List;
+
+public interface IHostPorts {
+ List<HostPort> getHostPorts();
+}
diff --git a/src/test/java/com/beust/jcommander/args/SeparatorColon.java b/src/test/java/com/beust/jcommander/args/SeparatorColon.java
new file mode 100644
index 0000000..ab454fc
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/SeparatorColon.java
@@ -0,0 +1,29 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+
+@Parameters(separators = ":")
+public class SeparatorColon {
+
+ @Parameter(names = "-verbose", arity = 1)
+ public boolean verbose = false;
+}
diff --git a/src/test/java/com/beust/jcommander/args/SeparatorEqual.java b/src/test/java/com/beust/jcommander/args/SeparatorEqual.java
new file mode 100644
index 0000000..a135207
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/SeparatorEqual.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+
+@Parameters(separators = "=")
+public class SeparatorEqual {
+
+ @Parameter(names = "-log")
+ public Integer log = 2;
+
+ @Parameter(names = "--longoption")
+ public Integer longOption;
+}
diff --git a/src/test/java/com/beust/jcommander/args/SeparatorMixed.java b/src/test/java/com/beust/jcommander/args/SeparatorMixed.java
new file mode 100644
index 0000000..aa2641f
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/SeparatorMixed.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+
+@Parameters(separators = ":=")
+public class SeparatorMixed {
+
+ @Parameter(names = "-level")
+ public Integer level = 0;
+
+ @Parameter(names = "-long")
+ public Long l = 0l;
+}
diff --git a/src/test/java/com/beust/jcommander/args/SlashSeparator.java b/src/test/java/com/beust/jcommander/args/SlashSeparator.java
new file mode 100644
index 0000000..64d3930
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/SlashSeparator.java
@@ -0,0 +1,32 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+
+@Parameters(optionPrefixes = "/")
+public class SlashSeparator {
+
+ @Parameter(names = "/verbose")
+ public boolean verbose = false;
+
+ @Parameter(names = "/file")
+ public String file;
+}
diff --git a/src/test/java/com/beust/jcommander/args/VariableArity.java b/src/test/java/com/beust/jcommander/args/VariableArity.java
new file mode 100644
index 0000000..21a861d
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/args/VariableArity.java
@@ -0,0 +1,26 @@
+package com.beust.jcommander.args;
+
+import com.beust.jcommander.IVariableArity;
+import com.beust.jcommander.Parameter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class VariableArity implements IVariableArity {
+
+ private int m_count;
+
+ public VariableArity(int count) {
+ m_count = count;
+ }
+
+ @Parameter
+ public List<String> main = new ArrayList<String>();
+
+ @Parameter(names = "-variable", variableArity = true)
+ public List<String> var = new ArrayList<String>();
+
+ public int processVariableArity(String optionName, String[] options) {
+ return m_count;
+ }
+}
diff --git a/src/test/java/com/beust/jcommander/command/CommandAdd.java b/src/test/java/com/beust/jcommander/command/CommandAdd.java
new file mode 100644
index 0000000..733e490
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/command/CommandAdd.java
@@ -0,0 +1,35 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.command;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+
+import java.util.List;
+
+@Parameters(commandDescription = "Add file contents to the index")
+public class CommandAdd {
+
+ @Parameter(description = "Patterns of files to be added")
+ public List<String> patterns;
+
+ @Parameter(names = "-i")
+ public Boolean interactive = false;
+
+}
diff --git a/src/test/java/com/beust/jcommander/command/CommandAliasTest.java b/src/test/java/com/beust/jcommander/command/CommandAliasTest.java
new file mode 100644
index 0000000..4eee7f2
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/command/CommandAliasTest.java
@@ -0,0 +1,175 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.command;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.ParameterException;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import java.util.Arrays;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Tests command alias functionality
+ *
+ * @author rodionmoiseev
+ */
+public class CommandAliasTest {
+ @Test
+ public void oneCommandWithSingleAlias() {
+ CommandMain cm = new CommandMain();
+ JCommander jc = new JCommander(cm);
+ CommandAdd add = new CommandAdd();
+ jc.addCommand("add", add, "a");
+ jc.parse("a", "-i", "A.java");
+
+ Assert.assertEquals(jc.getParsedCommand(), "add");
+ Assert.assertEquals(jc.getParsedAlias(), "a");
+ Assert.assertEquals(add.interactive.booleanValue(), true);
+ Assert.assertEquals(add.patterns, Arrays.asList("A.java"));
+ }
+
+ @Test
+ public void oneCommandWithMultipleAliases_commit_ci() {
+ testCommitWithAlias("ci");
+ }
+
+ @Test
+ public void oneCommandWithMultipleAliases_commit_cmt() {
+ testCommitWithAlias("cmt");
+ }
+
+ private void testCommitWithAlias(String alias) {
+ CommandMain cm = new CommandMain();
+ JCommander jc = new JCommander(cm);
+ CommandCommit commit = new CommandCommit();
+ jc.addCommand("commit", commit, "ci", "cmt");
+ jc.parse(alias, "--amend", "--author", "jack", "file1.txt");
+
+ Assert.assertEquals(jc.getParsedCommand(), "commit");
+ Assert.assertEquals(jc.getParsedAlias(), alias);
+ Assert.assertEquals(commit.amend.booleanValue(), true);
+ Assert.assertEquals(commit.author, "jack");
+ Assert.assertEquals(commit.files, Arrays.asList("file1.txt"));
+ }
+
+ @Test
+ public void twoCommandsWithAliases() {
+ CommandMain cm = new CommandMain();
+ JCommander jc = new JCommander(cm);
+ CommandAdd add = new CommandAdd();
+ jc.addCommand("add", add, "a");
+ CommandCommit commit = new CommandCommit();
+ jc.addCommand("commit", commit, "ci", "cmt");
+ jc.parse("a", "-i", "A.java");
+
+ Assert.assertEquals(jc.getParsedCommand(), "add");
+ Assert.assertEquals(add.interactive.booleanValue(), true);
+ Assert.assertEquals(add.patterns, Arrays.asList("A.java"));
+ }
+
+ @Test
+ public void clashingAliasesAreNotAllowed() {
+ CommandMain cm = new CommandMain();
+ JCommander jc = new JCommander(cm);
+ CommandAdd add = new CommandAdd();
+ jc.addCommand("add", add, "xx");
+ CommandCommit commit = new CommandCommit();
+ try {
+ jc.addCommand("commit", commit, "ci", "xx");
+ Assert.fail("Should not be able to register clashing alias 'xx'");
+ } catch (ParameterException pe) {
+ //Make sure the message mentions that "xx" aliases is already
+ //defined for "add" command
+ Assert.assertTrue(pe.getMessage().contains("xx"));
+ Assert.assertTrue(pe.getMessage().contains("add"));
+ }
+ }
+
+ @Test
+ public void mainCommandReturnsNullsForGetCommandAndGetParsedAlias() {
+ CommandMain cm = new CommandMain();
+ JCommander jc = new JCommander(cm);
+ Assert.assertNull(jc.getParsedCommand());
+ Assert.assertNull(jc.getParsedAlias());
+ }
+
+ @Test
+ public void usageCanBeRetrievedWithBothCommandAndAlias() {
+ CommandMain cm = new CommandMain();
+ JCommander jc = new JCommander(cm);
+ CommandCommit commit = new CommandCommit();
+ jc.addCommand("commit", commit, "ci", "cmt");
+ StringBuilder out = new StringBuilder();
+ jc.usage("commit", out);
+ patternMatchesTimes("commit\\(ci,cmt\\)", out.toString(), 1);
+
+ out = new StringBuilder();
+ jc.usage("ci", out);
+ patternMatchesTimes("commit\\(ci,cmt\\)", out.toString(), 1);
+
+ out = new StringBuilder();
+ jc.usage("cmt", out);
+ patternMatchesTimes("commit\\(ci,cmt\\)", out.toString(), 1);
+ }
+
+ @Test
+ public void usageDisplaysCommandWithAliasesOnlyOnce() {
+ CommandMain cm = new CommandMain();
+ JCommander jc = new JCommander(cm);
+ CommandCommit commit = new CommandCommit();
+ jc.addCommand("commit", commit, "ci", "cmt");
+ StringBuilder out = new StringBuilder();
+ jc.usage(out);
+ // The usage should display this string twice: one as the command name
+ // and one after Usage:
+ patternMatchesTimes("commit\\(ci,cmt\\)", out.toString(), 2);
+ }
+
+ /**
+ * Visually test the formatting for "prettiness"
+ */
+ @Test(enabled = false, description = "TODO: test the output instead of displaying it")
+ public void formattingLooksNice(){
+ CommandMain cm = new CommandMain();
+ JCommander jc = new JCommander(cm);
+ CommandAdd add = new CommandAdd();
+ jc.addCommand("add", add, "a");
+ CommandCommit commit = new CommandCommit();
+ jc.addCommand("commit", commit, "ci", "cmt");
+ StringBuilder sb = new StringBuilder();
+ jc.usage(sb);
+ System.out.println("--- usage() formatting ---");
+ System.out.println(sb.toString());
+
+ sb = new StringBuilder();
+ jc.usage("commit", sb);
+ System.out.println("--- usage('commit') formatting ---");
+ System.out.println(sb.toString());
+ }
+
+ private void patternMatchesTimes(String pattern, String input, int times) {
+ Matcher m = Pattern.compile(pattern).matcher(input);
+ int matches = 0;
+ while (m.find()) matches++;
+ Assert.assertEquals(matches, times);
+ }
+}
diff --git a/src/test/java/com/beust/jcommander/command/CommandCommit.java b/src/test/java/com/beust/jcommander/command/CommandCommit.java
new file mode 100644
index 0000000..2934a89
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/command/CommandCommit.java
@@ -0,0 +1,37 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.command;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+
+import java.util.List;
+
+@Parameters(separators = "=", commandDescription = "Record changes to the repository")
+public class CommandCommit {
+
+ @Parameter(description = "List of files")
+ public List<String> files;
+
+ @Parameter(names = "--amend", description = "Amend")
+ public Boolean amend = false;
+
+ @Parameter(names = "--author")
+ public String author;
+}
diff --git a/src/test/java/com/beust/jcommander/command/CommandHidden.java b/src/test/java/com/beust/jcommander/command/CommandHidden.java
new file mode 100644
index 0000000..a3fc4fa
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/command/CommandHidden.java
@@ -0,0 +1,17 @@
+package com.beust.jcommander.command;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+
+import java.util.List;
+
+@Parameters(commandNames = "add", commandDescription = "Hidden command to add file contents to the index", hidden = true)
+public class CommandHidden {
+
+ @Parameter(description = "Patterns of files to be added")
+ public List<String> patterns;
+
+ @Parameter(names = "-i")
+ public Boolean interactive = false;
+
+}
diff --git a/src/test/java/com/beust/jcommander/command/CommandMain.java b/src/test/java/com/beust/jcommander/command/CommandMain.java
new file mode 100644
index 0000000..c205116
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/command/CommandMain.java
@@ -0,0 +1,27 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.command;
+
+import com.beust.jcommander.Parameter;
+
+public class CommandMain {
+
+ @Parameter(names = "-v", description = "Verbose mode")
+ public Boolean verbose = false;
+}
diff --git a/src/test/java/com/beust/jcommander/command/CommandTest.java b/src/test/java/com/beust/jcommander/command/CommandTest.java
new file mode 100644
index 0000000..cf921bd
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/command/CommandTest.java
@@ -0,0 +1,115 @@
+/**
+ * Copyright (C) 2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.beust.jcommander.command;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.ParameterException;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import java.util.Arrays;
+
+public class CommandTest {
+ @Test
+ public void namedCommandTest1() {
+ CommandMain cm = new CommandMain();
+ JCommander jc = new JCommander(cm);
+ NamedCommandAdd add = new NamedCommandAdd();
+ jc.addCommand(add);
+ CommandCommit commit = new CommandCommit();
+ jc.addCommand("commit", commit);
+ jc.parse("add", "-i", "A.java");
+
+ Assert.assertEquals(jc.getParsedCommand(), "add");
+ Assert.assertEquals(add.interactive.booleanValue(), true);
+ Assert.assertEquals(add.patterns, Arrays.asList("A.java"));
+ }
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void shouldComplainIfNoAnnotations() {
+ CommandMain cm = new CommandMain();
+ JCommander jc = new JCommander(cm);
+ CommandAdd add = new CommandAdd();
+ jc.addCommand(add);
+ }
+
+ @Test
+ public void commandTest1() {
+ CommandMain cm = new CommandMain();
+ JCommander jc = new JCommander(cm);
+ CommandAdd add = new CommandAdd();
+ jc.addCommand("add", add);
+ CommandCommit commit = new CommandCommit();
+ jc.addCommand("commit", commit);
+ jc.parse("add", "-i", "A.java");
+
+ Assert.assertEquals(jc.getParsedCommand(), "add");
+ Assert.assertEquals(add.interactive.booleanValue(), true);
+ Assert.assertEquals(add.patterns, Arrays.asList("A.java"));
+ }
+
+ @Test
+ public void commandTest2() {
+ CommandMain cm = new CommandMain();
+ JCommander jc = new JCommander(cm);
+ CommandAdd add = new CommandAdd();
+ jc.addCommand("add", add);
+ CommandCommit commit = new CommandCommit();
+ jc.addCommand("commit", commit);
+ jc.parse("-v", "commit", "--amend", "--author=cbeust", "A.java", "B.java");
+
+// jc.setProgramName("TestCommander");
+// jc.usage();
+// jc.usage("add");
+// jc.usage("commit");
+
+ Assert.assertTrue(cm.verbose);
+ Assert.assertEquals(jc.getParsedCommand(), "commit");
+ Assert.assertTrue(commit.amend);
+ Assert.assertEquals(commit.author, "cbeust");
+ Assert.assertEquals(commit.files, Arrays.asList("A.java", "B.java"));
+ }
+
+ @Test
+ public void hiddenCommandTest() {
+ CommandMain cm = new CommandMain();
+ JCommander jc = new JCommander(cm);
+ CommandAdd add = new CommandAdd();
+ jc.addCommand("add", add);
+ CommandHidden hidden = new CommandHidden();
+ jc.addCommand("hidden", hidden);
+ jc.parse("hidden", "-i", "A.java");
+
+ Assert.assertEquals(jc.getParsedCommand(), "hidden");
+ Assert.assertEquals(hidden.interactive.booleanValue(), true);
+ Assert.assertEquals(hidden.patterns, Arrays.asList("A.java"));
+
+ jc.setProgramName("TestCommander");
+ StringBuilder out = new StringBuilder();
+ jc.usage(out);
+
+ Assert.assertTrue(out.toString().contains("add Add file contents to the index"));
+ Assert.assertFalse(out.toString().contains("hidden Hidden command to add file contents to the index"));
+ }
+
+ public static void main(String[] args) {
+ new CommandTest().shouldComplainIfNoAnnotations();
+ }
+}
diff --git a/src/test/java/com/beust/jcommander/command/NamedCommandAdd.java b/src/test/java/com/beust/jcommander/command/NamedCommandAdd.java
new file mode 100644
index 0000000..0773e18
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/command/NamedCommandAdd.java
@@ -0,0 +1,17 @@
+package com.beust.jcommander.command;
+
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+
+import java.util.List;
+
+@Parameters(commandNames = "add", commandDescription = "Add file contents to the index")
+public class NamedCommandAdd {
+
+ @Parameter(description = "Patterns of files to be added")
+ public List<String> patterns;
+
+ @Parameter(names = "-i")
+ public Boolean interactive = false;
+
+}
diff --git a/src/test/java/com/beust/jcommander/dynamic/DSimple.java b/src/test/java/com/beust/jcommander/dynamic/DSimple.java
new file mode 100644
index 0000000..deb5a2b
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/dynamic/DSimple.java
@@ -0,0 +1,16 @@
+package com.beust.jcommander.dynamic;
+
+import com.beust.jcommander.DynamicParameter;
+
+import org.testng.collections.Maps;
+
+import java.util.Map;
+
+public class DSimple {
+
+ @DynamicParameter(names = "-D", description = "Dynamic parameters go here")
+ public Map<String, String> params = Maps.newHashMap();
+
+ @DynamicParameter(names = "-A", assignment = "@")
+ public Map<String, String> params2 = Maps.newHashMap();
+}
diff --git a/src/test/java/com/beust/jcommander/dynamic/DSimpleBad.java b/src/test/java/com/beust/jcommander/dynamic/DSimpleBad.java
new file mode 100644
index 0000000..f859029
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/dynamic/DSimpleBad.java
@@ -0,0 +1,11 @@
+package com.beust.jcommander.dynamic;
+
+import com.beust.jcommander.DynamicParameter;
+
+import java.util.List;
+
+public class DSimpleBad {
+
+ @DynamicParameter(names = "-D")
+ public List<String> params;
+}
diff --git a/src/test/java/com/beust/jcommander/dynamic/DynamicParameterTest.java b/src/test/java/com/beust/jcommander/dynamic/DynamicParameterTest.java
new file mode 100644
index 0000000..98327bd
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/dynamic/DynamicParameterTest.java
@@ -0,0 +1,60 @@
+package com.beust.jcommander.dynamic;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.ParameterException;
+import com.beust.jcommander.internal.Maps;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+@Test
+public class DynamicParameterTest {
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void nonMapShouldThrow() {
+ new JCommander(new DSimpleBad()).parse("-D", "a=b", "-D", "c=d");
+ }
+
+ @Test(expectedExceptions = ParameterException.class)
+ public void wrongSeparatorShouldThrow() {
+ DSimple ds = new DSimple();
+ new JCommander(ds).parse("-D", "a:b", "-D", "c=d");
+ }
+
+ private void simple(String... parameters) {
+ DSimple ds = new DSimple();
+ new JCommander(ds).parse(parameters);
+ Assert.assertEquals(ds.params, Maps.newHashMap("a", "b", "c", "d"));
+ }
+
+ public void simpleWithSpaces() {
+ simple("-D", "a=b", "-D", "c=d");
+ }
+
+ public void simpleWithoutSpaces() {
+ simple("-Da=b", "-Dc=d");
+ }
+
+ public void usage() {
+ DSimple ds = new DSimple();
+ new JCommander(ds).usage(new StringBuilder());
+ }
+
+ public void differentAssignment() {
+ DSimple ds = new DSimple();
+ new JCommander(ds).parse("-D", "a=b", "-A", "c@d");
+ Assert.assertEquals(ds.params, Maps.newHashMap("a", "b"));
+ Assert.assertEquals(ds.params2, Maps.newHashMap("c", "d"));
+ }
+
+ @Test(enabled = false)
+ public static void main(String[] args) {
+ DynamicParameterTest dpt = new DynamicParameterTest();
+ dpt.simpleWithSpaces();
+// dpt.nonMapShouldThrow();
+// dpt.wrongSeparatorShouldThrow();
+// dpt.differentAssignment();
+// dpt.arity0();
+// dpt.usage();
+ }
+}
diff --git a/src/test/java/com/beust/jcommander/internal/DefaultConsoleTest.java b/src/test/java/com/beust/jcommander/internal/DefaultConsoleTest.java
new file mode 100644
index 0000000..e101439
--- /dev/null
+++ b/src/test/java/com/beust/jcommander/internal/DefaultConsoleTest.java
@@ -0,0 +1,64 @@
+package com.beust.jcommander.internal;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+@Test
+public class DefaultConsoleTest {
+ public void readPasswordCanBeCalledMultipleTimes() {
+ final InputStream inBackup = System.in;
+ try {
+ final StringInputStream in = new StringInputStream();
+ System.setIn(in);
+ final Console console = new DefaultConsole();
+
+ in.setData("password1\n");
+ char[] password = console.readPassword(false);
+ Assert.assertEquals(password, "password1".toCharArray());
+ Assert.assertFalse(in.isClosedCalled(), "System.in stream shouldn't be closed");
+
+ in.setData("password2\n");
+ password = console.readPassword(false);
+ Assert.assertEquals(password, "password2".toCharArray());
+ Assert.assertFalse(in.isClosedCalled(), "System.in stream shouldn't be closed");
+ } finally {
+ System.setIn(inBackup);
+ }
+ }
+
+ private static class StringInputStream extends InputStream {
+ private byte[] data = new byte[0];
+ private int offset = 0;
+ private boolean closedCalled;
+
+ StringInputStream() {
+ super();
+ }
+
+ void setData(final String strData) {
+ data = strData.getBytes();
+ offset = 0;
+ }
+
+ boolean isClosedCalled() {
+ return closedCalled;
+ }
+
+ @Override
+ public int read() throws IOException {
+ if (offset >= data.length) {
+ return -1;
+ }
+ return 0xFFFF & data[offset++];
+ }
+
+ @Override
+ public void close() throws IOException {
+ closedCalled = true;
+ super.close();
+ }
+ }
+}