From 082f57409671b8154b9268391884fa837a1fa8a1 Mon Sep 17 00:00:00 2001 From: bryanwee023 Date: Fri, 5 Nov 2021 20:02:09 +0800 Subject: [PATCH 1/7] Enhance tokenizer behaviour --- .../logic/parser/ArgumentTokenizer.java | 64 +++---- .../logic/parser/ArgumentTokenizerTest.java | 167 +++++++++++------- 2 files changed, 131 insertions(+), 100 deletions(-) diff --git a/src/main/java/seedu/address/logic/parser/ArgumentTokenizer.java b/src/main/java/seedu/address/logic/parser/ArgumentTokenizer.java index 5c9aebfa488..7aca05b69d1 100644 --- a/src/main/java/seedu/address/logic/parser/ArgumentTokenizer.java +++ b/src/main/java/seedu/address/logic/parser/ArgumentTokenizer.java @@ -1,8 +1,12 @@ package seedu.address.logic.parser; +import seedu.address.logic.parser.exceptions.ParseException; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; /** @@ -15,15 +19,19 @@ */ public class ArgumentTokenizer { + // Regex matching any series of non-whitespace characters followed by "/" + public static final String PREFIX_REGEX = "[^\\s]*/"; + /** * Tokenizes an arguments string and returns an {@code ArgumentMultimap} object that maps prefixes to their - * respective argument values. Only the given prefixes will be recognized in the arguments string. + * respective argument values. * * @param argsString Arguments string of the form: {@code preamble value value ...} - * @param prefixes Prefixes to tokenize the arguments string with + * @param prefixes Expected prefixes + * @throws ParseException if an unexpected prefix is detected * @return ArgumentMultimap object that maps prefixes to their arguments */ - public static ArgumentMultimap tokenize(String argsString, Prefix... prefixes) { + public static ArgumentMultimap tokenize(String argsString, Prefix... prefixes) throws ParseException { List positions = findAllPrefixPositions(argsString, prefixes); return extractArguments(argsString, positions); } @@ -32,47 +40,25 @@ public static ArgumentMultimap tokenize(String argsString, Prefix... prefixes) { * Finds all zero-based prefix positions in the given arguments string. * * @param argsString Arguments string of the form: {@code preamble value value ...} - * @param prefixes Prefixes to find in the arguments string + * @param prefixes Expected prefixes * @return List of zero-based prefix positions in the given arguments string */ - private static List findAllPrefixPositions(String argsString, Prefix... prefixes) { - return Arrays.stream(prefixes) - .flatMap(prefix -> findPrefixPositions(argsString, prefix).stream()) - .collect(Collectors.toList()); - } + private static List findAllPrefixPositions(String argsString, Prefix... prefixes) throws ParseException { + Matcher m = Pattern.compile(PREFIX_REGEX).matcher(argsString); - /** - * {@see findAllPrefixPositions} - */ - private static List findPrefixPositions(String argsString, Prefix prefix) { - List positions = new ArrayList<>(); - - int prefixPosition = findPrefixPosition(argsString, prefix.getPrefix(), 0); - while (prefixPosition != -1) { - PrefixPosition extendedPrefix = new PrefixPosition(prefix, prefixPosition); - positions.add(extendedPrefix); - prefixPosition = findPrefixPosition(argsString, prefix.getPrefix(), prefixPosition); - } + List prefixPositionList = new ArrayList<>(); + while (m.find()) { + Prefix found = new Prefix(m.group()); - return positions; - } + // If prefix is unexpected, throw parse exception + if (!List.of(prefixes).contains(found)) { + throw new ParseException(String.format("Unexpected prefix identified: %s", m.group())); + } - /** - * Returns the index of the first occurrence of {@code prefix} in - * {@code argsString} starting from index {@code fromIndex}. An occurrence - * is valid if there is a whitespace before {@code prefix}. Returns -1 if no - * such occurrence can be found. - * - * E.g if {@code argsString} = "e/hip/900", {@code prefix} = "p/" and - * {@code fromIndex} = 0, this method returns -1 as there are no valid - * occurrences of "p/" with whitespace before it. However, if - * {@code argsString} = "e/hi p/900", {@code prefix} = "p/" and - * {@code fromIndex} = 0, this method returns 5. - */ - private static int findPrefixPosition(String argsString, String prefix, int fromIndex) { - int prefixIndex = argsString.indexOf(" " + prefix, fromIndex); - return prefixIndex == -1 ? -1 - : prefixIndex + 1; // +1 as offset for whitespace + prefixPositionList.add(new PrefixPosition(found, m.start())); + } + + return prefixPositionList; } /** diff --git a/src/test/java/seedu/address/logic/parser/ArgumentTokenizerTest.java b/src/test/java/seedu/address/logic/parser/ArgumentTokenizerTest.java index c97308935f5..6feef8862e1 100644 --- a/src/test/java/seedu/address/logic/parser/ArgumentTokenizerTest.java +++ b/src/test/java/seedu/address/logic/parser/ArgumentTokenizerTest.java @@ -3,25 +3,23 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; +import seedu.address.logic.parser.exceptions.ParseException; public class ArgumentTokenizerTest { - private final Prefix unknownPrefix = new Prefix("--u"); + //private final Prefix unknownPrefix = new Prefix("--u"); private final Prefix pSlash = new Prefix("p/"); - private final Prefix dashT = new Prefix("-t"); - private final Prefix hatQ = new Prefix("^Q"); + private final Prefix dSlash = new Prefix("d/"); + private final Prefix wordSlash = new Prefix("word/"); - @Test - public void tokenize_emptyArgsString_noValues() { - String argsString = " "; - ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(argsString, pSlash); - - assertPreambleEmpty(argMultimap); - assertArgumentAbsent(argMultimap, pSlash); - } + private final String wordParameter1 = "Argument"; + private final String wordParameter2 = "Argument"; + private final String sentenceParameter1 = "Argument value with spaces"; + private final String sentenceParameter2 = "Another argument value"; private void assertPreamblePresent(ArgumentMultimap argMultimap, String expectedPreamble) { assertEquals(expectedPreamble, argMultimap.getPreamble()); @@ -31,6 +29,7 @@ private void assertPreambleEmpty(ArgumentMultimap argMultimap) { assertTrue(argMultimap.getPreamble().isEmpty()); } + /** * Asserts all the arguments in {@code argMultimap} with {@code prefix} match the {@code expectedValues} * and only the last value is returned upon calling {@code ArgumentMultimap#getValue(Prefix)}. @@ -53,87 +52,133 @@ private void assertArgumentAbsent(ArgumentMultimap argMultimap, Prefix prefix) { assertFalse(argMultimap.getValue(prefix).isPresent()); } + /* Equivalence Partitions: + Expected Prefixes: + - No prefixes + - Single character prefixes + - Multiple character prefixes + - Prefixes not in arg string + + Preamble: + - Empty string + - Single word + - Multiple word + + Parameters: + - Empty parameter + - Single word + - Multiple word + - Single word with trailing / leading spaces + - Multiple word with trailing / leading spaces + + The following test cases attempts to cover all partitions in an efficient manner. + */ + + @Test + public void tokenize_emptyArgsString_noValues() throws ParseException { + String argsString = " "; + ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(argsString, pSlash); + + assertPreambleEmpty(argMultimap); + assertArgumentAbsent(argMultimap, pSlash); + } + @Test - public void tokenize_noPrefixes_allTakenAsPreamble() { - String argsString = " some random string /t tag with leading and trailing spaces "; + public void tokenize_noPrefixes_allTakenAsPreamble() throws ParseException { + String argsString = " some random string with trailing space "; ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(argsString); // Same string expected as preamble, but leading/trailing spaces should be trimmed assertPreamblePresent(argMultimap, argsString.trim()); - } @Test - public void tokenize_oneArgument() { - // Preamble present - String argsString = " Some preamble string p/ Argument value "; + public void tokenize_oneArgument() throws ParseException { + // Preamble absent, empty values. + String argsString = pSlash.getPrefix(); ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(argsString, pSlash); - assertPreamblePresent(argMultimap, "Some preamble string"); - assertArgumentPresent(argMultimap, pSlash, "Argument value"); + assertPreambleEmpty(argMultimap); + assertArgumentPresent(argMultimap, pSlash, ""); - // No preamble - argsString = " p/ Argument value "; + // Preamble present, word values. + argsString = wordParameter1 + " " + pSlash + wordParameter2; + argMultimap = ArgumentTokenizer.tokenize(argsString, pSlash); + assertPreamblePresent(argMultimap, wordParameter1); + assertArgumentPresent(argMultimap, pSlash, wordParameter2); + + // Preamble absent, word values. + argsString = pSlash + wordParameter2; argMultimap = ArgumentTokenizer.tokenize(argsString, pSlash); assertPreambleEmpty(argMultimap); - assertArgumentPresent(argMultimap, pSlash, "Argument value"); + assertArgumentPresent(argMultimap, pSlash, wordParameter2); + // Preamble present, sentence values. + argsString = sentenceParameter1 + " " + pSlash + sentenceParameter2; + argMultimap = ArgumentTokenizer.tokenize(argsString, pSlash); + assertPreamblePresent(argMultimap, sentenceParameter1); + assertArgumentPresent(argMultimap, pSlash, sentenceParameter2); + + // Preamble absent, sentence values. + argsString = pSlash + sentenceParameter2; + argMultimap = ArgumentTokenizer.tokenize(argsString, pSlash); + assertPreambleEmpty(argMultimap); + assertArgumentPresent(argMultimap, pSlash, sentenceParameter2); } @Test - public void tokenize_multipleArguments() { - // Only two arguments are present - String argsString = "SomePreambleString -t dashT-Value p/pSlash value"; - ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ); - assertPreamblePresent(argMultimap, "SomePreambleString"); - assertArgumentPresent(argMultimap, pSlash, "pSlash value"); - assertArgumentPresent(argMultimap, dashT, "dashT-Value"); - assertArgumentAbsent(argMultimap, hatQ); - - // All three arguments are present - argsString = "Different Preamble String ^Q111 -t dashT-Value p/pSlash value"; - argMultimap = ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ); - assertPreamblePresent(argMultimap, "Different Preamble String"); - assertArgumentPresent(argMultimap, pSlash, "pSlash value"); - assertArgumentPresent(argMultimap, dashT, "dashT-Value"); - assertArgumentPresent(argMultimap, hatQ, "111"); + public void tokenize_multipleArguments() throws ParseException { + // Not all expected prefixes are present + String argsString = wordParameter1 + " " + pSlash + wordParameter2; + ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(argsString, pSlash, dSlash); + assertPreamblePresent(argMultimap, wordParameter1); + assertArgumentPresent(argMultimap, pSlash, wordParameter2); + + // All expected prefixes present + argsString = pSlash + wordParameter2 + " " + wordSlash + sentenceParameter1; + argMultimap = ArgumentTokenizer.tokenize(argsString, pSlash, dSlash, wordSlash); + assertPreambleEmpty(argMultimap); + assertArgumentPresent(argMultimap, pSlash, wordParameter2); + assertArgumentPresent(argMultimap, wordSlash, sentenceParameter1); /* Also covers: Reusing of the tokenizer multiple times */ // Reuse tokenizer on an empty string to ensure ArgumentMultimap is correctly reset // (i.e. no stale values from the previous tokenizing remain) argsString = ""; - argMultimap = ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ); + argMultimap = ArgumentTokenizer.tokenize(argsString, pSlash); assertPreambleEmpty(argMultimap); assertArgumentAbsent(argMultimap, pSlash); - - /* Also covers: testing for prefixes not specified as a prefix */ - - // Prefixes not previously given to the tokenizer should not return any values - argsString = unknownPrefix + "some value"; - argMultimap = ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ); - assertArgumentAbsent(argMultimap, unknownPrefix); - assertPreamblePresent(argMultimap, argsString); // Unknown prefix is taken as part of preamble } @Test - public void tokenize_multipleArgumentsWithRepeats() { + public void tokenize_multipleArgumentsWithRepeats() throws ParseException { // Two arguments repeated, some have empty values - String argsString = "SomePreambleString -t dashT-Value ^Q ^Q -t another dashT value p/ pSlash value -t"; - ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ); - assertPreamblePresent(argMultimap, "SomePreambleString"); - assertArgumentPresent(argMultimap, pSlash, "pSlash value"); - assertArgumentPresent(argMultimap, dashT, "dashT-Value", "another dashT value", ""); - assertArgumentPresent(argMultimap, hatQ, "", ""); + String argsString = wordParameter1 + " " + pSlash + " " + pSlash + + wordParameter2 + " " + dSlash + sentenceParameter1 + " " + dSlash; + ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(argsString, pSlash, dSlash); + assertPreamblePresent(argMultimap, wordParameter1); + assertArgumentPresent(argMultimap, pSlash, "", wordParameter2); + assertArgumentPresent(argMultimap, dSlash, sentenceParameter1, ""); } @Test - public void tokenize_multipleArgumentsJoined() { - String argsString = "SomePreambleStringp/ pSlash joined-tjoined -t not joined^Qjoined"; - ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(argsString, pSlash, dashT, hatQ); - assertPreamblePresent(argMultimap, "SomePreambleStringp/ pSlash joined-tjoined"); - assertArgumentAbsent(argMultimap, pSlash); - assertArgumentPresent(argMultimap, dashT, "not joined^Qjoined"); - assertArgumentAbsent(argMultimap, hatQ); + public void tokenize_paddedSpaces() throws ParseException { + // Parameters with leading or trailing whitespace should be trimmed + String argsString = wordParameter1 + " " + pSlash + " " + sentenceParameter2 + " "; + ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(argsString, pSlash); + assertPreamblePresent(argMultimap, wordParameter1); + assertArgumentPresent(argMultimap, pSlash, sentenceParameter2); + } + + @Test + public void tokenize_unexpectedPrefixes_throwsParseException() throws ParseException { + // Unexpected single character prefix + String argsString1 = wordParameter1 + " " + pSlash + " " + sentenceParameter2 + " "; + assertThrows(ParseException.class, () -> ArgumentTokenizer.tokenize(argsString1, dSlash)); + + // Unexpected multiple character prefix + String argsString2 = wordParameter1 + " " + wordSlash + " " + sentenceParameter2 + " "; + assertThrows(ParseException.class, () -> ArgumentTokenizer.tokenize(argsString2, dSlash)); } @Test From 8df90e59b202d0fb5b3b1f45de171709603e2962 Mon Sep 17 00:00:00 2001 From: bryanwee023 Date: Fri, 5 Nov 2021 20:27:00 +0800 Subject: [PATCH 2/7] Clean up code --- .../java/seedu/address/logic/parser/ArgumentTokenizerTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/seedu/address/logic/parser/ArgumentTokenizerTest.java b/src/test/java/seedu/address/logic/parser/ArgumentTokenizerTest.java index 6feef8862e1..43ca4488077 100644 --- a/src/test/java/seedu/address/logic/parser/ArgumentTokenizerTest.java +++ b/src/test/java/seedu/address/logic/parser/ArgumentTokenizerTest.java @@ -11,13 +11,12 @@ public class ArgumentTokenizerTest { - //private final Prefix unknownPrefix = new Prefix("--u"); private final Prefix pSlash = new Prefix("p/"); private final Prefix dSlash = new Prefix("d/"); private final Prefix wordSlash = new Prefix("word/"); private final String wordParameter1 = "Argument"; - private final String wordParameter2 = "Argument"; + private final String wordParameter2 = "Value"; private final String sentenceParameter1 = "Argument value with spaces"; private final String sentenceParameter2 = "Another argument value"; From 3e571cce23d91c056745dc4d5ba26308f16d2ad8 Mon Sep 17 00:00:00 2001 From: bryanwee023 Date: Fri, 5 Nov 2021 20:39:37 +0800 Subject: [PATCH 3/7] Fix bugs in test inputs --- .../seedu/address/logic/parser/FindCommandParser.java | 5 ++--- .../address/logic/parser/EditCommandParserTest.java | 10 +++++----- .../address/logic/parser/FindCommandParserTest.java | 4 ++-- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/seedu/address/logic/parser/FindCommandParser.java b/src/main/java/seedu/address/logic/parser/FindCommandParser.java index 5ebe0a68521..36f6957c054 100644 --- a/src/main/java/seedu/address/logic/parser/FindCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/FindCommandParser.java @@ -49,9 +49,8 @@ public FindCommand parse(String args) throws ParseException { // Add name predicate if name(s) specified if (argMultimap.getValue(PREFIX_NAME).isPresent()) { - predicates.add( - new NameContainsKeywordsPredicate(argMultimap.getAllValues(PREFIX_NAME)) - ); + predicates.add(new NameContainsKeywordsPredicate( + argMultimap.getAllValues(PREFIX_NAME))); } // Add id predicate if id(s) specified diff --git a/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java b/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java index be64a96d61d..d7d9fd46af4 100644 --- a/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java @@ -56,15 +56,15 @@ public void parse_missingParts_failure() { @Test public void parse_invalidPreamble_failure() { // negative index - assertParseFailure(parser, "-5 n/t" + NAME_DESC_BAGEL, MESSAGE_INVALID_COUNT_INDEX); + assertParseFailure(parser, "-5 " + NAME_DESC_BAGEL, MESSAGE_INVALID_COUNT_INDEX); // zero index - assertParseFailure(parser, "0 n/t" + NAME_DESC_BAGEL, MESSAGE_INVALID_COUNT_INDEX); + assertParseFailure(parser, "0 " + NAME_DESC_BAGEL, MESSAGE_INVALID_COUNT_INDEX); // invalid arguments being parsed as preamble - assertParseFailure(parser, "1 some random string n/t", MESSAGE_INVALID_COUNT_INDEX); + assertParseFailure(parser, "1 some random string ", MESSAGE_INVALID_COUNT_INDEX); - // invalid prefix being parsed as preamble - assertParseFailure(parser, "1 i/ string n/t", MESSAGE_INVALID_COUNT_INDEX); + // empty preamble + assertParseFailure(parser, NAME_DESC_BAGEL, MESSAGE_INVALID_COUNT_INDEX); } @Test diff --git a/src/test/java/seedu/address/logic/parser/FindCommandParserTest.java b/src/test/java/seedu/address/logic/parser/FindCommandParserTest.java index 63df80015af..c0f10a16faf 100644 --- a/src/test/java/seedu/address/logic/parser/FindCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/FindCommandParserTest.java @@ -94,13 +94,13 @@ public void parse_multipleValidArgs_returnsFindCommand() { @Test public void parse_negativeIdArgs_throwsParseException() { - assertParseFailure(parser, PREFIX_ID + INVALID_ID_NEGATIVE_NUMBER, String.format( + assertParseFailure(parser, INVALID_ID_NEGATIVE_NUMBER, String.format( MESSAGE_INVALID_ID_LENGTH_AND_SIGN, FindCommand.MESSAGE_USAGE)); } @Test public void parse_notDigitsInArg_throwsParseException() { - assertParseFailure(parser, PREFIX_ID + INVALID_ID_LETTER, String.format( + assertParseFailure(parser, INVALID_ID_LETTER, String.format( MESSAGE_INVALID_ID_FORMAT, FindCommand.MESSAGE_USAGE)); } From 3413a389db63b7abecc624b5f1269fc443b8729a Mon Sep 17 00:00:00 2001 From: bryanwee023 Date: Fri, 5 Nov 2021 21:42:48 +0800 Subject: [PATCH 4/7] Move equivalence partition tests to ParserUtil --- .../logic/commands/CommandTestUtil.java | 15 -- .../parser/AddToOrderCommandParserTest.java | 97 ------------- .../logic/parser/EditCommandParserTest.java | 2 +- .../address/logic/parser/ParserUtilTest.java | 135 +++++++++++++----- 4 files changed, 99 insertions(+), 150 deletions(-) diff --git a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java index 282a3a5ad7a..51a4408b672 100644 --- a/src/test/java/seedu/address/logic/commands/CommandTestUtil.java +++ b/src/test/java/seedu/address/logic/commands/CommandTestUtil.java @@ -32,13 +32,10 @@ public class CommandTestUtil { public static final String VALID_NAME_BAGEL = "Bagel"; public static final String VALID_NAME_DONUT = "Donut"; - public static final String VALID_NAME_100PLUS = "100Plus"; - public static final String VALID_NAME_H20 = "H20"; public static final String VALID_ID_BAGEL = "094021"; public static final String VALID_ID_DONUT = "789013"; public static final String VALID_COUNT_BAGEL = "5"; public static final String VALID_COUNT_DONUT = "6"; - public static final String VALID_COUNT_ONE = "1"; public static final String VALID_COSTPRICE_BAGEL = "5.0"; public static final String VALID_COSTPRICE_DONUT = "6.0"; public static final String VALID_SALESPRICE_BAGEL = "6.0"; @@ -52,17 +49,12 @@ public class CommandTestUtil { public static final String ID_DESC_DONUT = " " + PREFIX_ID + VALID_ID_DONUT; public static final String COUNT_DESC_BAGEL = " " + PREFIX_COUNT + VALID_COUNT_BAGEL; public static final String COUNT_DESC_DONUT = " " + PREFIX_COUNT + VALID_COUNT_DONUT; - public static final String COUNT_DESC_ONE = " " + PREFIX_COUNT + VALID_COUNT_ONE; - public static final String COUNT_DESC_MAX_INT = " " + PREFIX_COUNT + String.valueOf(Integer.MAX_VALUE); public static final String SALESPRICE_DESC_BAGEL = " " + PREFIX_SALESPRICE + VALID_SALESPRICE_BAGEL; - public static final String SALESPRICE_DESC_DONUT = " " + PREFIX_SALESPRICE + VALID_SALESPRICE_DONUT; public static final String COSTPRICE_DESC_BAGEL = " " + PREFIX_COSTPRICE + VALID_COSTPRICE_BAGEL; - public static final String COSTPRICE_DESC_DONUT = " " + PREFIX_COSTPRICE + VALID_COSTPRICE_DONUT; public static final String TAG_DESC_BAKED = " " + PREFIX_TAG + VALID_TAG_BAKED; public static final String TAG_DESC_POPULAR = " " + PREFIX_TAG + VALID_TAG_POPULAR; public static final String INVALID_NAME_SPECIAL_CHAR = "Cake$"; - public static final String INVALID_NAME_EMPTY_STRING = ""; public static final String INVALID_NAME_DESC = " " + PREFIX_NAME + INVALID_NAME_SPECIAL_CHAR; // '&' not allowed in names public static final String INVALID_TAG_DESC = " " + PREFIX_TAG + "hubby*"; // '*' not allowed in tags @@ -71,15 +63,8 @@ public class CommandTestUtil { public static final String INVALID_ID_NEGATIVE_NUMBER = " " + PREFIX_ID + "-123232"; public static final String INVALID_ID_SEVEN_DIGITS = " " + PREFIX_ID + "1234567"; public static final String INVALID_COUNT_LETTER = " " + PREFIX_COUNT + "abc"; - public static final String INVALID_COUNT_SPECIAL_CHAR = " " + PREFIX_COUNT + "1234$"; public static final String INVALID_COUNT_ZERO = " " + PREFIX_COUNT + "0"; public static final String INVALID_COUNT_NEGATIVE_VALUE = " " + PREFIX_COUNT + "-1"; - public static final String INVALID_COUNT_BEYOND_MAX_INT = " " + PREFIX_COUNT + "2147483648"; - public static final String INVALID_SALESPRICE_BAGEL = " " + PREFIX_SALESPRICE + "asdf"; - public static final String INVALID_COSTPRICE_BAGEL = " " + PREFIX_COSTPRICE + "asdf"; - - public static final String PREAMBLE_WHITESPACE = "\t \r \n"; - public static final String PREAMBLE_NON_EMPTY = "NonEmptyPreamble"; public static final ItemDescriptor DESC_BAGEL; public static final ItemDescriptor DESC_DONUT; diff --git a/src/test/java/seedu/address/logic/parser/AddToOrderCommandParserTest.java b/src/test/java/seedu/address/logic/parser/AddToOrderCommandParserTest.java index f9c1db39a14..349c4a93d9a 100644 --- a/src/test/java/seedu/address/logic/parser/AddToOrderCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/AddToOrderCommandParserTest.java @@ -2,14 +2,10 @@ import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; -import static seedu.address.commons.core.Messages.MESSAGE_NAME_SPECIFIED_TWICE; import static seedu.address.logic.commands.CommandTestUtil.COUNT_DESC_BAGEL; import static seedu.address.logic.commands.CommandTestUtil.COUNT_DESC_DONUT; -import static seedu.address.logic.commands.CommandTestUtil.COUNT_DESC_MAX_INT; -import static seedu.address.logic.commands.CommandTestUtil.COUNT_DESC_ONE; import static seedu.address.logic.commands.CommandTestUtil.ID_DESC_BAGEL; import static seedu.address.logic.commands.CommandTestUtil.ID_DESC_DONUT; -import static seedu.address.logic.commands.CommandTestUtil.INVALID_COUNT_BEYOND_MAX_INT; import static seedu.address.logic.commands.CommandTestUtil.INVALID_COUNT_LETTER; import static seedu.address.logic.commands.CommandTestUtil.INVALID_COUNT_NEGATIVE_VALUE; import static seedu.address.logic.commands.CommandTestUtil.INVALID_COUNT_ZERO; @@ -21,13 +17,8 @@ import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_BAKED; import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_POPULAR; import static seedu.address.logic.commands.CommandTestUtil.VALID_COUNT_BAGEL; -import static seedu.address.logic.commands.CommandTestUtil.VALID_COUNT_DONUT; import static seedu.address.logic.commands.CommandTestUtil.VALID_ID_BAGEL; -import static seedu.address.logic.commands.CommandTestUtil.VALID_ID_DONUT; -import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_100PLUS; import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BAGEL; -import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_DONUT; -import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure; import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess; @@ -42,43 +33,6 @@ public class AddToOrderCommandParserTest { private AddToOrderCommandParser parser = new AddToOrderCommandParser(); - @Test - public void parse_nameEp() { - - // EP: valid name: alphabetical string - // Heuristic: other inputs valid EP appear at least once - ItemDescriptor expectedDescriptor = new ItemDescriptorBuilder() - .withName(VALID_NAME_BAGEL) - .withId(VALID_ID_BAGEL) - .withCount(VALID_COUNT_BAGEL) - .build(); - - assertParseSuccess(parser, VALID_NAME_BAGEL + ID_DESC_BAGEL + COUNT_DESC_BAGEL, - new AddToOrderCommand(expectedDescriptor)); - - // EP: valid name: alphanumeric string - // Heuristic: other inputs valid EP appear at least once - expectedDescriptor = new ItemDescriptorBuilder() - .withName(VALID_NAME_100PLUS) - .withId(VALID_ID_DONUT) - .withCount(VALID_COUNT_DONUT) - .build(); - - assertParseSuccess(parser, VALID_NAME_100PLUS + ID_DESC_DONUT + COUNT_DESC_DONUT, - new AddToOrderCommand(expectedDescriptor)); - - String invalidNameErrorMsg = - "Names should only contain alphanumeric characters and spaces, and it should not be blank"; - // EP: invalid name: empty string for name. - //assertParseFailure(parser, INVALID_NAME_EMPTY_STRING + ID_DESC_BAGEL + COUNT_DESC_BAGEL, invalidNameErrorMsg); - - // EP: invalid name: special chars involved. e.g."cake$" - //assertParseFailure(parser, INVALID_NAME_SPECIAL_CHAR + ID_DESC_BAGEL + COUNT_DESC_BAGEL, invalidNameErrorMsg); - - // EP: invalid name: name comes with prefix. - //assertParseFailure(parser, INVALID_NAME_DESC + ID_DESC_BAGEL + COUNT_DESC_BAGEL, invalidNameErrorMsg); - } - @Test public void parse_idEp() { @@ -111,49 +65,6 @@ public void parse_idEp() { assertParseFailure(parser, VALID_NAME_BAGEL + INVALID_ID_LETTER + COUNT_DESC_BAGEL, notIntegerErrorMsg); } - @Test - public void parse_countEp() { - // EP: valid count: boundary value 1 - ItemDescriptor expectedDescriptor = new ItemDescriptorBuilder() - .withName(VALID_NAME_BAGEL) - .withId(VALID_ID_BAGEL) - .withCount("1") - .build(); - - assertParseSuccess(parser, VALID_NAME_BAGEL + ID_DESC_BAGEL + COUNT_DESC_ONE, - new AddToOrderCommand(expectedDescriptor)); - - // EP: valid count: boundary value Integer.MAX_VALUE - expectedDescriptor = new ItemDescriptorBuilder() - .withName(VALID_NAME_BAGEL) - .withId(VALID_ID_BAGEL) - .withCount(String.valueOf(Integer.MAX_VALUE)) - .build(); - - assertParseSuccess(parser, VALID_NAME_BAGEL + ID_DESC_BAGEL + COUNT_DESC_MAX_INT, - new AddToOrderCommand(expectedDescriptor)); - - // EP: invalid count: boundary value 0 - String zeroCountErrorMsg = "The count provided must be positive!"; - assertParseFailure(parser, VALID_NAME_BAGEL + ID_DESC_BAGEL + INVALID_COUNT_ZERO, - zeroCountErrorMsg); - - // EP: invalid count: boundary value -1 - String negativeCountErrorMsg = "The count provided must be positive!"; - assertParseFailure(parser, VALID_NAME_BAGEL + ID_DESC_BAGEL + INVALID_COUNT_NEGATIVE_VALUE, - negativeCountErrorMsg); - - // EP: invalid count: boundary value Integer.MAX_VALUE + 1 - String notIntegerErrorMsg = "The count provided must be integer!"; - assertParseFailure(parser, VALID_NAME_BAGEL + ID_DESC_BAGEL + INVALID_COUNT_BEYOND_MAX_INT, - notIntegerErrorMsg); - - // EP: invalid count: not a number - assertParseFailure(parser, VALID_NAME_BAGEL + ID_DESC_BAGEL + INVALID_COUNT_LETTER, - notIntegerErrorMsg); - } - - @Test public void parse_allFieldsPresent_success() { ItemDescriptor expectedDescriptor = new ItemDescriptorBuilder() @@ -221,14 +132,6 @@ public void parse_noNameOrId_failure() { assertParseFailure(parser, COUNT_DESC_BAGEL, expectedMessage); } - @Test - public void parse_twoNameFields_failure() { - String expectedMessage = String.format(MESSAGE_NAME_SPECIFIED_TWICE + "\n" + AddToOrderCommand.MESSAGE_USAGE); - - // both name and id prefix missing - assertParseFailure(parser, VALID_NAME_BAGEL + " " + PREFIX_NAME + VALID_NAME_DONUT, expectedMessage); - } - @Test public void parse_countZero_failure() { assertParseFailure(parser, VALID_NAME_BAGEL + ID_DESC_BAGEL + INVALID_COUNT_ZERO, diff --git a/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java b/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java index d7d9fd46af4..6b89c79158f 100644 --- a/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/EditCommandParserTest.java @@ -61,7 +61,7 @@ public void parse_invalidPreamble_failure() { assertParseFailure(parser, "0 " + NAME_DESC_BAGEL, MESSAGE_INVALID_COUNT_INDEX); // invalid arguments being parsed as preamble - assertParseFailure(parser, "1 some random string ", MESSAGE_INVALID_COUNT_INDEX); + assertParseFailure(parser, "1 some random string " + NAME_DESC_BAGEL, MESSAGE_INVALID_COUNT_INDEX); // empty preamble assertParseFailure(parser, NAME_DESC_BAGEL, MESSAGE_INVALID_COUNT_INDEX); diff --git a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java index a34882fa0a9..082c80f7c6b 100644 --- a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java +++ b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java @@ -18,23 +18,24 @@ import seedu.address.model.tag.Tag; public class ParserUtilTest { - private static final String INVALID_NAME = "Pudding^"; + private static final String INVALID_NAME_CARET = "Pudding^"; + private static final String INVALID_NAME_DOLLAR = "$Pudding"; private static final String INVALID_TAG = "#nice"; private static final String INVALID_COUNT_ZERO = "0"; private static final String INVALID_COUNT_FORMAT = "sweet"; private static final String INVALID_COUNT_NEGATIVE = "-1"; + private static final String INVALID_COUNT_FLOAT = "12.2"; private static final String INVALID_ID_FORMAT = "abc"; private static final String INVALID_ID_NEGATIVE = "-1"; private static final String INVALID_ID_LONGER = "1232343"; private static final String INVALID_PRICE_FORMAT = "abc"; private static final String INVALID_PRICE_NEGATIVE = "-1"; - private static final String INVALID_PRICE_OVERFLOW = "999999999.1"; + private static final String INVALID_PRICE_OVERFLOW = "9999999.1"; private static final String VALID_NAME = "Pudding"; + private static final String VALID_NAME_NUMERIC = "100"; private static final String VALID_TAG_1 = "nice"; private static final String VALID_TAG_2 = "sweet"; - private static final String VALID_COUNT_1 = "2"; - private static final String VALID_COUNT_2 = "12"; private static final String VALID_ID_1 = "123456"; private static final String VALID_ID_2 = "123"; private static final String VALID_PRICE_1 = "1.21"; @@ -62,20 +63,39 @@ public void parseIndex_validInput_success() throws Exception { assertEquals(INDEX_FIRST_ITEM, ParserUtil.parseIndex(" 1 ")); } + /* Tests for parsing name: + Equivalence Partitions: + - null + - Alphabets only + - Numbers only + - Alphabets and numbers + - With special characters + - With whitespace + */ @Test public void parseName_null_throwsNullPointerException() { - assertThrows(NullPointerException.class, () -> ParserUtil.parseName((String) null)); + assertThrows(NullPointerException.class, () -> ParserUtil.parseName(null)); } @Test public void parseName_invalidValue_throwsParseException() { - assertThrows(ParseException.class, () -> ParserUtil.parseName(INVALID_NAME)); + // Special characters - "^" + assertThrows(ParseException.class, () -> ParserUtil.parseName(INVALID_NAME_CARET)); + // Special characters - "$" + assertThrows(ParseException.class, () -> ParserUtil.parseName(INVALID_NAME_DOLLAR)); } @Test public void parseName_validValueWithoutWhitespace_returnsName() throws Exception { + // Alphabets only Name expectedName = new Name(VALID_NAME); assertEquals(expectedName, ParserUtil.parseName(VALID_NAME)); + // Numbers only + expectedName = new Name(VALID_NAME_NUMERIC); + assertEquals(expectedName, ParserUtil.parseName(VALID_NAME_NUMERIC)); + // Alphabets and numbers + expectedName = new Name(VALID_NAME + VALID_NAME_NUMERIC); + assertEquals(expectedName, ParserUtil.parseName(VALID_NAME + VALID_NAME_NUMERIC)); } @Test @@ -85,6 +105,13 @@ public void parseName_validValueWithWhitespace_returnsTrimmedName() throws Excep assertEquals(expectedName, ParserUtil.parseName(nameWithWhitespace)); } + /* Tests for parsing tag: + Equivalence Partitions: + - null + - Alphanumeric characters + - With special characters + - With whitespace in between + */ @Test public void parseTag_null_throwsNullPointerException() { assertThrows(NullPointerException.class, () -> ParserUtil.parseTag(null)); @@ -108,6 +135,12 @@ public void parseTag_validValueWithWhitespace_returnsTrimmedTag() throws Excepti assertEquals(expectedTag, ParserUtil.parseTag(tagWithWhitespace)); } + @Test + public void parseTag_whitespaceBetween_returnsTrimmedTag() throws Exception { + String invalidTag = VALID_TAG_1 + WHITESPACE + VALID_TAG_1; + assertThrows(ParseException.class, () -> ParserUtil.parseTag(invalidTag)); + } + @Test public void parseTags_null_throwsNullPointerException() { assertThrows(NullPointerException.class, () -> ParserUtil.parseTags(null)); @@ -131,6 +164,16 @@ public void parseTags_collectionWithValidTags_returnsTagSet() throws Exception { assertEquals(expectedTagSet, actualTagSet); } + /* Tests for parsing count: + Equivalence Partitions: + - null + - Integers within range [1, INT_MAX] + - 0 + - Negative integers + - Large integers (> INT_MAX) + - Not an integer + - Not a number + */ @Test public void parseCount_null_throwsParseException() { assertThrows(ParseException.class, () -> ParserUtil.parseCount(null)); @@ -138,32 +181,39 @@ public void parseCount_null_throwsParseException() { @Test public void parseCount_invalidValue_throwsParseException() { - assertThrows(ParseException.class, () -> ParserUtil.parseCount(INVALID_COUNT_FORMAT)); - } - - @Test - public void parseCount_zeroNumber_throwsParseException() { + // Count == 0 assertThrows(ParseException.class, () -> ParserUtil.parseCount(INVALID_COUNT_ZERO)); - } - - @Test - public void parseCount_negativeNumber_throwsParseException() { + // Negative integer assertThrows(ParseException.class, () -> ParserUtil.parseCount(INVALID_COUNT_NEGATIVE)); + // Large integer + String largeString = String.format("%d", (long)Integer.MAX_VALUE + 1); + assertThrows(ParseException.class, () -> ParserUtil.parseCount(largeString)); + // Not an integer + assertThrows(ParseException.class, () -> ParserUtil.parseCount(INVALID_COUNT_FLOAT)); + // Not a number + assertThrows(ParseException.class, () -> ParserUtil.parseCount(INVALID_COUNT_FORMAT)); } @Test public void parseCount_validValue_returnsCount() throws Exception { - Integer expectedCount = Integer.parseInt(VALID_COUNT_1); - Integer actualCount = ParserUtil.parseCount(VALID_COUNT_1); - assertEquals(expectedCount, actualCount); + // Tests the lower boundary of the valid range + Integer expectedCount = ParserUtil.parseCount("1"); + assertEquals(expectedCount, 1); + + // Tests the upper boundary of the valid range + String maxString = String.format("%d", Integer.MAX_VALUE); + expectedCount = ParserUtil.parseCount(maxString); + assertEquals(expectedCount, Integer.MAX_VALUE); } - @Test - public void parseCount_validValue2_returnsCount() throws Exception { - Integer expectedCount = Integer.parseInt(VALID_COUNT_2); - Integer actualCount = ParserUtil.parseCount(VALID_COUNT_2); - assertEquals(expectedCount, actualCount); - } + /* Tests for parsing id: + Equivalence Partitions: + - null + - Integers within range [0, 999,999] + - Negative integers + - Large integers (> 6 digits) + - Not an integer + */ @Test public void parseId_null_throwsParseException() { @@ -172,24 +222,27 @@ public void parseId_null_throwsParseException() { @Test public void parseId_invalidValue_throwsParseException() { - assertThrows(ParseException.class, () -> ParserUtil.parseId(INVALID_ID_FORMAT)); - } - - @Test - public void parseId_negativeValue_throwsParseException() { + // Negative integer assertThrows(ParseException.class, () -> ParserUtil.parseId(INVALID_ID_NEGATIVE)); - } - - @Test - public void parseId_moreThan6Digits_throwsParseException() { + // Large integer assertThrows(ParseException.class, () -> ParserUtil.parseId(INVALID_ID_LONGER)); + // Not an integer + assertThrows(ParseException.class, () -> ParserUtil.parseId(INVALID_ID_FORMAT)); } @Test public void parseId_validId_returnsId() throws Exception { - Integer expectedId = Integer.parseInt(VALID_ID_1); - Integer actualId = ParserUtil.parseId(VALID_ID_1); - assertEquals(expectedId, actualId); + // Tests the lower boundary of the valid range + Integer expectedId = ParserUtil.parseId("000000"); + assertEquals(expectedId, 0); + + // Tests a middle value of the valid range + expectedId = ParserUtil.parseId(VALID_ID_1); + assertEquals(expectedId, Integer.parseInt(VALID_ID_1)); + + // Tests the upper boundary of the valid range + expectedId = ParserUtil.parseId("999999"); + assertEquals(expectedId, 999999); } @Test @@ -199,6 +252,15 @@ public void parseId_validIdLessThan6digits_returnsId() throws Exception { assertEquals(expectedId, actualId); } + /* Tests for parsing prices: + Equivalence Partitions: + - null + - Values within range [0, 9,999,999] + - Values within range but with more than 2 d.p. + - Negative values + - Large values + */ + @Test public void parsePrice_validPrices_returnsPrice() throws Exception { // 2 decimal places @@ -222,7 +284,6 @@ public void parsePrice_largePrice_throwsParseException() { assertThrows(ParseException.class, () -> ParserUtil.parseId(INVALID_PRICE_OVERFLOW)); } - @Test public void parsePrice_notNumbers_throwsParseException() { assertThrows(ParseException.class, () -> ParserUtil.parseId(INVALID_PRICE_FORMAT)); From 90c03ab1f211fd4b6f637fdf52154bf4ce42e734 Mon Sep 17 00:00:00 2001 From: bryanwee023 Date: Fri, 5 Nov 2021 21:45:58 +0800 Subject: [PATCH 5/7] Remove redundant checking of name prefix --- .../java/seedu/address/commons/core/Messages.java | 1 - .../address/logic/parser/AddToOrderCommandParser.java | 8 +------- .../seedu/address/logic/parser/ArgumentTokenizer.java | 11 +++++------ .../address/logic/parser/RemoveCommandParser.java | 5 ----- 4 files changed, 6 insertions(+), 19 deletions(-) diff --git a/src/main/java/seedu/address/commons/core/Messages.java b/src/main/java/seedu/address/commons/core/Messages.java index 9fcd6900c6c..624415216a6 100644 --- a/src/main/java/seedu/address/commons/core/Messages.java +++ b/src/main/java/seedu/address/commons/core/Messages.java @@ -19,5 +19,4 @@ public class Messages { public static final String MESSAGE_INVALID_ID_FORMAT = "The id provided must be integer!"; public static final String MESSAGE_INVALID_ID_LENGTH_AND_SIGN = "The id provided must be positive" + " and at most 6 digits!"; - public static final String MESSAGE_NAME_SPECIFIED_TWICE = "Name field is specified twice!"; } diff --git a/src/main/java/seedu/address/logic/parser/AddToOrderCommandParser.java b/src/main/java/seedu/address/logic/parser/AddToOrderCommandParser.java index 8410b933f18..336bc216999 100644 --- a/src/main/java/seedu/address/logic/parser/AddToOrderCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/AddToOrderCommandParser.java @@ -1,11 +1,9 @@ package seedu.address.logic.parser; import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; -import static seedu.address.commons.core.Messages.MESSAGE_NAME_SPECIFIED_TWICE; import static seedu.address.logic.parser.CliSyntax.PREFIX_COSTPRICE; import static seedu.address.logic.parser.CliSyntax.PREFIX_COUNT; import static seedu.address.logic.parser.CliSyntax.PREFIX_ID; -import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_SALESPRICE; import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; @@ -24,7 +22,7 @@ public class AddToOrderCommandParser implements Parser { @Override public AddToOrderCommand parse(String args) throws ParseException { ArgumentMultimap argMultimap = - ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_ID, PREFIX_COUNT, PREFIX_TAG, + ArgumentTokenizer.tokenize(args, PREFIX_ID, PREFIX_COUNT, PREFIX_TAG, PREFIX_COSTPRICE, PREFIX_SALESPRICE); if (argMultimap.getValue(PREFIX_ID).isEmpty() && argMultimap.getPreamble().isEmpty()) { @@ -32,10 +30,6 @@ public AddToOrderCommand parse(String args) throws ParseException { } ItemDescriptor toAddDescriptor = new ItemDescriptor(); - // if both name flag and prefix are present - if (!argMultimap.getPreamble().isEmpty() && argMultimap.getValue(PREFIX_NAME).isPresent()) { - throw new ParseException(MESSAGE_NAME_SPECIFIED_TWICE + "\n" + AddToOrderCommand.MESSAGE_USAGE); - } // Parse preamble if (!argMultimap.getPreamble().isEmpty()) { diff --git a/src/main/java/seedu/address/logic/parser/ArgumentTokenizer.java b/src/main/java/seedu/address/logic/parser/ArgumentTokenizer.java index 7aca05b69d1..019b7177c65 100644 --- a/src/main/java/seedu/address/logic/parser/ArgumentTokenizer.java +++ b/src/main/java/seedu/address/logic/parser/ArgumentTokenizer.java @@ -1,13 +1,11 @@ package seedu.address.logic.parser; -import seedu.address.logic.parser.exceptions.ParseException; - import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; + +import seedu.address.logic.parser.exceptions.ParseException; /** * Tokenizes arguments string of the form: {@code preamble value value ...}
@@ -28,8 +26,8 @@ public class ArgumentTokenizer { * * @param argsString Arguments string of the form: {@code preamble value value ...} * @param prefixes Expected prefixes - * @throws ParseException if an unexpected prefix is detected * @return ArgumentMultimap object that maps prefixes to their arguments + * @throws ParseException if an unexpected prefix is detected */ public static ArgumentMultimap tokenize(String argsString, Prefix... prefixes) throws ParseException { List positions = findAllPrefixPositions(argsString, prefixes); @@ -43,7 +41,8 @@ public static ArgumentMultimap tokenize(String argsString, Prefix... prefixes) t * @param prefixes Expected prefixes * @return List of zero-based prefix positions in the given arguments string */ - private static List findAllPrefixPositions(String argsString, Prefix... prefixes) throws ParseException { + private static List findAllPrefixPositions(String argsString, Prefix... prefixes) + throws ParseException { Matcher m = Pattern.compile(PREFIX_REGEX).matcher(argsString); List prefixPositionList = new ArrayList<>(); diff --git a/src/main/java/seedu/address/logic/parser/RemoveCommandParser.java b/src/main/java/seedu/address/logic/parser/RemoveCommandParser.java index fe20e682a8a..9e92a67c3c8 100644 --- a/src/main/java/seedu/address/logic/parser/RemoveCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/RemoveCommandParser.java @@ -1,7 +1,6 @@ package seedu.address.logic.parser; import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; -import static seedu.address.commons.core.Messages.MESSAGE_NAME_SPECIFIED_TWICE; import static seedu.address.logic.parser.CliSyntax.PREFIX_COSTPRICE; import static seedu.address.logic.parser.CliSyntax.PREFIX_COUNT; import static seedu.address.logic.parser.CliSyntax.PREFIX_ID; @@ -32,10 +31,6 @@ public RemoveCommand parse(String args) throws ParseException { throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, RemoveCommand.MESSAGE_USAGE)); } - if (argMultimap.getValue(PREFIX_NAME).isPresent() && !argMultimap.getPreamble().isEmpty()) { - throw new ParseException(String.format(MESSAGE_NAME_SPECIFIED_TWICE, RemoveCommand.MESSAGE_USAGE)); - } - ItemDescriptor toRemoveDescriptor = new ItemDescriptor(); // Parse name From 3b7b05e82cb622ee37444bff9d0a6af36489f344 Mon Sep 17 00:00:00 2001 From: bryanwee023 Date: Fri, 5 Nov 2021 21:47:13 +0800 Subject: [PATCH 6/7] Fix styling --- .../java/seedu/address/logic/parser/ArgumentTokenizerTest.java | 1 + .../java/seedu/address/logic/parser/FindCommandParserTest.java | 1 - src/test/java/seedu/address/logic/parser/ParserUtilTest.java | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/seedu/address/logic/parser/ArgumentTokenizerTest.java b/src/test/java/seedu/address/logic/parser/ArgumentTokenizerTest.java index 43ca4488077..ed5f86a5ab8 100644 --- a/src/test/java/seedu/address/logic/parser/ArgumentTokenizerTest.java +++ b/src/test/java/seedu/address/logic/parser/ArgumentTokenizerTest.java @@ -7,6 +7,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; + import seedu.address.logic.parser.exceptions.ParseException; public class ArgumentTokenizerTest { diff --git a/src/test/java/seedu/address/logic/parser/FindCommandParserTest.java b/src/test/java/seedu/address/logic/parser/FindCommandParserTest.java index c0f10a16faf..cb12b24565b 100644 --- a/src/test/java/seedu/address/logic/parser/FindCommandParserTest.java +++ b/src/test/java/seedu/address/logic/parser/FindCommandParserTest.java @@ -13,7 +13,6 @@ import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BAGEL; import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_DONUT; import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_BAKED; -import static seedu.address.logic.parser.CliSyntax.PREFIX_ID; import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure; import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess; import static seedu.address.testutil.TypicalItems.BAGEL; diff --git a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java index 082c80f7c6b..5d7a5d9733a 100644 --- a/src/test/java/seedu/address/logic/parser/ParserUtilTest.java +++ b/src/test/java/seedu/address/logic/parser/ParserUtilTest.java @@ -186,7 +186,7 @@ public void parseCount_invalidValue_throwsParseException() { // Negative integer assertThrows(ParseException.class, () -> ParserUtil.parseCount(INVALID_COUNT_NEGATIVE)); // Large integer - String largeString = String.format("%d", (long)Integer.MAX_VALUE + 1); + String largeString = String.format("%d", (long) Integer.MAX_VALUE + 1); assertThrows(ParseException.class, () -> ParserUtil.parseCount(largeString)); // Not an integer assertThrows(ParseException.class, () -> ParserUtil.parseCount(INVALID_COUNT_FLOAT)); From 581e8906a0be05077583913693b6572000bd8df6 Mon Sep 17 00:00:00 2001 From: bryanwee023 Date: Fri, 5 Nov 2021 22:09:32 +0800 Subject: [PATCH 7/7] Added range to count constraints message --- src/main/java/seedu/address/commons/core/Messages.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/address/commons/core/Messages.java b/src/main/java/seedu/address/commons/core/Messages.java index 624415216a6..703a4a76283 100644 --- a/src/main/java/seedu/address/commons/core/Messages.java +++ b/src/main/java/seedu/address/commons/core/Messages.java @@ -10,7 +10,8 @@ public class Messages { public static final String MESSAGE_INVALID_ITEM_DISPLAYED_INDEX = "The item index provided is invalid"; public static final String MESSAGE_ITEMS_LISTED_OVERVIEW = "%1$d items listed!"; public static final String MESSAGE_INVALID_COUNT_INTEGER = "The count provided must be positive!"; - public static final String MESSAGE_INVALID_COUNT_FORMAT = "The count provided must be integer!"; + public static final String MESSAGE_INVALID_COUNT_FORMAT = "The count provided must be an integer!\n" + + "Minimum: 1\n" + "Maximum: 2,147,483,647"; public static final String MESSAGE_INVALID_COUNT_INDEX = "The index provided must be a number (can't be >1 number)" + " and cannot be 0 or negative!"; public static final String MESSAGE_INVALID_PRICE_FORMAT = "Prices provided must be numerical values!";