JCommanderTest.java revision 406904b81e91c3160646388b26f7c167fa7dd3ea
158a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust/**
258a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * Copyright (C) 2010 the original author or authors.
358a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * See the notice.md file distributed with this work for additional
458a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * information regarding copyright ownership.
558a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust *
658a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * Licensed under the Apache License, Version 2.0 (the "License");
758a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * you may not use this file except in compliance with the License.
858a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * You may obtain a copy of the License at
958a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust *
1058a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust *     http://www.apache.org/licenses/LICENSE-2.0
1158a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust *
1258a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * Unless required by applicable law or agreed to in writing, software
1358a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * distributed under the License is distributed on an "AS IS" BASIS,
1458a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1558a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * See the License for the specific language governing permissions and
1658a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * limitations under the License.
1758a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust */
1858a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust
19e9229f961b3a5799f6798369afe26dec7960249Cedric Beustpackage com.beust.jcommander;
20e9229f961b3a5799f6798369afe26dec7960249Cedric Beust
21c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.io.ByteArrayInputStream;
22c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.io.File;
23c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.io.FileWriter;
24c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.io.IOException;
25c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.io.InputStream;
26c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.math.BigDecimal;
27c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.text.ParseException;
28c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.text.SimpleDateFormat;
29c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.util.ArrayList;
30c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.util.Arrays;
31c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.util.EnumSet;
32c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.util.Iterator;
33c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.util.List;
34c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.util.Locale;
35c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.util.Map;
36c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.util.ResourceBundle;
37c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport java.util.TreeSet;
38c421118d3104c0594dbe207c8443e51022422d32Cedric Beust
39c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport org.testng.Assert;
40c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport org.testng.annotations.DataProvider;
41c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport org.testng.annotations.Test;
42c421118d3104c0594dbe207c8443e51022422d32Cedric Beust
43103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.Args1;
44369d387138b6da9e77e01d82273ef6271580eb47Cedric Beustimport com.beust.jcommander.args.Args1Setter;
45103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.Args2;
46103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsArityString;
47103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsBooleanArity;
48b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beustimport com.beust.jcommander.args.ArgsBooleanArity0;
49103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsConverter;
500638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraruimport com.beust.jcommander.args.ArgsEnum;
512ee07bc8765f4873b69423e6185120d176c49a2bCedric Beustimport com.beust.jcommander.args.ArgsEquals;
52b5598e97aa7d22a933223f6211d50329b1a20308Cedric Beustimport com.beust.jcommander.args.ArgsHelp;
53103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsI18N1;
54103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsI18N2;
55103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsI18N2New;
56b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthierimport com.beust.jcommander.args.ArgsInherited;
573e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beustimport com.beust.jcommander.args.ArgsList;
58f2cd60c1f0e475201b9d24b486df920ff1d02ac5Russell Eganimport com.beust.jcommander.args.ArgsMainParameter1;
59103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsMaster;
60103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsMultipleUnparsed;
61c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beustimport com.beust.jcommander.args.ArgsOutOfMemory;
62103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsPrivate;
6372cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beustimport com.beust.jcommander.args.ArgsRequired;
64103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsSlave;
65103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsSlaveBogus;
66cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beustimport com.beust.jcommander.args.ArgsValidate1;
67876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beustimport com.beust.jcommander.args.ArgsWithSet;
68e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beustimport com.beust.jcommander.args.Arity1;
69103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.SeparatorColon;
70103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.SeparatorEqual;
71103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.SeparatorMixed;
72d556f4a527306a9769776d1cbb2fccac98618bc9Cedric Beustimport com.beust.jcommander.args.SlashSeparator;
73c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beustimport com.beust.jcommander.args.VariableArity;
74dda1651c0b74aa9e8d225096f1d531871460e692Cedric Beustimport com.beust.jcommander.command.CommandAdd;
75dda1651c0b74aa9e8d225096f1d531871460e692Cedric Beustimport com.beust.jcommander.command.CommandCommit;
76dda1651c0b74aa9e8d225096f1d531871460e692Cedric Beustimport com.beust.jcommander.command.CommandMain;
77c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport com.beust.jcommander.internal.Lists;
78c421118d3104c0594dbe207c8443e51022422d32Cedric Beustimport com.beust.jcommander.internal.Maps;
79e9229f961b3a5799f6798369afe26dec7960249Cedric Beust
80460998fec3b06bf45b024c645b5b5e854de68c24Cedric Beust@Test
81e9229f961b3a5799f6798369afe26dec7960249Cedric Beustpublic class JCommanderTest {
82f923ee57617c8690d293909c53a4e109a8c2ba26Angus  public void simpleArgs() throws ParseException {
8394fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Args1 args = new Args1();
84041bdac9067d4ce9c936ff1c0ae3856f2e240f15Angus    String[] argv = { "-debug", "-log", "2", "-float", "1.2", "-double", "1.3", "-bigdecimal", "1.4",
85f923ee57617c8690d293909c53a4e109a8c2ba26Angus            "-date", "2011-10-26", "-groups", "unit", "a", "b", "c" };
8694fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    new JCommander(args, argv);
87e9229f961b3a5799f6798369afe26dec7960249Cedric Beust
88cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust    Assert.assertTrue(args.debug);
8994fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Assert.assertEquals(args.verbose.intValue(), 2);
9094fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Assert.assertEquals(args.groups, "unit");
9194fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Assert.assertEquals(args.parameters, Arrays.asList("a", "b", "c"));
9236e3614a3ebf663c723e94f30b873194d33a29d1Cedric Beust    Assert.assertEquals(args.floa, 1.2f, 0.1f);
9336e3614a3ebf663c723e94f30b873194d33a29d1Cedric Beust    Assert.assertEquals(args.doub, 1.3f, 0.1f);
94041bdac9067d4ce9c936ff1c0ae3856f2e240f15Angus    Assert.assertEquals(args.bigd, new BigDecimal("1.4"));
95f923ee57617c8690d293909c53a4e109a8c2ba26Angus    Assert.assertEquals(args.date, new SimpleDateFormat("yyyy-MM-dd").parse("2011-10-26"));
96e9229f961b3a5799f6798369afe26dec7960249Cedric Beust  }
97696418a94157048544c44f405d757ede86eec926Cedric Beust
98696418a94157048544c44f405d757ede86eec926Cedric Beust  /**
99696418a94157048544c44f405d757ede86eec926Cedric Beust   * Make sure that if there are args with multiple names (e.g. "-log" and "-verbose"),
100696418a94157048544c44f405d757ede86eec926Cedric Beust   * the usage will only display it once.
101696418a94157048544c44f405d757ede86eec926Cedric Beust   */
102696418a94157048544c44f405d757ede86eec926Cedric Beust  public void repeatedArgs() {
10394fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Args1 args = new Args1();
104696418a94157048544c44f405d757ede86eec926Cedric Beust    String[] argv = { "-log", "2" };
10594fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    JCommander jc = new JCommander(args, argv);
106f923ee57617c8690d293909c53a4e109a8c2ba26Angus    Assert.assertEquals(jc.getParameters().size(), 8);
107696418a94157048544c44f405d757ede86eec926Cedric Beust  }
108696418a94157048544c44f405d757ede86eec926Cedric Beust
109dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  /**
110dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust   * Not specifying a required option should throw an exception.
111dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust   */
112dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  @Test(expectedExceptions = ParameterException.class)
1136734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust  public void requiredFields1Fail() {
11494fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Args1 args = new Args1();
115dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust    String[] argv = { "-debug" };
11694fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    new JCommander(args, argv);
117dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  }
118dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust
119dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  /**
120e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust   * Getting the description of a nonexistent command should throw an exception.
121e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust   */
122e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust  @Test(expectedExceptions = ParameterException.class)
123e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust  public void nonexistentCommandShouldThrow() {
124e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust    String[] argv = { };
125e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust    JCommander jc = new JCommander(new Object(), argv);
126e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust    jc.getCommandDescription("foo");
127e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust  }
128e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust
129e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust  /**
130dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust   * Required options with multiple names should work with all names.
131dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust   */
132c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust  private void multipleNames(String option) {
13394fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    Args1 args = new Args1();
134c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust    String[] argv = { option, "2" };
13594fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust    new JCommander(args, argv);
136c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust    Assert.assertEquals(args.verbose.intValue(), 2);
137c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust  }
1380638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru
139c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust  public void multipleNames1() {
140c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust    multipleNames("-log");
141dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  }
142dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust
143c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust  public void multipleNames2() {
144c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust    multipleNames("-verbose");
145dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust  }
146dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust
1476734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust  private void i18n1(String bundleName, Locale locale, String expectedString) {
1486734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    ResourceBundle bundle = locale != null ? ResourceBundle.getBundle(bundleName, locale)
1499b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust        : null;
1509b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
1516734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    ArgsI18N1 i18n = new ArgsI18N1();
1529b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust    String[] argv = { "-host", "localhost" };
1539b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust    JCommander jc = new JCommander(i18n, bundle, argv);
15414516e91e6be4ba1c3e7b573ea450e5c59925ecfCedric Beust//    jc.usage();
1559b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
1569b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust    ParameterDescription pd = jc.getParameters().get(0);
1579b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust    Assert.assertEquals(pd.getDescription(), expectedString);
1589b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  }
1599b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
1609b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  public void i18nNoLocale() {
1616734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    i18n1("MessageBundle", null, "Host");
1629b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  }
1639b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
1649b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  public void i18nUsLocale() {
1656734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    i18n1("MessageBundle", new Locale("en", "US"), "Host");
1669b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  }
1679b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
1689b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  public void i18nFrLocale() {
169c27a04a2e10667dff4390b25fa4224b58b291ca0David Gageot    i18n1("MessageBundle", new Locale("fr", "FR"), "Hôte");
1706734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust  }
1716734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust
172b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust  private void i18n2(Object i18n) {
1736734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    String[] argv = { "-host", "localhost" };
1746734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    Locale.setDefault(new Locale("fr", "FR"));
1756734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    JCommander jc = new JCommander(i18n, argv);
1766734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust    ParameterDescription pd = jc.getParameters().get(0);
177c27a04a2e10667dff4390b25fa4224b58b291ca0David Gageot    Assert.assertEquals(pd.getDescription(), "Hôte");
1789b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust  }
1799b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust
180b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust  public void i18nWithResourceAnnotation() {
181b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust    i18n2(new ArgsI18N2());
182b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust  }
183b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust
184b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust  public void i18nWithResourceAnnotationNew() {
185b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust    i18n2(new ArgsI18N2New());
186b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust  }
187b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust
18821059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust  public void noParseConstructor() {
18921059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust    JCommander jCommander = new JCommander(new ArgsMainParameter1());
190b5598e97aa7d22a933223f6211d50329b1a20308Cedric Beust    jCommander.usage(new StringBuilder());
19121059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust    // Before fix, this parse would throw an exception, because it calls createDescription, which
19221059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust    // was already called by usage(), and can only be called once.
19321059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust    jCommander.parse();
19421059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust  }
19521059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust
196dae46a1c4166085b56a78669050dc19938735a41Russell Egan  /**
197dae46a1c4166085b56a78669050dc19938735a41Russell Egan   * Test a use case where there are required parameters, but you still want
198dae46a1c4166085b56a78669050dc19938735a41Russell Egan   * to interrogate the options which are specified.
199dae46a1c4166085b56a78669050dc19938735a41Russell Egan   */
200dae46a1c4166085b56a78669050dc19938735a41Russell Egan  public void usageWithRequiredArgsAndResourceBundle() {
201dae46a1c4166085b56a78669050dc19938735a41Russell Egan    ArgsHelp argsHelp = new ArgsHelp();
20221059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust    JCommander jc = new JCommander(new Object[]{argsHelp, new ArgsRequired()},
20321059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust        java.util.ResourceBundle.getBundle("MessageBundle"));
204dae46a1c4166085b56a78669050dc19938735a41Russell Egan    // Should be able to display usage without triggering validation
205b5598e97aa7d22a933223f6211d50329b1a20308Cedric Beust    jc.usage(new StringBuilder());
206dae46a1c4166085b56a78669050dc19938735a41Russell Egan    try {
207dae46a1c4166085b56a78669050dc19938735a41Russell Egan      jc.parse("-h");
208dae46a1c4166085b56a78669050dc19938735a41Russell Egan      Assert.fail("Should have thrown a required parameter exception");
209dae46a1c4166085b56a78669050dc19938735a41Russell Egan    } catch (ParameterException e) {
210dae46a1c4166085b56a78669050dc19938735a41Russell Egan      Assert.assertTrue(e.getMessage().contains("are required"));
211dae46a1c4166085b56a78669050dc19938735a41Russell Egan    }
212dae46a1c4166085b56a78669050dc19938735a41Russell Egan    Assert.assertTrue(argsHelp.help);
213dae46a1c4166085b56a78669050dc19938735a41Russell Egan  }
214dae46a1c4166085b56a78669050dc19938735a41Russell Egan
215d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust  public void multiObjects() {
216d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust    ArgsMaster m = new ArgsMaster();
217d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust    ArgsSlave s = new ArgsSlave();
218d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust    String[] argv = { "-master", "master", "-slave", "slave" };
219b945b741b5de0510ce39f8c793e31202070ef942Cedric Beust    new JCommander(new Object[] { m , s }, argv);
220d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust
221d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust    Assert.assertEquals(m.master, "master");
222d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust    Assert.assertEquals(s.slave, "slave");
223d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust  }
224d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust
2250c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust  @Test(expectedExceptions = ParameterException.class)
2266734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust  public void multiObjectsWithDuplicatesFail() {
2270c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust    ArgsMaster m = new ArgsMaster();
2280c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust    ArgsSlave s = new ArgsSlaveBogus();
2290c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust    String[] argv = { "-master", "master", "-slave", "slave" };
2300c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust    new JCommander(new Object[] { m , s }, argv);
2310c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust  }
2320c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust
233f3b82e196a622a959374d7588688e74fe852a512Cedric Beust  public void arityString() {
234f3b82e196a622a959374d7588688e74fe852a512Cedric Beust    ArgsArityString args = new ArgsArityString();
235a21262377768de124914e354e428ed6860828949Cedric Beust    String[] argv = { "-pairs", "pair0", "pair1", "rest" };
236a21262377768de124914e354e428ed6860828949Cedric Beust    new JCommander(args, argv);
237a21262377768de124914e354e428ed6860828949Cedric Beust
238a21262377768de124914e354e428ed6860828949Cedric Beust    Assert.assertEquals(args.pairs.size(), 2);
239a21262377768de124914e354e428ed6860828949Cedric Beust    Assert.assertEquals(args.pairs.get(0), "pair0");
240a21262377768de124914e354e428ed6860828949Cedric Beust    Assert.assertEquals(args.pairs.get(1), "pair1");
241a21262377768de124914e354e428ed6860828949Cedric Beust    Assert.assertEquals(args.rest.size(), 1);
242a21262377768de124914e354e428ed6860828949Cedric Beust    Assert.assertEquals(args.rest.get(0), "rest");
243a21262377768de124914e354e428ed6860828949Cedric Beust  }
244a21262377768de124914e354e428ed6860828949Cedric Beust
245f3b82e196a622a959374d7588688e74fe852a512Cedric Beust  @Test(expectedExceptions = ParameterException.class)
246e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  public void arity2Fail() {
247f3b82e196a622a959374d7588688e74fe852a512Cedric Beust    ArgsArityString args = new ArgsArityString();
248f3b82e196a622a959374d7588688e74fe852a512Cedric Beust    String[] argv = { "-pairs", "pair0" };
249f3b82e196a622a959374d7588688e74fe852a512Cedric Beust    new JCommander(args, argv);
250f3b82e196a622a959374d7588688e74fe852a512Cedric Beust  }
251f3b82e196a622a959374d7588688e74fe852a512Cedric Beust
252cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust  @Test(expectedExceptions = ParameterException.class)
253cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust  public void multipleUnparsedFail() {
254cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust    ArgsMultipleUnparsed args = new ArgsMultipleUnparsed();
255cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust    String[] argv = { };
256cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust    new JCommander(args, argv);
257cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust  }
258cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust
2595f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust  public void privateArgs() {
2605f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust    ArgsPrivate args = new ArgsPrivate();
2615f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust    new JCommander(args, "-verbose", "3");
2625f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust    Assert.assertEquals(args.getVerbose().intValue(), 3);
2635f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust  }
2645f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust
2655a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust  public void converterArgs() {
2665a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust    ArgsConverter args = new ArgsConverter();
2675a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust    String fileName = "a";
2687021eade4657caf7ae25b19539bdc135619d248cAngus    new JCommander(args, "-file", "/tmp/" + fileName,
2697021eade4657caf7ae25b19539bdc135619d248cAngus      "-listStrings", "Tuesday,Thursday",
2707021eade4657caf7ae25b19539bdc135619d248cAngus      "-listInts", "-1,8",
2717021eade4657caf7ae25b19539bdc135619d248cAngus      "-listBigDecimals", "-11.52,100.12");
2725a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust    Assert.assertEquals(args.file.getName(), fileName);
2737021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listStrings.size(), 2);
2747021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listStrings.get(0), "Tuesday");
2757021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listStrings.get(1), "Thursday");
2767021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listInts.size(), 2);
2777021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listInts.get(0).intValue(), -1);
2787021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listInts.get(1).intValue(), 8);
2797021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listBigDecimals.size(), 2);
2807021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listBigDecimals.get(0), new BigDecimal("-11.52"));
2817021eade4657caf7ae25b19539bdc135619d248cAngus    Assert.assertEquals(args.listBigDecimals.get(1), new BigDecimal("100.12"));
2825a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust  }
2835a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust
284b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  private void argsBoolean1(String[] params, Boolean expected) {
285d3b9e34aed415eba172befec79d2261c3ac38123Cedric Beust    ArgsBooleanArity args = new ArgsBooleanArity();
286b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    new JCommander(args, params);
287b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    Assert.assertEquals(args.debug, expected);
288b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  }
289b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust
290b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  private void argsBoolean0(String[] params, Boolean expected) {
291b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    ArgsBooleanArity0 args = new ArgsBooleanArity0();
292b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    new JCommander(args, params);
293b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    Assert.assertEquals(args.debug, expected);
294b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  }
295b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust
296b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  public void booleanArity1() {
297b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    argsBoolean1(new String[] {}, Boolean.FALSE);
298b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    argsBoolean1(new String[] { "-debug", "true" }, Boolean.TRUE);
299b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  }
300b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust
301b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust  public void booleanArity0() {
302b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    argsBoolean0(new String[] {}, Boolean.FALSE);
303b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust    argsBoolean0(new String[] { "-debug"}, Boolean.TRUE);
304d3b9e34aed415eba172befec79d2261c3ac38123Cedric Beust  }
305d3b9e34aed415eba172befec79d2261c3ac38123Cedric Beust
3064312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  @Test(expectedExceptions = ParameterException.class)
3074312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  public void badParameterShouldThrowParameter1Exception() {
3084312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    Args1 args = new Args1();
3094312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    String[] argv = { "-log", "foo" };
3104312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    new JCommander(args, argv);
3114312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  }
3124312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust
3134312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  @Test(expectedExceptions = ParameterException.class)
3144312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  public void badParameterShouldThrowParameter2Exception() {
3154312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    Args1 args = new Args1();
3164312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    String[] argv = { "-long", "foo" };
3174312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust    new JCommander(args, argv);
3184312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust  }
3194312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust
320b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust  public void listParameters() {
321b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    Args2 a = new Args2();
322b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    String[] argv = {"-log", "2", "-groups", "unit", "a", "b", "c", "-host", "host2"};
323b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    new JCommander(a, argv);
324b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    Assert.assertEquals(a.verbose.intValue(), 2);
325b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    Assert.assertEquals(a.groups, "unit");
326b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    Assert.assertEquals(a.hosts, Arrays.asList("host2"));
327b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust    Assert.assertEquals(a.parameters, Arrays.asList("a", "b", "c"));
328b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust  }
32985866a95d6479be731596a838b6f5e793a341f5bCedric Beust
330fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  public void separatorEqual() {
331fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    SeparatorEqual s = new SeparatorEqual();
332bc108076cf3dc506d4e87e004d8c2e413b995adaCedric Beust    String[] argv = { "-log=3", "--longoption=10" };
33385866a95d6479be731596a838b6f5e793a341f5bCedric Beust    new JCommander(s, argv);
33485866a95d6479be731596a838b6f5e793a341f5bCedric Beust    Assert.assertEquals(s.log.intValue(), 3);
335bc108076cf3dc506d4e87e004d8c2e413b995adaCedric Beust    Assert.assertEquals(s.longOption.intValue(), 10);
33685866a95d6479be731596a838b6f5e793a341f5bCedric Beust  }
33785866a95d6479be731596a838b6f5e793a341f5bCedric Beust
338fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  public void separatorColon() {
339fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    SeparatorColon s = new SeparatorColon();
340fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    String[] argv = { "-verbose:true" };
341fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    new JCommander(s, argv);
342fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    Assert.assertTrue(s.verbose);
343fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  }
344fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust
345fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  public void separatorBoth() {
346fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    SeparatorColon s = new SeparatorColon();
347fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    SeparatorEqual s2 = new SeparatorEqual();
348fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    String[] argv = { "-verbose:true", "-log=3" };
349fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    new JCommander(new Object[] { s, s2 }, argv);
350fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    Assert.assertTrue(s.verbose);
351fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    Assert.assertEquals(s2.log.intValue(), 3);
352fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  }
353fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust
354fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  public void separatorMixed1() {
355fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    SeparatorMixed s = new SeparatorMixed();
356fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    String[] argv = { "-long:1", "-level=42" };
357fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    new JCommander(s, argv);
358fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    Assert.assertEquals(s.l.longValue(), 1l);
359fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust    Assert.assertEquals(s.level.intValue(), 42);
360fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust  }
361fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust
362426bf32155b30f5c1819a00d88c16944c01e5a52Cedric Beust  public void slashParameters() {
363d556f4a527306a9769776d1cbb2fccac98618bc9Cedric Beust    SlashSeparator a = new SlashSeparator();
364858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust    String[] argv = { "/verbose", "/file", "/tmp/a" };
3655f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust    new JCommander(a, argv);
366d556f4a527306a9769776d1cbb2fccac98618bc9Cedric Beust    Assert.assertTrue(a.verbose);
367d556f4a527306a9769776d1cbb2fccac98618bc9Cedric Beust    Assert.assertEquals(a.file, "/tmp/a");
3685f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust  }
3695f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust
370b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier  public void inheritance() {
371b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier    ArgsInherited args = new ArgsInherited();
372b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier    String[] argv = { "-log", "3", "-child", "2" };
373b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier    new JCommander(args, argv);
374b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier    Assert.assertEquals(args.child.intValue(), 2);
375b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier    Assert.assertEquals(args.log.intValue(), 3);
376b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier  }
377b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier
378858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust  public void negativeNumber() {
379858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust    Args1 a = new Args1();
380858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust    String[] argv = { "-verbose", "-3" };
381858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust    new JCommander(a, argv);
382858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust    Assert.assertEquals(a.verbose.intValue(), -3);
383858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust  }
384858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust
38572cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beust  @Test(expectedExceptions = ParameterException.class)
3865f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust  public void requiredMainParameters() {
38772cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beust    ArgsRequired a = new ArgsRequired();
38872cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beust    String[] argv = {};
38972cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beust    new JCommander(a, argv);
3905f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust  }
3915f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust
392a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust  public void usageShouldNotChange() {
393a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    JCommander jc = new JCommander(new Args1(), new String[]{"-log", "1"});
394a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    StringBuilder sb = new StringBuilder();
395a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    jc.usage(sb);
396a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    String expected = sb.toString();
397a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    jc = new JCommander(new Args1(), new String[]{"-debug", "-log", "2", "-long", "5"});
398a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    sb = new StringBuilder();
399a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    jc.usage(sb);
400a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    String actual = sb.toString();
401a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust    Assert.assertEquals(actual, expected);
402a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust  }
403a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust
4044c020da73b8b25773bba8553263cf1954c718573Cedric Beust  private void verifyCommandOrdering(String[] commandNames, Object[] commands) {
4054c020da73b8b25773bba8553263cf1954c718573Cedric Beust    CommandMain cm = new CommandMain();
4064c020da73b8b25773bba8553263cf1954c718573Cedric Beust    JCommander jc = new JCommander(cm);
4074c020da73b8b25773bba8553263cf1954c718573Cedric Beust
4084c020da73b8b25773bba8553263cf1954c718573Cedric Beust    for (int i = 0; i < commands.length; i++) {
4094c020da73b8b25773bba8553263cf1954c718573Cedric Beust      jc.addCommand(commandNames[i], commands[i]);
4104c020da73b8b25773bba8553263cf1954c718573Cedric Beust    }
4114c020da73b8b25773bba8553263cf1954c718573Cedric Beust
4124c020da73b8b25773bba8553263cf1954c718573Cedric Beust    Map<String, JCommander> c = jc.getCommands();
4134c020da73b8b25773bba8553263cf1954c718573Cedric Beust    Assert.assertEquals(c.size(), commands.length);
4144c020da73b8b25773bba8553263cf1954c718573Cedric Beust
4154c020da73b8b25773bba8553263cf1954c718573Cedric Beust    Iterator<String> it = c.keySet().iterator();
4164c020da73b8b25773bba8553263cf1954c718573Cedric Beust    for (int i = 0; i < commands.length; i++) {
4174c020da73b8b25773bba8553263cf1954c718573Cedric Beust      Assert.assertEquals(it.next(), commandNames[i]);
4184c020da73b8b25773bba8553263cf1954c718573Cedric Beust    }
4194c020da73b8b25773bba8553263cf1954c718573Cedric Beust  }
4204c020da73b8b25773bba8553263cf1954c718573Cedric Beust
4214c020da73b8b25773bba8553263cf1954c718573Cedric Beust  public void commandsShouldBeShownInOrderOfInsertion() {
4224c020da73b8b25773bba8553263cf1954c718573Cedric Beust    verifyCommandOrdering(new String[] { "add", "commit" },
4234c020da73b8b25773bba8553263cf1954c718573Cedric Beust        new Object[] { new CommandAdd(), new CommandCommit() });
4244c020da73b8b25773bba8553263cf1954c718573Cedric Beust    verifyCommandOrdering(new String[] { "commit", "add" },
4254c020da73b8b25773bba8553263cf1954c718573Cedric Beust        new Object[] { new CommandCommit(), new CommandAdd() });
4264c020da73b8b25773bba8553263cf1954c718573Cedric Beust  }
4274c020da73b8b25773bba8553263cf1954c718573Cedric Beust
428e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust  @DataProvider
429e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust  public static Object[][] f() {
430e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust    return new Integer[][] {
431e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust      new Integer[] { 3, 5, 1 },
432e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust      new Integer[] { 3, 8, 1 },
433e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust      new Integer[] { 3, 12, 2 },
434e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust      new Integer[] { 8, 12, 2 },
435e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust      new Integer[] { 9, 10, 1 },
436e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust    };
437e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust  }
438e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust
439460998fec3b06bf45b024c645b5b5e854de68c24Cedric Beust  @Test(expectedExceptions = ParameterException.class)
440e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  public void arity1Fail() {
441e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final Arity1 arguments = new Arity1();
442e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final JCommander jCommander = new JCommander(arguments);
443e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final String[] commands = {
444e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust        "-inspect"
445e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    };
446e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    jCommander.parse(commands);
447e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  }
448e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust
449e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  public void arity1Success1() {
450e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final Arity1 arguments = new Arity1();
451e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final JCommander jCommander = new JCommander(arguments);
452e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final String[] commands = {
453e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust        "-inspect", "true"
454e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    };
455e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    jCommander.parse(commands);
456e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    Assert.assertTrue(arguments.inspect);
457e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  }
458e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust
459e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  public void arity1Success2() {
460e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final Arity1 arguments = new Arity1();
461e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final JCommander jCommander = new JCommander(arguments);
462e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    final String[] commands = {
463e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust        "-inspect", "false"
464e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    };
465e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    jCommander.parse(commands);
466e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust    Assert.assertFalse(arguments.inspect);
467e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust  }
468e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust
469804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  @Parameters(commandDescription = "Help for the given commands.")
470804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  public static class Help {
471804498ec24662928bf06efcee6584d55fca3d898Cedric Beust      public static final String NAME = "help";
472804498ec24662928bf06efcee6584d55fca3d898Cedric Beust
473804498ec24662928bf06efcee6584d55fca3d898Cedric Beust      @Parameter(description = "List of commands.")
474804498ec24662928bf06efcee6584d55fca3d898Cedric Beust      public List<String> commands=new ArrayList<String>();
475804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  }
476804498ec24662928bf06efcee6584d55fca3d898Cedric Beust
477804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  @Test(expectedExceptions = ParameterException.class,
478804498ec24662928bf06efcee6584d55fca3d898Cedric Beust      description = "Verify that the main parameter's type is checked to be a List")
479804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  public void wrongMainTypeShouldThrow() {
480804498ec24662928bf06efcee6584d55fca3d898Cedric Beust    JCommander jc = new JCommander(new ArgsRequiredWrongMain());
481804498ec24662928bf06efcee6584d55fca3d898Cedric Beust    jc.parse(new String[] { "f1", "f2" });
482804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  }
483804498ec24662928bf06efcee6584d55fca3d898Cedric Beust
484c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust  @Test(description = "This used to run out of memory")
485c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust  public void oom() {
486c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust    JCommander jc = new JCommander(new ArgsOutOfMemory());
487c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust    jc.usage(new StringBuilder());
488c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust  }
489c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust
490cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust  @Test
491cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust  public void getParametersShouldNotNpe() {
492cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust    JCommander jc = new JCommander(new Args1());
493cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust    List<ParameterDescription> parameters = jc.getParameters();
494cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust  }
495cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust
496cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust  public void validationShouldWork1() {
497cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust    ArgsValidate1 a = new ArgsValidate1();
498cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust    JCommander jc = new JCommander(a);
499e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust    jc.parse(new String[] { "-age", "2 "});
500e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust    Assert.assertEquals(a.age, new Integer(2));
501e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust  }
502e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust
503e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust  @Test(expectedExceptions = ParameterException.class)
504fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust  public void validationShouldWorkWithDefaultValues() {
505fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust    ArgsValidate2 a = new ArgsValidate2();
506fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust    new JCommander(a);
507fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust  }
508fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust
509fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust  @Test(expectedExceptions = ParameterException.class)
510e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust  public void validationShouldWork2() {
511e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust    ArgsValidate1 a = new ArgsValidate1();
512e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust    JCommander jc = new JCommander(a);
513cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust    jc.parse(new String[] { "-age", "-2 "});
514cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust  }
515cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust
5168877f663e79381340b329180922d7ac448e26317Cedric Beust  public void atFileCanContainEmptyLines() throws IOException {
5178877f663e79381340b329180922d7ac448e26317Cedric Beust    File f = File.createTempFile("JCommander", null);
5188877f663e79381340b329180922d7ac448e26317Cedric Beust    f.deleteOnExit();
5198877f663e79381340b329180922d7ac448e26317Cedric Beust    FileWriter fw = new FileWriter(f);
5208877f663e79381340b329180922d7ac448e26317Cedric Beust    fw.write("-log\n");
5218877f663e79381340b329180922d7ac448e26317Cedric Beust    fw.write("\n");
5228877f663e79381340b329180922d7ac448e26317Cedric Beust    fw.write("2\n");
5238877f663e79381340b329180922d7ac448e26317Cedric Beust    fw.close();
5248877f663e79381340b329180922d7ac448e26317Cedric Beust    new JCommander(new Args1(), "@" + f.getAbsolutePath());
5258877f663e79381340b329180922d7ac448e26317Cedric Beust  }
5268877f663e79381340b329180922d7ac448e26317Cedric Beust
5272ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust  public void handleEqualSigns() {
5282ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust    ArgsEquals a = new ArgsEquals();
5292ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust    JCommander jc = new JCommander(a);
5302ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust    jc.parse(new String[] { "-args=a=b,b=c" });
5312ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust    Assert.assertEquals(a.args, "a=b,b=c");
5322ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust  }
5332ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust
534876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust  @SuppressWarnings("serial")
535876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust  public void handleSets() {
536876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust    ArgsWithSet a = new ArgsWithSet();
537876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust    new JCommander(a, new String[] { "-s", "3,1,2" });
538876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust    Assert.assertEquals(a.set, new TreeSet<Integer>() {{ add(1); add(2); add(3); }});
539876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust  }
540876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust
541c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  private static final List<String> V = Arrays.asList("a", "b", "c", "d");
542c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust
543c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  @DataProvider
544c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  public Object[][] variable() {
545c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust    return new Object[][] {
546c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust        new Object[] { 0, V.subList(0, 0), V },
547c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust        new Object[] { 1, V.subList(0, 1), V.subList(1, 4) },
548c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust        new Object[] { 2, V.subList(0, 2), V.subList(2, 4) },
549c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust        new Object[] { 3, V.subList(0, 3), V.subList(3, 4) },
550c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust        new Object[] { 4, V.subList(0, 4), V.subList(4, 4) },
551c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust    };
552c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  }
553c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust
554c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  @Test(dataProvider = "variable")
555c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  public void variableArity(int count, List<String> var, List<String> main) {
556c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust    VariableArity va = new VariableArity(count);
557c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust    new JCommander(va).parse("-variable", "a", "b", "c", "d");
558c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust    Assert.assertEquals(var, va.var);
559c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust    Assert.assertEquals(main, va.main);
560c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust  }
561c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust
5620638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru  public void enumArgs() {
5630638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru    ArgsEnum args = new ArgsEnum();
5640638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru    String[] argv = { "-choice", "ONE"};
565a3199885e5e515af41a01c4d693bf96f1dafbd67Adrian Muraru    JCommander jc = new JCommander(args, argv);
5660638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru
5670638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru    Assert.assertEquals(args.choice, ArgsEnum.ChoiceType.ONE);
568a3199885e5e515af41a01c4d693bf96f1dafbd67Adrian Muraru
5691322b1a0011d7ac5c15f73a062a0e7b4b0879840Cedric Beust    Assert.assertEquals(jc.getParameters().get(0).getDescription(),
5701322b1a0011d7ac5c15f73a062a0e7b4b0879840Cedric Beust        "Options: " + EnumSet.allOf((Class<? extends Enum>) ArgsEnum.ChoiceType.class));
571a3199885e5e515af41a01c4d693bf96f1dafbd67Adrian Muraru
5720638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru  }
5730638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru
5740638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru  @Test(expectedExceptions = ParameterException.class)
5750638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru  public void enumArgsFail() {
5760638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru    ArgsEnum args = new ArgsEnum();
5770638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru    String[] argv = { "-choice", "A" };
5780638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru    new JCommander(args, argv);
5790638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru  }
5800638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru
5813e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust  public void testListAndSplitters() {
5823e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    ArgsList al = new ArgsList();
5833e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    JCommander j = new JCommander(al);
5843e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    j.parse("-groups", "a,b", "-ints", "41,42", "-hp", "localhost:1000;example.com:1001",
5853e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust        "-hp2", "localhost:1000,example.com:1001", "-uppercase", "ab,cd");
5863e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.groups.get(0), "a");
5873e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.groups.get(1), "b");
5883e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.ints.get(0).intValue(), 41);
5893e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.ints.get(1).intValue(), 42);
5903e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.hostPorts.get(0).host, "localhost");
5913e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.hostPorts.get(0).port.intValue(), 1000);
5923e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.hostPorts.get(1).host, "example.com");
5933e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.hostPorts.get(1).port.intValue(), 1001);
5943e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.hp2.get(1).host, "example.com");
5953e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.hp2.get(1).port.intValue(), 1001);
5963e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.uppercase.get(0), "AB");
5973e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust    Assert.assertEquals(al.uppercase.get(1), "CD");
5983e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust  }
5993e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust
6004ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust  @Test(expectedExceptions = ParameterException.class)
6014ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust  public void shouldThrowIfUnknownOption() {
6024ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust    class A {
6034ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust      @Parameter(names = "-long")
6044ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust      public long l;
6054ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust    }
6064ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust    A a = new A();
6074ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust    new JCommander(a).parse("-lon", "32");
6084ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust  }
6094ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust
610c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust  @Test(expectedExceptions = ParameterException.class)
611c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust  public void mainParameterShouldBeValidate() {
612c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust    class V implements IParameterValidator {
613c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust
614369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust      @Override
615c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust      public void validate(String name, String value) throws ParameterException {
616c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust        Assert.assertEquals("a", value);
617c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust      }
618c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust    }
619c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust
620c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust    class A {
621c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust      @Parameter(validateWith = V.class)
622c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust      public List<String> m;
623c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust    }
624c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust
625c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust    A a = new A();
626c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust    new JCommander(a).parse("b");
627c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust  }
628c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust
6298ad02daa23243bf515009d16205465f1b811da81Cedric Beust  @Parameters(commandNames = { "--configure" })
6308ad02daa23243bf515009d16205465f1b811da81Cedric Beust  public static class ConfigureArgs {
6318ad02daa23243bf515009d16205465f1b811da81Cedric Beust  }
632c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust
6338ad02daa23243bf515009d16205465f1b811da81Cedric Beust  public static class BaseArgs {
6348ad02daa23243bf515009d16205465f1b811da81Cedric Beust    @Parameter(names = { "-h", "--help" }, description = "Show this help screen")
6358ad02daa23243bf515009d16205465f1b811da81Cedric Beust    private boolean help = false;
6367e743acbff5277d087347bfba2409406865af8a0Cedric Beust
6378ad02daa23243bf515009d16205465f1b811da81Cedric Beust    @Parameter(names = { "--version", "-version" }, description = "Show the program version")
6388ad02daa23243bf515009d16205465f1b811da81Cedric Beust    private boolean version;
6398ad02daa23243bf515009d16205465f1b811da81Cedric Beust  }
6408ad02daa23243bf515009d16205465f1b811da81Cedric Beust
6418ad02daa23243bf515009d16205465f1b811da81Cedric Beust  public void commandsWithSamePrefixAsOptionsShouldWork() {
6428ad02daa23243bf515009d16205465f1b811da81Cedric Beust    BaseArgs a = new BaseArgs();
6438ad02daa23243bf515009d16205465f1b811da81Cedric Beust    ConfigureArgs conf = new ConfigureArgs();
6448ad02daa23243bf515009d16205465f1b811da81Cedric Beust    JCommander jc = new JCommander(a);
6458ad02daa23243bf515009d16205465f1b811da81Cedric Beust    jc.addCommand(conf);
6468ad02daa23243bf515009d16205465f1b811da81Cedric Beust    jc.parse("--configure");
6478ad02daa23243bf515009d16205465f1b811da81Cedric Beust  }
6488ad02daa23243bf515009d16205465f1b811da81Cedric Beust
64939e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust  // Tests:
65039e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust  // required unparsed parameter
65139e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust  @Test(enabled = false,
65239e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust      description = "For some reason, this test still asks the password on stdin")
65339e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust  public void askedRequiredPassword() {
65439e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust    class A {
65539e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust        @Parameter(names = { "--password", "-p" }, description = "Private key password",
65639e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust            password = true, required = true)
65739e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust        public String password;
65839e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust
65939e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust        @Parameter(names = { "--port", "-o" }, description = "Port to bind server to",
66039e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust            required = true)
66139e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust        public int port;
66239e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust    }
66339e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust    A a = new A();
66439e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust    InputStream stdin = System.in;
66539e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust    try {
66639e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust      System.setIn(new ByteArrayInputStream("password".getBytes()));
66739e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust      new JCommander(a,new String[]{"--port", "7","--password"});
66839e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust      Assert.assertEquals(a.port, 7);
66939e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust      Assert.assertEquals(a.password, "password");
67039e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust    } finally {
67139e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust      System.setIn(stdin);
6725bbf7af0a020eb6da94be078c80300c19b6d77d4Jason Wheeler    }
67339e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust  }
67439e431ec5e9c2505973a976f62a91e738b85fe4cCedric Beust
6758ebf58f752ae0703b70af57cecfe584968442558Cedric Beust  public void dynamicParameters() {
6768ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    class Command {
6778ebf58f752ae0703b70af57cecfe584968442558Cedric Beust      @DynamicParameter(names = {"-P"}, description = "Additional command parameters")
6788ebf58f752ae0703b70af57cecfe584968442558Cedric Beust      private Map<String, String> params = Maps.newHashMap();
6798ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    }
6808ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    JCommander commander = new JCommander();
6818ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    Command c = new Command();
6828ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    commander.addCommand("command", c);
6838ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    commander.parse(new String[] { "command", "-Pparam='name=value'" });
6848ebf58f752ae0703b70af57cecfe584968442558Cedric Beust    Assert.assertEquals(c.params.get("param"), "'name=value'");
6858ebf58f752ae0703b70af57cecfe584968442558Cedric Beust  }
6868ebf58f752ae0703b70af57cecfe584968442558Cedric Beust
687ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust  public void exeParser() {
688ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust      class Params {
689ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust        @Parameter( names= "-i")
690ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust        private String inputFile;
691ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust      }
692ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust
693ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust      String args[] = { "-i", "" };
694ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust      Params p = new Params();
695ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust      new JCommander(p, args);
696ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust  }
697ca0789ba868746845d31c2ee9e354d8bfbdeca6eCedric Beust
69874664b26b3b9cdaec4a683ec9666828cbc856e44Cedric Beust  public void multiVariableArityList() {
69974664b26b3b9cdaec4a683ec9666828cbc856e44Cedric Beust    class Params {
7005414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust      @Parameter(names = "-paramA", description = "ParamA", variableArity = true)
7015414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust      private List<String> paramA = Lists.newArrayList();
7025414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust
7035414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust      @Parameter(names = "-paramB", description = "ParamB", variableArity = true)
7045414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust      private List<String> paramB = Lists.newArrayList();
7055414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust    }
7065414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust
7079e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    {
7089e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      String args[] = { "-paramA", "a1", "a2", "-paramB", "b1", "b2", "b3" };
7099e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      Params p = new Params();
7109e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      new JCommander(p, args).parse();
7119e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      Assert.assertEquals(p.paramA, Arrays.asList(new String[] { "a1", "a2" }));
7129e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      Assert.assertEquals(p.paramB, Arrays.asList(new String[] { "b1", "b2", "b3" }));
7139e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    }
7149e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust
7159e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    {
7169e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      String args[] = { "-paramA", "a1", "a2", "-paramB", "b1", "-paramA", "a3" };
7179e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      Params p = new Params();
7189e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      new JCommander(p, args).parse();
7199e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      Assert.assertEquals(p.paramA, Arrays.asList(new String[] { "a1", "a2", "a3" }));
7209e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      Assert.assertEquals(p.paramB, Arrays.asList(new String[] { "b1" }));
7219e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    }
7225414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust  }
7235414de6562cc1a597c0d522fc4889e0f4136306cCedric Beust
72461e65090c5495518a9a521149dbecbd17e1df193Cedric Beust  @Test(enabled = false,
72561e65090c5495518a9a521149dbecbd17e1df193Cedric Beust      description = "Need to double check that the command description is i18n'ed in the usage")
72661e65090c5495518a9a521149dbecbd17e1df193Cedric Beust  public void commandKey() {
72761e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    @Parameters(resourceBundle = "MessageBundle", commandDescriptionKey = "command")
72861e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    class Args {
72961e65090c5495518a9a521149dbecbd17e1df193Cedric Beust      @Parameter(names="-myoption", descriptionKey="myoption")
73061e65090c5495518a9a521149dbecbd17e1df193Cedric Beust      private boolean option;
73161e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    }
73261e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    JCommander j = new JCommander();
73361e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    Args a = new Args();
73461e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    j.addCommand("comm", a);
73561e65090c5495518a9a521149dbecbd17e1df193Cedric Beust    j.usage();
73661e65090c5495518a9a521149dbecbd17e1df193Cedric Beust  }
73761e65090c5495518a9a521149dbecbd17e1df193Cedric Beust
7389e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust  public void tmp() {
7399e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    class A {
7409e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      @Parameter(names = "-b")
7419e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      public String b;
7429e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    }
7439e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    new JCommander(new A()).parse("");
7449e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust  }
7459e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust
7469e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust  public void unknownOptionWithDifferentPrefix() {
7479e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    @Parameters(optionPrefixes = "/")
7489e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    class SlashSeparator {
7499e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust
7509e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust     @Parameter(names = "/verbose")
7519e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust     public boolean verbose = false;
7529e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust
7539e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust     @Parameter(names = "/file")
7549e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust     public String file;
7559e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    }
7569e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    SlashSeparator ss = new SlashSeparator();
7579e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    try {
7589e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      new JCommander(ss).parse("/notAParam");
7599e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    } catch (ParameterException ex) {
7609e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      boolean result = ex.getMessage().contains("Unknown option");
7619e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust      Assert.assertTrue(result);
7629e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust    }
7639e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust  }
7649e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust
7659c2bd65ecd9779540bfde5a200ff71d1d503839cCedric Beust  public void equalSeparator() {
7669c2bd65ecd9779540bfde5a200ff71d1d503839cCedric Beust    @Parameters(separators = "=", commandDescription = "My command")
7679c2bd65ecd9779540bfde5a200ff71d1d503839cCedric Beust    class MyClass {
768074b8af3781fbc976f01b43bc3fa0d8ef0431599Cedric Beust
769074b8af3781fbc976f01b43bc3fa0d8ef0431599Cedric Beust       @Parameter(names = { "-p", "--param" }, required = true, description = "param desc...")
7709c2bd65ecd9779540bfde5a200ff71d1d503839cCedric Beust       private String param;
7719c2bd65ecd9779540bfde5a200ff71d1d503839cCedric Beust    }
7729c2bd65ecd9779540bfde5a200ff71d1d503839cCedric Beust    MyClass c = new MyClass();
773074b8af3781fbc976f01b43bc3fa0d8ef0431599Cedric Beust    String expected = "\"hello\"world";
7749c2bd65ecd9779540bfde5a200ff71d1d503839cCedric Beust    new JCommander(c).parse("--param=" + expected);
775074b8af3781fbc976f01b43bc3fa0d8ef0431599Cedric Beust    Assert.assertEquals(expected, c.param);
7769c2bd65ecd9779540bfde5a200ff71d1d503839cCedric Beust  }
7779c2bd65ecd9779540bfde5a200ff71d1d503839cCedric Beust
778369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust  public void simpleArgsSetter() throws ParseException {
779369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    Args1Setter args = new Args1Setter();
780369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    String[] argv = { "-debug", "-log", "2", "-float", "1.2", "-double", "1.3", "-bigdecimal", "1.4",
781369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust            "-date", "2011-10-26", "-groups", "unit", "a", "b", "c" };
782369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    new JCommander(args, argv);
783369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust
784369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    Assert.assertTrue(args.debug);
785369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    Assert.assertEquals(args.verbose.intValue(), 2);
786369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    Assert.assertEquals(args.groups, "unit");
787369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    Assert.assertEquals(args.parameters, Arrays.asList("a", "b", "c"));
788369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    Assert.assertEquals(args.floa, 1.2f, 0.1f);
789369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    Assert.assertEquals(args.doub, 1.3f, 0.1f);
790369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    Assert.assertEquals(args.bigd, new BigDecimal("1.4"));
791369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust    Assert.assertEquals(args.date, new SimpleDateFormat("yyyy-MM-dd").parse("2011-10-26"));
792369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust  }
793369d387138b6da9e77e01d82273ef6271580eb47Cedric Beust
794c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust  public void verifyHelp() {
795c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust    class Arg {
796c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust      @Parameter(names = "--help", help = true)
797c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust      public boolean help = false;
798c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust
799c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust      @Parameter(names = "file", required = true)
800c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust      public String file;
801c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust    }
802c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust    Arg arg = new Arg();
803c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust    String[] argv = { "--help" };
804c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust    new JCommander(arg, argv);
805c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust
806c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust    Assert.assertTrue(arg.help);
807c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust  }
808c675ef5201552ed809a1cb12e18f2fc3e25a7c9aCedric Beust
80994e08e73342f858518b14a70624c38479c0365d3Cedric Beust  public void helpTest() {
81094e08e73342f858518b14a70624c38479c0365d3Cedric Beust    class Arg {
81194e08e73342f858518b14a70624c38479c0365d3Cedric Beust      @Parameter(names = { "?", "-help", "--help" }, description = "Shows help", help = true)
81294e08e73342f858518b14a70624c38479c0365d3Cedric Beust      private boolean help = false;
81394e08e73342f858518b14a70624c38479c0365d3Cedric Beust    }
81494e08e73342f858518b14a70624c38479c0365d3Cedric Beust    Arg arg = new Arg();
81594e08e73342f858518b14a70624c38479c0365d3Cedric Beust    JCommander jc = new JCommander(arg);
81694e08e73342f858518b14a70624c38479c0365d3Cedric Beust    jc.parse(new String[] { "-help" });
8171322b1a0011d7ac5c15f73a062a0e7b4b0879840Cedric Beust//    System.out.println("helpTest:" + arg.help);
81894e08e73342f858518b14a70624c38479c0365d3Cedric Beust  }
81994e08e73342f858518b14a70624c38479c0365d3Cedric Beust
82094e08e73342f858518b14a70624c38479c0365d3Cedric Beust  @Test(enabled = false, description = "Should only be enable once multiple parameters are allowed")
82194e08e73342f858518b14a70624c38479c0365d3Cedric Beust  public void duplicateParameterNames() {
82294e08e73342f858518b14a70624c38479c0365d3Cedric Beust    class ArgBase {
82394e08e73342f858518b14a70624c38479c0365d3Cedric Beust      @Parameter(names = { "-host" })
82494e08e73342f858518b14a70624c38479c0365d3Cedric Beust      protected String host;
82594e08e73342f858518b14a70624c38479c0365d3Cedric Beust    }
82694e08e73342f858518b14a70624c38479c0365d3Cedric Beust
82794e08e73342f858518b14a70624c38479c0365d3Cedric Beust    class Arg1 extends ArgBase {}
82894e08e73342f858518b14a70624c38479c0365d3Cedric Beust    Arg1 arg1 = new Arg1();
82994e08e73342f858518b14a70624c38479c0365d3Cedric Beust
83094e08e73342f858518b14a70624c38479c0365d3Cedric Beust    class Arg2 extends ArgBase {}
83194e08e73342f858518b14a70624c38479c0365d3Cedric Beust    Arg2 arg2 = new Arg2();
83294e08e73342f858518b14a70624c38479c0365d3Cedric Beust
83394e08e73342f858518b14a70624c38479c0365d3Cedric Beust    JCommander jc = new JCommander(new Object[] { arg1, arg2});
83494e08e73342f858518b14a70624c38479c0365d3Cedric Beust    jc.parse(new String[] { "-host", "foo" });
83594e08e73342f858518b14a70624c38479c0365d3Cedric Beust    Assert.assertEquals(arg1.host, "foo");
83694e08e73342f858518b14a70624c38479c0365d3Cedric Beust    Assert.assertEquals(arg2.host, "foo");
83794e08e73342f858518b14a70624c38479c0365d3Cedric Beust  }
83894e08e73342f858518b14a70624c38479c0365d3Cedric Beust
83994e08e73342f858518b14a70624c38479c0365d3Cedric Beust  public void parameterWithOneDoubleQuote() {
84094e08e73342f858518b14a70624c38479c0365d3Cedric Beust    @Parameters(separators = "=")
84194e08e73342f858518b14a70624c38479c0365d3Cedric Beust    class Arg {
84294e08e73342f858518b14a70624c38479c0365d3Cedric Beust      @Parameter(names = { "-p", "--param" })
84394e08e73342f858518b14a70624c38479c0365d3Cedric Beust      private String param;
84494e08e73342f858518b14a70624c38479c0365d3Cedric Beust    }
84594e08e73342f858518b14a70624c38479c0365d3Cedric Beust    JCommander jc = new JCommander(new MyClass());
84694e08e73342f858518b14a70624c38479c0365d3Cedric Beust    jc.parse("-p=\"");
84794e08e73342f858518b14a70624c38479c0365d3Cedric Beust  }
84894e08e73342f858518b14a70624c38479c0365d3Cedric Beust
849e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust  public void emptyStringAsDefault() {
850e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust    class Arg {
851e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust      @Parameter(names = "-x")
852e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust      String s = "";
853e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust    }
854e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust    Arg a = new Arg();
855e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust    StringBuilder sb = new StringBuilder();
856e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust    new JCommander(a).usage(sb);
857e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust    Assert.assertTrue(sb.toString().contains("Default: <empty string>"));
858e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust  }
859e79760c8a3806df3369adcbaa4dbaeceb93f9a65Cedric Beust
860f19232f69a08b3fc0242b91ea0095b47f5fad44bCedric Beust  public void spaces() {
861f19232f69a08b3fc0242b91ea0095b47f5fad44bCedric Beust    class Arg {
862f19232f69a08b3fc0242b91ea0095b47f5fad44bCedric Beust      @Parameter(names = "-rule", description = "rule")
863f19232f69a08b3fc0242b91ea0095b47f5fad44bCedric Beust      private List<String> rules = new ArrayList<String>();
864f19232f69a08b3fc0242b91ea0095b47f5fad44bCedric Beust    }
865f19232f69a08b3fc0242b91ea0095b47f5fad44bCedric Beust    Arg a = new Arg();
866f19232f69a08b3fc0242b91ea0095b47f5fad44bCedric Beust    new JCommander(a, "-rule", "some test");
867f19232f69a08b3fc0242b91ea0095b47f5fad44bCedric Beust    Assert.assertEquals(a.rules, Arrays.asList("some test"));
868f19232f69a08b3fc0242b91ea0095b47f5fad44bCedric Beust  }
869f19232f69a08b3fc0242b91ea0095b47f5fad44bCedric Beust
8705377e48b0f7b1b77aa9d546313b11767559068deCedric Beust  static class V2 implements IParameterValidator2 {
8715377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    final static List<String> names =  Lists.newArrayList();
8725377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    static boolean validateCalled = false;
8735377e48b0f7b1b77aa9d546313b11767559068deCedric Beust
8745377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    @Override
8755377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    public void validate(String name, String value) throws ParameterException {
8765377e48b0f7b1b77aa9d546313b11767559068deCedric Beust      validateCalled = true;
8775377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    }
8785377e48b0f7b1b77aa9d546313b11767559068deCedric Beust
8795377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    @Override
8805377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    public void validate(String name, String value, ParameterDescription pd)
8815377e48b0f7b1b77aa9d546313b11767559068deCedric Beust        throws ParameterException {
8825377e48b0f7b1b77aa9d546313b11767559068deCedric Beust      names.addAll(Arrays.asList(pd.getParameter().names()));
8835377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    }
8845377e48b0f7b1b77aa9d546313b11767559068deCedric Beust  }
8855377e48b0f7b1b77aa9d546313b11767559068deCedric Beust
8865377e48b0f7b1b77aa9d546313b11767559068deCedric Beust  public void validator2() {
8875377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    class Arg {
8885377e48b0f7b1b77aa9d546313b11767559068deCedric Beust      @Parameter(names = { "-h", "--host" }, validateWith = V2.class)
8895377e48b0f7b1b77aa9d546313b11767559068deCedric Beust      String host;
8905377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    }
8915377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    Arg a = new Arg();
8925377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    V2.names.clear();
8935377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    V2.validateCalled = false;
894c421118d3104c0594dbe207c8443e51022422d32Cedric Beust    JCommander jc = new JCommander(a, "--host", "h");
895406904b81e91c3160646388b26f7c167fa7dd3eaCedric Beust    jc.setAcceptUnknownOptions(true);
8965377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    Assert.assertEquals(V2.names, Arrays.asList(new String[] { "-h", "--host" }));
8975377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    Assert.assertTrue(V2.validateCalled);
8985377e48b0f7b1b77aa9d546313b11767559068deCedric Beust  }
899c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin
900c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin  public void usageCommandsUnderUsage() {
901c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    class Arg {
902c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    }
903c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    @Parameters(commandDescription = "command a")
904c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    class ArgCommandA {
905c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin      @Parameter(description = "command a parameters")
906c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin      List<String> parameters;
907c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    }
908c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    @Parameters(commandDescription = "command b")
909c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    class ArgCommandB {
910c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin      @Parameter(description = "command b parameters")
911c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin      List<String> parameters;
912c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    }
913c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin
914c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    Arg a = new Arg();
915c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin
916c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    JCommander c = new JCommander(a);
917c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    c.addCommand("a", new ArgCommandA());
918c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    c.addCommand("b", new ArgCommandB());
919c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin
920c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    StringBuilder sb = new StringBuilder();
921c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    c.usage(sb);
922c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    Assert.assertTrue(sb.toString().contains("[command options]\n  Commands:"));
923c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin  }
924c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin
925c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin  public void usageWithEmpytLine() {
926c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    class Arg {
927c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    }
928c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    @Parameters(commandDescription = "command a")
929c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    class ArgCommandA {
930c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin      @Parameter(description = "command a parameters")
931c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin      List<String> parameters;
932c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    }
933c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    @Parameters(commandDescription = "command b")
934c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    class ArgCommandB {
935c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin      @Parameter(description = "command b parameters")
936c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin      List<String> parameters;
937c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    }
938c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin
939c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    Arg a = new Arg();
940c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin
941c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    JCommander c = new JCommander(a);
942c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    c.addCommand("a", new ArgCommandA());
943c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    c.addCommand("b", new ArgCommandB());
944c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin
945c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    StringBuilder sb = new StringBuilder();
946c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    c.usage(sb);
947c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin    Assert.assertTrue(sb.toString().contains("command a parameters\n\n    b"));
948c36c84f608a9a0f3877b37e2889bff6d8a1da88dSergey Tyurin  }
9495377e48b0f7b1b77aa9d546313b11767559068deCedric Beust
950c421118d3104c0594dbe207c8443e51022422d32Cedric Beust  public void partialValidation() {
951c421118d3104c0594dbe207c8443e51022422d32Cedric Beust    class Arg {
952c421118d3104c0594dbe207c8443e51022422d32Cedric Beust      @Parameter(names = { "-h", "--host" })
953c421118d3104c0594dbe207c8443e51022422d32Cedric Beust      String host;
954c421118d3104c0594dbe207c8443e51022422d32Cedric Beust    }
955c421118d3104c0594dbe207c8443e51022422d32Cedric Beust    Arg a = new Arg();
956c421118d3104c0594dbe207c8443e51022422d32Cedric Beust    JCommander jc = new JCommander();
957406904b81e91c3160646388b26f7c167fa7dd3eaCedric Beust    jc.setAcceptUnknownOptions(true);
958c421118d3104c0594dbe207c8443e51022422d32Cedric Beust    jc.addObject(a);
959c421118d3104c0594dbe207c8443e51022422d32Cedric Beust    jc.parse("-a", "foo", "-h", "host");
960c421118d3104c0594dbe207c8443e51022422d32Cedric Beust    Assert.assertEquals(a.host, "host");
961c421118d3104c0594dbe207c8443e51022422d32Cedric Beust    Assert.assertEquals(jc.getUnknownArgs(), Lists.newArrayList("-a", "foo"));
962c421118d3104c0594dbe207c8443e51022422d32Cedric Beust  }
963c421118d3104c0594dbe207c8443e51022422d32Cedric Beust
9648ad02daa23243bf515009d16205465f1b811da81Cedric Beust  @Test(enabled = false)
9658ad02daa23243bf515009d16205465f1b811da81Cedric Beust  public static void main(String[] args) throws Exception {
9665377e48b0f7b1b77aa9d546313b11767559068deCedric Beust    new JCommanderTest().parameterWithOneDoubleQuote();
9678ad02daa23243bf515009d16205465f1b811da81Cedric Beust//    class A {
9689e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust//      @Parameter(names = "-short", required = true)
9698ad02daa23243bf515009d16205465f1b811da81Cedric Beust//      List<String> parameters;
9708ad02daa23243bf515009d16205465f1b811da81Cedric Beust//
9719e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust//      @Parameter(names = "-long", required = true)
9728ad02daa23243bf515009d16205465f1b811da81Cedric Beust//      public long l;
9738ad02daa23243bf515009d16205465f1b811da81Cedric Beust//    }
9748ad02daa23243bf515009d16205465f1b811da81Cedric Beust//    A a = new A();
9759e22cffb2d22829cb5e2d1bf4d64d87df69d2983Cedric Beust//    new JCommander(a).parse();
9764ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    System.out.println(a.l);
9774ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    System.out.println(a.parameters);
9784ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    ArgsList al = new ArgsList();
9794ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    JCommander j = new JCommander(al);
9804ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    j.setColumnSize(40);
9814ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    j.usage();
9824ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    new JCommanderTest().testListAndSplitters();
9834ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust//    new JCommanderTest().converterArgs();
984804498ec24662928bf06efcee6584d55fca3d898Cedric Beust  }
985c3e28e12136391968250719b1627b6b4eaa196cdCedric Beust
986c3e28e12136391968250719b1627b6b4eaa196cdCedric Beust  // Tests:
987c3e28e12136391968250719b1627b6b4eaa196cdCedric Beust  // required unparsed parameter
988e9229f961b3a5799f6798369afe26dec7960249Cedric Beust}
989