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