JCommanderTest.java revision 61e65090c5495518a9a521149dbecbd17e1df193
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
21103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.Args1;
22103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.Args2;
23103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsArityString;
24103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsBooleanArity;
25b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beustimport com.beust.jcommander.args.ArgsBooleanArity0;
26103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsConverter;
270638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraruimport com.beust.jcommander.args.ArgsEnum;
282ee07bc8765f4873b69423e6185120d176c49a2bCedric Beustimport com.beust.jcommander.args.ArgsEquals;
29b5598e97aa7d22a933223f6211d50329b1a20308Cedric Beustimport com.beust.jcommander.args.ArgsHelp;
30103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsI18N1;
31103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsI18N2;
32103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsI18N2New;
33b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthierimport com.beust.jcommander.args.ArgsInherited;
343e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beustimport com.beust.jcommander.args.ArgsList;
35f2cd60c1f0e475201b9d24b486df920ff1d02ac5Russell Eganimport com.beust.jcommander.args.ArgsMainParameter1;
36103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsMaster;
37103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsMultipleUnparsed;
38c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beustimport com.beust.jcommander.args.ArgsOutOfMemory;
39103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsPrivate;
4072cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beustimport com.beust.jcommander.args.ArgsRequired;
41103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsSlave;
42103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsSlaveBogus;
43cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beustimport com.beust.jcommander.args.ArgsValidate1;
44876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beustimport com.beust.jcommander.args.ArgsWithSet;
45e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beustimport com.beust.jcommander.args.Arity1;
46103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.SeparatorColon;
47103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.SeparatorEqual;
48103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.SeparatorMixed;
49d556f4a527306a9769776d1cbb2fccac98618bc9Cedric Beustimport com.beust.jcommander.args.SlashSeparator;
50c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beustimport com.beust.jcommander.args.VariableArity;
51dda1651c0b74aa9e8d225096f1d531871460e692Cedric Beustimport com.beust.jcommander.command.CommandAdd;
52dda1651c0b74aa9e8d225096f1d531871460e692Cedric Beustimport com.beust.jcommander.command.CommandCommit;
53dda1651c0b74aa9e8d225096f1d531871460e692Cedric Beustimport com.beust.jcommander.command.CommandMain;
54eca9dc8ab293c10f16a104e107b402b61c4c76deCedric Beust
55b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beustimport org.testng.Assert;
56b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beustimport org.testng.annotations.DataProvider;
57b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beustimport org.testng.annotations.Test;
585414de6562cc1a597c0d522fc4889e0f4136306cCedric Beustimport org.testng.collections.Lists;
598ebf58f752ae0703b70af57cecfe584968442558Cedric Beustimport org.testng.collections.Maps;
60b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust
6139e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beustimport java.io.ByteArrayInputStream;
628877f663e79381340b329180922d7ac448e26317Cedric Beustimport java.io.File;
638877f663e79381340b329180922d7ac448e26317Cedric Beustimport java.io.FileWriter;
648877f663e79381340b329180922d7ac448e26317Cedric Beustimport java.io.IOException;
6539e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beustimport java.io.InputStream;
66041bdac9067d4ce9c936ff1c0ae3856f2e240f15Angusimport java.math.BigDecimal;
67f923ee57617c8690d293909c53a4e109a8c2ba26Angusimport java.text.ParseException;
68f923ee57617c8690d293909c53a4e109a8c2ba26Angusimport java.text.SimpleDateFormat;
69804498ec24662928bf06efcee6584d55fca3d898Cedric Beustimport java.util.ArrayList;
70e9229f961b3a5799f6798369afe26dec7960249Cedric Beustimport java.util.Arrays;
71a3199885e5e515af41a01c4d693bf96f1dafbd67Adrian Muraruimport java.util.EnumSet;
724c020da73b8b25773bba8553263cf1954c718573Cedric Beustimport java.util.Iterator;
73804498ec24662928bf06efcee6584d55fca3d898Cedric Beustimport java.util.List;
749b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beustimport java.util.Locale;
754c020da73b8b25773bba8553263cf1954c718573Cedric Beustimport java.util.Map;
769b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beustimport java.util.ResourceBundle;
77876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beustimport java.util.TreeSet;
78e9229f961b3a5799f6798369afe26dec7960249Cedric Beust
79460998fec3b06bf45b024c645b5b5e854de68c24Cedric Beust@Test
80e9229f961b3a5799f6798369afe26dec7960249Cedric Beustpublic class JCommanderTest {
81f923ee57617c8690d293909c53a4e109a8c2ba26Angus  public void simpleArgs() throws ParseException {
8294fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Args1 args = new Args1();
83041bdac9067d4ce9c936ff1c0ae3856f2e240f15Angus    String[] argv = { "-debug", "-log", "2", "-float", "1.2", "-double", "1.3", "-bigdecimal", "1.4",
84f923ee57617c8690d293909c53a4e109a8c2ba26Angus            "-date", "2011-10-26", "-groups", "unit", "a", "b", "c" };
8594fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    new JCommander(args, argv);
86e9229f961b3a5799f6798369afe26dec7960249Cedric Beust
87cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust    Assert.assertTrue(args.debug);
8894fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Assert.assertEquals(args.verbose.intValue(), 2);
8994fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Assert.assertEquals(args.groups, "unit");
9094fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Assert.assertEquals(args.parameters, Arrays.asList("a", "b", "c"));
9136e3614a3ebf663c723e94f30b873194d33a29d1Cedric Beust    Assert.assertEquals(args.floa, 1.2f, 0.1f);
9236e3614a3ebf663c723e94f30b873194d33a29d1Cedric Beust    Assert.assertEquals(args.doub, 1.3f, 0.1f);
93041bdac9067d4ce9c936ff1c0ae3856f2e240f15Angus    Assert.assertEquals(args.bigd, new BigDecimal("1.4"));
94f923ee57617c8690d293909c53a4e109a8c2ba26Angus    Assert.assertEquals(args.date, new SimpleDateFormat("yyyy-MM-dd").parse("2011-10-26"));
95e9229f961b3a5799f6798369afe26dec7960249Cedric Beust  }
96696418a94157048544c44f405d757ede86eec926Cedric Beust
97696418a94157048544c44f405d757ede86eec926Cedric Beust  /**
98696418a94157048544c44f405d757ede86eec926Cedric Beust   * Make sure that if there are args with multiple names (e.g. "-log" and "-verbose"),
99696418a94157048544c44f405d757ede86eec926Cedric Beust   * the usage will only display it once.
100696418a94157048544c44f405d757ede86eec926Cedric Beust   */
101696418a94157048544c44f405d757ede86eec926Cedric Beust  public void repeatedArgs() {
10294fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Args1 args = new Args1();
103696418a94157048544c44f405d757ede86eec926Cedric Beust    String[] argv = { "-log", "2" };
10494fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    JCommander jc = new JCommander(args, argv);
105f923ee57617c8690d293909c53a4e109a8c2ba26Angus    Assert.assertEquals(jc.getParameters().size(), 8);
106696418a94157048544c44f405d757ede86eec926Cedric Beust  }
107696418a94157048544c44f405d757ede86eec926Cedric Beust
108dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  /**
109dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust   * Not specifying a required option should throw an exception.
110dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust   */
111dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  @Test(expectedExceptions = ParameterException.class)
1126734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust  public void requiredFields1Fail() {
11394fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Args1 args = new Args1();
114dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust    String[] argv = { "-debug" };
11594fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    new JCommander(args, argv);
116dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  }
117dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust
118dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  /**
119e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust   * Getting the description of a nonexistent command should throw an exception.
120e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust   */
121e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust  @Test(expectedExceptions = ParameterException.class)
122e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust  public void nonexistentCommandShouldThrow() {
123e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust    String[] argv = { };
124e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust    JCommander jc = new JCommander(new Object(), argv);
125e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust    jc.getCommandDescription("foo");
126e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust  }
127e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust
128e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust  /**
129dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust   * Required options with multiple names should work with all names.
130dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust   */
131c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust  private void multipleNames(String option) {
13294fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Args1 args = new Args1();
133c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust    String[] argv = { option, "2" };
13494fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    new JCommander(args, argv);
135c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust    Assert.assertEquals(args.verbose.intValue(), 2);
136c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust  }
1370638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru
138c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust  public void multipleNames1() {
139c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust    multipleNames("-log");
140dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  }
141dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust
142c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust  public void multipleNames2() {
143c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust    multipleNames("-verbose");
144dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  }
145dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust
1466734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust  private void i18n1(String bundleName, Locale locale, String expectedString) {
1476734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    ResourceBundle bundle = locale != null ? ResourceBundle.getBundle(bundleName, locale)
1489b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust        : null;
1499b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
1506734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    ArgsI18N1 i18n = new ArgsI18N1();
1519b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust    String[] argv = { "-host", "localhost" };
1529b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust    JCommander jc = new JCommander(i18n, bundle, argv);
15314516e91e6be4ba1c3e7b573ea450e5c59925ecfCedric Beust//    jc.usage();
1549b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
1559b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust    ParameterDescription pd = jc.getParameters().get(0);
1569b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust    Assert.assertEquals(pd.getDescription(), expectedString);
1579b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  }
1589b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
1599b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  public void i18nNoLocale() {
1606734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    i18n1("MessageBundle", null, "Host");
1619b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  }
1629b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
1639b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  public void i18nUsLocale() {
1646734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    i18n1("MessageBundle", new Locale("en", "US"), "Host");
1659b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  }
1669b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
1679b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  public void i18nFrLocale() {
168c27a04a2e10667dff4390b25fa4224b58b291ca0David Gageot    i18n1("MessageBundle", new Locale("fr", "FR"), "Hôte");
1696734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust  }
1706734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust
171b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust  private void i18n2(Object i18n) {
1726734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    String[] argv = { "-host", "localhost" };
1736734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    Locale.setDefault(new Locale("fr", "FR"));
1746734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    JCommander jc = new JCommander(i18n, argv);
1756734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    ParameterDescription pd = jc.getParameters().get(0);
176c27a04a2e10667dff4390b25fa4224b58b291ca0David Gageot    Assert.assertEquals(pd.getDescription(), "Hôte");
1779b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  }
1789b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
179b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust  public void i18nWithResourceAnnotation() {
180b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust    i18n2(new ArgsI18N2());
181b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust  }
182b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust
183b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust  public void i18nWithResourceAnnotationNew() {
184b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust    i18n2(new ArgsI18N2New());
185b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust  }
186b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust
18721059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust  public void noParseConstructor() {
18821059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust    JCommander jCommander = new JCommander(new ArgsMainParameter1());
189b5598e97aa7d22a933223f6211d50329b1a20308Cedric Beust    jCommander.usage(new StringBuilder());
19021059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust    // Before fix, this parse would throw an exception, because it calls createDescription, which
19121059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust    // was already called by usage(), and can only be called once.
19221059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust    jCommander.parse();
19321059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust  }
19421059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust
195dae46a1c4166085b56a78669050dc19938735a41Russell Egan  /**
196dae46a1c4166085b56a78669050dc19938735a41Russell Egan   * Test a use case where there are required parameters, but you still want
197dae46a1c4166085b56a78669050dc19938735a41Russell Egan   * to interrogate the options which are specified.
198dae46a1c4166085b56a78669050dc19938735a41Russell Egan   */
199dae46a1c4166085b56a78669050dc19938735a41Russell Egan  public void usageWithRequiredArgsAndResourceBundle() {
200dae46a1c4166085b56a78669050dc19938735a41Russell Egan    ArgsHelp argsHelp = new ArgsHelp();
20121059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust    JCommander jc = new JCommander(new Object[]{argsHelp, new ArgsRequired()},
20221059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust        java.util.ResourceBundle.getBundle("MessageBundle"));
203dae46a1c4166085b56a78669050dc19938735a41Russell Egan    // Should be able to display usage without triggering validation
204b5598e97aa7d22a933223f6211d50329b1a20308Cedric Beust    jc.usage(new StringBuilder());
205dae46a1c4166085b56a78669050dc19938735a41Russell Egan    try {
206dae46a1c4166085b56a78669050dc19938735a41Russell Egan      jc.parse("-h");
207dae46a1c4166085b56a78669050dc19938735a41Russell Egan      Assert.fail("Should have thrown a required parameter exception");
208dae46a1c4166085b56a78669050dc19938735a41Russell Egan    } catch (ParameterException e) {
209dae46a1c4166085b56a78669050dc19938735a41Russell Egan      Assert.assertTrue(e.getMessage().contains("are required"));
210dae46a1c4166085b56a78669050dc19938735a41Russell Egan    }
211dae46a1c4166085b56a78669050dc19938735a41Russell Egan    Assert.assertTrue(argsHelp.help);
212dae46a1c4166085b56a78669050dc19938735a41Russell Egan  }
213dae46a1c4166085b56a78669050dc19938735a41Russell Egan
214d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust  public void multiObjects() {
215d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust    ArgsMaster m = new ArgsMaster();
216d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust    ArgsSlave s = new ArgsSlave();
217d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust    String[] argv = { "-master", "master", "-slave", "slave" };
218b945b741b5de0510ce39f8c793e31202070ef942Cedric Beust    new JCommander(new Object[] { m , s }, argv);
219d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust
220d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust    Assert.assertEquals(m.master, "master");
221d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust    Assert.assertEquals(s.slave, "slave");
222d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust  }
223d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust
2240c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust  @Test(expectedExceptions = ParameterException.class)
2256734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust  public void multiObjectsWithDuplicatesFail() {
2260c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust    ArgsMaster m = new ArgsMaster();
2270c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust    ArgsSlave s = new ArgsSlaveBogus();
2280c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust    String[] argv = { "-master", "master", "-slave", "slave" };
2290c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust    new JCommander(new Object[] { m , s }, argv);
2300c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust  }
2310c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust
232f3b82e196a622a959374d7588688e74fe852a512Cedric Beust  public void arityString() {
233f3b82e196a622a959374d7588688e74fe852a512Cedric Beust    ArgsArityString args = new ArgsArityString();
234a21262377768de124914e354e428ed6860828949Cedric Beust    String[] argv = { "-pairs", "pair0", "pair1", "rest" };
235a21262377768de124914e354e428ed6860828949Cedric Beust    new JCommander(args, argv);
236a21262377768de124914e354e428ed6860828949Cedric Beust
237a21262377768de124914e354e428ed6860828949Cedric Beust    Assert.assertEquals(args.pairs.size(), 2);
238a21262377768de124914e354e428ed6860828949Cedric Beust    Assert.assertEquals(args.pairs.get(0), "pair0");
239a21262377768de124914e354e428ed6860828949Cedric Beust    Assert.assertEquals(args.pairs.get(1), "pair1");
240a21262377768de124914e354e428ed6860828949Cedric Beust    Assert.assertEquals(args.rest.size(), 1);
241a21262377768de124914e354e428ed6860828949Cedric Beust    Assert.assertEquals(args.rest.get(0), "rest");
242a21262377768de124914e354e428ed6860828949Cedric Beust  }
243a21262377768de124914e354e428ed6860828949Cedric Beust
244f3b82e196a622a959374d7588688e74fe852a512Cedric Beust  @Test(expectedExceptions = ParameterException.class)
245e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  public void arity2Fail() {
246f3b82e196a622a959374d7588688e74fe852a512Cedric Beust    ArgsArityString args = new ArgsArityString();
247f3b82e196a622a959374d7588688e74fe852a512Cedric Beust    String[] argv = { "-pairs", "pair0" };
248f3b82e196a622a959374d7588688e74fe852a512Cedric Beust    new JCommander(args, argv);
249f3b82e196a622a959374d7588688e74fe852a512Cedric Beust  }
250f3b82e196a622a959374d7588688e74fe852a512Cedric Beust
251cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust  @Test(expectedExceptions = ParameterException.class)
252cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust  public void multipleUnparsedFail() {
253cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust    ArgsMultipleUnparsed args = new ArgsMultipleUnparsed();
254cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust    String[] argv = { };
255cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust    new JCommander(args, argv);
256cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust  }
257cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust
2585f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust  public void privateArgs() {
2595f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust    ArgsPrivate args = new ArgsPrivate();
2605f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust    new JCommander(args, "-verbose", "3");
2615f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust    Assert.assertEquals(args.getVerbose().intValue(), 3);
2625f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust  }
2635f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust
2645a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust  public void converterArgs() {
2655a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust    ArgsConverter args = new ArgsConverter();
2665a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust    String fileName = "a";
2677021eade4657caf7ae25b19539bdc135619d248cAngus    new JCommander(args, "-file", "/tmp/" + fileName,
2687021eade4657caf7ae25b19539bdc135619d248cAngus      "-listStrings", "Tuesday,Thursday",
2697021eade4657caf7ae25b19539bdc135619d248cAngus      "-listInts", "-1,8",
2707021eade4657caf7ae25b19539bdc135619d248cAngus      "-listBigDecimals", "-11.52,100.12");
2715a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust    Assert.assertEquals(args.file.getName(), fileName);
2727021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listStrings.size(), 2);
2737021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listStrings.get(0), "Tuesday");
2747021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listStrings.get(1), "Thursday");
2757021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listInts.size(), 2);
2767021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listInts.get(0).intValue(), -1);
2777021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listInts.get(1).intValue(), 8);
2787021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listBigDecimals.size(), 2);
2797021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listBigDecimals.get(0), new BigDecimal("-11.52"));
2807021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listBigDecimals.get(1), new BigDecimal("100.12"));
2815a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust  }
2825a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust
283b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  private void argsBoolean1(String[] params, Boolean expected) {
284d3b9e34aed415eba172befec79d2261c3ac38123Cedric Beust    ArgsBooleanArity args = new ArgsBooleanArity();
285b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    new JCommander(args, params);
286b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    Assert.assertEquals(args.debug, expected);
287b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  }
288b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust
289b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  private void argsBoolean0(String[] params, Boolean expected) {
290b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    ArgsBooleanArity0 args = new ArgsBooleanArity0();
291b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    new JCommander(args, params);
292b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    Assert.assertEquals(args.debug, expected);
293b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  }
294b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust
295b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  public void booleanArity1() {
296b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    argsBoolean1(new String[] {}, Boolean.FALSE);
297b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    argsBoolean1(new String[] { "-debug", "true" }, Boolean.TRUE);
298b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  }
299b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust
300b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  public void booleanArity0() {
301b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    argsBoolean0(new String[] {}, Boolean.FALSE);
302b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    argsBoolean0(new String[] { "-debug"}, Boolean.TRUE);
303d3b9e34aed415eba172befec79d2261c3ac38123Cedric Beust  }
304d3b9e34aed415eba172befec79d2261c3ac38123Cedric Beust
3054312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  @Test(expectedExceptions = ParameterException.class)
3064312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  public void badParameterShouldThrowParameter1Exception() {
3074312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    Args1 args = new Args1();
3084312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    String[] argv = { "-log", "foo" };
3094312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    new JCommander(args, argv);
3104312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  }
3114312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust
3124312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  @Test(expectedExceptions = ParameterException.class)
3134312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  public void badParameterShouldThrowParameter2Exception() {
3144312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    Args1 args = new Args1();
3154312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    String[] argv = { "-long", "foo" };
3164312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    new JCommander(args, argv);
3174312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  }
3184312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust
319b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust  public void listParameters() {
320b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    Args2 a = new Args2();
321b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    String[] argv = {"-log", "2", "-groups", "unit", "a", "b", "c", "-host", "host2"};
322b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    new JCommander(a, argv);
323b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    Assert.assertEquals(a.verbose.intValue(), 2);
324b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    Assert.assertEquals(a.groups, "unit");
325b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    Assert.assertEquals(a.hosts, Arrays.asList("host2"));
326b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    Assert.assertEquals(a.parameters, Arrays.asList("a", "b", "c"));
327b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust  }
32885866a95d6479be731596a838b6f5e793a341f5bCedric Beust
329fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  public void separatorEqual() {
330fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    SeparatorEqual s = new SeparatorEqual();
331bc108076cf3dc506d4e87e004d8c2e413b995adaCedric Beust    String[] argv = { "-log=3", "--longoption=10" };
33285866a95d6479be731596a838b6f5e793a341f5bCedric Beust    new JCommander(s, argv);
33385866a95d6479be731596a838b6f5e793a341f5bCedric Beust    Assert.assertEquals(s.log.intValue(), 3);
334bc108076cf3dc506d4e87e004d8c2e413b995adaCedric Beust    Assert.assertEquals(s.longOption.intValue(), 10);
33585866a95d6479be731596a838b6f5e793a341f5bCedric Beust  }
33685866a95d6479be731596a838b6f5e793a341f5bCedric Beust
337fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  public void separatorColon() {
338fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    SeparatorColon s = new SeparatorColon();
339fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    String[] argv = { "-verbose:true" };
340fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    new JCommander(s, argv);
341fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    Assert.assertTrue(s.verbose);
342fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  }
343fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust
344fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  public void separatorBoth() {
345fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    SeparatorColon s = new SeparatorColon();
346fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    SeparatorEqual s2 = new SeparatorEqual();
347fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    String[] argv = { "-verbose:true", "-log=3" };
348fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    new JCommander(new Object[] { s, s2 }, argv);
349fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    Assert.assertTrue(s.verbose);
350fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    Assert.assertEquals(s2.log.intValue(), 3);
351fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  }
352fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust
353fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  public void separatorMixed1() {
354fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    SeparatorMixed s = new SeparatorMixed();
355fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    String[] argv = { "-long:1", "-level=42" };
356fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    new JCommander(s, argv);
357fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    Assert.assertEquals(s.l.longValue(), 1l);
358fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    Assert.assertEquals(s.level.intValue(), 42);
359fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  }
360fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust
361426bf32155b30f5c1819a00d88c16944c01e5a52Cedric Beust  public void slashParameters() {
362d556f4a527306a9769776d1cbb2fccac98618bc9Cedric Beust    SlashSeparator a = new SlashSeparator();
363858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust    String[] argv = { "/verbose", "/file", "/tmp/a" };
3645f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust    new JCommander(a, argv);
365d556f4a527306a9769776d1cbb2fccac98618bc9Cedric Beust    Assert.assertTrue(a.verbose);
366d556f4a527306a9769776d1cbb2fccac98618bc9Cedric Beust    Assert.assertEquals(a.file, "/tmp/a");
3675f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust  }
3685f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust
369b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier  public void inheritance() {
370b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier    ArgsInherited args = new ArgsInherited();
371b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier    String[] argv = { "-log", "3", "-child", "2" };
372b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier    new JCommander(args, argv);
373b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier    Assert.assertEquals(args.child.intValue(), 2);
374b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier    Assert.assertEquals(args.log.intValue(), 3);
375b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier  }
376b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier
377858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust  public void negativeNumber() {
378858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust    Args1 a = new Args1();
379858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust    String[] argv = { "-verbose", "-3" };
380858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust    new JCommander(a, argv);
381858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust    Assert.assertEquals(a.verbose.intValue(), -3);
382858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust  }
383858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust
38472cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beust  @Test(expectedExceptions = ParameterException.class)
3855f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust  public void requiredMainParameters() {
38672cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beust    ArgsRequired a = new ArgsRequired();
38772cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beust    String[] argv = {};
38872cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beust    new JCommander(a, argv);
3895f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust  }
3905f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust
391a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust  public void usageShouldNotChange() {
392a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    JCommander jc = new JCommander(new Args1(), new String[]{"-log", "1"});
393a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    StringBuilder sb = new StringBuilder();
394a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    jc.usage(sb);
395a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    String expected = sb.toString();
396a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    jc = new JCommander(new Args1(), new String[]{"-debug", "-log", "2", "-long", "5"});
397a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    sb = new StringBuilder();
398a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    jc.usage(sb);
399a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    String actual = sb.toString();
400a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    Assert.assertEquals(actual, expected);
401a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust  }
402a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust
4034c020da73b8b25773bba8553263cf1954c718573Cedric Beust  private void verifyCommandOrdering(String[] commandNames, Object[] commands) {
4044c020da73b8b25773bba8553263cf1954c718573Cedric Beust    CommandMain cm = new CommandMain();
4054c020da73b8b25773bba8553263cf1954c718573Cedric Beust    JCommander jc = new JCommander(cm);
4064c020da73b8b25773bba8553263cf1954c718573Cedric Beust
4074c020da73b8b25773bba8553263cf1954c718573Cedric Beust    for (int i = 0; i < commands.length; i++) {
4084c020da73b8b25773bba8553263cf1954c718573Cedric Beust      jc.addCommand(commandNames[i], commands[i]);
4094c020da73b8b25773bba8553263cf1954c718573Cedric Beust    }
4104c020da73b8b25773bba8553263cf1954c718573Cedric Beust
4114c020da73b8b25773bba8553263cf1954c718573Cedric Beust    Map<String, JCommander> c = jc.getCommands();
4124c020da73b8b25773bba8553263cf1954c718573Cedric Beust    Assert.assertEquals(c.size(), commands.length);
4134c020da73b8b25773bba8553263cf1954c718573Cedric Beust
4144c020da73b8b25773bba8553263cf1954c718573Cedric Beust    Iterator<String> it = c.keySet().iterator();
4154c020da73b8b25773bba8553263cf1954c718573Cedric Beust    for (int i = 0; i < commands.length; i++) {
4164c020da73b8b25773bba8553263cf1954c718573Cedric Beust      Assert.assertEquals(it.next(), commandNames[i]);
4174c020da73b8b25773bba8553263cf1954c718573Cedric Beust    }
4184c020da73b8b25773bba8553263cf1954c718573Cedric Beust  }
4194c020da73b8b25773bba8553263cf1954c718573Cedric Beust
4204c020da73b8b25773bba8553263cf1954c718573Cedric Beust  public void commandsShouldBeShownInOrderOfInsertion() {
4214c020da73b8b25773bba8553263cf1954c718573Cedric Beust    verifyCommandOrdering(new String[] { "add", "commit" },
4224c020da73b8b25773bba8553263cf1954c718573Cedric Beust        new Object[] { new CommandAdd(), new CommandCommit() });
4234c020da73b8b25773bba8553263cf1954c718573Cedric Beust    verifyCommandOrdering(new String[] { "commit", "add" },
4244c020da73b8b25773bba8553263cf1954c718573Cedric Beust        new Object[] { new CommandCommit(), new CommandAdd() });
4254c020da73b8b25773bba8553263cf1954c718573Cedric Beust  }
4264c020da73b8b25773bba8553263cf1954c718573Cedric Beust
427e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust  @DataProvider
428e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust  public static Object[][] f() {
429e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust    return new Integer[][] {
430e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust      new Integer[] { 3, 5, 1 },
431e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust      new Integer[] { 3, 8, 1 },
432e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust      new Integer[] { 3, 12, 2 },
433e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust      new Integer[] { 8, 12, 2 },
434e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust      new Integer[] { 9, 10, 1 },
435e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust    };
436e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust  }
437e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust
438460998fec3b06bf45b024c645b5b5e854de68c24Cedric Beust  @Test(expectedExceptions = ParameterException.class)
439e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  public void arity1Fail() {
440e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final Arity1 arguments = new Arity1();
441e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final JCommander jCommander = new JCommander(arguments);
442e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final String[] commands = {
443e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust        "-inspect"
444e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    };
445e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    jCommander.parse(commands);
446e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  }
447e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust
448e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  public void arity1Success1() {
449e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final Arity1 arguments = new Arity1();
450e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final JCommander jCommander = new JCommander(arguments);
451e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final String[] commands = {
452e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust        "-inspect", "true"
453e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    };
454e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    jCommander.parse(commands);
455e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    Assert.assertTrue(arguments.inspect);
456e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  }
457e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust
458e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  public void arity1Success2() {
459e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final Arity1 arguments = new Arity1();
460e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final JCommander jCommander = new JCommander(arguments);
461e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final String[] commands = {
462e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust        "-inspect", "false"
463e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    };
464e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    jCommander.parse(commands);
465e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    Assert.assertFalse(arguments.inspect);
466e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  }
467e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust
468804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  @Parameters(commandDescription = "Help for the given commands.")
469804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  public static class Help {
470804498ec24662928bf06efcee6584d55fca3d898Cedric Beust      public static final String NAME = "help";
471804498ec24662928bf06efcee6584d55fca3d898Cedric Beust
472804498ec24662928bf06efcee6584d55fca3d898Cedric Beust      @Parameter(description = "List of commands.")
473804498ec24662928bf06efcee6584d55fca3d898Cedric Beust      public List<String> commands=new ArrayList<String>();
474804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  }
475804498ec24662928bf06efcee6584d55fca3d898Cedric Beust
476804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  @Test(expectedExceptions = ParameterException.class,
477804498ec24662928bf06efcee6584d55fca3d898Cedric Beust      description = "Verify that the main parameter's type is checked to be a List")
478804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  public void wrongMainTypeShouldThrow() {
479804498ec24662928bf06efcee6584d55fca3d898Cedric Beust    JCommander jc = new JCommander(new ArgsRequiredWrongMain());
480804498ec24662928bf06efcee6584d55fca3d898Cedric Beust    jc.parse(new String[] { "f1", "f2" });
481804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  }
482804498ec24662928bf06efcee6584d55fca3d898Cedric Beust
483c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust  @Test(description = "This used to run out of memory")
484c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust  public void oom() {
485c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust    JCommander jc = new JCommander(new ArgsOutOfMemory());
486c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust    jc.usage(new StringBuilder());
487c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust  }
488c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust
489cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust  @Test
490cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust  public void getParametersShouldNotNpe() {
491cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust    JCommander jc = new JCommander(new Args1());
492cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust    List<ParameterDescription> parameters = jc.getParameters();
493cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust  }
494cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust
495cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust  public void validationShouldWork1() {
496cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust    ArgsValidate1 a = new ArgsValidate1();
497cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust    JCommander jc = new JCommander(a);
498e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust    jc.parse(new String[] { "-age", "2 "});
499e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust    Assert.assertEquals(a.age, new Integer(2));
500e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust  }
501e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust
502e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust  @Test(expectedExceptions = ParameterException.class)
503fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust  public void validationShouldWorkWithDefaultValues() {
504fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust    ArgsValidate2 a = new ArgsValidate2();
505fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust    new JCommander(a);
506fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust  }
507fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust
508fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust  @Test(expectedExceptions = ParameterException.class)
509e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust  public void validationShouldWork2() {
510e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust    ArgsValidate1 a = new ArgsValidate1();
511e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust    JCommander jc = new JCommander(a);
512cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust    jc.parse(new String[] { "-age", "-2 "});
513cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust  }
514cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust
5158877f663e79381340b329180922d7ac448e26317Cedric Beust  public void atFileCanContainEmptyLines() throws IOException {
5168877f663e79381340b329180922d7ac448e26317Cedric Beust    File f = File.createTempFile("JCommander", null);
5178877f663e79381340b329180922d7ac448e26317Cedric Beust    f.deleteOnExit();
5188877f663e79381340b329180922d7ac448e26317Cedric Beust    FileWriter fw = new FileWriter(f);
5198877f663e79381340b329180922d7ac448e26317Cedric Beust    fw.write("-log\n");
5208877f663e79381340b329180922d7ac448e26317Cedric Beust    fw.write("\n");
5218877f663e79381340b329180922d7ac448e26317Cedric Beust    fw.write("2\n");
5228877f663e79381340b329180922d7ac448e26317Cedric Beust    fw.close();
5238877f663e79381340b329180922d7ac448e26317Cedric Beust    new JCommander(new Args1(), "@" + f.getAbsolutePath());
5248877f663e79381340b329180922d7ac448e26317Cedric Beust  }
5258877f663e79381340b329180922d7ac448e26317Cedric Beust
5262ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust  public void handleEqualSigns() {
5272ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust    ArgsEquals a = new ArgsEquals();
5282ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust    JCommander jc = new JCommander(a);
5292ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust    jc.parse(new String[] { "-args=a=b,b=c" });
5302ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust    Assert.assertEquals(a.args, "a=b,b=c");
5312ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust  }
5322ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust
533876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust  @SuppressWarnings("serial")
534876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust  public void handleSets() {
535876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust    ArgsWithSet a = new ArgsWithSet();
536876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust    new JCommander(a, new String[] { "-s", "3,1,2" });
537876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust    Assert.assertEquals(a.set, new TreeSet<Integer>() {{ add(1); add(2); add(3); }});
538876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust  }
539876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust
540c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  private static final List<String> V = Arrays.asList("a", "b", "c", "d");
541c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust
542c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  @DataProvider
543c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  public Object[][] variable() {
544c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust    return new Object[][] {
545c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust        new Object[] { 0, V.subList(0, 0), V },
546c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust        new Object[] { 1, V.subList(0, 1), V.subList(1, 4) },
547c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust        new Object[] { 2, V.subList(0, 2), V.subList(2, 4) },
548c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust        new Object[] { 3, V.subList(0, 3), V.subList(3, 4) },
549c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust        new Object[] { 4, V.subList(0, 4), V.subList(4, 4) },
550c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust    };
551c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  }
552c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust
553c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  @Test(dataProvider = "variable")
554c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  public void variableArity(int count, List<String> var, List<String> main) {
555c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust    VariableArity va = new VariableArity(count);
556c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust    new JCommander(va).parse("-variable", "a", "b", "c", "d");
557c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust    Assert.assertEquals(var, va.var);
558c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust    Assert.assertEquals(main, va.main);
559c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  }
560c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust
5610638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru  public void enumArgs() {
5620638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru    ArgsEnum args = new ArgsEnum();
5630638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru    String[] argv = { "-choice", "ONE"};
564a3199885e5e515af41a01c4d693bf96f1dafbd67Adrian Muraru    JCommander jc = new JCommander(args, argv);
5650638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru
5660638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru    Assert.assertEquals(args.choice, ArgsEnum.ChoiceType.ONE);
567a3199885e5e515af41a01c4d693bf96f1dafbd67Adrian Muraru
568a3199885e5e515af41a01c4d693bf96f1dafbd67Adrian Muraru    Assert.assertEquals(jc.getParameters().get(0).getDescription(), "Options: " + EnumSet.allOf((Class<? extends Enum>) ArgsEnum.ChoiceType.class));
569a3199885e5e515af41a01c4d693bf96f1dafbd67Adrian Muraru
5700638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru  }
5710638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru
5720638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru  @Test(expectedExceptions = ParameterException.class)
5730638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru  public void enumArgsFail() {
5740638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru    ArgsEnum args = new ArgsEnum();
5750638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru    String[] argv = { "-choice", "A" };
5760638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru    new JCommander(args, argv);
5770638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru  }
5780638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru
5793e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust  public void testListAndSplitters() {
5803e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    ArgsList al = new ArgsList();
5813e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    JCommander j = new JCommander(al);
5823e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    j.parse("-groups", "a,b", "-ints", "41,42", "-hp", "localhost:1000;example.com:1001",
5833e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust        "-hp2", "localhost:1000,example.com:1001", "-uppercase", "ab,cd");
5843e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.groups.get(0), "a");
5853e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.groups.get(1), "b");
5863e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.ints.get(0).intValue(), 41);
5873e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.ints.get(1).intValue(), 42);
5883e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.hostPorts.get(0).host, "localhost");
5893e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.hostPorts.get(0).port.intValue(), 1000);
5903e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.hostPorts.get(1).host, "example.com");
5913e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.hostPorts.get(1).port.intValue(), 1001);
5923e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.hp2.get(1).host, "example.com");
5933e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.hp2.get(1).port.intValue(), 1001);
5943e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.uppercase.get(0), "AB");
5953e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.uppercase.get(1), "CD");
5963e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust  }
5973e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust
5984ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust  @Test(expectedExceptions = ParameterException.class)
5994ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust  public void shouldThrowIfUnknownOption() {
6004ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust    class A {
6014ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust      @Parameter(names = "-long")
6024ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust      public long l;
6034ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust    }
6044ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust    A a = new A();
6054ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust    new JCommander(a).parse("-lon", "32");
6064ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust  }
6074ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust
608c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust  @Test(expectedExceptions = ParameterException.class)
609c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust  public void mainParameterShouldBeValidate() {
610c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust    class V implements IParameterValidator {
611c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust
612c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust      public void validate(String name, String value) throws ParameterException {
613c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust        Assert.assertEquals("a", value);
614c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust      }
615c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust    }
616c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust
617c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust    class A {
618c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust      @Parameter(validateWith = V.class)
619c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust      public List<String> m;
620c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust    }
621c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust
622c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust    A a = new A();
623c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust    new JCommander(a).parse("b");
624c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust  }
625c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust
6268ad02daa23243bf515009d16205465f1b811da81Cedric Beust  @Parameters(commandNames = { "--configure" })
6278ad02daa23243bf515009d16205465f1b811da81Cedric Beust  public static class ConfigureArgs {
6288ad02daa23243bf515009d16205465f1b811da81Cedric Beust  }
629c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust
6308ad02daa23243bf515009d16205465f1b811da81Cedric Beust  public static class BaseArgs {
6318ad02daa23243bf515009d16205465f1b811da81Cedric Beust    @Parameter(names = { "-h", "--help" }, description = "Show this help screen")
6328ad02daa23243bf515009d16205465f1b811da81Cedric Beust    private boolean help = false;
6337e743acbff5277d087347bfba2409406865af8a0Cedric Beust
6348ad02daa23243bf515009d16205465f1b811da81Cedric Beust    @Parameter(names = { "--version", "-version" }, description = "Show the program version")
6358ad02daa23243bf515009d16205465f1b811da81Cedric Beust    private boolean version;
6368ad02daa23243bf515009d16205465f1b811da81Cedric Beust  }
6378ad02daa23243bf515009d16205465f1b811da81Cedric Beust
6388ad02daa23243bf515009d16205465f1b811da81Cedric Beust  public void commandsWithSamePrefixAsOptionsShouldWork() {
6398ad02daa23243bf515009d16205465f1b811da81Cedric Beust    BaseArgs a = new BaseArgs();
6408ad02daa23243bf515009d16205465f1b811da81Cedric Beust    ConfigureArgs conf = new ConfigureArgs();
6418ad02daa23243bf515009d16205465f1b811da81Cedric Beust    JCommander jc = new JCommander(a);
6428ad02daa23243bf515009d16205465f1b811da81Cedric Beust    jc.addCommand(conf);
6438ad02daa23243bf515009d16205465f1b811da81Cedric Beust    jc.parse("--configure");
6448ad02daa23243bf515009d16205465f1b811da81Cedric Beust  }
6458ad02daa23243bf515009d16205465f1b811da81Cedric Beust
64639e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust  // Tests:
64739e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust  // required unparsed parameter
64839e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust  @Test(enabled = false,
64939e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust      description = "For some reason, this test still asks the password on stdin")
65039e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust  public void askedRequiredPassword() {
65139e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust    class A {
65239e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust        @Parameter(names = { "--password", "-p" }, description = "Private key password",
65339e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust            password = true, required = true)
65439e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust        public String password;
65539e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust
65639e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust        @Parameter(names = { "--port", "-o" }, description = "Port to bind server to",
65739e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust            required = true)
65839e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust        public int port;
65939e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust    }
66039e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust    A a = new A();
66139e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust    InputStream stdin = System.in;
66239e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust    try {
66339e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust      System.setIn(new ByteArrayInputStream("password".getBytes()));
66439e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust      new JCommander(a,new String[]{"--port", "7","--password"});
66539e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust      Assert.assertEquals(a.port, 7);
66639e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust      Assert.assertEquals(a.password, "password");
66739e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust    } finally {
66839e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust      System.setIn(stdin);
66939e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust    }
67039e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust  }
67139e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust
6728ebf58f752ae0703b70af57cecfe584968442558Cedric Beust  public void dynamicParameters() {
6738ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    class Command {
6748ebf58f752ae0703b70af57cecfe584968442558Cedric Beust      @DynamicParameter(names = {"-P"}, description = "Additional command parameters")
6758ebf58f752ae0703b70af57cecfe584968442558Cedric Beust      private Map<String, String> params = Maps.newHashMap();
6768ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    }
6778ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    JCommander commander = new JCommander();
6788ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    Command c = new Command();
6798ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    commander.addCommand("command", c);
6808ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    commander.parse(new String[] { "command", "-Pparam='name=value'" });
6818ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    Assert.assertEquals(c.params.get("param"), "'name=value'");
6828ebf58f752ae0703b70af57cecfe584968442558Cedric Beust  }
6838ebf58f752ae0703b70af57cecfe584968442558Cedric Beust
684ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust  public void exeParser() {
685ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust      class Params {
686ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust        @Parameter( names= "-i")
687ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust        private String inputFile;
688ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust      }
689ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust
690ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust      String args[] = { "-i", "" };
691ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust      Params p = new Params();
692ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust      new JCommander(p, args);
693ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust  }
694ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust
69574664b26b3b9cdaec4a683ec9666828cbc856e44Cedric Beust  public void multiVariableArityList() {
69674664b26b3b9cdaec4a683ec9666828cbc856e44Cedric Beust    class Params {
6975414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust      @Parameter(names = "-paramA", description = "ParamA", variableArity = true)
6985414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust      private List<String> paramA = Lists.newArrayList();
6995414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust
7005414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust      @Parameter(names = "-paramB", description = "ParamB", variableArity = true)
7015414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust      private List<String> paramB = Lists.newArrayList();
7025414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust    }
7035414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust
7045414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust    String args[] = { "-paramA", "a1", "a2", "-paramB", "b1", "b2", "b3" };
7055414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust    Params p = new Params();
7065414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust    new JCommander(p, args).parse();
7075414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust    Assert.assertEquals(p.paramA, Arrays.asList(new String[] { "a1", "a2" }));
7085414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust    Assert.assertEquals(p.paramB, Arrays.asList(new String[] { "b1", "b2", "b3" }));
7095414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust  }
7105414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust
71161e65090c5495518a9a521149dbecbd17e1df193Cedric Beust  @Test(enabled = false,
71261e65090c5495518a9a521149dbecbd17e1df193Cedric Beust      description = "Need to double check that the command description is i18n'ed in the usage")
71361e65090c5495518a9a521149dbecbd17e1df193Cedric Beust  public void commandKey() {
71461e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    @Parameters(resourceBundle = "MessageBundle", commandDescriptionKey = "command")
71561e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    class Args {
71661e65090c5495518a9a521149dbecbd17e1df193Cedric Beust      @Parameter(names="-myoption", descriptionKey="myoption")
71761e65090c5495518a9a521149dbecbd17e1df193Cedric Beust      private boolean option;
71861e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    }
71961e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    JCommander j = new JCommander();
72061e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    Args a = new Args();
72161e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    j.addCommand("comm", a);
72261e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    j.usage();
72361e65090c5495518a9a521149dbecbd17e1df193Cedric Beust  }
72461e65090c5495518a9a521149dbecbd17e1df193Cedric Beust
7258ad02daa23243bf515009d16205465f1b811da81Cedric Beust  @Test(enabled = false)
7268ad02daa23243bf515009d16205465f1b811da81Cedric Beust  public static void main(String[] args) throws Exception {
72761e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    new JCommanderTest().commandKey();
7288ad02daa23243bf515009d16205465f1b811da81Cedric Beust//    System.out.println("Help:" + a.help);
7298ad02daa23243bf515009d16205465f1b811da81Cedric Beust//    System.out.println("A");
7308ad02daa23243bf515009d16205465f1b811da81Cedric Beust//    class A {
7318ad02daa23243bf515009d16205465f1b811da81Cedric Beust//      @Parameter
7328ad02daa23243bf515009d16205465f1b811da81Cedric Beust//      List<String> parameters;
7338ad02daa23243bf515009d16205465f1b811da81Cedric Beust//
7348ad02daa23243bf515009d16205465f1b811da81Cedric Beust//      @Parameter(names = "-long")
7358ad02daa23243bf515009d16205465f1b811da81Cedric Beust//      public long l;
7368ad02daa23243bf515009d16205465f1b811da81Cedric Beust//    }
7378ad02daa23243bf515009d16205465f1b811da81Cedric Beust//    A a = new A();
7388ad02daa23243bf515009d16205465f1b811da81Cedric Beust//    new JCommander(a).parse("-long", "32");
7394ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    System.out.println(a.l);
7404ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    System.out.println(a.parameters);
7414ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    ArgsList al = new ArgsList();
7424ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    JCommander j = new JCommander(al);
7434ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    j.setColumnSize(40);
7444ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    j.usage();
7454ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    new JCommanderTest().testListAndSplitters();
7464ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    new JCommanderTest().converterArgs();
747804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  }
748c3e28e12136391968250719b1627b6b4eaa196cdCedric Beust
749c3e28e12136391968250719b1627b6b4eaa196cdCedric Beust  // Tests:
750c3e28e12136391968250719b1627b6b4eaa196cdCedric Beust  // required unparsed parameter
751e9229f961b3a5799f6798369afe26dec7960249Cedric Beust}
752