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