diff --git a/src/main/java/com/sk89q/minecraft/util/commands/CommandContext.java b/src/main/java/com/sk89q/minecraft/util/commands/CommandContext.java index 0004318bf..e8f712d18 100644 --- a/src/main/java/com/sk89q/minecraft/util/commands/CommandContext.java +++ b/src/main/java/com/sk89q/minecraft/util/commands/CommandContext.java @@ -85,9 +85,7 @@ public class CommandContext { // Then flags for (int i = 1; i < args.length; ++i) { final String arg = args[i]; - if (arg.charAt(0) != '-') { - break; - } + if (arg.equals("--")) { args = removePortionOfArray(args, i, i, null); @@ -95,28 +93,26 @@ public class CommandContext { } if (!arg.matches("^-[a-zA-Z]+$")) { - throw new CommandException("Invalid flag character given."); + continue; } - + int index = i; for (int k = 1; k < arg.length(); ++k) { final char flagName = arg.charAt(k); if (valueFlags.contains(flagName)) { if (this.valueFlags.containsKey(flagName)) { throw new CommandException("Value flag '" + flagName + "' already given"); } - - final int index = i + 1; + index++; if (index >= args.length) { throw new CommandException("Value flag '" + flagName + "' specified without value"); } this.valueFlags.put(flagName, args[index]); - args = removePortionOfArray(args, index, index, null); } else { booleanFlags.add(flagName); } } - args = removePortionOfArray(args, i, i, null); + args = removePortionOfArray(args, i, index, null); } this.args = args; } diff --git a/src/test/java/com/sk89q/minecraft/util/commands/CommandContextTest.java b/src/test/java/com/sk89q/minecraft/util/commands/CommandContextTest.java new file mode 100644 index 000000000..2dc4e19f7 --- /dev/null +++ b/src/test/java/com/sk89q/minecraft/util/commands/CommandContextTest.java @@ -0,0 +1,32 @@ +package com.sk89q.minecraft.util.commands; + +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +import java.util.Arrays; +import java.util.HashSet; + +public class CommandContextTest { + final String firstCmdString = "herpderp -opw testers \"mani world\" 'another thing' because something"; + CommandContext firstCommand; + CommandContext secondCommand; + + @Before + public void setUpTest(){ + try { + firstCommand = new CommandContext(firstCmdString, new HashSet(Arrays.asList('o', 'w'))); + } catch (CommandException e) { + e.printStackTrace(); + fail(); + } + } + + @Test(expected = CommandException.class) + public void testInvalidFlags() throws CommandException { + String failingCommand = "herpderp -opw testers"; + new CommandContext(failingCommand, new HashSet(Arrays.asList('o', 'w'))); + } + +}