158a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust/**
258a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * Copyright (C) 2010 the original author or authors.
358a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * See the notice.md file distributed with this work for additional
458a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * information regarding copyright ownership.
558a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust *
658a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * Licensed under the Apache License, Version 2.0 (the "License");
758a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * you may not use this file except in compliance with the License.
858a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * You may obtain a copy of the License at
958a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust *
1058a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust *     http://www.apache.org/licenses/LICENSE-2.0
1158a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust *
1258a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * Unless required by applicable law or agreed to in writing, software
1358a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * distributed under the License is distributed on an "AS IS" BASIS,
1458a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1558a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * See the License for the specific language governing permissions and
1658a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * limitations under the License.
1758a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust */
1858a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust
19e9229f961b3a5799f6798369afe26dec7960249Cedric Beustpackage com.beust.jcommander;
20e9229f961b3a5799f6798369afe26dec7960249Cedric Beust
21c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.io.ByteArrayInputStream;
22c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.io.File;
23c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.io.FileWriter;
24c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.io.IOException;
25c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.io.InputStream;
26c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.math.BigDecimal;
27c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.text.ParseException;
28c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.text.SimpleDateFormat;
29c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.util.ArrayList;
30c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.util.Arrays;
31c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.util.EnumSet;
32c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.util.Iterator;
33c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.util.List;
34c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.util.Locale;
35c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.util.Map;
36c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.util.ResourceBundle;
37c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.util.TreeSet;
38c421118d3104c0594dbe207c8443e51022422d32Cedric Beust
39c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport org.testng.Assert;
40c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport org.testng.annotations.DataProvider;
41c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport org.testng.annotations.Test;
42c421118d3104c0594dbe207c8443e51022422d32Cedric Beust
437c5bf86fc5d5e85d471e3722a39b7a21101b0484Cedric Beustimport com.beust.jcommander.args.AlternateNamesForListArgs;
44103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.Args1;
45369d387138b6da9e77e01d82273ef6271580eb47Cedric Beustimport com.beust.jcommander.args.Args1Setter;
46103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.Args2;
47103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsArityString;
48103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsBooleanArity;
49b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beustimport com.beust.jcommander.args.ArgsBooleanArity0;
50103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsConverter;
510638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraruimport com.beust.jcommander.args.ArgsEnum;
525fc805c44e904eb37f24217676b5da1619268c48Cedric Beustimport com.beust.jcommander.args.ArgsEnum.ChoiceType;
532ee07bc8765f4873b69423e6185120d176c49a2bCedric Beustimport com.beust.jcommander.args.ArgsEquals;
54b5598e97aa7d22a933223f6211d50329b1a20308Cedric Beustimport com.beust.jcommander.args.ArgsHelp;
55103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsI18N1;
56103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsI18N2;
57103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsI18N2New;
58b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthierimport com.beust.jcommander.args.ArgsInherited;
593e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beustimport com.beust.jcommander.args.ArgsList;
60f2cd60c1f0e475201b9d24b486df920ff1d02ac5Russell Eganimport com.beust.jcommander.args.ArgsMainParameter1;
61103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsMaster;
62103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsMultipleUnparsed;
63c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beustimport com.beust.jcommander.args.ArgsOutOfMemory;
64103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsPrivate;
6572cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beustimport com.beust.jcommander.args.ArgsRequired;
66103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsSlave;
67103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsSlaveBogus;
68cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beustimport com.beust.jcommander.args.ArgsValidate1;
69876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beustimport com.beust.jcommander.args.ArgsWithSet;
70e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beustimport com.beust.jcommander.args.Arity1;
71103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.SeparatorColon;
72103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.SeparatorEqual;
73103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.SeparatorMixed;
74d556f4a527306a9769776d1cbb2fccac98618bc9Cedric Beustimport com.beust.jcommander.args.SlashSeparator;
75c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beustimport com.beust.jcommander.args.VariableArity;
76dda1651c0b74aa9e8d225096f1d531871460e692Cedric Beustimport com.beust.jcommander.command.CommandAdd;
77dda1651c0b74aa9e8d225096f1d531871460e692Cedric Beustimport com.beust.jcommander.command.CommandCommit;
78dda1651c0b74aa9e8d225096f1d531871460e692Cedric Beustimport com.beust.jcommander.command.CommandMain;
79c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport com.beust.jcommander.internal.Lists;
80c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport com.beust.jcommander.internal.Maps;
81e9229f961b3a5799f6798369afe26dec7960249Cedric Beust
82460998fec3b06bf45b024c645b5b5e854de68c24Cedric Beust@Test
83e9229f961b3a5799f6798369afe26dec7960249Cedric Beustpublic class JCommanderTest {
84f923ee57617c8690d293909c53a4e109a8c2ba26Angus  public void simpleArgs() throws ParseException {
8594fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Args1 args = new Args1();
86041bdac9067d4ce9c936ff1c0ae3856f2e240f15Angus    String[] argv = { "-debug", "-log", "2", "-float", "1.2", "-double", "1.3", "-bigdecimal", "1.4",
87f923ee57617c8690d293909c53a4e109a8c2ba26Angus            "-date", "2011-10-26", "-groups", "unit", "a", "b", "c" };
8894fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    new JCommander(args, argv);
89e9229f961b3a5799f6798369afe26dec7960249Cedric Beust
90cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust    Assert.assertTrue(args.debug);
9194fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Assert.assertEquals(args.verbose.intValue(), 2);
9294fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Assert.assertEquals(args.groups, "unit");
9394fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Assert.assertEquals(args.parameters, Arrays.asList("a", "b", "c"));
9436e3614a3ebf663c723e94f30b873194d33a29d1Cedric Beust    Assert.assertEquals(args.floa, 1.2f, 0.1f);
9536e3614a3ebf663c723e94f30b873194d33a29d1Cedric Beust    Assert.assertEquals(args.doub, 1.3f, 0.1f);
96041bdac9067d4ce9c936ff1c0ae3856f2e240f15Angus    Assert.assertEquals(args.bigd, new BigDecimal("1.4"));
97f923ee57617c8690d293909c53a4e109a8c2ba26Angus    Assert.assertEquals(args.date, new SimpleDateFormat("yyyy-MM-dd").parse("2011-10-26"));
98e9229f961b3a5799f6798369afe26dec7960249Cedric Beust  }
99696418a94157048544c44f405d757ede86eec926Cedric Beust
10004e646fe260cced3e41c20c7807a7af7207ea32fAndy Law  @DataProvider
10104e646fe260cced3e41c20c7807a7af7207ea32fAndy Law  public Object[][] alternateNamesListArgs() {
10204e646fe260cced3e41c20c7807a7af7207ea32fAndy Law    return new Object[][] {
10304e646fe260cced3e41c20c7807a7af7207ea32fAndy Law        new String[][] {new String[] {"--servers", "1", "-s", "2", "--servers", "3"}},
10404e646fe260cced3e41c20c7807a7af7207ea32fAndy Law        new String[][] {new String[] {"-s", "1", "-s", "2", "--servers", "3"}},
10504e646fe260cced3e41c20c7807a7af7207ea32fAndy Law        new String[][] {new String[] {"--servers", "1", "--servers", "2", "-s", "3"}},
10604e646fe260cced3e41c20c7807a7af7207ea32fAndy Law        new String[][] {new String[] {"-s", "1", "--servers", "2", "-s", "3"}},
10704e646fe260cced3e41c20c7807a7af7207ea32fAndy Law        new String[][] {new String[] {"-s", "1", "-s", "2", "--servers", "3"}},
10804e646fe260cced3e41c20c7807a7af7207ea32fAndy Law    };
10904e646fe260cced3e41c20c7807a7af7207ea32fAndy Law  }
11004e646fe260cced3e41c20c7807a7af7207ea32fAndy Law
11104e646fe260cced3e41c20c7807a7af7207ea32fAndy Law  /**
11204e646fe260cced3e41c20c7807a7af7207ea32fAndy Law   *  Confirm that List<?> parameters with alternate names return the correct
11304e646fe260cced3e41c20c7807a7af7207ea32fAndy Law   * List regardless of how the arguments are specified
11404e646fe260cced3e41c20c7807a7af7207ea32fAndy Law   */
11504e646fe260cced3e41c20c7807a7af7207ea32fAndy Law
11604e646fe260cced3e41c20c7807a7af7207ea32fAndy Law  @Test(dataProvider = "alternateNamesListArgs")
11704e646fe260cced3e41c20c7807a7af7207ea32fAndy Law  public void testAlternateNamesForListArguments(String[] argv) {
11804e646fe260cced3e41c20c7807a7af7207ea32fAndy Law      AlternateNamesForListArgs args = new AlternateNamesForListArgs();
11904e646fe260cced3e41c20c7807a7af7207ea32fAndy Law
12004e646fe260cced3e41c20c7807a7af7207ea32fAndy Law      new JCommander(args, argv);
12104e646fe260cced3e41c20c7807a7af7207ea32fAndy Law
12204e646fe260cced3e41c20c7807a7af7207ea32fAndy Law      Assert.assertEquals(args.serverNames.size(), 3);
12304e646fe260cced3e41c20c7807a7af7207ea32fAndy Law      Assert.assertEquals(args.serverNames.get(0), argv[1]);
12404e646fe260cced3e41c20c7807a7af7207ea32fAndy Law      Assert.assertEquals(args.serverNames.get(1), argv[3]);
12504e646fe260cced3e41c20c7807a7af7207ea32fAndy Law      Assert.assertEquals(args.serverNames.get(2), argv[5]);
12604e646fe260cced3e41c20c7807a7af7207ea32fAndy Law  }
12704e646fe260cced3e41c20c7807a7af7207ea32fAndy Law
12804e646fe260cced3e41c20c7807a7af7207ea32fAndy Law
129696418a94157048544c44f405d757ede86eec926Cedric Beust  /**
130696418a94157048544c44f405d757ede86eec926Cedric Beust   * Make sure that if there are args with multiple names (e.g. "-log" and "-verbose"),
131696418a94157048544c44f405d757ede86eec926Cedric Beust   * the usage will only display it once.
132696418a94157048544c44f405d757ede86eec926Cedric Beust   */
133696418a94157048544c44f405d757ede86eec926Cedric Beust  public void repeatedArgs() {
13494fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Args1 args = new Args1();
135696418a94157048544c44f405d757ede86eec926Cedric Beust    String[] argv = { "-log", "2" };
13694fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    JCommander jc = new JCommander(args, argv);
137f923ee57617c8690d293909c53a4e109a8c2ba26Angus    Assert.assertEquals(jc.getParameters().size(), 8);
138696418a94157048544c44f405d757ede86eec926Cedric Beust  }
139696418a94157048544c44f405d757ede86eec926Cedric Beust
140dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  /**
141dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust   * Not specifying a required option should throw an exception.
142dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust   */
143dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  @Test(expectedExceptions = ParameterException.class)
1446734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust  public void requiredFields1Fail() {
14594fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Args1 args = new Args1();
146dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust    String[] argv = { "-debug" };
14794fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    new JCommander(args, argv);
148dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  }
149dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust
150dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  /**
151e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust   * Getting the description of a nonexistent command should throw an exception.
152e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust   */
153e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust  @Test(expectedExceptions = ParameterException.class)
154e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust  public void nonexistentCommandShouldThrow() {
155e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust    String[] argv = { };
156e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust    JCommander jc = new JCommander(new Object(), argv);
157e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust    jc.getCommandDescription("foo");
158e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust  }
159e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust
160e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust  /**
161dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust   * Required options with multiple names should work with all names.
162dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust   */
163c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust  private void multipleNames(String option) {
16494fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Args1 args = new Args1();
165c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust    String[] argv = { option, "2" };
16694fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    new JCommander(args, argv);
167c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust    Assert.assertEquals(args.verbose.intValue(), 2);
168c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust  }
1690638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru
170c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust  public void multipleNames1() {
171c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust    multipleNames("-log");
172dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  }
173dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust
174c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust  public void multipleNames2() {
175c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust    multipleNames("-verbose");
176dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  }
177dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust
1786734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust  private void i18n1(String bundleName, Locale locale, String expectedString) {
1796734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    ResourceBundle bundle = locale != null ? ResourceBundle.getBundle(bundleName, locale)
1809b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust        : null;
1819b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
1826734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    ArgsI18N1 i18n = new ArgsI18N1();
1839b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust    String[] argv = { "-host", "localhost" };
1849b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust    JCommander jc = new JCommander(i18n, bundle, argv);
18514516e91e6be4ba1c3e7b573ea450e5c59925ecfCedric Beust//    jc.usage();
1869b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
1879b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust    ParameterDescription pd = jc.getParameters().get(0);
1889b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust    Assert.assertEquals(pd.getDescription(), expectedString);
1899b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  }
1909b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
1919b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  public void i18nNoLocale() {
1926734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    i18n1("MessageBundle", null, "Host");
1939b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  }
1949b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
1959b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  public void i18nUsLocale() {
1966734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    i18n1("MessageBundle", new Locale("en", "US"), "Host");
1979b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  }
1989b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
1999b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  public void i18nFrLocale() {
200c27a04a2e10667dff4390b25fa4224b58b291ca0David Gageot    i18n1("MessageBundle", new Locale("fr", "FR"), "Hôte");
2016734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust  }
2026734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust
203b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust  private void i18n2(Object i18n) {
2046734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    String[] argv = { "-host", "localhost" };
2056734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    Locale.setDefault(new Locale("fr", "FR"));
2066734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    JCommander jc = new JCommander(i18n, argv);
2076734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    ParameterDescription pd = jc.getParameters().get(0);
208c27a04a2e10667dff4390b25fa4224b58b291ca0David Gageot    Assert.assertEquals(pd.getDescription(), "Hôte");
2099b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  }
2109b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
211b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust  public void i18nWithResourceAnnotation() {
212b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust    i18n2(new ArgsI18N2());
213b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust  }
214b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust
215b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust  public void i18nWithResourceAnnotationNew() {
216b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust    i18n2(new ArgsI18N2New());
217b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust  }
218b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust
21921059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust  public void noParseConstructor() {
22021059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust    JCommander jCommander = new JCommander(new ArgsMainParameter1());
221b5598e97aa7d22a933223f6211d50329b1a20308Cedric Beust    jCommander.usage(new StringBuilder());
22221059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust    // Before fix, this parse would throw an exception, because it calls createDescription, which
22321059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust    // was already called by usage(), and can only be called once.
22421059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust    jCommander.parse();
22521059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust  }
22621059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust
227dae46a1c4166085b56a78669050dc19938735a41Russell Egan  /**
228dae46a1c4166085b56a78669050dc19938735a41Russell Egan   * Test a use case where there are required parameters, but you still want
229dae46a1c4166085b56a78669050dc19938735a41Russell Egan   * to interrogate the options which are specified.
230dae46a1c4166085b56a78669050dc19938735a41Russell Egan   */
231dae46a1c4166085b56a78669050dc19938735a41Russell Egan  public void usageWithRequiredArgsAndResourceBundle() {
232dae46a1c4166085b56a78669050dc19938735a41Russell Egan    ArgsHelp argsHelp = new ArgsHelp();
23321059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust    JCommander jc = new JCommander(new Object[]{argsHelp, new ArgsRequired()},
23421059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust        java.util.ResourceBundle.getBundle("MessageBundle"));
235dae46a1c4166085b56a78669050dc19938735a41Russell Egan    // Should be able to display usage without triggering validation
236b5598e97aa7d22a933223f6211d50329b1a20308Cedric Beust    jc.usage(new StringBuilder());
237dae46a1c4166085b56a78669050dc19938735a41Russell Egan    try {
238dae46a1c4166085b56a78669050dc19938735a41Russell Egan      jc.parse("-h");
239dae46a1c4166085b56a78669050dc19938735a41Russell Egan      Assert.fail("Should have thrown a required parameter exception");
240dae46a1c4166085b56a78669050dc19938735a41Russell Egan    } catch (ParameterException e) {
241dae46a1c4166085b56a78669050dc19938735a41Russell Egan      Assert.assertTrue(e.getMessage().contains("are required"));
242dae46a1c4166085b56a78669050dc19938735a41Russell Egan    }
243dae46a1c4166085b56a78669050dc19938735a41Russell Egan    Assert.assertTrue(argsHelp.help);
244dae46a1c4166085b56a78669050dc19938735a41Russell Egan  }
245dae46a1c4166085b56a78669050dc19938735a41Russell Egan
246d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust  public void multiObjects() {
247d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust    ArgsMaster m = new ArgsMaster();
248d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust    ArgsSlave s = new ArgsSlave();
249d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust    String[] argv = { "-master", "master", "-slave", "slave" };
250b945b741b5de0510ce39f8c793e31202070ef942Cedric Beust    new JCommander(new Object[] { m , s }, argv);
251d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust
252d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust    Assert.assertEquals(m.master, "master");
253d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust    Assert.assertEquals(s.slave, "slave");
254d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust  }
255d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust
2560c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust  @Test(expectedExceptions = ParameterException.class)
2576734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust  public void multiObjectsWithDuplicatesFail() {
2580c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust    ArgsMaster m = new ArgsMaster();
2590c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust    ArgsSlave s = new ArgsSlaveBogus();
2600c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust    String[] argv = { "-master", "master", "-slave", "slave" };
2610c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust    new JCommander(new Object[] { m , s }, argv);
2620c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust  }
2630c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust
264f3b82e196a622a959374d7588688e74fe852a512Cedric Beust  public void arityString() {
265f3b82e196a622a959374d7588688e74fe852a512Cedric Beust    ArgsArityString args = new ArgsArityString();
266a21262377768de124914e354e428ed6860828949Cedric Beust    String[] argv = { "-pairs", "pair0", "pair1", "rest" };
267a21262377768de124914e354e428ed6860828949Cedric Beust    new JCommander(args, argv);
268a21262377768de124914e354e428ed6860828949Cedric Beust
269a21262377768de124914e354e428ed6860828949Cedric Beust    Assert.assertEquals(args.pairs.size(), 2);
270a21262377768de124914e354e428ed6860828949Cedric Beust    Assert.assertEquals(args.pairs.get(0), "pair0");
271a21262377768de124914e354e428ed6860828949Cedric Beust    Assert.assertEquals(args.pairs.get(1), "pair1");
272a21262377768de124914e354e428ed6860828949Cedric Beust    Assert.assertEquals(args.rest.size(), 1);
273a21262377768de124914e354e428ed6860828949Cedric Beust    Assert.assertEquals(args.rest.get(0), "rest");
274a21262377768de124914e354e428ed6860828949Cedric Beust  }
275a21262377768de124914e354e428ed6860828949Cedric Beust
276f3b82e196a622a959374d7588688e74fe852a512Cedric Beust  @Test(expectedExceptions = ParameterException.class)
277e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  public void arity2Fail() {
278f3b82e196a622a959374d7588688e74fe852a512Cedric Beust    ArgsArityString args = new ArgsArityString();
279f3b82e196a622a959374d7588688e74fe852a512Cedric Beust    String[] argv = { "-pairs", "pair0" };
280f3b82e196a622a959374d7588688e74fe852a512Cedric Beust    new JCommander(args, argv);
281f3b82e196a622a959374d7588688e74fe852a512Cedric Beust  }
282f3b82e196a622a959374d7588688e74fe852a512Cedric Beust
283cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust  @Test(expectedExceptions = ParameterException.class)
284cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust  public void multipleUnparsedFail() {
285cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust    ArgsMultipleUnparsed args = new ArgsMultipleUnparsed();
286cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust    String[] argv = { };
287cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust    new JCommander(args, argv);
288cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust  }
289cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust
2905f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust  public void privateArgs() {
2915f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust    ArgsPrivate args = new ArgsPrivate();
2925f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust    new JCommander(args, "-verbose", "3");
2935f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust    Assert.assertEquals(args.getVerbose().intValue(), 3);
2945f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust  }
2955f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust
2965a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust  public void converterArgs() {
2975a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust    ArgsConverter args = new ArgsConverter();
2985a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust    String fileName = "a";
2997021eade4657caf7ae25b19539bdc135619d248cAngus    new JCommander(args, "-file", "/tmp/" + fileName,
3007021eade4657caf7ae25b19539bdc135619d248cAngus      "-listStrings", "Tuesday,Thursday",
3017021eade4657caf7ae25b19539bdc135619d248cAngus      "-listInts", "-1,8",
3027021eade4657caf7ae25b19539bdc135619d248cAngus      "-listBigDecimals", "-11.52,100.12");
3035a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust    Assert.assertEquals(args.file.getName(), fileName);
3047021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listStrings.size(), 2);
3057021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listStrings.get(0), "Tuesday");
3067021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listStrings.get(1), "Thursday");
3077021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listInts.size(), 2);
3087021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listInts.get(0).intValue(), -1);
3097021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listInts.get(1).intValue(), 8);
3107021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listBigDecimals.size(), 2);
3117021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listBigDecimals.get(0), new BigDecimal("-11.52"));
3127021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listBigDecimals.get(1), new BigDecimal("100.12"));
3135a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust  }
3145a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust
315b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  private void argsBoolean1(String[] params, Boolean expected) {
316d3b9e34aed415eba172befec79d2261c3ac38123Cedric Beust    ArgsBooleanArity args = new ArgsBooleanArity();
317b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    new JCommander(args, params);
318b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    Assert.assertEquals(args.debug, expected);
319b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  }
320b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust
321b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  private void argsBoolean0(String[] params, Boolean expected) {
322b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    ArgsBooleanArity0 args = new ArgsBooleanArity0();
323b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    new JCommander(args, params);
324b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    Assert.assertEquals(args.debug, expected);
325b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  }
326b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust
327b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  public void booleanArity1() {
328b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    argsBoolean1(new String[] {}, Boolean.FALSE);
329b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    argsBoolean1(new String[] { "-debug", "true" }, Boolean.TRUE);
330b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  }
331b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust
332b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  public void booleanArity0() {
333b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    argsBoolean0(new String[] {}, Boolean.FALSE);
334b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    argsBoolean0(new String[] { "-debug"}, Boolean.TRUE);
335d3b9e34aed415eba172befec79d2261c3ac38123Cedric Beust  }
336d3b9e34aed415eba172befec79d2261c3ac38123Cedric Beust
3374312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  @Test(expectedExceptions = ParameterException.class)
3384312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  public void badParameterShouldThrowParameter1Exception() {
3394312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    Args1 args = new Args1();
3404312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    String[] argv = { "-log", "foo" };
3414312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    new JCommander(args, argv);
3424312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  }
3434312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust
3444312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  @Test(expectedExceptions = ParameterException.class)
3454312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  public void badParameterShouldThrowParameter2Exception() {
3464312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    Args1 args = new Args1();
3474312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    String[] argv = { "-long", "foo" };
3484312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    new JCommander(args, argv);
3494312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  }
3504312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust
351b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust  public void listParameters() {
352b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    Args2 a = new Args2();
353b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    String[] argv = {"-log", "2", "-groups", "unit", "a", "b", "c", "-host", "host2"};
354b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    new JCommander(a, argv);
355b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    Assert.assertEquals(a.verbose.intValue(), 2);
356b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    Assert.assertEquals(a.groups, "unit");
357b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    Assert.assertEquals(a.hosts, Arrays.asList("host2"));
358b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    Assert.assertEquals(a.parameters, Arrays.asList("a", "b", "c"));
359b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust  }
36085866a95d6479be731596a838b6f5e793a341f5bCedric Beust
361fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  public void separatorEqual() {
362fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    SeparatorEqual s = new SeparatorEqual();
363bc108076cf3dc506d4e87e004d8c2e413b995adaCedric Beust    String[] argv = { "-log=3", "--longoption=10" };
36485866a95d6479be731596a838b6f5e793a341f5bCedric Beust    new JCommander(s, argv);
36585866a95d6479be731596a838b6f5e793a341f5bCedric Beust    Assert.assertEquals(s.log.intValue(), 3);
366bc108076cf3dc506d4e87e004d8c2e413b995adaCedric Beust    Assert.assertEquals(s.longOption.intValue(), 10);
36785866a95d6479be731596a838b6f5e793a341f5bCedric Beust  }
36885866a95d6479be731596a838b6f5e793a341f5bCedric Beust
369fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  public void separatorColon() {
370fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    SeparatorColon s = new SeparatorColon();
371fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    String[] argv = { "-verbose:true" };
372fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    new JCommander(s, argv);
373fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    Assert.assertTrue(s.verbose);
374fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  }
375fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust
376fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  public void separatorBoth() {
377fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    SeparatorColon s = new SeparatorColon();
378fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    SeparatorEqual s2 = new SeparatorEqual();
379fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    String[] argv = { "-verbose:true", "-log=3" };
380fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    new JCommander(new Object[] { s, s2 }, argv);
381fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    Assert.assertTrue(s.verbose);
382fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    Assert.assertEquals(s2.log.intValue(), 3);
383fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  }
384fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust
385fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  public void separatorMixed1() {
386fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    SeparatorMixed s = new SeparatorMixed();
387fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    String[] argv = { "-long:1", "-level=42" };
388fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    new JCommander(s, argv);
389fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    Assert.assertEquals(s.l.longValue(), 1l);
390fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    Assert.assertEquals(s.level.intValue(), 42);
391fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  }
392fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust
393426bf32155b30f5c1819a00d88c16944c01e5a52Cedric Beust  public void slashParameters() {
394d556f4a527306a9769776d1cbb2fccac98618bc9Cedric Beust    SlashSeparator a = new SlashSeparator();
395858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust    String[] argv = { "/verbose", "/file", "/tmp/a" };
3965f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust    new JCommander(a, argv);
397d556f4a527306a9769776d1cbb2fccac98618bc9Cedric Beust    Assert.assertTrue(a.verbose);
398d556f4a527306a9769776d1cbb2fccac98618bc9Cedric Beust    Assert.assertEquals(a.file, "/tmp/a");
3995f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust  }
4005f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust
401b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier  public void inheritance() {
402b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier    ArgsInherited args = new ArgsInherited();
403b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier    String[] argv = { "-log", "3", "-child", "2" };
404b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier    new JCommander(args, argv);
405b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier    Assert.assertEquals(args.child.intValue(), 2);
406b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier    Assert.assertEquals(args.log.intValue(), 3);
407b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier  }
408b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier
409858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust  public void negativeNumber() {
410858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust    Args1 a = new Args1();
411858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust    String[] argv = { "-verbose", "-3" };
412858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust    new JCommander(a, argv);
413858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust    Assert.assertEquals(a.verbose.intValue(), -3);
414858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust  }
415858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust
41672cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beust  @Test(expectedExceptions = ParameterException.class)
4175f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust  public void requiredMainParameters() {
41872cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beust    ArgsRequired a = new ArgsRequired();
41972cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beust    String[] argv = {};
42072cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beust    new JCommander(a, argv);
4215f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust  }
4225f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust
423a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust  public void usageShouldNotChange() {
424a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    JCommander jc = new JCommander(new Args1(), new String[]{"-log", "1"});
425a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    StringBuilder sb = new StringBuilder();
426a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    jc.usage(sb);
427a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    String expected = sb.toString();
428a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    jc = new JCommander(new Args1(), new String[]{"-debug", "-log", "2", "-long", "5"});
429a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    sb = new StringBuilder();
430a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    jc.usage(sb);
431a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    String actual = sb.toString();
432a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    Assert.assertEquals(actual, expected);
433a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust  }
434a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust
4354c020da73b8b25773bba8553263cf1954c718573Cedric Beust  private void verifyCommandOrdering(String[] commandNames, Object[] commands) {
4364c020da73b8b25773bba8553263cf1954c718573Cedric Beust    CommandMain cm = new CommandMain();
4374c020da73b8b25773bba8553263cf1954c718573Cedric Beust    JCommander jc = new JCommander(cm);
4384c020da73b8b25773bba8553263cf1954c718573Cedric Beust
4394c020da73b8b25773bba8553263cf1954c718573Cedric Beust    for (int i = 0; i < commands.length; i++) {
4404c020da73b8b25773bba8553263cf1954c718573Cedric Beust      jc.addCommand(commandNames[i], commands[i]);
4414c020da73b8b25773bba8553263cf1954c718573Cedric Beust    }
4424c020da73b8b25773bba8553263cf1954c718573Cedric Beust
4434c020da73b8b25773bba8553263cf1954c718573Cedric Beust    Map<String, JCommander> c = jc.getCommands();
4444c020da73b8b25773bba8553263cf1954c718573Cedric Beust    Assert.assertEquals(c.size(), commands.length);
4454c020da73b8b25773bba8553263cf1954c718573Cedric Beust
4464c020da73b8b25773bba8553263cf1954c718573Cedric Beust    Iterator<String> it = c.keySet().iterator();
4474c020da73b8b25773bba8553263cf1954c718573Cedric Beust    for (int i = 0; i < commands.length; i++) {
4484c020da73b8b25773bba8553263cf1954c718573Cedric Beust      Assert.assertEquals(it.next(), commandNames[i]);
4494c020da73b8b25773bba8553263cf1954c718573Cedric Beust    }
4504c020da73b8b25773bba8553263cf1954c718573Cedric Beust  }
4514c020da73b8b25773bba8553263cf1954c718573Cedric Beust
4524c020da73b8b25773bba8553263cf1954c718573Cedric Beust  public void commandsShouldBeShownInOrderOfInsertion() {
4534c020da73b8b25773bba8553263cf1954c718573Cedric Beust    verifyCommandOrdering(new String[] { "add", "commit" },
4544c020da73b8b25773bba8553263cf1954c718573Cedric Beust        new Object[] { new CommandAdd(), new CommandCommit() });
4554c020da73b8b25773bba8553263cf1954c718573Cedric Beust    verifyCommandOrdering(new String[] { "commit", "add" },
4564c020da73b8b25773bba8553263cf1954c718573Cedric Beust        new Object[] { new CommandCommit(), new CommandAdd() });
4574c020da73b8b25773bba8553263cf1954c718573Cedric Beust  }
4584c020da73b8b25773bba8553263cf1954c718573Cedric Beust
459e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust  @DataProvider
460e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust  public static Object[][] f() {
461e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust    return new Integer[][] {
462e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust      new Integer[] { 3, 5, 1 },
463e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust      new Integer[] { 3, 8, 1 },
464e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust      new Integer[] { 3, 12, 2 },
465e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust      new Integer[] { 8, 12, 2 },
466e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust      new Integer[] { 9, 10, 1 },
467e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust    };
468e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust  }
469e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust
470460998fec3b06bf45b024c645b5b5e854de68c24Cedric Beust  @Test(expectedExceptions = ParameterException.class)
471e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  public void arity1Fail() {
472e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final Arity1 arguments = new Arity1();
473e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final JCommander jCommander = new JCommander(arguments);
474e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final String[] commands = {
475e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust        "-inspect"
476e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    };
477e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    jCommander.parse(commands);
478e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  }
479e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust
480e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  public void arity1Success1() {
481e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final Arity1 arguments = new Arity1();
482e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final JCommander jCommander = new JCommander(arguments);
483e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final String[] commands = {
484e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust        "-inspect", "true"
485e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    };
486e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    jCommander.parse(commands);
487e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    Assert.assertTrue(arguments.inspect);
488e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  }
489e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust
490e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  public void arity1Success2() {
491e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final Arity1 arguments = new Arity1();
492e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final JCommander jCommander = new JCommander(arguments);
493e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final String[] commands = {
494e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust        "-inspect", "false"
495e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    };
496e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    jCommander.parse(commands);
497e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    Assert.assertFalse(arguments.inspect);
498e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  }
499e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust
500804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  @Parameters(commandDescription = "Help for the given commands.")
501804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  public static class Help {
502804498ec24662928bf06efcee6584d55fca3d898Cedric Beust      public static final String NAME = "help";
503804498ec24662928bf06efcee6584d55fca3d898Cedric Beust
504804498ec24662928bf06efcee6584d55fca3d898Cedric Beust      @Parameter(description = "List of commands.")
505804498ec24662928bf06efcee6584d55fca3d898Cedric Beust      public List<String> commands=new ArrayList<String>();
506804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  }
507804498ec24662928bf06efcee6584d55fca3d898Cedric Beust
508804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  @Test(expectedExceptions = ParameterException.class,
509804498ec24662928bf06efcee6584d55fca3d898Cedric Beust      description = "Verify that the main parameter's type is checked to be a List")
510804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  public void wrongMainTypeShouldThrow() {
511804498ec24662928bf06efcee6584d55fca3d898Cedric Beust    JCommander jc = new JCommander(new ArgsRequiredWrongMain());
512804498ec24662928bf06efcee6584d55fca3d898Cedric Beust    jc.parse(new String[] { "f1", "f2" });
513804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  }
514804498ec24662928bf06efcee6584d55fca3d898Cedric Beust
515c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust  @Test(description = "This used to run out of memory")
516c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust  public void oom() {
517c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust    JCommander jc = new JCommander(new ArgsOutOfMemory());
518c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust    jc.usage(new StringBuilder());
519c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust  }
520c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust
521cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust  @Test
522cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust  public void getParametersShouldNotNpe() {
523cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust    JCommander jc = new JCommander(new Args1());
524cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust    List<ParameterDescription> parameters = jc.getParameters();
525cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust  }
526cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust
527cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust  public void validationShouldWork1() {
528cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust    ArgsValidate1 a = new ArgsValidate1();
529cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust    JCommander jc = new JCommander(a);
530e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust    jc.parse(new String[] { "-age", "2 "});
531e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust    Assert.assertEquals(a.age, new Integer(2));
532e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust  }
533e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust
534e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust  @Test(expectedExceptions = ParameterException.class)
535fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust  public void validationShouldWorkWithDefaultValues() {
536fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust    ArgsValidate2 a = new ArgsValidate2();
537fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust    new JCommander(a);
538fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust  }
539fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust
540fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust  @Test(expectedExceptions = ParameterException.class)
541e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust  public void validationShouldWork2() {
542e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust    ArgsValidate1 a = new ArgsValidate1();
543e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust    JCommander jc = new JCommander(a);
544cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust    jc.parse(new String[] { "-age", "-2 "});
545cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust  }
546cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust
5478877f663e79381340b329180922d7ac448e26317Cedric Beust  public void atFileCanContainEmptyLines() throws IOException {
5488877f663e79381340b329180922d7ac448e26317Cedric Beust    File f = File.createTempFile("JCommander", null);
5498877f663e79381340b329180922d7ac448e26317Cedric Beust    f.deleteOnExit();
5508877f663e79381340b329180922d7ac448e26317Cedric Beust    FileWriter fw = new FileWriter(f);
5518877f663e79381340b329180922d7ac448e26317Cedric Beust    fw.write("-log\n");
5528877f663e79381340b329180922d7ac448e26317Cedric Beust    fw.write("\n");
5538877f663e79381340b329180922d7ac448e26317Cedric Beust    fw.write("2\n");
5548877f663e79381340b329180922d7ac448e26317Cedric Beust    fw.close();
5558877f663e79381340b329180922d7ac448e26317Cedric Beust    new JCommander(new Args1(), "@" + f.getAbsolutePath());
5568877f663e79381340b329180922d7ac448e26317Cedric Beust  }
5578877f663e79381340b329180922d7ac448e26317Cedric Beust
5582ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust  public void handleEqualSigns() {
5592ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust    ArgsEquals a = new ArgsEquals();
5602ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust    JCommander jc = new JCommander(a);
5612ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust    jc.parse(new String[] { "-args=a=b,b=c" });
5622ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust    Assert.assertEquals(a.args, "a=b,b=c");
5632ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust  }
5642ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust
565876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust  @SuppressWarnings("serial")
566876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust  public void handleSets() {
567876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust    ArgsWithSet a = new ArgsWithSet();
568876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust    new JCommander(a, new String[] { "-s", "3,1,2" });
569876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust    Assert.assertEquals(a.set, new TreeSet<Integer>() {{ add(1); add(2); add(3); }});
570876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust  }
571876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust
572c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  private static final List<String> V = Arrays.asList("a", "b", "c", "d");
573c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust
574c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  @DataProvider
575c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  public Object[][] variable() {
576c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust    return new Object[][] {
577c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust        new Object[] { 0, V.subList(0, 0), V },
578c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust        new Object[] { 1, V.subList(0, 1), V.subList(1, 4) },
579c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust        new Object[] { 2, V.subList(0, 2), V.subList(2, 4) },
580c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust        new Object[] { 3, V.subList(0, 3), V.subList(3, 4) },
581c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust        new Object[] { 4, V.subList(0, 4), V.subList(4, 4) },
582c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust    };
583c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  }
584c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust
585c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  @Test(dataProvider = "variable")
586c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  public void variableArity(int count, List<String> var, List<String> main) {
587c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust    VariableArity va = new VariableArity(count);
588c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust    new JCommander(va).parse("-variable", "a", "b", "c", "d");
589c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust    Assert.assertEquals(var, va.var);
590c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust    Assert.assertEquals(main, va.main);
591c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  }
592c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust
5930638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru  public void enumArgs() {
5940638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru    ArgsEnum args = new ArgsEnum();
595d5490aabc6002f9400e5cf3050f098ab967253d2Cedric Beust    String[] argv = { "-choice", "ONE", "-choices", "ONE", "Two" };
596a3199885e5e515af41a01c4d693bf96f1dafbd67Adrian Muraru    JCommander jc = new JCommander(args, argv);
5970638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru
5980638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru    Assert.assertEquals(args.choice, ArgsEnum.ChoiceType.ONE);
599aa87f5891a77dffdf24bc4fb1f766ec976b064c1Yannick Menager
600d5490aabc6002f9400e5cf3050f098ab967253d2Cedric Beust    List<ChoiceType> expected = Arrays.asList(ChoiceType.ONE, ChoiceType.Two);
6015fc805c44e904eb37f24217676b5da1619268c48Cedric Beust    Assert.assertEquals(expected, args.choices);
6021322b1a0011d7ac5c15f73a062a0e7b4b0879840Cedric Beust    Assert.assertEquals(jc.getParameters().get(0).getDescription(),
6031322b1a0011d7ac5c15f73a062a0e7b4b0879840Cedric Beust        "Options: " + EnumSet.allOf((Class<? extends Enum>) ArgsEnum.ChoiceType.class));
604aa87f5891a77dffdf24bc4fb1f766ec976b064c1Yannick Menager
605aa87f5891a77dffdf24bc4fb1f766ec976b064c1Yannick Menager  }
606aa87f5891a77dffdf24bc4fb1f766ec976b064c1Yannick Menager
607aa87f5891a77dffdf24bc4fb1f766ec976b064c1Yannick Menager  public void enumArgsCaseInsensitive() {
608aa87f5891a77dffdf24bc4fb1f766ec976b064c1Yannick Menager      ArgsEnum args = new ArgsEnum();
609aa87f5891a77dffdf24bc4fb1f766ec976b064c1Yannick Menager      String[] argv = { "-choice", "one"};
610aa87f5891a77dffdf24bc4fb1f766ec976b064c1Yannick Menager      JCommander jc = new JCommander(args, argv);
611aa87f5891a77dffdf24bc4fb1f766ec976b064c1Yannick Menager
612aa87f5891a77dffdf24bc4fb1f766ec976b064c1Yannick Menager      Assert.assertEquals(args.choice, ArgsEnum.ChoiceType.ONE);
6130638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru  }
6140638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru
6150638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru  @Test(expectedExceptions = ParameterException.class)
6160638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru  public void enumArgsFail() {
6170638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru    ArgsEnum args = new ArgsEnum();
6180638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru    String[] argv = { "-choice", "A" };
6190638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru    new JCommander(args, argv);
6200638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru  }
6210638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru
6223e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust  public void testListAndSplitters() {
6233e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    ArgsList al = new ArgsList();
6243e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    JCommander j = new JCommander(al);
6253e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    j.parse("-groups", "a,b", "-ints", "41,42", "-hp", "localhost:1000;example.com:1001",
6263e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust        "-hp2", "localhost:1000,example.com:1001", "-uppercase", "ab,cd");
6273e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.groups.get(0), "a");
6283e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.groups.get(1), "b");
6293e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.ints.get(0).intValue(), 41);
6303e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.ints.get(1).intValue(), 42);
6313e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.hostPorts.get(0).host, "localhost");
6323e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.hostPorts.get(0).port.intValue(), 1000);
6333e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.hostPorts.get(1).host, "example.com");
6343e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.hostPorts.get(1).port.intValue(), 1001);
6353e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.hp2.get(1).host, "example.com");
6363e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.hp2.get(1).port.intValue(), 1001);
6373e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.uppercase.get(0), "AB");
6383e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.uppercase.get(1), "CD");
6393e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust  }
6403e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust
6414ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust  @Test(expectedExceptions = ParameterException.class)
6424ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust  public void shouldThrowIfUnknownOption() {
6434ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust    class A {
6444ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust      @Parameter(names = "-long")
6454ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust      public long l;
6464ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust    }
6474ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust    A a = new A();
6484ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust    new JCommander(a).parse("-lon", "32");
6494ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust  }
6504ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust
651c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust  @Test(expectedExceptions = ParameterException.class)
652c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust  public void mainParameterShouldBeValidate() {
653c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust    class V implements IParameterValidator {
654c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust
655369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust      @Override
656c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust      public void validate(String name, String value) throws ParameterException {
657c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust        Assert.assertEquals("a", value);
658c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust      }
659c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust    }
660c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust
661c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust    class A {
662c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust      @Parameter(validateWith = V.class)
663c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust      public List<String> m;
664c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust    }
665c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust
666c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust    A a = new A();
667c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust    new JCommander(a).parse("b");
668c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust  }
669c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust
6708ad02daa23243bf515009d16205465f1b811da81Cedric Beust  @Parameters(commandNames = { "--configure" })
6718ad02daa23243bf515009d16205465f1b811da81Cedric Beust  public static class ConfigureArgs {
6728ad02daa23243bf515009d16205465f1b811da81Cedric Beust  }
673c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust
6748ad02daa23243bf515009d16205465f1b811da81Cedric Beust  public static class BaseArgs {
6758ad02daa23243bf515009d16205465f1b811da81Cedric Beust    @Parameter(names = { "-h", "--help" }, description = "Show this help screen")
6768ad02daa23243bf515009d16205465f1b811da81Cedric Beust    private boolean help = false;
6777e743acbff5277d087347bfba2409406865af8a0Cedric Beust
6788ad02daa23243bf515009d16205465f1b811da81Cedric Beust    @Parameter(names = { "--version", "-version" }, description = "Show the program version")
6798ad02daa23243bf515009d16205465f1b811da81Cedric Beust    private boolean version;
6808ad02daa23243bf515009d16205465f1b811da81Cedric Beust  }
6818ad02daa23243bf515009d16205465f1b811da81Cedric Beust
6828ad02daa23243bf515009d16205465f1b811da81Cedric Beust  public void commandsWithSamePrefixAsOptionsShouldWork() {
6838ad02daa23243bf515009d16205465f1b811da81Cedric Beust    BaseArgs a = new BaseArgs();
6848ad02daa23243bf515009d16205465f1b811da81Cedric Beust    ConfigureArgs conf = new ConfigureArgs();
6858ad02daa23243bf515009d16205465f1b811da81Cedric Beust    JCommander jc = new JCommander(a);
6868ad02daa23243bf515009d16205465f1b811da81Cedric Beust    jc.addCommand(conf);
6878ad02daa23243bf515009d16205465f1b811da81Cedric Beust    jc.parse("--configure");
6888ad02daa23243bf515009d16205465f1b811da81Cedric Beust  }
6898ad02daa23243bf515009d16205465f1b811da81Cedric Beust
69039e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust  // Tests:
69139e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust  // required unparsed parameter
69239e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust  @Test(enabled = false,
69339e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust      description = "For some reason, this test still asks the password on stdin")
69439e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust  public void askedRequiredPassword() {
69539e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust    class A {
69639e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust        @Parameter(names = { "--password", "-p" }, description = "Private key password",
69739e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust            password = true, required = true)
69839e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust        public String password;
69939e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust
70039e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust        @Parameter(names = { "--port", "-o" }, description = "Port to bind server to",
70139e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust            required = true)
70239e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust        public int port;
70339e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust    }
70439e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust    A a = new A();
70539e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust    InputStream stdin = System.in;
70639e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust    try {
70739e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust      System.setIn(new ByteArrayInputStream("password".getBytes()));
70839e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust      new JCommander(a,new String[]{"--port", "7","--password"});
70939e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust      Assert.assertEquals(a.port, 7);
71039e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust      Assert.assertEquals(a.password, "password");
71139e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust    } finally {
71239e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust      System.setIn(stdin);
7135bbf7af0a020eb6da94be078c80300c19b6d77d4Jason Wheeler    }
71439e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust  }
71539e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust
7168ebf58f752ae0703b70af57cecfe584968442558Cedric Beust  public void dynamicParameters() {
7178ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    class Command {
7188ebf58f752ae0703b70af57cecfe584968442558Cedric Beust      @DynamicParameter(names = {"-P"}, description = "Additional command parameters")
7198ebf58f752ae0703b70af57cecfe584968442558Cedric Beust      private Map<String, String> params = Maps.newHashMap();
7208ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    }
7218ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    JCommander commander = new JCommander();
7228ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    Command c = new Command();
7238ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    commander.addCommand("command", c);
7248ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    commander.parse(new String[] { "command", "-Pparam='name=value'" });
7258ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    Assert.assertEquals(c.params.get("param"), "'name=value'");
7268ebf58f752ae0703b70af57cecfe584968442558Cedric Beust  }
7278ebf58f752ae0703b70af57cecfe584968442558Cedric Beust
728ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust  public void exeParser() {
729ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust      class Params {
730ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust        @Parameter( names= "-i")
731ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust        private String inputFile;
732ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust      }
733ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust
734ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust      String args[] = { "-i", "" };
735ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust      Params p = new Params();
736ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust      new JCommander(p, args);
737ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust  }
738ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust
73974664b26b3b9cdaec4a683ec9666828cbc856e44Cedric Beust  public void multiVariableArityList() {
74074664b26b3b9cdaec4a683ec9666828cbc856e44Cedric Beust    class Params {
7415414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust      @Parameter(names = "-paramA", description = "ParamA", variableArity = true)
7425414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust      private List<String> paramA = Lists.newArrayList();
7435414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust
7445414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust      @Parameter(names = "-paramB", description = "ParamB", variableArity = true)
7455414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust      private List<String> paramB = Lists.newArrayList();
7465414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust    }
7475414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust
7489e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    {
7499e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      String args[] = { "-paramA", "a1", "a2", "-paramB", "b1", "b2", "b3" };
7509e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      Params p = new Params();
7519e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      new JCommander(p, args).parse();
7529e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      Assert.assertEquals(p.paramA, Arrays.asList(new String[] { "a1", "a2" }));
7539e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      Assert.assertEquals(p.paramB, Arrays.asList(new String[] { "b1", "b2", "b3" }));
7549e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    }
7559e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust
7569e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    {
7579e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      String args[] = { "-paramA", "a1", "a2", "-paramB", "b1", "-paramA", "a3" };
7589e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      Params p = new Params();
7599e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      new JCommander(p, args).parse();
7609e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      Assert.assertEquals(p.paramA, Arrays.asList(new String[] { "a1", "a2", "a3" }));
7619e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      Assert.assertEquals(p.paramB, Arrays.asList(new String[] { "b1" }));
7629e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    }
7635414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust  }
7645414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust
76561e65090c5495518a9a521149dbecbd17e1df193Cedric Beust  @Test(enabled = false,
76661e65090c5495518a9a521149dbecbd17e1df193Cedric Beust      description = "Need to double check that the command description is i18n'ed in the usage")
76761e65090c5495518a9a521149dbecbd17e1df193Cedric Beust  public void commandKey() {
76861e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    @Parameters(resourceBundle = "MessageBundle", commandDescriptionKey = "command")
76961e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    class Args {
77061e65090c5495518a9a521149dbecbd17e1df193Cedric Beust      @Parameter(names="-myoption", descriptionKey="myoption")
77161e65090c5495518a9a521149dbecbd17e1df193Cedric Beust      private boolean option;
77261e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    }
77361e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    JCommander j = new JCommander();
77461e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    Args a = new Args();
77561e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    j.addCommand("comm", a);
77661e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    j.usage();
77761e65090c5495518a9a521149dbecbd17e1df193Cedric Beust  }
77861e65090c5495518a9a521149dbecbd17e1df193Cedric Beust
7799e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust  public void tmp() {
7809e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    class A {
7819e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      @Parameter(names = "-b")
7829e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      public String b;
7839e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    }
7849e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    new JCommander(new A()).parse("");
7859e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust  }
7869e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust
7879e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust  public void unknownOptionWithDifferentPrefix() {
7889e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    @Parameters(optionPrefixes = "/")
7899e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    class SlashSeparator {
7909e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust
7919e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust     @Parameter(names = "/verbose")
7929e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust     public boolean verbose = false;
7939e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust
7949e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust     @Parameter(names = "/file")
7959e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust     public String file;
7969e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    }
7979e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    SlashSeparator ss = new SlashSeparator();
7989e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    try {
7999e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      new JCommander(ss).parse("/notAParam");
8009e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    } catch (ParameterException ex) {
8019e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      boolean result = ex.getMessage().contains("Unknown option");
8029e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      Assert.assertTrue(result);
8039e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    }
8049e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust  }
8059e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust
8069c2bd65ecd9779540bfde5a200ff71d1d503839cCedric Beust  public void equalSeparator() {
8079c2bd65ecd9779540bfde5a200ff71d1d503839cCedric Beust    @Parameters(separators = "=", commandDescription = "My command")
8089c2bd65ecd9779540bfde5a200ff71d1d503839cCedric Beust    class MyClass {
809074b8af3781fbc976f01b43bc3fa0d8ef0431599Cedric Beust
810074b8af3781fbc976f01b43bc3fa0d8ef0431599Cedric Beust       @Parameter(names = { "-p", "--param" }, required = true, description = "param desc...")
8119c2bd65ecd9779540bfde5a200ff71d1d503839cCedric Beust       private String param;
8129c2bd65ecd9779540bfde5a200ff71d1d503839cCedric Beust    }
8139c2bd65ecd9779540bfde5a200ff71d1d503839cCedric Beust    MyClass c = new MyClass();
814074b8af3781fbc976f01b43bc3fa0d8ef0431599Cedric Beust    String expected = "\"hello\"world";
8159c2bd65ecd9779540bfde5a200ff71d1d503839cCedric Beust    new JCommander(c).parse("--param=" + expected);
816074b8af3781fbc976f01b43bc3fa0d8ef0431599Cedric Beust    Assert.assertEquals(expected, c.param);
8179c2bd65ecd9779540bfde5a200ff71d1d503839cCedric Beust  }
8189c2bd65ecd9779540bfde5a200ff71d1d503839cCedric Beust
819369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust  public void simpleArgsSetter() throws ParseException {
820369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    Args1Setter args = new Args1Setter();
821369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    String[] argv = { "-debug", "-log", "2", "-float", "1.2", "-double", "1.3", "-bigdecimal", "1.4",
822369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust            "-date", "2011-10-26", "-groups", "unit", "a", "b", "c" };
823369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    new JCommander(args, argv);
824369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust
825369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    Assert.assertTrue(args.debug);
826369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    Assert.assertEquals(args.verbose.intValue(), 2);
827369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    Assert.assertEquals(args.groups, "unit");
828369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    Assert.assertEquals(args.parameters, Arrays.asList("a", "b", "c"));
829369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    Assert.assertEquals(args.floa, 1.2f, 0.1f);
830369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    Assert.assertEquals(args.doub, 1.3f, 0.1f);
831369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    Assert.assertEquals(args.bigd, new BigDecimal("1.4"));
832369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    Assert.assertEquals(args.date, new SimpleDateFormat("yyyy-MM-dd").parse("2011-10-26"));
833369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust  }
834369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust
835c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust  public void verifyHelp() {
836c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust    class Arg {
837c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust      @Parameter(names = "--help", help = true)
838c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust      public boolean help = false;
839c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust
840c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust      @Parameter(names = "file", required = true)
841c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust      public String file;
842c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust    }
843c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust    Arg arg = new Arg();
844c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust    String[] argv = { "--help" };
845c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust    new JCommander(arg, argv);
846c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust
847c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust    Assert.assertTrue(arg.help);
848c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust  }
849c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust
85094e08e73342f858518b14a70624c38479c0365d3Cedric Beust  public void helpTest() {
85194e08e73342f858518b14a70624c38479c0365d3Cedric Beust    class Arg {
85294e08e73342f858518b14a70624c38479c0365d3Cedric Beust      @Parameter(names = { "?", "-help", "--help" }, description = "Shows help", help = true)
85394e08e73342f858518b14a70624c38479c0365d3Cedric Beust      private boolean help = false;
85494e08e73342f858518b14a70624c38479c0365d3Cedric Beust    }
85594e08e73342f858518b14a70624c38479c0365d3Cedric Beust    Arg arg = new Arg();
85694e08e73342f858518b14a70624c38479c0365d3Cedric Beust    JCommander jc = new JCommander(arg);
85794e08e73342f858518b14a70624c38479c0365d3Cedric Beust    jc.parse(new String[] { "-help" });
8581322b1a0011d7ac5c15f73a062a0e7b4b0879840Cedric Beust//    System.out.println("helpTest:" + arg.help);
85994e08e73342f858518b14a70624c38479c0365d3Cedric Beust  }
86094e08e73342f858518b14a70624c38479c0365d3Cedric Beust
86194e08e73342f858518b14a70624c38479c0365d3Cedric Beust  @Test(enabled = false, description = "Should only be enable once multiple parameters are allowed")
86294e08e73342f858518b14a70624c38479c0365d3Cedric Beust  public void duplicateParameterNames() {
86394e08e73342f858518b14a70624c38479c0365d3Cedric Beust    class ArgBase {
86494e08e73342f858518b14a70624c38479c0365d3Cedric Beust      @Parameter(names = { "-host" })
86594e08e73342f858518b14a70624c38479c0365d3Cedric Beust      protected String host;
86694e08e73342f858518b14a70624c38479c0365d3Cedric Beust    }
86794e08e73342f858518b14a70624c38479c0365d3Cedric Beust
86894e08e73342f858518b14a70624c38479c0365d3Cedric Beust    class Arg1 extends ArgBase {}
86994e08e73342f858518b14a70624c38479c0365d3Cedric Beust    Arg1 arg1 = new Arg1();
87094e08e73342f858518b14a70624c38479c0365d3Cedric Beust
87194e08e73342f858518b14a70624c38479c0365d3Cedric Beust    class Arg2 extends ArgBase {}
87294e08e73342f858518b14a70624c38479c0365d3Cedric Beust    Arg2 arg2 = new Arg2();
87394e08e73342f858518b14a70624c38479c0365d3Cedric Beust
87494e08e73342f858518b14a70624c38479c0365d3Cedric Beust    JCommander jc = new JCommander(new Object[] { arg1, arg2});
87594e08e73342f858518b14a70624c38479c0365d3Cedric Beust    jc.parse(new String[] { "-host", "foo" });
87694e08e73342f858518b14a70624c38479c0365d3Cedric Beust    Assert.assertEquals(arg1.host, "foo");
87794e08e73342f858518b14a70624c38479c0365d3Cedric Beust    Assert.assertEquals(arg2.host, "foo");
87894e08e73342f858518b14a70624c38479c0365d3Cedric Beust  }
87994e08e73342f858518b14a70624c38479c0365d3Cedric Beust
88094e08e73342f858518b14a70624c38479c0365d3Cedric Beust  public void parameterWithOneDoubleQuote() {
88194e08e73342f858518b14a70624c38479c0365d3Cedric Beust    @Parameters(separators = "=")
88294e08e73342f858518b14a70624c38479c0365d3Cedric Beust    class Arg {
88394e08e73342f858518b14a70624c38479c0365d3Cedric Beust      @Parameter(names = { "-p", "--param" })
88494e08e73342f858518b14a70624c38479c0365d3Cedric Beust      private String param;
88594e08e73342f858518b14a70624c38479c0365d3Cedric Beust    }
88694e08e73342f858518b14a70624c38479c0365d3Cedric Beust    JCommander jc = new JCommander(new MyClass());
88794e08e73342f858518b14a70624c38479c0365d3Cedric Beust    jc.parse("-p=\"");
88894e08e73342f858518b14a70624c38479c0365d3Cedric Beust  }
88994e08e73342f858518b14a70624c38479c0365d3Cedric Beust
890e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust  public void emptyStringAsDefault() {
891e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust    class Arg {
892e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust      @Parameter(names = "-x")
893e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust      String s = "";
894e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust    }
895e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust    Arg a = new Arg();
896e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust    StringBuilder sb = new StringBuilder();
897e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust    new JCommander(a).usage(sb);
898e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust    Assert.assertTrue(sb.toString().contains("Default: <empty string>"));
899e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust  }
900e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust
901f19232f69a08b3fc0242b91ea0095b47f5fad44bCedric Beust  public void spaces() {
902f19232f69a08b3fc0242b91ea0095b47f5fad44bCedric Beust    class Arg {
903f19232f69a08b3fc0242b91ea0095b47f5fad44bCedric Beust      @Parameter(names = "-rule", description = "rule")
904f19232f69a08b3fc0242b91ea0095b47f5fad44bCedric Beust      private List<String> rules = new ArrayList<String>();
905f19232f69a08b3fc0242b91ea0095b47f5fad44bCedric Beust    }
906f19232f69a08b3fc0242b91ea0095b47f5fad44bCedric Beust    Arg a = new Arg();
907f19232f69a08b3fc0242b91ea0095b47f5fad44bCedric Beust    new JCommander(a, "-rule", "some test");
908f19232f69a08b3fc0242b91ea0095b47f5fad44bCedric Beust    Assert.assertEquals(a.rules, Arrays.asList("some test"));
909f19232f69a08b3fc0242b91ea0095b47f5fad44bCedric Beust  }
910f19232f69a08b3fc0242b91ea0095b47f5fad44bCedric Beust
9115377e48b0f7b1b77aa9d546313b11767559068deCedric Beust  static class V2 implements IParameterValidator2 {
9125377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    final static List<String> names =  Lists.newArrayList();
9135377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    static boolean validateCalled = false;
9145377e48b0f7b1b77aa9d546313b11767559068deCedric Beust
9155377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    @Override
9165377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    public void validate(String name, String value) throws ParameterException {
9175377e48b0f7b1b77aa9d546313b11767559068deCedric Beust      validateCalled = true;
9185377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    }
9195377e48b0f7b1b77aa9d546313b11767559068deCedric Beust
9205377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    @Override
9215377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    public void validate(String name, String value, ParameterDescription pd)
9225377e48b0f7b1b77aa9d546313b11767559068deCedric Beust        throws ParameterException {
9235377e48b0f7b1b77aa9d546313b11767559068deCedric Beust      names.addAll(Arrays.asList(pd.getParameter().names()));
9245377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    }
9255377e48b0f7b1b77aa9d546313b11767559068deCedric Beust  }
9265377e48b0f7b1b77aa9d546313b11767559068deCedric Beust
9275377e48b0f7b1b77aa9d546313b11767559068deCedric Beust  public void validator2() {
9285377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    class Arg {
9295377e48b0f7b1b77aa9d546313b11767559068deCedric Beust      @Parameter(names = { "-h", "--host" }, validateWith = V2.class)
9305377e48b0f7b1b77aa9d546313b11767559068deCedric Beust      String host;
9315377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    }
9325377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    Arg a = new Arg();
9335377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    V2.names.clear();
9345377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    V2.validateCalled = false;
935c421118d3104c0594dbe207c8443e51022422d32Cedric Beust    JCommander jc = new JCommander(a, "--host", "h");
936406904b81e91c3160646388b26f7c167fa7dd3eaCedric Beust    jc.setAcceptUnknownOptions(true);
9375377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    Assert.assertEquals(V2.names, Arrays.asList(new String[] { "-h", "--host" }));
9385377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    Assert.assertTrue(V2.validateCalled);
9395377e48b0f7b1b77aa9d546313b11767559068deCedric Beust  }
940c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin
941c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin  public void usageCommandsUnderUsage() {
942c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    class Arg {
943c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    }
944c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    @Parameters(commandDescription = "command a")
945c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    class ArgCommandA {
946c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin      @Parameter(description = "command a parameters")
947c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin      List<String> parameters;
948c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    }
949c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    @Parameters(commandDescription = "command b")
950c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    class ArgCommandB {
951c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin      @Parameter(description = "command b parameters")
952c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin      List<String> parameters;
953c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    }
954c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin
955c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    Arg a = new Arg();
956c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin
957c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    JCommander c = new JCommander(a);
958c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    c.addCommand("a", new ArgCommandA());
959c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    c.addCommand("b", new ArgCommandB());
960c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin
961c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    StringBuilder sb = new StringBuilder();
962c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    c.usage(sb);
963c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    Assert.assertTrue(sb.toString().contains("[command options]\n  Commands:"));
964c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin  }
965c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin
966c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin  public void usageWithEmpytLine() {
967c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    class Arg {
968c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    }
969c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    @Parameters(commandDescription = "command a")
970c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    class ArgCommandA {
971c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin      @Parameter(description = "command a parameters")
972c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin      List<String> parameters;
973c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    }
974c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    @Parameters(commandDescription = "command b")
975c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    class ArgCommandB {
976c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin      @Parameter(description = "command b parameters")
977c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin      List<String> parameters;
978c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    }
979c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin
980c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    Arg a = new Arg();
981c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin
982c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    JCommander c = new JCommander(a);
983c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    c.addCommand("a", new ArgCommandA());
984c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    c.addCommand("b", new ArgCommandB());
985c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin
986c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    StringBuilder sb = new StringBuilder();
987c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    c.usage(sb);
988c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    Assert.assertTrue(sb.toString().contains("command a parameters\n\n    b"));
989c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin  }
9905377e48b0f7b1b77aa9d546313b11767559068deCedric Beust
991c421118d3104c0594dbe207c8443e51022422d32Cedric Beust  public void partialValidation() {
992c421118d3104c0594dbe207c8443e51022422d32Cedric Beust    class Arg {
993c421118d3104c0594dbe207c8443e51022422d32Cedric Beust      @Parameter(names = { "-h", "--host" })
994c421118d3104c0594dbe207c8443e51022422d32Cedric Beust      String host;
995c421118d3104c0594dbe207c8443e51022422d32Cedric Beust    }
996c421118d3104c0594dbe207c8443e51022422d32Cedric Beust    Arg a = new Arg();
997c421118d3104c0594dbe207c8443e51022422d32Cedric Beust    JCommander jc = new JCommander();
998406904b81e91c3160646388b26f7c167fa7dd3eaCedric Beust    jc.setAcceptUnknownOptions(true);
999c421118d3104c0594dbe207c8443e51022422d32Cedric Beust    jc.addObject(a);
1000c421118d3104c0594dbe207c8443e51022422d32Cedric Beust    jc.parse("-a", "foo", "-h", "host");
1001c421118d3104c0594dbe207c8443e51022422d32Cedric Beust    Assert.assertEquals(a.host, "host");
100231f61c5de3753a86d58a5bf2399ea5ea7312d35bCedric Beust    Assert.assertEquals(jc.getUnknownOptions(), Lists.newArrayList("-a", "foo"));
1003c421118d3104c0594dbe207c8443e51022422d32Cedric Beust  }
1004c421118d3104c0594dbe207c8443e51022422d32Cedric Beust
100507e332d70768d2f49d835ccf65628d73d2d6703fCedric Beust  /**
100607e332d70768d2f49d835ccf65628d73d2d6703fCedric Beust   * GITHUB-137.
100707e332d70768d2f49d835ccf65628d73d2d6703fCedric Beust   */
100807e332d70768d2f49d835ccf65628d73d2d6703fCedric Beust  public void listArgShouldBeCleared() {
100907e332d70768d2f49d835ccf65628d73d2d6703fCedric Beust    class Args {
101007e332d70768d2f49d835ccf65628d73d2d6703fCedric Beust      @Parameter(description = "[endpoint]")
101107e332d70768d2f49d835ccf65628d73d2d6703fCedric Beust      public List<String> endpoint = Lists.newArrayList("prod");
101207e332d70768d2f49d835ccf65628d73d2d6703fCedric Beust    }
101307e332d70768d2f49d835ccf65628d73d2d6703fCedric Beust    Args a = new Args();
101407e332d70768d2f49d835ccf65628d73d2d6703fCedric Beust    new JCommander(a, new String[] { "dev" });
101507e332d70768d2f49d835ccf65628d73d2d6703fCedric Beust    Assert.assertEquals(a.endpoint, Lists.newArrayList("dev"));
101607e332d70768d2f49d835ccf65628d73d2d6703fCedric Beust  }
101707e332d70768d2f49d835ccf65628d73d2d6703fCedric Beust
10187c5bf86fc5d5e85d471e3722a39b7a21101b0484Cedric Beust  public void dashDashParameter() {
1019cf62891268452675c56a4b18d5866123398e1cb3Cedric Beust    class Arguments {
10207c5bf86fc5d5e85d471e3722a39b7a21101b0484Cedric Beust        @Parameter(names = { "-name" })
10217c5bf86fc5d5e85d471e3722a39b7a21101b0484Cedric Beust        public String name;
10227c5bf86fc5d5e85d471e3722a39b7a21101b0484Cedric Beust        @Parameter
10237c5bf86fc5d5e85d471e3722a39b7a21101b0484Cedric Beust        public List<String> mainParameters;
1024cf62891268452675c56a4b18d5866123398e1cb3Cedric Beust    }
10257c5bf86fc5d5e85d471e3722a39b7a21101b0484Cedric Beust
1026cf62891268452675c56a4b18d5866123398e1cb3Cedric Beust    Arguments a = new Arguments();
1027cf62891268452675c56a4b18d5866123398e1cb3Cedric Beust    new JCommander(a, new String[] {
10287c5bf86fc5d5e85d471e3722a39b7a21101b0484Cedric Beust        "-name", "theName", "--", "param1", "param2"}
1029cf62891268452675c56a4b18d5866123398e1cb3Cedric Beust    );
10307c5bf86fc5d5e85d471e3722a39b7a21101b0484Cedric Beust    Assert.assertEquals(a.name, "theName");
10317c5bf86fc5d5e85d471e3722a39b7a21101b0484Cedric Beust    Assert.assertEquals(a.mainParameters.size(), 2);
10327c5bf86fc5d5e85d471e3722a39b7a21101b0484Cedric Beust    Assert.assertEquals(a.mainParameters.get(0), "param1");
10337c5bf86fc5d5e85d471e3722a39b7a21101b0484Cedric Beust    Assert.assertEquals(a.mainParameters.get(1), "param2");
1034cf62891268452675c56a4b18d5866123398e1cb3Cedric Beust  }
1035cf62891268452675c56a4b18d5866123398e1cb3Cedric Beust
1036df883e8495e143f92d363225e48b45a81cf449fdMike Drob  public void dashDashParameter2() {
1037df883e8495e143f92d363225e48b45a81cf449fdMike Drob    class Arguments {
1038df883e8495e143f92d363225e48b45a81cf449fdMike Drob        @Parameter(names = { "-name" })
1039df883e8495e143f92d363225e48b45a81cf449fdMike Drob        public String name;
1040df883e8495e143f92d363225e48b45a81cf449fdMike Drob        @Parameter
1041df883e8495e143f92d363225e48b45a81cf449fdMike Drob        public List<String> mainParameters;
1042df883e8495e143f92d363225e48b45a81cf449fdMike Drob    }
1043df883e8495e143f92d363225e48b45a81cf449fdMike Drob
1044df883e8495e143f92d363225e48b45a81cf449fdMike Drob    Arguments a = new Arguments();
1045df883e8495e143f92d363225e48b45a81cf449fdMike Drob    new JCommander(a, new String[] {
1046a944e2290d2ced9e3615892695754424197d93b7Mike Drob        "param1", "param2", "--", "param3", "-name", "theName"}
1047df883e8495e143f92d363225e48b45a81cf449fdMike Drob    );
1048df883e8495e143f92d363225e48b45a81cf449fdMike Drob    Assert.assertNull(a.name);
1049a944e2290d2ced9e3615892695754424197d93b7Mike Drob    Assert.assertEquals(a.mainParameters.size(), 5);
1050df883e8495e143f92d363225e48b45a81cf449fdMike Drob    Assert.assertEquals(a.mainParameters.get(0), "param1");
1051df883e8495e143f92d363225e48b45a81cf449fdMike Drob    Assert.assertEquals(a.mainParameters.get(1), "param2");
1052a944e2290d2ced9e3615892695754424197d93b7Mike Drob    Assert.assertEquals(a.mainParameters.get(2), "param3");
1053a944e2290d2ced9e3615892695754424197d93b7Mike Drob    Assert.assertEquals(a.mainParameters.get(3), "-name");
1054a944e2290d2ced9e3615892695754424197d93b7Mike Drob    Assert.assertEquals(a.mainParameters.get(4), "theName");
1055df883e8495e143f92d363225e48b45a81cf449fdMike Drob  }
1056df883e8495e143f92d363225e48b45a81cf449fdMike Drob
10578ad02daa23243bf515009d16205465f1b811da81Cedric Beust  @Test(enabled = false)
10588ad02daa23243bf515009d16205465f1b811da81Cedric Beust  public static void main(String[] args) throws Exception {
1059f5bc65089dc0a58c3855868c985f291b6e9e1afeCedric Beust    new JCommanderTest().enumArgsFail();
10608ad02daa23243bf515009d16205465f1b811da81Cedric Beust//    class A {
10619e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust//      @Parameter(names = "-short", required = true)
10628ad02daa23243bf515009d16205465f1b811da81Cedric Beust//      List<String> parameters;
10638ad02daa23243bf515009d16205465f1b811da81Cedric Beust//
10649e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust//      @Parameter(names = "-long", required = true)
10658ad02daa23243bf515009d16205465f1b811da81Cedric Beust//      public long l;
10668ad02daa23243bf515009d16205465f1b811da81Cedric Beust//    }
10678ad02daa23243bf515009d16205465f1b811da81Cedric Beust//    A a = new A();
10689e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust//    new JCommander(a).parse();
10694ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    System.out.println(a.l);
10704ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    System.out.println(a.parameters);
10714ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    ArgsList al = new ArgsList();
10724ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    JCommander j = new JCommander(al);
10734ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    j.setColumnSize(40);
10744ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    j.usage();
10754ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    new JCommanderTest().testListAndSplitters();
10764ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    new JCommanderTest().converterArgs();
1077804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  }
1078c3e28e12136391968250719b1627b6b4eaa196cdCedric Beust
1079c3e28e12136391968250719b1627b6b4eaa196cdCedric Beust  // Tests:
1080c3e28e12136391968250719b1627b6b4eaa196cdCedric Beust  // required unparsed parameter
1081e9229f961b3a5799f6798369afe26dec7960249Cedric Beust}
1082