JCommanderTest.java revision 36e3614a3ebf663c723e94f30b873194d33a29d1
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;
272ee07bc8765f4873b69423e6185120d176c49a2bCedric Beustimport com.beust.jcommander.args.ArgsEquals;
28b5598e97aa7d22a933223f6211d50329b1a20308Cedric Beustimport com.beust.jcommander.args.ArgsHelp;
29103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsI18N1;
30103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsI18N2;
31103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsI18N2New;
32b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthierimport com.beust.jcommander.args.ArgsInherited;
33f2cd60c1f0e475201b9d24b486df920ff1d02ac5Russell Eganimport com.beust.jcommander.args.ArgsMainParameter1;
34103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsMaster;
35103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsMultipleUnparsed;
36c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beustimport com.beust.jcommander.args.ArgsOutOfMemory;
37103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsPrivate;
3872cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beustimport com.beust.jcommander.args.ArgsRequired;
39103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsSlave;
40103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsSlaveBogus;
41cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beustimport com.beust.jcommander.args.ArgsValidate1;
42876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beustimport com.beust.jcommander.args.ArgsWithSet;
43e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beustimport com.beust.jcommander.args.Arity1;
44103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.SeparatorColon;
45103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.SeparatorEqual;
46103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.SeparatorMixed;
47d556f4a527306a9769776d1cbb2fccac98618bc9Cedric Beustimport com.beust.jcommander.args.SlashSeparator;
48dda1651c0b74aa9e8d225096f1d531871460e692Cedric Beustimport com.beust.jcommander.command.CommandAdd;
49dda1651c0b74aa9e8d225096f1d531871460e692Cedric Beustimport com.beust.jcommander.command.CommandCommit;
50dda1651c0b74aa9e8d225096f1d531871460e692Cedric Beustimport com.beust.jcommander.command.CommandMain;
51eca9dc8ab293c10f16a104e107b402b61c4c76deCedric Beust
52b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beustimport org.testng.Assert;
53b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beustimport org.testng.annotations.DataProvider;
54b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beustimport org.testng.annotations.Test;
55b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust
568877f663e79381340b329180922d7ac448e26317Cedric Beustimport java.io.File;
578877f663e79381340b329180922d7ac448e26317Cedric Beustimport java.io.FileWriter;
588877f663e79381340b329180922d7ac448e26317Cedric Beustimport java.io.IOException;
59804498ec24662928bf06efcee6584d55fca3d898Cedric Beustimport java.util.ArrayList;
60e9229f961b3a5799f6798369afe26dec7960249Cedric Beustimport java.util.Arrays;
614c020da73b8b25773bba8553263cf1954c718573Cedric Beustimport java.util.Iterator;
62804498ec24662928bf06efcee6584d55fca3d898Cedric Beustimport java.util.List;
639b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beustimport java.util.Locale;
644c020da73b8b25773bba8553263cf1954c718573Cedric Beustimport java.util.Map;
659b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beustimport java.util.ResourceBundle;
66876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beustimport java.util.TreeSet;
67e9229f961b3a5799f6798369afe26dec7960249Cedric Beust
68460998fec3b06bf45b024c645b5b5e854de68c24Cedric Beust@Test
69e9229f961b3a5799f6798369afe26dec7960249Cedric Beustpublic class JCommanderTest {
70e9229f961b3a5799f6798369afe26dec7960249Cedric Beust  public void simpleArgs() {
7194fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Args1 args = new Args1();
7236e3614a3ebf663c723e94f30b873194d33a29d1Cedric Beust    String[] argv = { "-debug", "-log", "2", "-float", "1.2", "-double", "1.3",
7336e3614a3ebf663c723e94f30b873194d33a29d1Cedric Beust            "-groups", "unit", "a", "b", "c" };
7494fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    new JCommander(args, argv);
75e9229f961b3a5799f6798369afe26dec7960249Cedric Beust
76cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust    Assert.assertTrue(args.debug);
7794fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Assert.assertEquals(args.verbose.intValue(), 2);
7894fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Assert.assertEquals(args.groups, "unit");
7994fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Assert.assertEquals(args.parameters, Arrays.asList("a", "b", "c"));
8036e3614a3ebf663c723e94f30b873194d33a29d1Cedric Beust    Assert.assertEquals(args.floa, 1.2f, 0.1f);
8136e3614a3ebf663c723e94f30b873194d33a29d1Cedric Beust    Assert.assertEquals(args.doub, 1.3f, 0.1f);
82e9229f961b3a5799f6798369afe26dec7960249Cedric Beust  }
83696418a94157048544c44f405d757ede86eec926Cedric Beust
84696418a94157048544c44f405d757ede86eec926Cedric Beust  /**
85696418a94157048544c44f405d757ede86eec926Cedric Beust   * Make sure that if there are args with multiple names (e.g. "-log" and "-verbose"),
86696418a94157048544c44f405d757ede86eec926Cedric Beust   * the usage will only display it once.
87696418a94157048544c44f405d757ede86eec926Cedric Beust   */
88696418a94157048544c44f405d757ede86eec926Cedric Beust  public void repeatedArgs() {
8994fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Args1 args = new Args1();
90696418a94157048544c44f405d757ede86eec926Cedric Beust    String[] argv = { "-log", "2" };
9194fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    JCommander jc = new JCommander(args, argv);
9236e3614a3ebf663c723e94f30b873194d33a29d1Cedric Beust    Assert.assertEquals(jc.getParameters().size(), 6);
93696418a94157048544c44f405d757ede86eec926Cedric Beust  }
94696418a94157048544c44f405d757ede86eec926Cedric Beust
95dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  /**
96dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust   * Not specifying a required option should throw an exception.
97dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust   */
98dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  @Test(expectedExceptions = ParameterException.class)
996734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust  public void requiredFields1Fail() {
10094fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Args1 args = new Args1();
101dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust    String[] argv = { "-debug" };
10294fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    new JCommander(args, argv);
103dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  }
104dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust
105dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  /**
106e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust   * Getting the description of a nonexistent command should throw an exception.
107e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust   */
108e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust  @Test(expectedExceptions = ParameterException.class)
109e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust  public void nonexistentCommandShouldThrow() {
110e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust    String[] argv = { };
111e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust    JCommander jc = new JCommander(new Object(), argv);
112e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust    jc.getCommandDescription("foo");
113e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust  }
114e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust
115e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust  /**
116dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust   * Required options with multiple names should work with all names.
117dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust   */
118c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust  private void multipleNames(String option) {
11994fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Args1 args = new Args1();
120c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust    String[] argv = { option, "2" };
12194fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    new JCommander(args, argv);
122c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust    Assert.assertEquals(args.verbose.intValue(), 2);
123c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust  }
124c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust
125c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust  public void multipleNames1() {
126c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust    multipleNames("-log");
127dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  }
128dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust
129c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust  public void multipleNames2() {
130c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust    multipleNames("-verbose");
131dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  }
132dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust
1336734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust  private void i18n1(String bundleName, Locale locale, String expectedString) {
1346734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    ResourceBundle bundle = locale != null ? ResourceBundle.getBundle(bundleName, locale)
1359b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust        : null;
1369b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
1376734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    ArgsI18N1 i18n = new ArgsI18N1();
1389b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust    String[] argv = { "-host", "localhost" };
1399b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust    JCommander jc = new JCommander(i18n, bundle, argv);
14014516e91e6be4ba1c3e7b573ea450e5c59925ecfCedric Beust//    jc.usage();
1419b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
1429b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust    ParameterDescription pd = jc.getParameters().get(0);
1439b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust    Assert.assertEquals(pd.getDescription(), expectedString);
1449b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  }
1459b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
1469b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  public void i18nNoLocale() {
1476734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    i18n1("MessageBundle", null, "Host");
1489b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  }
1499b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
1509b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  public void i18nUsLocale() {
1516734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    i18n1("MessageBundle", new Locale("en", "US"), "Host");
1529b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  }
1539b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
1549b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  public void i18nFrLocale() {
155c27a04a2e10667dff4390b25fa4224b58b291ca0David Gageot    i18n1("MessageBundle", new Locale("fr", "FR"), "Hôte");
1566734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust  }
1576734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust
158b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust  private void i18n2(Object i18n) {
1596734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    String[] argv = { "-host", "localhost" };
1606734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    Locale.setDefault(new Locale("fr", "FR"));
1616734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    JCommander jc = new JCommander(i18n, argv);
1626734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    ParameterDescription pd = jc.getParameters().get(0);
163c27a04a2e10667dff4390b25fa4224b58b291ca0David Gageot    Assert.assertEquals(pd.getDescription(), "Hôte");
1649b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  }
1659b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
166b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust  public void i18nWithResourceAnnotation() {
167b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust    i18n2(new ArgsI18N2());
168b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust  }
169b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust
170b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust  public void i18nWithResourceAnnotationNew() {
171b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust    i18n2(new ArgsI18N2New());
172b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust  }
173b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust
17421059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust  public void noParseConstructor() {
17521059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust    JCommander jCommander = new JCommander(new ArgsMainParameter1());
176b5598e97aa7d22a933223f6211d50329b1a20308Cedric Beust    jCommander.usage(new StringBuilder());
17721059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust    // Before fix, this parse would throw an exception, because it calls createDescription, which
17821059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust    // was already called by usage(), and can only be called once.
17921059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust    jCommander.parse();
18021059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust  }
18121059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust
182dae46a1c4166085b56a78669050dc19938735a41Russell Egan  /**
183dae46a1c4166085b56a78669050dc19938735a41Russell Egan   * Test a use case where there are required parameters, but you still want
184dae46a1c4166085b56a78669050dc19938735a41Russell Egan   * to interrogate the options which are specified.
185dae46a1c4166085b56a78669050dc19938735a41Russell Egan   */
186dae46a1c4166085b56a78669050dc19938735a41Russell Egan  public void usageWithRequiredArgsAndResourceBundle() {
187dae46a1c4166085b56a78669050dc19938735a41Russell Egan    ArgsHelp argsHelp = new ArgsHelp();
18821059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust    JCommander jc = new JCommander(new Object[]{argsHelp, new ArgsRequired()},
18921059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust        java.util.ResourceBundle.getBundle("MessageBundle"));
190dae46a1c4166085b56a78669050dc19938735a41Russell Egan    // Should be able to display usage without triggering validation
191b5598e97aa7d22a933223f6211d50329b1a20308Cedric Beust    jc.usage(new StringBuilder());
192dae46a1c4166085b56a78669050dc19938735a41Russell Egan    try {
193dae46a1c4166085b56a78669050dc19938735a41Russell Egan      jc.parse("-h");
194dae46a1c4166085b56a78669050dc19938735a41Russell Egan      Assert.fail("Should have thrown a required parameter exception");
195dae46a1c4166085b56a78669050dc19938735a41Russell Egan    } catch (ParameterException e) {
196dae46a1c4166085b56a78669050dc19938735a41Russell Egan      Assert.assertTrue(e.getMessage().contains("are required"));
197dae46a1c4166085b56a78669050dc19938735a41Russell Egan    }
198dae46a1c4166085b56a78669050dc19938735a41Russell Egan    Assert.assertTrue(argsHelp.help);
199dae46a1c4166085b56a78669050dc19938735a41Russell Egan  }
200dae46a1c4166085b56a78669050dc19938735a41Russell Egan
201d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust  public void multiObjects() {
202d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust    ArgsMaster m = new ArgsMaster();
203d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust    ArgsSlave s = new ArgsSlave();
204d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust    String[] argv = { "-master", "master", "-slave", "slave" };
205b945b741b5de0510ce39f8c793e31202070ef942Cedric Beust    new JCommander(new Object[] { m , s }, argv);
206d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust
207d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust    Assert.assertEquals(m.master, "master");
208d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust    Assert.assertEquals(s.slave, "slave");
209d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust  }
210d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust
2110c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust  @Test(expectedExceptions = ParameterException.class)
2126734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust  public void multiObjectsWithDuplicatesFail() {
2130c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust    ArgsMaster m = new ArgsMaster();
2140c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust    ArgsSlave s = new ArgsSlaveBogus();
2150c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust    String[] argv = { "-master", "master", "-slave", "slave" };
2160c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust    new JCommander(new Object[] { m , s }, argv);
2170c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust  }
2180c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust
219f3b82e196a622a959374d7588688e74fe852a512Cedric Beust  public void arityString() {
220f3b82e196a622a959374d7588688e74fe852a512Cedric Beust    ArgsArityString args = new ArgsArityString();
221a21262377768de124914e354e428ed6860828949Cedric Beust    String[] argv = { "-pairs", "pair0", "pair1", "rest" };
222a21262377768de124914e354e428ed6860828949Cedric Beust    new JCommander(args, argv);
223a21262377768de124914e354e428ed6860828949Cedric Beust
224a21262377768de124914e354e428ed6860828949Cedric Beust    Assert.assertEquals(args.pairs.size(), 2);
225a21262377768de124914e354e428ed6860828949Cedric Beust    Assert.assertEquals(args.pairs.get(0), "pair0");
226a21262377768de124914e354e428ed6860828949Cedric Beust    Assert.assertEquals(args.pairs.get(1), "pair1");
227a21262377768de124914e354e428ed6860828949Cedric Beust    Assert.assertEquals(args.rest.size(), 1);
228a21262377768de124914e354e428ed6860828949Cedric Beust    Assert.assertEquals(args.rest.get(0), "rest");
229a21262377768de124914e354e428ed6860828949Cedric Beust  }
230a21262377768de124914e354e428ed6860828949Cedric Beust
231f3b82e196a622a959374d7588688e74fe852a512Cedric Beust  @Test(expectedExceptions = ParameterException.class)
232e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  public void arity2Fail() {
233f3b82e196a622a959374d7588688e74fe852a512Cedric Beust    ArgsArityString args = new ArgsArityString();
234f3b82e196a622a959374d7588688e74fe852a512Cedric Beust    String[] argv = { "-pairs", "pair0" };
235f3b82e196a622a959374d7588688e74fe852a512Cedric Beust    new JCommander(args, argv);
236f3b82e196a622a959374d7588688e74fe852a512Cedric Beust  }
237f3b82e196a622a959374d7588688e74fe852a512Cedric Beust
238cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust  @Test(expectedExceptions = ParameterException.class)
239cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust  public void multipleUnparsedFail() {
240cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust    ArgsMultipleUnparsed args = new ArgsMultipleUnparsed();
241cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust    String[] argv = { };
242cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust    new JCommander(args, argv);
243cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust  }
244cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust
2455f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust  public void privateArgs() {
2465f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust    ArgsPrivate args = new ArgsPrivate();
2475f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust    new JCommander(args, "-verbose", "3");
2485f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust    Assert.assertEquals(args.getVerbose().intValue(), 3);
2495f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust  }
2505f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust
2515a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust  public void converterArgs() {
2525a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust    ArgsConverter args = new ArgsConverter();
2535a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust    String fileName = "a";
2545a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust    new JCommander(args, "-file", "/tmp/" + fileName, "-days", "Tuesday,Thursday");
2555a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust    Assert.assertEquals(args.file.getName(), fileName);
2565a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust    Assert.assertEquals(args.days.size(), 2);
2575a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust    Assert.assertEquals(args.days.get(0), "Tuesday");
2585a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust    Assert.assertEquals(args.days.get(1), "Thursday");
2595a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust  }
2605a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust
261b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  private void argsBoolean1(String[] params, Boolean expected) {
262d3b9e34aed415eba172befec79d2261c3ac38123Cedric Beust    ArgsBooleanArity args = new ArgsBooleanArity();
263b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    new JCommander(args, params);
264b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    Assert.assertEquals(args.debug, expected);
265b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  }
266b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust
267b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  private void argsBoolean0(String[] params, Boolean expected) {
268b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    ArgsBooleanArity0 args = new ArgsBooleanArity0();
269b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    new JCommander(args, params);
270b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    Assert.assertEquals(args.debug, expected);
271b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  }
272b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust
273b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  public void booleanArity1() {
274b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    argsBoolean1(new String[] {}, Boolean.FALSE);
275b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    argsBoolean1(new String[] { "-debug", "true" }, Boolean.TRUE);
276b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  }
277b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust
278b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  public void booleanArity0() {
279b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    argsBoolean0(new String[] {}, Boolean.FALSE);
280b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    argsBoolean0(new String[] { "-debug"}, Boolean.TRUE);
281d3b9e34aed415eba172befec79d2261c3ac38123Cedric Beust  }
282d3b9e34aed415eba172befec79d2261c3ac38123Cedric Beust
2834312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  @Test(expectedExceptions = ParameterException.class)
2844312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  public void badParameterShouldThrowParameter1Exception() {
2854312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    Args1 args = new Args1();
2864312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    String[] argv = { "-log", "foo" };
2874312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    new JCommander(args, argv);
2884312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  }
2894312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust
2904312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  @Test(expectedExceptions = ParameterException.class)
2914312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  public void badParameterShouldThrowParameter2Exception() {
2924312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    Args1 args = new Args1();
2934312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    String[] argv = { "-long", "foo" };
2944312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    new JCommander(args, argv);
2954312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  }
2964312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust
297b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust  public void listParameters() {
298b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    Args2 a = new Args2();
299b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    String[] argv = {"-log", "2", "-groups", "unit", "a", "b", "c", "-host", "host2"};
300b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    new JCommander(a, argv);
301b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    Assert.assertEquals(a.verbose.intValue(), 2);
302b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    Assert.assertEquals(a.groups, "unit");
303b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    Assert.assertEquals(a.hosts, Arrays.asList("host2"));
304b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    Assert.assertEquals(a.parameters, Arrays.asList("a", "b", "c"));
305b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust  }
30685866a95d6479be731596a838b6f5e793a341f5bCedric Beust
307fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  public void separatorEqual() {
308fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    SeparatorEqual s = new SeparatorEqual();
309bc108076cf3dc506d4e87e004d8c2e413b995adaCedric Beust    String[] argv = { "-log=3", "--longoption=10" };
31085866a95d6479be731596a838b6f5e793a341f5bCedric Beust    new JCommander(s, argv);
31185866a95d6479be731596a838b6f5e793a341f5bCedric Beust    Assert.assertEquals(s.log.intValue(), 3);
312bc108076cf3dc506d4e87e004d8c2e413b995adaCedric Beust    Assert.assertEquals(s.longOption.intValue(), 10);
31385866a95d6479be731596a838b6f5e793a341f5bCedric Beust  }
31485866a95d6479be731596a838b6f5e793a341f5bCedric Beust
315fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  public void separatorColon() {
316fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    SeparatorColon s = new SeparatorColon();
317fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    String[] argv = { "-verbose:true" };
318fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    new JCommander(s, argv);
319fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    Assert.assertTrue(s.verbose);
320fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  }
321fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust
322fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  public void separatorBoth() {
323fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    SeparatorColon s = new SeparatorColon();
324fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    SeparatorEqual s2 = new SeparatorEqual();
325fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    String[] argv = { "-verbose:true", "-log=3" };
326fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    new JCommander(new Object[] { s, s2 }, argv);
327fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    Assert.assertTrue(s.verbose);
328fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    Assert.assertEquals(s2.log.intValue(), 3);
329fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  }
330fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust
331fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  public void separatorMixed1() {
332fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    SeparatorMixed s = new SeparatorMixed();
333fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    String[] argv = { "-long:1", "-level=42" };
334fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    new JCommander(s, argv);
335fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    Assert.assertEquals(s.l.longValue(), 1l);
336fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    Assert.assertEquals(s.level.intValue(), 42);
337fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  }
338fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust
339426bf32155b30f5c1819a00d88c16944c01e5a52Cedric Beust  public void slashParameters() {
340d556f4a527306a9769776d1cbb2fccac98618bc9Cedric Beust    SlashSeparator a = new SlashSeparator();
341858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust    String[] argv = { "/verbose", "/file", "/tmp/a" };
3425f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust    new JCommander(a, argv);
343d556f4a527306a9769776d1cbb2fccac98618bc9Cedric Beust    Assert.assertTrue(a.verbose);
344d556f4a527306a9769776d1cbb2fccac98618bc9Cedric Beust    Assert.assertEquals(a.file, "/tmp/a");
3455f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust  }
3465f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust
347b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier  public void inheritance() {
348b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier    ArgsInherited args = new ArgsInherited();
349b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier    String[] argv = { "-log", "3", "-child", "2" };
350b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier    new JCommander(args, argv);
351b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier    Assert.assertEquals(args.child.intValue(), 2);
352b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier    Assert.assertEquals(args.log.intValue(), 3);
353b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier  }
354b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier
355858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust  public void negativeNumber() {
356858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust    Args1 a = new Args1();
357858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust    String[] argv = { "-verbose", "-3" };
358858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust    new JCommander(a, argv);
359858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust    Assert.assertEquals(a.verbose.intValue(), -3);
360858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust  }
361858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust
36272cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beust  @Test(expectedExceptions = ParameterException.class)
3635f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust  public void requiredMainParameters() {
36472cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beust    ArgsRequired a = new ArgsRequired();
36572cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beust    String[] argv = {};
36672cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beust    new JCommander(a, argv);
3675f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust  }
3685f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust
369a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust  public void usageShouldNotChange() {
370a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    JCommander jc = new JCommander(new Args1(), new String[]{"-log", "1"});
371a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    StringBuilder sb = new StringBuilder();
372a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    jc.usage(sb);
373a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    String expected = sb.toString();
374a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    jc = new JCommander(new Args1(), new String[]{"-debug", "-log", "2", "-long", "5"});
375a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    sb = new StringBuilder();
376a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    jc.usage(sb);
377a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    String actual = sb.toString();
378a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    Assert.assertEquals(actual, expected);
379a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust  }
380a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust
3814c020da73b8b25773bba8553263cf1954c718573Cedric Beust  private void verifyCommandOrdering(String[] commandNames, Object[] commands) {
3824c020da73b8b25773bba8553263cf1954c718573Cedric Beust    CommandMain cm = new CommandMain();
3834c020da73b8b25773bba8553263cf1954c718573Cedric Beust    JCommander jc = new JCommander(cm);
3844c020da73b8b25773bba8553263cf1954c718573Cedric Beust
3854c020da73b8b25773bba8553263cf1954c718573Cedric Beust    for (int i = 0; i < commands.length; i++) {
3864c020da73b8b25773bba8553263cf1954c718573Cedric Beust      jc.addCommand(commandNames[i], commands[i]);
3874c020da73b8b25773bba8553263cf1954c718573Cedric Beust    }
3884c020da73b8b25773bba8553263cf1954c718573Cedric Beust
3894c020da73b8b25773bba8553263cf1954c718573Cedric Beust    Map<String, JCommander> c = jc.getCommands();
3904c020da73b8b25773bba8553263cf1954c718573Cedric Beust    Assert.assertEquals(c.size(), commands.length);
3914c020da73b8b25773bba8553263cf1954c718573Cedric Beust
3924c020da73b8b25773bba8553263cf1954c718573Cedric Beust    Iterator<String> it = c.keySet().iterator();
3934c020da73b8b25773bba8553263cf1954c718573Cedric Beust    for (int i = 0; i < commands.length; i++) {
3944c020da73b8b25773bba8553263cf1954c718573Cedric Beust      Assert.assertEquals(it.next(), commandNames[i]);
3954c020da73b8b25773bba8553263cf1954c718573Cedric Beust    }
3964c020da73b8b25773bba8553263cf1954c718573Cedric Beust  }
3974c020da73b8b25773bba8553263cf1954c718573Cedric Beust
3984c020da73b8b25773bba8553263cf1954c718573Cedric Beust  public void commandsShouldBeShownInOrderOfInsertion() {
3994c020da73b8b25773bba8553263cf1954c718573Cedric Beust    verifyCommandOrdering(new String[] { "add", "commit" },
4004c020da73b8b25773bba8553263cf1954c718573Cedric Beust        new Object[] { new CommandAdd(), new CommandCommit() });
4014c020da73b8b25773bba8553263cf1954c718573Cedric Beust    verifyCommandOrdering(new String[] { "commit", "add" },
4024c020da73b8b25773bba8553263cf1954c718573Cedric Beust        new Object[] { new CommandCommit(), new CommandAdd() });
4034c020da73b8b25773bba8553263cf1954c718573Cedric Beust  }
4044c020da73b8b25773bba8553263cf1954c718573Cedric Beust
405e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust  @DataProvider
406e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust  public static Object[][] f() {
407e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust    return new Integer[][] {
408e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust      new Integer[] { 3, 5, 1 },
409e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust      new Integer[] { 3, 8, 1 },
410e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust      new Integer[] { 3, 12, 2 },
411e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust      new Integer[] { 8, 12, 2 },
412e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust      new Integer[] { 9, 10, 1 },
413e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust    };
414e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust  }
415e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust
416460998fec3b06bf45b024c645b5b5e854de68c24Cedric Beust  @Test(expectedExceptions = ParameterException.class)
417e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  public void arity1Fail() {
418e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final Arity1 arguments = new Arity1();
419e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final JCommander jCommander = new JCommander(arguments);
420e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final String[] commands = {
421e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust        "-inspect"
422e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    };
423e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    jCommander.parse(commands);
424e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  }
425e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust
426e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  public void arity1Success1() {
427e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final Arity1 arguments = new Arity1();
428e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final JCommander jCommander = new JCommander(arguments);
429e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final String[] commands = {
430e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust        "-inspect", "true"
431e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    };
432e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    jCommander.parse(commands);
433e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    Assert.assertTrue(arguments.inspect);
434e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  }
435e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust
436e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  public void arity1Success2() {
437e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final Arity1 arguments = new Arity1();
438e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final JCommander jCommander = new JCommander(arguments);
439e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final String[] commands = {
440e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust        "-inspect", "false"
441e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    };
442e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    jCommander.parse(commands);
443e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    Assert.assertFalse(arguments.inspect);
444e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  }
445e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust
446804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  @Parameters(commandDescription = "Help for the given commands.")
447804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  public static class Help {
448804498ec24662928bf06efcee6584d55fca3d898Cedric Beust      public static final String NAME = "help";
449804498ec24662928bf06efcee6584d55fca3d898Cedric Beust
450804498ec24662928bf06efcee6584d55fca3d898Cedric Beust      @Parameter(description = "List of commands.")
451804498ec24662928bf06efcee6584d55fca3d898Cedric Beust      public List<String> commands=new ArrayList<String>();
452804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  }
453804498ec24662928bf06efcee6584d55fca3d898Cedric Beust
454804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  @Test(expectedExceptions = ParameterException.class,
455804498ec24662928bf06efcee6584d55fca3d898Cedric Beust      description = "Verify that the main parameter's type is checked to be a List")
456804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  public void wrongMainTypeShouldThrow() {
457804498ec24662928bf06efcee6584d55fca3d898Cedric Beust    JCommander jc = new JCommander(new ArgsRequiredWrongMain());
458804498ec24662928bf06efcee6584d55fca3d898Cedric Beust    jc.parse(new String[] { "f1", "f2" });
459804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  }
460804498ec24662928bf06efcee6584d55fca3d898Cedric Beust
461c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust  @Test(description = "This used to run out of memory")
462c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust  public void oom() {
463c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust    JCommander jc = new JCommander(new ArgsOutOfMemory());
464c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust    jc.usage(new StringBuilder());
465c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust  }
466c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust
467cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust  @Test
468cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust  public void getParametersShouldNotNpe() {
469cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust    JCommander jc = new JCommander(new Args1());
470cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust    List<ParameterDescription> parameters = jc.getParameters();
471cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust  }
472cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust
473cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust  public void validationShouldWork1() {
474cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust    ArgsValidate1 a = new ArgsValidate1();
475cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust    JCommander jc = new JCommander(a);
476e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust    jc.parse(new String[] { "-age", "2 "});
477e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust    Assert.assertEquals(a.age, new Integer(2));
478e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust  }
479e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust
480e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust  @Test(expectedExceptions = ParameterException.class)
481fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust  public void validationShouldWorkWithDefaultValues() {
482fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust    ArgsValidate2 a = new ArgsValidate2();
483fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust    new JCommander(a);
484fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust  }
485fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust
486fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust  @Test(expectedExceptions = ParameterException.class)
487e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust  public void validationShouldWork2() {
488e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust    ArgsValidate1 a = new ArgsValidate1();
489e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust    JCommander jc = new JCommander(a);
490cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust    jc.parse(new String[] { "-age", "-2 "});
491cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust  }
492cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust
4938877f663e79381340b329180922d7ac448e26317Cedric Beust  public void atFileCanContainEmptyLines() throws IOException {
4948877f663e79381340b329180922d7ac448e26317Cedric Beust    File f = File.createTempFile("JCommander", null);
4958877f663e79381340b329180922d7ac448e26317Cedric Beust    f.deleteOnExit();
4968877f663e79381340b329180922d7ac448e26317Cedric Beust    FileWriter fw = new FileWriter(f);
4978877f663e79381340b329180922d7ac448e26317Cedric Beust    fw.write("-log\n");
4988877f663e79381340b329180922d7ac448e26317Cedric Beust    fw.write("\n");
4998877f663e79381340b329180922d7ac448e26317Cedric Beust    fw.write("2\n");
5008877f663e79381340b329180922d7ac448e26317Cedric Beust    fw.close();
5018877f663e79381340b329180922d7ac448e26317Cedric Beust    new JCommander(new Args1(), "@" + f.getAbsolutePath());
5028877f663e79381340b329180922d7ac448e26317Cedric Beust  }
5038877f663e79381340b329180922d7ac448e26317Cedric Beust
5042ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust  public void handleEqualSigns() {
5052ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust    ArgsEquals a = new ArgsEquals();
5062ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust    JCommander jc = new JCommander(a);
5072ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust    jc.parse(new String[] { "-args=a=b,b=c" });
5082ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust    Assert.assertEquals(a.args, "a=b,b=c");
5092ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust  }
5102ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust
511876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust  @SuppressWarnings("serial")
512876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust  public void handleSets() {
513876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust    ArgsWithSet a = new ArgsWithSet();
514876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust    new JCommander(a, new String[] { "-s", "3,1,2" });
515876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust    Assert.assertEquals(a.set, new TreeSet<Integer>() {{ add(1); add(2); add(3); }});
516876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust  }
517876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust
518804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  @Test(enabled = false)
5198877f663e79381340b329180922d7ac448e26317Cedric Beust  public static void main(String[] args) throws Exception {
52036e3614a3ebf663c723e94f30b873194d33a29d1Cedric Beust    new JCommanderTest().repeatedArgs();
5212ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust//    PortsArgs a = new PortsArgs();
5222ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust//    JCommander jc = new JCommander(a);
5232ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust//    jc.usage();
5242ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust//    new JCommanderTest().validationShouldWorkWithDefaultValues();
5250dcc308f1c08b831376a3e153e2a1ed1a6166697Cedric Beust//    new JCommanderTest().booleanArity1();
526c1d51baff4fb68b90b2f9cdfea512c84ab94eb42Cedric Beust//    ArgsLongDescription a = new ArgsLongDescription();
527c1d51baff4fb68b90b2f9cdfea512c84ab94eb42Cedric Beust//    JCommander jc = new JCommander(a);
528c1d51baff4fb68b90b2f9cdfea512c84ab94eb42Cedric Beust//    jc.usage();
529e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust//    ArgsPassword a = new ArgsPassword();
530e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust//    JCommander jc = new JCommander(a);
531e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust//    jc.parse("-password");
532e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust//    System.out.println("Password:" + a.password);
533ed891ffa6a8894150718d11df446269365bed216Cedric Beust//    new JCommanderTest().commandsShouldBeShownInOrderOfInsertion();
5344c020da73b8b25773bba8553263cf1954c718573Cedric Beust//    CommandMain cm = new CommandMain();
5354c020da73b8b25773bba8553263cf1954c718573Cedric Beust//    JCommander jc = new JCommander(cm);
5364c020da73b8b25773bba8553263cf1954c718573Cedric Beust//    CommandAdd add = new CommandAdd();
5374c020da73b8b25773bba8553263cf1954c718573Cedric Beust//    jc.addCommand("add", add);
5384c020da73b8b25773bba8553263cf1954c718573Cedric Beust//    CommandCommit commit = new CommandCommit();
5394c020da73b8b25773bba8553263cf1954c718573Cedric Beust//    jc.addCommand("commit", commit);
5404c020da73b8b25773bba8553263cf1954c718573Cedric Beust//    jc.usage();
541dda1651c0b74aa9e8d225096f1d531871460e692Cedric Beust
542dda1651c0b74aa9e8d225096f1d531871460e692Cedric Beust//    new JCommanderTest().requiredMainParameters();
543dda1651c0b74aa9e8d225096f1d531871460e692Cedric Beust//    new CommandTest().commandTest1();
544f14a46abd32b378ec56a672a2da0b926c5d7276dCedric Beust//    new DefaultProviderTest().defaultProvider1();
5451eb22b901f731760a479740312337471363febffCedric Beust//    ArgsMainParameter a = new ArgsMainParameter();
5461eb22b901f731760a479740312337471363febffCedric Beust//    new JCommander(a, "ex1:10", "ex2:20");
5471eb22b901f731760a479740312337471363febffCedric Beust//    System.out.println(a.parameters.get(0).host);
5481eb22b901f731760a479740312337471363febffCedric Beust//    new JCommander(new Args1()).usage();
54985866a95d6479be731596a838b6f5e793a341f5bCedric Beust//    Separator a = new Separator();
55076c4b6ace154f18794f9eb0c3d6211101bf426d0Cedric Beust//    String[] argv = new String[] { "-n", "foo" };
55176c4b6ace154f18794f9eb0c3d6211101bf426d0Cedric Beust//    String[] argv = new String[] { "-v", "t" };
55285866a95d6479be731596a838b6f5e793a341f5bCedric Beust//    String[] argv = { "-log=10" };
55385866a95d6479be731596a838b6f5e793a341f5bCedric Beust//    JCommander jc = new JCommander(a, argv);
55485866a95d6479be731596a838b6f5e793a341f5bCedric Beust//    Assert.assertEquals(a.log.intValue(), 10);
555460998fec3b06bf45b024c645b5b5e854de68c24Cedric Beust//  }
556804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  }
557c3e28e12136391968250719b1627b6b4eaa196cdCedric Beust
558c3e28e12136391968250719b1627b6b4eaa196cdCedric Beust  // Tests:
559c3e28e12136391968250719b1627b6b4eaa196cdCedric Beust  // required unparsed parameter
560e9229f961b3a5799f6798369afe26dec7960249Cedric Beust}
561