JCommanderTest.java revision 7e743acbff5277d087347bfba2409406865af8a0
158a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust/** 258a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * Copyright (C) 2010 the original author or authors. 358a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * See the notice.md file distributed with this work for additional 458a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * information regarding copyright ownership. 558a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * 658a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * Licensed under the Apache License, Version 2.0 (the "License"); 758a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * you may not use this file except in compliance with the License. 858a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * You may obtain a copy of the License at 958a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * 1058a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * http://www.apache.org/licenses/LICENSE-2.0 1158a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * 1258a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * Unless required by applicable law or agreed to in writing, software 1358a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * distributed under the License is distributed on an "AS IS" BASIS, 1458a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1558a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * See the License for the specific language governing permissions and 1658a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust * limitations under the License. 1758a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust */ 1858a4af720c30d8dba072a96e3713577c8d30aeaeCedric Beust 19e9229f961b3a5799f6798369afe26dec7960249Cedric Beustpackage com.beust.jcommander; 20e9229f961b3a5799f6798369afe26dec7960249Cedric Beust 21103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.Args1; 22103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.Args2; 23103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsArityString; 24103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsBooleanArity; 25b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beustimport com.beust.jcommander.args.ArgsBooleanArity0; 26103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsConverter; 270638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraruimport com.beust.jcommander.args.ArgsEnum; 282ee07bc8765f4873b69423e6185120d176c49a2bCedric Beustimport com.beust.jcommander.args.ArgsEquals; 29b5598e97aa7d22a933223f6211d50329b1a20308Cedric Beustimport com.beust.jcommander.args.ArgsHelp; 30103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsI18N1; 31103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsI18N2; 32103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsI18N2New; 33b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthierimport com.beust.jcommander.args.ArgsInherited; 343e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beustimport com.beust.jcommander.args.ArgsList; 35f2cd60c1f0e475201b9d24b486df920ff1d02ac5Russell Eganimport com.beust.jcommander.args.ArgsMainParameter1; 36103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsMaster; 37103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsMultipleUnparsed; 38c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beustimport com.beust.jcommander.args.ArgsOutOfMemory; 39103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsPrivate; 4072cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beustimport com.beust.jcommander.args.ArgsRequired; 41103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsSlave; 42103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.ArgsSlaveBogus; 43cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beustimport com.beust.jcommander.args.ArgsValidate1; 44876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beustimport com.beust.jcommander.args.ArgsWithSet; 45e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beustimport com.beust.jcommander.args.Arity1; 46103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.SeparatorColon; 47103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.SeparatorEqual; 48103fe3e72907f6f221dda8688e6e6d1b69ddeb73Cedric Beustimport com.beust.jcommander.args.SeparatorMixed; 49d556f4a527306a9769776d1cbb2fccac98618bc9Cedric Beustimport com.beust.jcommander.args.SlashSeparator; 50c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beustimport com.beust.jcommander.args.VariableArity; 51dda1651c0b74aa9e8d225096f1d531871460e692Cedric Beustimport com.beust.jcommander.command.CommandAdd; 52dda1651c0b74aa9e8d225096f1d531871460e692Cedric Beustimport com.beust.jcommander.command.CommandCommit; 53dda1651c0b74aa9e8d225096f1d531871460e692Cedric Beustimport com.beust.jcommander.command.CommandMain; 54eca9dc8ab293c10f16a104e107b402b61c4c76deCedric Beust 55b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beustimport org.testng.Assert; 56b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beustimport org.testng.annotations.DataProvider; 57b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beustimport org.testng.annotations.Test; 58b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust 598877f663e79381340b329180922d7ac448e26317Cedric Beustimport java.io.File; 608877f663e79381340b329180922d7ac448e26317Cedric Beustimport java.io.FileWriter; 618877f663e79381340b329180922d7ac448e26317Cedric Beustimport java.io.IOException; 62041bdac9067d4ce9c936ff1c0ae3856f2e240f15Angusimport java.math.BigDecimal; 63f923ee57617c8690d293909c53a4e109a8c2ba26Angusimport java.text.ParseException; 64f923ee57617c8690d293909c53a4e109a8c2ba26Angusimport java.text.SimpleDateFormat; 65804498ec24662928bf06efcee6584d55fca3d898Cedric Beustimport java.util.ArrayList; 66e9229f961b3a5799f6798369afe26dec7960249Cedric Beustimport java.util.Arrays; 674c020da73b8b25773bba8553263cf1954c718573Cedric Beustimport java.util.Iterator; 68804498ec24662928bf06efcee6584d55fca3d898Cedric Beustimport java.util.List; 699b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beustimport java.util.Locale; 704c020da73b8b25773bba8553263cf1954c718573Cedric Beustimport java.util.Map; 719b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beustimport java.util.ResourceBundle; 72876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beustimport java.util.TreeSet; 73e9229f961b3a5799f6798369afe26dec7960249Cedric Beust 74460998fec3b06bf45b024c645b5b5e854de68c24Cedric Beust@Test 75e9229f961b3a5799f6798369afe26dec7960249Cedric Beustpublic class JCommanderTest { 76f923ee57617c8690d293909c53a4e109a8c2ba26Angus public void simpleArgs() throws ParseException { 7794fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust Args1 args = new Args1(); 78041bdac9067d4ce9c936ff1c0ae3856f2e240f15Angus String[] argv = { "-debug", "-log", "2", "-float", "1.2", "-double", "1.3", "-bigdecimal", "1.4", 79f923ee57617c8690d293909c53a4e109a8c2ba26Angus "-date", "2011-10-26", "-groups", "unit", "a", "b", "c" }; 8094fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust new JCommander(args, argv); 81e9229f961b3a5799f6798369afe26dec7960249Cedric Beust 82cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust Assert.assertTrue(args.debug); 8394fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust Assert.assertEquals(args.verbose.intValue(), 2); 8494fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust Assert.assertEquals(args.groups, "unit"); 8594fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust Assert.assertEquals(args.parameters, Arrays.asList("a", "b", "c")); 8636e3614a3ebf663c723e94f30b873194d33a29d1Cedric Beust Assert.assertEquals(args.floa, 1.2f, 0.1f); 8736e3614a3ebf663c723e94f30b873194d33a29d1Cedric Beust Assert.assertEquals(args.doub, 1.3f, 0.1f); 88041bdac9067d4ce9c936ff1c0ae3856f2e240f15Angus Assert.assertEquals(args.bigd, new BigDecimal("1.4")); 89f923ee57617c8690d293909c53a4e109a8c2ba26Angus Assert.assertEquals(args.date, new SimpleDateFormat("yyyy-MM-dd").parse("2011-10-26")); 90e9229f961b3a5799f6798369afe26dec7960249Cedric Beust } 91696418a94157048544c44f405d757ede86eec926Cedric Beust 92696418a94157048544c44f405d757ede86eec926Cedric Beust /** 93696418a94157048544c44f405d757ede86eec926Cedric Beust * Make sure that if there are args with multiple names (e.g. "-log" and "-verbose"), 94696418a94157048544c44f405d757ede86eec926Cedric Beust * the usage will only display it once. 95696418a94157048544c44f405d757ede86eec926Cedric Beust */ 96696418a94157048544c44f405d757ede86eec926Cedric Beust public void repeatedArgs() { 9794fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust Args1 args = new Args1(); 98696418a94157048544c44f405d757ede86eec926Cedric Beust String[] argv = { "-log", "2" }; 9994fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust JCommander jc = new JCommander(args, argv); 100f923ee57617c8690d293909c53a4e109a8c2ba26Angus Assert.assertEquals(jc.getParameters().size(), 8); 101696418a94157048544c44f405d757ede86eec926Cedric Beust } 102696418a94157048544c44f405d757ede86eec926Cedric Beust 103dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust /** 104dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust * Not specifying a required option should throw an exception. 105dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust */ 106dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust @Test(expectedExceptions = ParameterException.class) 1076734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust public void requiredFields1Fail() { 10894fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust Args1 args = new Args1(); 109dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust String[] argv = { "-debug" }; 11094fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust new JCommander(args, argv); 111dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust } 112dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust 113dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust /** 114e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust * Getting the description of a nonexistent command should throw an exception. 115e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust */ 116e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust @Test(expectedExceptions = ParameterException.class) 117e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust public void nonexistentCommandShouldThrow() { 118e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust String[] argv = { }; 119e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust JCommander jc = new JCommander(new Object(), argv); 120e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust jc.getCommandDescription("foo"); 121e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust } 122e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust 123e2d8da7b584b6a13c23de32ce2df0799a4d3513dCedric Beust /** 124dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust * Required options with multiple names should work with all names. 125dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust */ 126c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust private void multipleNames(String option) { 12794fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust Args1 args = new Args1(); 128c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust String[] argv = { option, "2" }; 12994fca5e6d4506c5b070b17db4063ad360a85d8fcCedric Beust new JCommander(args, argv); 130c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust Assert.assertEquals(args.verbose.intValue(), 2); 131c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust } 1320638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru 133c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust public void multipleNames1() { 134c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust multipleNames("-log"); 135dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust } 136dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust 137c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust public void multipleNames2() { 138c2559dfb9a77c3c8223c5cfb1eac5cc6bbba488eCedric Beust multipleNames("-verbose"); 139dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust } 140dc76d5707bd6f5b761772203e9d7c285846e8362Cedric Beust 1416734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust private void i18n1(String bundleName, Locale locale, String expectedString) { 1426734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust ResourceBundle bundle = locale != null ? ResourceBundle.getBundle(bundleName, locale) 1439b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust : null; 1449b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust 1456734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust ArgsI18N1 i18n = new ArgsI18N1(); 1469b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust String[] argv = { "-host", "localhost" }; 1479b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust JCommander jc = new JCommander(i18n, bundle, argv); 14814516e91e6be4ba1c3e7b573ea450e5c59925ecfCedric Beust// jc.usage(); 1499b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust 1509b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust ParameterDescription pd = jc.getParameters().get(0); 1519b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust Assert.assertEquals(pd.getDescription(), expectedString); 1529b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust } 1539b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust 1549b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust public void i18nNoLocale() { 1556734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust i18n1("MessageBundle", null, "Host"); 1569b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust } 1579b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust 1589b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust public void i18nUsLocale() { 1596734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust i18n1("MessageBundle", new Locale("en", "US"), "Host"); 1609b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust } 1619b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust 1629b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust public void i18nFrLocale() { 163c27a04a2e10667dff4390b25fa4224b58b291ca0David Gageot i18n1("MessageBundle", new Locale("fr", "FR"), "Hôte"); 1646734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust } 1656734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust 166b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust private void i18n2(Object i18n) { 1676734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust String[] argv = { "-host", "localhost" }; 1686734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust Locale.setDefault(new Locale("fr", "FR")); 1696734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust JCommander jc = new JCommander(i18n, argv); 1706734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust ParameterDescription pd = jc.getParameters().get(0); 171c27a04a2e10667dff4390b25fa4224b58b291ca0David Gageot Assert.assertEquals(pd.getDescription(), "Hôte"); 1729b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust } 1739b9a740c04d97ccbb5c643e55775cf9e9e6fc2d7Cedric Beust 174b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust public void i18nWithResourceAnnotation() { 175b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust i18n2(new ArgsI18N2()); 176b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust } 177b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust 178b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust public void i18nWithResourceAnnotationNew() { 179b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust i18n2(new ArgsI18N2New()); 180b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust } 181b8010b01b766d131076f7343be5e36e7014319e3Cedric Beust 18221059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust public void noParseConstructor() { 18321059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust JCommander jCommander = new JCommander(new ArgsMainParameter1()); 184b5598e97aa7d22a933223f6211d50329b1a20308Cedric Beust jCommander.usage(new StringBuilder()); 18521059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust // Before fix, this parse would throw an exception, because it calls createDescription, which 18621059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust // was already called by usage(), and can only be called once. 18721059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust jCommander.parse(); 18821059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust } 18921059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust 190dae46a1c4166085b56a78669050dc19938735a41Russell Egan /** 191dae46a1c4166085b56a78669050dc19938735a41Russell Egan * Test a use case where there are required parameters, but you still want 192dae46a1c4166085b56a78669050dc19938735a41Russell Egan * to interrogate the options which are specified. 193dae46a1c4166085b56a78669050dc19938735a41Russell Egan */ 194dae46a1c4166085b56a78669050dc19938735a41Russell Egan public void usageWithRequiredArgsAndResourceBundle() { 195dae46a1c4166085b56a78669050dc19938735a41Russell Egan ArgsHelp argsHelp = new ArgsHelp(); 19621059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust JCommander jc = new JCommander(new Object[]{argsHelp, new ArgsRequired()}, 19721059374aa90082d8d0b94c758a0041c2c6b06deCedric Beust java.util.ResourceBundle.getBundle("MessageBundle")); 198dae46a1c4166085b56a78669050dc19938735a41Russell Egan // Should be able to display usage without triggering validation 199b5598e97aa7d22a933223f6211d50329b1a20308Cedric Beust jc.usage(new StringBuilder()); 200dae46a1c4166085b56a78669050dc19938735a41Russell Egan try { 201dae46a1c4166085b56a78669050dc19938735a41Russell Egan jc.parse("-h"); 202dae46a1c4166085b56a78669050dc19938735a41Russell Egan Assert.fail("Should have thrown a required parameter exception"); 203dae46a1c4166085b56a78669050dc19938735a41Russell Egan } catch (ParameterException e) { 204dae46a1c4166085b56a78669050dc19938735a41Russell Egan Assert.assertTrue(e.getMessage().contains("are required")); 205dae46a1c4166085b56a78669050dc19938735a41Russell Egan } 206dae46a1c4166085b56a78669050dc19938735a41Russell Egan Assert.assertTrue(argsHelp.help); 207dae46a1c4166085b56a78669050dc19938735a41Russell Egan } 208dae46a1c4166085b56a78669050dc19938735a41Russell Egan 209d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust public void multiObjects() { 210d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust ArgsMaster m = new ArgsMaster(); 211d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust ArgsSlave s = new ArgsSlave(); 212d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust String[] argv = { "-master", "master", "-slave", "slave" }; 213b945b741b5de0510ce39f8c793e31202070ef942Cedric Beust new JCommander(new Object[] { m , s }, argv); 214d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust 215d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust Assert.assertEquals(m.master, "master"); 216d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust Assert.assertEquals(s.slave, "slave"); 217d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust } 218d4e3897873895131ae5ebef4e9552b15a9e804ddCedric Beust 2190c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust @Test(expectedExceptions = ParameterException.class) 2206734de3a3b73ec9fe6bbfe4f8ba1da9f57264587Cedric Beust public void multiObjectsWithDuplicatesFail() { 2210c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust ArgsMaster m = new ArgsMaster(); 2220c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust ArgsSlave s = new ArgsSlaveBogus(); 2230c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust String[] argv = { "-master", "master", "-slave", "slave" }; 2240c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust new JCommander(new Object[] { m , s }, argv); 2250c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust } 2260c0b2226295308797b486e7dcc81d10497ad4886Cedric Beust 227f3b82e196a622a959374d7588688e74fe852a512Cedric Beust public void arityString() { 228f3b82e196a622a959374d7588688e74fe852a512Cedric Beust ArgsArityString args = new ArgsArityString(); 229a21262377768de124914e354e428ed6860828949Cedric Beust String[] argv = { "-pairs", "pair0", "pair1", "rest" }; 230a21262377768de124914e354e428ed6860828949Cedric Beust new JCommander(args, argv); 231a21262377768de124914e354e428ed6860828949Cedric Beust 232a21262377768de124914e354e428ed6860828949Cedric Beust Assert.assertEquals(args.pairs.size(), 2); 233a21262377768de124914e354e428ed6860828949Cedric Beust Assert.assertEquals(args.pairs.get(0), "pair0"); 234a21262377768de124914e354e428ed6860828949Cedric Beust Assert.assertEquals(args.pairs.get(1), "pair1"); 235a21262377768de124914e354e428ed6860828949Cedric Beust Assert.assertEquals(args.rest.size(), 1); 236a21262377768de124914e354e428ed6860828949Cedric Beust Assert.assertEquals(args.rest.get(0), "rest"); 237a21262377768de124914e354e428ed6860828949Cedric Beust } 238a21262377768de124914e354e428ed6860828949Cedric Beust 239f3b82e196a622a959374d7588688e74fe852a512Cedric Beust @Test(expectedExceptions = ParameterException.class) 240e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust public void arity2Fail() { 241f3b82e196a622a959374d7588688e74fe852a512Cedric Beust ArgsArityString args = new ArgsArityString(); 242f3b82e196a622a959374d7588688e74fe852a512Cedric Beust String[] argv = { "-pairs", "pair0" }; 243f3b82e196a622a959374d7588688e74fe852a512Cedric Beust new JCommander(args, argv); 244f3b82e196a622a959374d7588688e74fe852a512Cedric Beust } 245f3b82e196a622a959374d7588688e74fe852a512Cedric Beust 246cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust @Test(expectedExceptions = ParameterException.class) 247cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust public void multipleUnparsedFail() { 248cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust ArgsMultipleUnparsed args = new ArgsMultipleUnparsed(); 249cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust String[] argv = { }; 250cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust new JCommander(args, argv); 251cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust } 252cb91ef843854605fcde3b84ce91ec4d46205a47aCedric Beust 2535f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust public void privateArgs() { 2545f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust ArgsPrivate args = new ArgsPrivate(); 2555f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust new JCommander(args, "-verbose", "3"); 2565f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust Assert.assertEquals(args.getVerbose().intValue(), 3); 2575f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust } 2585f00acc5afee348e6f3b3741d5e53ca01e508b3eCedric Beust 2595a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust public void converterArgs() { 2605a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust ArgsConverter args = new ArgsConverter(); 2615a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust String fileName = "a"; 2627021eade4657caf7ae25b19539bdc135619d248cAngus new JCommander(args, "-file", "/tmp/" + fileName, 2637021eade4657caf7ae25b19539bdc135619d248cAngus "-listStrings", "Tuesday,Thursday", 2647021eade4657caf7ae25b19539bdc135619d248cAngus "-listInts", "-1,8", 2657021eade4657caf7ae25b19539bdc135619d248cAngus "-listBigDecimals", "-11.52,100.12"); 2665a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust Assert.assertEquals(args.file.getName(), fileName); 2677021eade4657caf7ae25b19539bdc135619d248cAngus Assert.assertEquals(args.listStrings.size(), 2); 2687021eade4657caf7ae25b19539bdc135619d248cAngus Assert.assertEquals(args.listStrings.get(0), "Tuesday"); 2697021eade4657caf7ae25b19539bdc135619d248cAngus Assert.assertEquals(args.listStrings.get(1), "Thursday"); 2707021eade4657caf7ae25b19539bdc135619d248cAngus Assert.assertEquals(args.listInts.size(), 2); 2717021eade4657caf7ae25b19539bdc135619d248cAngus Assert.assertEquals(args.listInts.get(0).intValue(), -1); 2727021eade4657caf7ae25b19539bdc135619d248cAngus Assert.assertEquals(args.listInts.get(1).intValue(), 8); 2737021eade4657caf7ae25b19539bdc135619d248cAngus Assert.assertEquals(args.listBigDecimals.size(), 2); 2747021eade4657caf7ae25b19539bdc135619d248cAngus Assert.assertEquals(args.listBigDecimals.get(0), new BigDecimal("-11.52")); 2757021eade4657caf7ae25b19539bdc135619d248cAngus Assert.assertEquals(args.listBigDecimals.get(1), new BigDecimal("100.12")); 2765a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust } 2775a8d2cda56e06eccac04f985cfb6df4886cb270eCedric Beust 278b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust private void argsBoolean1(String[] params, Boolean expected) { 279d3b9e34aed415eba172befec79d2261c3ac38123Cedric Beust ArgsBooleanArity args = new ArgsBooleanArity(); 280b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust new JCommander(args, params); 281b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust Assert.assertEquals(args.debug, expected); 282b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust } 283b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust 284b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust private void argsBoolean0(String[] params, Boolean expected) { 285b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust ArgsBooleanArity0 args = new ArgsBooleanArity0(); 286b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust new JCommander(args, params); 287b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust Assert.assertEquals(args.debug, expected); 288b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust } 289b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust 290b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust public void booleanArity1() { 291b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust argsBoolean1(new String[] {}, Boolean.FALSE); 292b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust argsBoolean1(new String[] { "-debug", "true" }, Boolean.TRUE); 293b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust } 294b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust 295b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust public void booleanArity0() { 296b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust argsBoolean0(new String[] {}, Boolean.FALSE); 297b828856eb3f2d04ebc118babb4068419fce5b3bdCedric Beust argsBoolean0(new String[] { "-debug"}, Boolean.TRUE); 298d3b9e34aed415eba172befec79d2261c3ac38123Cedric Beust } 299d3b9e34aed415eba172befec79d2261c3ac38123Cedric Beust 3004312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust @Test(expectedExceptions = ParameterException.class) 3014312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust public void badParameterShouldThrowParameter1Exception() { 3024312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust Args1 args = new Args1(); 3034312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust String[] argv = { "-log", "foo" }; 3044312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust new JCommander(args, argv); 3054312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust } 3064312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust 3074312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust @Test(expectedExceptions = ParameterException.class) 3084312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust public void badParameterShouldThrowParameter2Exception() { 3094312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust Args1 args = new Args1(); 3104312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust String[] argv = { "-long", "foo" }; 3114312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust new JCommander(args, argv); 3124312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust } 3134312bccb3787db4e24d19c16c5786bf2a503a9b9Cedric Beust 314b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust public void listParameters() { 315b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust Args2 a = new Args2(); 316b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust String[] argv = {"-log", "2", "-groups", "unit", "a", "b", "c", "-host", "host2"}; 317b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust new JCommander(a, argv); 318b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust Assert.assertEquals(a.verbose.intValue(), 2); 319b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust Assert.assertEquals(a.groups, "unit"); 320b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust Assert.assertEquals(a.hosts, Arrays.asList("host2")); 321b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust Assert.assertEquals(a.parameters, Arrays.asList("a", "b", "c")); 322b2b58d4e3845c1eaa85d7a63cf4632f58e634056Cedric Beust } 32385866a95d6479be731596a838b6f5e793a341f5bCedric Beust 324fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust public void separatorEqual() { 325fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust SeparatorEqual s = new SeparatorEqual(); 326bc108076cf3dc506d4e87e004d8c2e413b995adaCedric Beust String[] argv = { "-log=3", "--longoption=10" }; 32785866a95d6479be731596a838b6f5e793a341f5bCedric Beust new JCommander(s, argv); 32885866a95d6479be731596a838b6f5e793a341f5bCedric Beust Assert.assertEquals(s.log.intValue(), 3); 329bc108076cf3dc506d4e87e004d8c2e413b995adaCedric Beust Assert.assertEquals(s.longOption.intValue(), 10); 33085866a95d6479be731596a838b6f5e793a341f5bCedric Beust } 33185866a95d6479be731596a838b6f5e793a341f5bCedric Beust 332fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust public void separatorColon() { 333fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust SeparatorColon s = new SeparatorColon(); 334fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust String[] argv = { "-verbose:true" }; 335fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust new JCommander(s, argv); 336fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust Assert.assertTrue(s.verbose); 337fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust } 338fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust 339fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust public void separatorBoth() { 340fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust SeparatorColon s = new SeparatorColon(); 341fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust SeparatorEqual s2 = new SeparatorEqual(); 342fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust String[] argv = { "-verbose:true", "-log=3" }; 343fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust new JCommander(new Object[] { s, s2 }, argv); 344fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust Assert.assertTrue(s.verbose); 345fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust Assert.assertEquals(s2.log.intValue(), 3); 346fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust } 347fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust 348fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust public void separatorMixed1() { 349fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust SeparatorMixed s = new SeparatorMixed(); 350fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust String[] argv = { "-long:1", "-level=42" }; 351fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust new JCommander(s, argv); 352fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust Assert.assertEquals(s.l.longValue(), 1l); 353fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust Assert.assertEquals(s.level.intValue(), 42); 354fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust } 355fe9b1e59d132e6b10819ae8c9dc3300fb3200ae0Cedric Beust 356426bf32155b30f5c1819a00d88c16944c01e5a52Cedric Beust public void slashParameters() { 357d556f4a527306a9769776d1cbb2fccac98618bc9Cedric Beust SlashSeparator a = new SlashSeparator(); 358858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust String[] argv = { "/verbose", "/file", "/tmp/a" }; 3595f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust new JCommander(a, argv); 360d556f4a527306a9769776d1cbb2fccac98618bc9Cedric Beust Assert.assertTrue(a.verbose); 361d556f4a527306a9769776d1cbb2fccac98618bc9Cedric Beust Assert.assertEquals(a.file, "/tmp/a"); 3625f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust } 3635f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust 364b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier public void inheritance() { 365b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier ArgsInherited args = new ArgsInherited(); 366b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier String[] argv = { "-log", "3", "-child", "2" }; 367b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier new JCommander(args, argv); 368b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier Assert.assertEquals(args.child.intValue(), 2); 369b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier Assert.assertEquals(args.log.intValue(), 3); 370b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier } 371b7e9d9cfe060b02437f867716a8902cc466b0776Guillaume Sauthier 372858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust public void negativeNumber() { 373858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust Args1 a = new Args1(); 374858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust String[] argv = { "-verbose", "-3" }; 375858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust new JCommander(a, argv); 376858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust Assert.assertEquals(a.verbose.intValue(), -3); 377858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust } 378858c0e61453c4b3a8663d9094f38b6aba493d753Cedric Beust 37972cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beust @Test(expectedExceptions = ParameterException.class) 3805f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust public void requiredMainParameters() { 38172cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beust ArgsRequired a = new ArgsRequired(); 38272cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beust String[] argv = {}; 38372cacbaebb04753ddba0c8dc0f9328310e8cb222Cedric Beust new JCommander(a, argv); 3845f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust } 3855f57e62a9aad979f2fe17e6d61ce5d05136661dbCedric Beust 386a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust public void usageShouldNotChange() { 387a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust JCommander jc = new JCommander(new Args1(), new String[]{"-log", "1"}); 388a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust StringBuilder sb = new StringBuilder(); 389a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust jc.usage(sb); 390a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust String expected = sb.toString(); 391a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust jc = new JCommander(new Args1(), new String[]{"-debug", "-log", "2", "-long", "5"}); 392a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust sb = new StringBuilder(); 393a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust jc.usage(sb); 394a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust String actual = sb.toString(); 395a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust Assert.assertEquals(actual, expected); 396a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust } 397a76d5b9a334e8600d0bc7b0c51506cf4e67e1a3aCedric Beust 3984c020da73b8b25773bba8553263cf1954c718573Cedric Beust private void verifyCommandOrdering(String[] commandNames, Object[] commands) { 3994c020da73b8b25773bba8553263cf1954c718573Cedric Beust CommandMain cm = new CommandMain(); 4004c020da73b8b25773bba8553263cf1954c718573Cedric Beust JCommander jc = new JCommander(cm); 4014c020da73b8b25773bba8553263cf1954c718573Cedric Beust 4024c020da73b8b25773bba8553263cf1954c718573Cedric Beust for (int i = 0; i < commands.length; i++) { 4034c020da73b8b25773bba8553263cf1954c718573Cedric Beust jc.addCommand(commandNames[i], commands[i]); 4044c020da73b8b25773bba8553263cf1954c718573Cedric Beust } 4054c020da73b8b25773bba8553263cf1954c718573Cedric Beust 4064c020da73b8b25773bba8553263cf1954c718573Cedric Beust Map<String, JCommander> c = jc.getCommands(); 4074c020da73b8b25773bba8553263cf1954c718573Cedric Beust Assert.assertEquals(c.size(), commands.length); 4084c020da73b8b25773bba8553263cf1954c718573Cedric Beust 4094c020da73b8b25773bba8553263cf1954c718573Cedric Beust Iterator<String> it = c.keySet().iterator(); 4104c020da73b8b25773bba8553263cf1954c718573Cedric Beust for (int i = 0; i < commands.length; i++) { 4114c020da73b8b25773bba8553263cf1954c718573Cedric Beust Assert.assertEquals(it.next(), commandNames[i]); 4124c020da73b8b25773bba8553263cf1954c718573Cedric Beust } 4134c020da73b8b25773bba8553263cf1954c718573Cedric Beust } 4144c020da73b8b25773bba8553263cf1954c718573Cedric Beust 4154c020da73b8b25773bba8553263cf1954c718573Cedric Beust public void commandsShouldBeShownInOrderOfInsertion() { 4164c020da73b8b25773bba8553263cf1954c718573Cedric Beust verifyCommandOrdering(new String[] { "add", "commit" }, 4174c020da73b8b25773bba8553263cf1954c718573Cedric Beust new Object[] { new CommandAdd(), new CommandCommit() }); 4184c020da73b8b25773bba8553263cf1954c718573Cedric Beust verifyCommandOrdering(new String[] { "commit", "add" }, 4194c020da73b8b25773bba8553263cf1954c718573Cedric Beust new Object[] { new CommandCommit(), new CommandAdd() }); 4204c020da73b8b25773bba8553263cf1954c718573Cedric Beust } 4214c020da73b8b25773bba8553263cf1954c718573Cedric Beust 422e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust @DataProvider 423e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust public static Object[][] f() { 424e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust return new Integer[][] { 425e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust new Integer[] { 3, 5, 1 }, 426e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust new Integer[] { 3, 8, 1 }, 427e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust new Integer[] { 3, 12, 2 }, 428e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust new Integer[] { 8, 12, 2 }, 429e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust new Integer[] { 9, 10, 1 }, 430e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust }; 431e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust } 432e78248b969b0fa0f217ce85e43d39a1d7c055753Cedric Beust 433460998fec3b06bf45b024c645b5b5e854de68c24Cedric Beust @Test(expectedExceptions = ParameterException.class) 434e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust public void arity1Fail() { 435e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust final Arity1 arguments = new Arity1(); 436e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust final JCommander jCommander = new JCommander(arguments); 437e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust final String[] commands = { 438e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust "-inspect" 439e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust }; 440e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust jCommander.parse(commands); 441e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust } 442e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust 443e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust public void arity1Success1() { 444e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust final Arity1 arguments = new Arity1(); 445e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust final JCommander jCommander = new JCommander(arguments); 446e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust final String[] commands = { 447e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust "-inspect", "true" 448e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust }; 449e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust jCommander.parse(commands); 450e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust Assert.assertTrue(arguments.inspect); 451e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust } 452e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust 453e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust public void arity1Success2() { 454e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust final Arity1 arguments = new Arity1(); 455e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust final JCommander jCommander = new JCommander(arguments); 456e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust final String[] commands = { 457e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust "-inspect", "false" 458e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust }; 459e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust jCommander.parse(commands); 460e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust Assert.assertFalse(arguments.inspect); 461e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust } 462e5799d36df3ceddb4b71b5f786e343c1c1e0d027Cedric Beust 463804498ec24662928bf06efcee6584d55fca3d898Cedric Beust @Parameters(commandDescription = "Help for the given commands.") 464804498ec24662928bf06efcee6584d55fca3d898Cedric Beust public static class Help { 465804498ec24662928bf06efcee6584d55fca3d898Cedric Beust public static final String NAME = "help"; 466804498ec24662928bf06efcee6584d55fca3d898Cedric Beust 467804498ec24662928bf06efcee6584d55fca3d898Cedric Beust @Parameter(description = "List of commands.") 468804498ec24662928bf06efcee6584d55fca3d898Cedric Beust public List<String> commands=new ArrayList<String>(); 469804498ec24662928bf06efcee6584d55fca3d898Cedric Beust } 470804498ec24662928bf06efcee6584d55fca3d898Cedric Beust 471804498ec24662928bf06efcee6584d55fca3d898Cedric Beust @Test(expectedExceptions = ParameterException.class, 472804498ec24662928bf06efcee6584d55fca3d898Cedric Beust description = "Verify that the main parameter's type is checked to be a List") 473804498ec24662928bf06efcee6584d55fca3d898Cedric Beust public void wrongMainTypeShouldThrow() { 474804498ec24662928bf06efcee6584d55fca3d898Cedric Beust JCommander jc = new JCommander(new ArgsRequiredWrongMain()); 475804498ec24662928bf06efcee6584d55fca3d898Cedric Beust jc.parse(new String[] { "f1", "f2" }); 476804498ec24662928bf06efcee6584d55fca3d898Cedric Beust } 477804498ec24662928bf06efcee6584d55fca3d898Cedric Beust 478c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust @Test(description = "This used to run out of memory") 479c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust public void oom() { 480c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust JCommander jc = new JCommander(new ArgsOutOfMemory()); 481c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust jc.usage(new StringBuilder()); 482c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust } 483c512c633a76a8bfe5a8eda8c6198cce7af4c5eafCedric Beust 484cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust @Test 485cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust public void getParametersShouldNotNpe() { 486cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust JCommander jc = new JCommander(new Args1()); 487cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust List<ParameterDescription> parameters = jc.getParameters(); 488cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust } 489cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust 490cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust public void validationShouldWork1() { 491cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust ArgsValidate1 a = new ArgsValidate1(); 492cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust JCommander jc = new JCommander(a); 493e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust jc.parse(new String[] { "-age", "2 "}); 494e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust Assert.assertEquals(a.age, new Integer(2)); 495e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust } 496e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust 497e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust @Test(expectedExceptions = ParameterException.class) 498fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust public void validationShouldWorkWithDefaultValues() { 499fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust ArgsValidate2 a = new ArgsValidate2(); 500fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust new JCommander(a); 501fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust } 502fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust 503fe8a696f6c65438505eb26d8b734d34910932ef7Cedric Beust @Test(expectedExceptions = ParameterException.class) 504e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust public void validationShouldWork2() { 505e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust ArgsValidate1 a = new ArgsValidate1(); 506e1d494d69d20c1afab9ff29a9fd31e48ba71cc7cCedric Beust JCommander jc = new JCommander(a); 507cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust jc.parse(new String[] { "-age", "-2 "}); 508cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust } 509cfbeb8905f1166e5fd03624a34571d6ae5ab321dCedric Beust 5108877f663e79381340b329180922d7ac448e26317Cedric Beust public void atFileCanContainEmptyLines() throws IOException { 5118877f663e79381340b329180922d7ac448e26317Cedric Beust File f = File.createTempFile("JCommander", null); 5128877f663e79381340b329180922d7ac448e26317Cedric Beust f.deleteOnExit(); 5138877f663e79381340b329180922d7ac448e26317Cedric Beust FileWriter fw = new FileWriter(f); 5148877f663e79381340b329180922d7ac448e26317Cedric Beust fw.write("-log\n"); 5158877f663e79381340b329180922d7ac448e26317Cedric Beust fw.write("\n"); 5168877f663e79381340b329180922d7ac448e26317Cedric Beust fw.write("2\n"); 5178877f663e79381340b329180922d7ac448e26317Cedric Beust fw.close(); 5188877f663e79381340b329180922d7ac448e26317Cedric Beust new JCommander(new Args1(), "@" + f.getAbsolutePath()); 5198877f663e79381340b329180922d7ac448e26317Cedric Beust } 5208877f663e79381340b329180922d7ac448e26317Cedric Beust 5212ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust public void handleEqualSigns() { 5222ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust ArgsEquals a = new ArgsEquals(); 5232ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust JCommander jc = new JCommander(a); 5242ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust jc.parse(new String[] { "-args=a=b,b=c" }); 5252ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust Assert.assertEquals(a.args, "a=b,b=c"); 5262ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust } 5272ee07bc8765f4873b69423e6185120d176c49a2bCedric Beust 528876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust @SuppressWarnings("serial") 529876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust public void handleSets() { 530876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust ArgsWithSet a = new ArgsWithSet(); 531876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust new JCommander(a, new String[] { "-s", "3,1,2" }); 532876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust Assert.assertEquals(a.set, new TreeSet<Integer>() {{ add(1); add(2); add(3); }}); 533876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust } 534876c9776ebe75ca46504847a4807b681ef5d5e4fCedric Beust 535c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust private static final List<String> V = Arrays.asList("a", "b", "c", "d"); 536c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust 537c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust @DataProvider 538c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust public Object[][] variable() { 539c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust return new Object[][] { 540c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust new Object[] { 0, V.subList(0, 0), V }, 541c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust new Object[] { 1, V.subList(0, 1), V.subList(1, 4) }, 542c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust new Object[] { 2, V.subList(0, 2), V.subList(2, 4) }, 543c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust new Object[] { 3, V.subList(0, 3), V.subList(3, 4) }, 544c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust new Object[] { 4, V.subList(0, 4), V.subList(4, 4) }, 545c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust }; 546c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust } 547c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust 548c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust @Test(dataProvider = "variable") 549c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust public void variableArity(int count, List<String> var, List<String> main) { 550c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust VariableArity va = new VariableArity(count); 551c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust new JCommander(va).parse("-variable", "a", "b", "c", "d"); 552c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust Assert.assertEquals(var, va.var); 553c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust Assert.assertEquals(main, va.main); 554c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust } 555c709e6db81d11fe4aa6c573775ba5577902aa35cCédric Beust 5560638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru public void enumArgs() { 5570638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru ArgsEnum args = new ArgsEnum(); 5580638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru String[] argv = { "-choice", "ONE"}; 5590638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru new JCommander(args, argv); 5600638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru 5610638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru Assert.assertEquals(args.choice, ArgsEnum.ChoiceType.ONE); 5620638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru } 5630638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru 5640638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru @Test(expectedExceptions = ParameterException.class) 5650638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru public void enumArgsFail() { 5660638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru ArgsEnum args = new ArgsEnum(); 5670638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru String[] argv = { "-choice", "A" }; 5680638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru new JCommander(args, argv); 5690638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru } 5700638723e74c48bf8960f1401d0c5d99f9b1292b0Adrian Muraru 5713e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust public void testListAndSplitters() { 5723e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust ArgsList al = new ArgsList(); 5733e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust JCommander j = new JCommander(al); 5743e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust j.parse("-groups", "a,b", "-ints", "41,42", "-hp", "localhost:1000;example.com:1001", 5753e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust "-hp2", "localhost:1000,example.com:1001", "-uppercase", "ab,cd"); 5763e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust Assert.assertEquals(al.groups.get(0), "a"); 5773e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust Assert.assertEquals(al.groups.get(1), "b"); 5783e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust Assert.assertEquals(al.ints.get(0).intValue(), 41); 5793e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust Assert.assertEquals(al.ints.get(1).intValue(), 42); 5803e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust Assert.assertEquals(al.hostPorts.get(0).host, "localhost"); 5813e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust Assert.assertEquals(al.hostPorts.get(0).port.intValue(), 1000); 5823e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust Assert.assertEquals(al.hostPorts.get(1).host, "example.com"); 5833e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust Assert.assertEquals(al.hostPorts.get(1).port.intValue(), 1001); 5843e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust Assert.assertEquals(al.hp2.get(1).host, "example.com"); 5853e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust Assert.assertEquals(al.hp2.get(1).port.intValue(), 1001); 5863e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust Assert.assertEquals(al.uppercase.get(0), "AB"); 5873e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust Assert.assertEquals(al.uppercase.get(1), "CD"); 5883e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust } 5893e7cb52cbf4ca537cafb6617b20387225672ad1aCedric Beust 5904ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust @Test(expectedExceptions = ParameterException.class) 5914ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust public void shouldThrowIfUnknownOption() { 5924ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust class A { 5934ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust @Parameter(names = "-long") 5944ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust public long l; 5954ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust } 5964ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust A a = new A(); 5974ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust new JCommander(a).parse("-lon", "32"); 5984ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust } 5994ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust 600c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust @Test(expectedExceptions = ParameterException.class) 601c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust public void mainParameterShouldBeValidate() { 602c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust class V implements IParameterValidator { 603c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust 604c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust public void validate(String name, String value) throws ParameterException { 605c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust Assert.assertEquals("a", value); 606c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust } 607c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust } 608c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust 609c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust class A { 610c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust @Parameter(validateWith = V.class) 611c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust public List<String> m; 612c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust } 613c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust 614c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust A a = new A(); 615c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust new JCommander(a).parse("b"); 616c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust } 617c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust 618804498ec24662928bf06efcee6584d55fca3d898Cedric Beust @Test(enabled = false) 6198877f663e79381340b329180922d7ac448e26317Cedric Beust public static void main(String[] args) throws Exception { 620c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust 621c3507ebf6d4b118ebeb443f0da87a63543ab395aCedric Beust System.out.println("A"); 6227e743acbff5277d087347bfba2409406865af8a0Cedric Beust class A { 6237e743acbff5277d087347bfba2409406865af8a0Cedric Beust @Parameter 6247e743acbff5277d087347bfba2409406865af8a0Cedric Beust List<String> parameters; 6257e743acbff5277d087347bfba2409406865af8a0Cedric Beust 6267e743acbff5277d087347bfba2409406865af8a0Cedric Beust @Parameter(names = "-long") 6277e743acbff5277d087347bfba2409406865af8a0Cedric Beust public long l; 6287e743acbff5277d087347bfba2409406865af8a0Cedric Beust } 6297e743acbff5277d087347bfba2409406865af8a0Cedric Beust A a = new A(); 6307e743acbff5277d087347bfba2409406865af8a0Cedric Beust new JCommander(a).parse("-long", "32"); 6314ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust// System.out.println(a.l); 6324ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust// System.out.println(a.parameters); 6334ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust// ArgsList al = new ArgsList(); 6344ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust// JCommander j = new JCommander(al); 6354ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust// j.setColumnSize(40); 6364ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust// j.usage(); 6374ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust// new JCommanderTest().testListAndSplitters(); 6384ba2a3c6a66626c4629266729a16e7f7e07b9ad0Cedric Beust// new JCommanderTest().converterArgs(); 639804498ec24662928bf06efcee6584d55fca3d898Cedric Beust } 640c3e28e12136391968250719b1627b6b4eaa196cdCedric Beust 641c3e28e12136391968250719b1627b6b4eaa196cdCedric Beust // Tests: 642c3e28e12136391968250719b1627b6b4eaa196cdCedric Beust // required unparsed parameter 643e9229f961b3a5799f6798369afe26dec7960249Cedric Beust} 644