diff --git a/src/ArgsParser/ArgsParser.java b/src/ArgsParser/ArgsParser.java index f5833cf..5689b7f 100644 --- a/src/ArgsParser/ArgsParser.java +++ b/src/ArgsParser/ArgsParser.java @@ -687,7 +687,7 @@ private Set> parseArguments() throws UnknownFlagArgsException, TooM } else if (currentPositionIsFlag && flagAlreadyProvided) { // if the flag already was set throw new FlagAlreadyProvidedArgsException(currentParameter.getFullFlag(), currentParameter.getShortFlag()); - } else if (argumentSet && !currentPositionIsFlag) { // if two arguments are provided to a single flag + } else if (argumentSet && !currentPositionIsFlag && !currentPositionIsCommand) { // if two arguments are provided to a single flag throw new TooManyArgumentsArgsException(longFlagUsed ? currentParameter.getFullFlag() : currentParameter.getShortFlag()); } else if (currentPositionIsFlag && lastPositionWasFlag) { // if a flag follows another flag @@ -705,7 +705,7 @@ private Set> parseArguments() throws UnknownFlagArgsException, TooM if (isArrayParam) { // we "collect" all following arguments after an array parameter in a StringBuilder StringBuilder arguments = new StringBuilder(); arguments.append(args[i]).append("==="); // every entry in the array gets seperated by === - while(i + 1 < argsLength && !args[i + 1].startsWith("-")) { // loop through all arguments + while(i + 1 < argsLength && !args[i + 1].startsWith("-") && !commandMap.containsKey(args[i + 1])) { // loop through all arguments arguments.append(args[++i]).append("==="); } currentParameter.setArgument(arguments.toString()); diff --git a/src/test/TestAddParameterMethods.java b/src/test/TestAddParameterMethods.java index 7e2f6d2..69bbd53 100644 --- a/src/test/TestAddParameterMethods.java +++ b/src/test/TestAddParameterMethods.java @@ -375,6 +375,30 @@ public void testAddDefaultCharacterArrayParameterWithArgument() { } + +// Commands + + @Test + public void testCommand() { + String[] args = {"command"}; + ArgsParser parser = new ArgsParser(args); + Command command = parser.addCommand("command", "c", ""); + parser.parse(); + + assertTrue(command.isProvided()); + } + + @Test + public void testIndirectCommandCheck() { + String[] args = {"command"}; + ArgsParser parser = new ArgsParser(args); + Command command = parser.addCommand("command", "c", ""); + parser.parse(); + + assertTrue(parser.checkIfCommandIsProvided("command")); + } + + // Mixing addParameter Methods @@ -506,4 +530,35 @@ public void testGetArgumentOf() { assertEquals('x', (Character) parser.getArgumentOf("--Character")); assertArrayEquals(new Character[]{'a', 'z'}, (Character[]) parser.getArgumentOf("--CharacterArray")); } + + @Test + public void testCombinationsOfCommandsAndFlags() { + String[] args = new String[]{ + "c3", + "-s", "stringInput", + "-sArr", "arr1", "arr2", + "-i", "42", + "command1", + "-iArr", "1", "2", + "command2" + }; + ArgsParser parser = new ArgsParser(args); + Parameter stringPar = parser.addMandatoryStringParameter("String", "s", "desc"); + Parameter stringArrPar = parser.addStringArrayParameter("StringArray", "sArr", "", false); + Parameter intPar = parser.addMandatoryIntegerParameter("Int", "i", "desc"); + Parameter intArrPar = parser.addIntegerArrayParameter("IntArray", "iArr", "", false); + Command command1 = parser.addCommand("command1", "c1", null); + Command command2 = parser.addCommand("command2", "c2", null); + Command command3 = parser.addCommand("command3", "c3", null); + parser.parse(); + + assertEquals("stringInput", parser.getArgumentOf("--String")); + assertArrayEquals(new String[]{"arr1", "arr2"}, stringArrPar.getArgument()); + assertEquals(42, intPar.getArgument()); + assertArrayEquals(new Integer[]{1, 2}, (Integer[]) intArrPar.getArgument()); + assertTrue(command1.isProvided()); + assertTrue(command2.isProvided()); + assertTrue(command3.isProvided()); + } + }