diff --git a/src/main/java/florizz/command/RecommendCommand.java b/src/main/java/florizz/command/RecommendCommand.java index c064d6751f..e4d50bebea 100644 --- a/src/main/java/florizz/command/RecommendCommand.java +++ b/src/main/java/florizz/command/RecommendCommand.java @@ -11,7 +11,13 @@ import java.util.logging.Logger; public class RecommendCommand extends Command{ - private Logger logger = Logger.getLogger(RecommendCommand.class.getName()); + private static final int SMALL_BOUQUET_FLOWER_COUNT = 1; + private static final int MEDIUM_BOUQUET_FLOWER_COUNT = 3; + private static final int LARGE_BOUQUET_FLOWER_COUNT = 5; + private static final int SMALL_BOUQUET_FILLER_COUNT = 2; + private static final int MEDIUM_BOUQUET_FILLER_COUNT = 4; + private static final int LARGE_BOUQUET_FILLER_COUNT = 6; + private final Logger logger = Logger.getLogger(RecommendCommand.class.getName()); @Override public boolean execute(ArrayList bouquetList, Ui ui) throws FlorizzException { logger.entering(RecommendCommand.class.getName(), "execute"); @@ -35,13 +41,14 @@ public boolean execute(ArrayList bouquetList, Ui ui) throws FlorizzExce // ask for bouquetName String bouquetName = askBouquetName(ui, bouquetList); - // ask for size [FUTURE IMPLEMENTATION] + // ask for size + String size = askSize(ui); // create bouquet with occasion and colour Bouquet recommendedBouquet = new Bouquet(bouquetName); // randomly add 3 flowers to bouquet - addRandomFlowers(eligibleFlowers, recommendedBouquet); + addRandomFlowers(eligibleFlowers, recommendedBouquet, size, colour); // ask if they want to save bouquet to array askSaveBouquet(ui, bouquetList, recommendedBouquet); @@ -77,15 +84,53 @@ public String askBouquetName(Ui ui, ArrayList bouquetList) throws Flori * @param eligibleFlowers list of flowers to choose from * @param recommendedBouquet bouquet to add flowers to */ - private void addRandomFlowers(ArrayList eligibleFlowers, Bouquet recommendedBouquet) + public void addRandomFlowers(ArrayList eligibleFlowers, + Bouquet recommendedBouquet, String size, Flower.Colour colour) throws FlorizzException { logger.entering(RecommendCommand.class.getName(), "addRandomFlowers"); - // [TEMPORARY CODE] + + int flowerCount = 0; + int fillerCount = 0; + switch (size) { + case "small": + flowerCount = SMALL_BOUQUET_FLOWER_COUNT; + fillerCount = SMALL_BOUQUET_FILLER_COUNT; + break; + case "medium": + flowerCount = MEDIUM_BOUQUET_FLOWER_COUNT; + fillerCount = MEDIUM_BOUQUET_FILLER_COUNT; + break; + case "large": + flowerCount = LARGE_BOUQUET_FLOWER_COUNT; + fillerCount = LARGE_BOUQUET_FILLER_COUNT; + break; + default: + // this should not happen at any case since size is validated before this + assert false : "Invalid size"; + throw new FlorizzException("Invalid size"); + } + // generate random combination of flowers from eligible flowers totaling to 5 - for (int i = 0; i < 5; i++) { + for (int i = 0; i < flowerCount; i++) { int randomIndex = (int) (Math.random() * eligibleFlowers.size()); recommendedBouquet.addFlower(eligibleFlowers.get(randomIndex), 1); } + + // get all fillers + ArrayList fillers = FlowerDictionary.getFlowersByType(Flower.Type.FILLER_FLOWER); + for (int i = 0; i < fillerCount; i++) { + int randomIndex = (int) (Math.random() * fillers.size()); + // filler colour must be green or same as main flower + boolean isSameColour = fillers.get(randomIndex).getColour().equalsIgnoreCase(colour.toString()); + boolean isGreen = fillers.get(randomIndex).getColour().equalsIgnoreCase("green"); + if (isSameColour || isGreen) { + recommendedBouquet.addFlower(fillers.get(randomIndex), 1); + } else { + i--; + } + } + + logger.exiting(RecommendCommand.class.getName(), "addRandomFlowers"); } @@ -93,7 +138,7 @@ private void addRandomFlowers(ArrayList eligibleFlowers, Bouquet recomme * Asks user for occasion * @return Occasion enum */ - private Flower.Occasion askOccasion(Ui ui) throws FlorizzException { + public Flower.Occasion askOccasion(Ui ui) throws FlorizzException { logger.entering(RecommendCommand.class.getName(), "askOccasion"); boolean isValidFormat = false; boolean isValidOccasion = false; @@ -106,8 +151,9 @@ private Flower.Occasion askOccasion(Ui ui) throws FlorizzException { isValidOccasion = Flower.isValidOccasion(occasionInput); // check if occasion is in our dictionary if (!isValidOccasion) { - System.out.println("This occasion does not exist." + - "Type 'cancel' if you would like to exit the recommendation page"); + System.out.println("This occasion does not exist."); + Ui.printBreakLine(); + System.out.println("Type 'cancel' if you would like to exit the recommendation page"); } } @@ -129,15 +175,16 @@ private Flower.Colour askColour(Ui ui, ArrayList eligibleFlowers) throws boolean isValidColour = false; ui.printAskColour(eligibleFlowers); while (!(isValidColour && isValidFormat)) { - colourInput = ui.getInput(); + colourInput = ui.getInput().trim(); Parser.checkRecommendExitCondition(colourInput); isValidFormat = Parser.parseColour(colourInput); isValidColour = Flower.isValidColour(colourInput); // check if colour is in our dictionary if (!isValidColour) { - System.out.println("This colour does not exist. " + - "Type 'cancel' if you would like to exit the recommendation page"); + System.out.println("This colour does not exist."); + Ui.printBreakLine(); + System.out.println("Type 'cancel' if you would like to exit the recommendation page"); } } @@ -145,6 +192,12 @@ private Flower.Colour askColour(Ui ui, ArrayList eligibleFlowers) throws return Flower.stringToColour(colourInput); } + /** + * Asks user if they want to save the bouquet + * @param ui Ui to take input and print messages + * @param bouquetList List that contains all bouquets + * @param recommendedBouquet Bouquet to be saved + */ private void askSaveBouquet(Ui ui, ArrayList bouquetList, Bouquet recommendedBouquet) { logger.entering(RecommendCommand.class.getName(), "askSaveBouquet"); @@ -162,6 +215,32 @@ private void askSaveBouquet(Ui ui, ArrayList bouquetList, ui.printBouquetAdded(recommendedBouquet); assert !bouquetList.isEmpty() : "Bouquet list should not be empty"; } + + if (saveInput.equalsIgnoreCase("no")) { + ui.printBouquetNotAdded(recommendedBouquet); + } + logger.exiting(RecommendCommand.class.getName(), "askSaveBouquet"); } + + /** + * Asks user for size of bouquet + * @param ui Ui to take input and print messages + * @return size of bouquet in lower case string + */ + private String askSize(Ui ui) { + logger.entering(RecommendCommand.class.getName(), "askSize"); + String sizeInput = "placeHolder"; + boolean isValidFormat = false; + boolean isValidInput = false; + while (!(isValidInput && isValidFormat)) { + sizeInput = ui.printAskSize().toLowerCase(); + isValidFormat = Parser.parseSize(sizeInput); + isValidInput = (sizeInput.equalsIgnoreCase("small") || + sizeInput.equalsIgnoreCase("medium") || + sizeInput.equalsIgnoreCase("large")); + } + logger.exiting(RecommendCommand.class.getName(), "askSize"); + return sizeInput.toLowerCase(); + } } diff --git a/src/main/java/florizz/core/FlowerDictionary.java b/src/main/java/florizz/core/FlowerDictionary.java index dcf0a5bb4a..2a7183e35f 100644 --- a/src/main/java/florizz/core/FlowerDictionary.java +++ b/src/main/java/florizz/core/FlowerDictionary.java @@ -60,22 +60,23 @@ public static void startup() { // [Fillers have yet to be implemented] add("Baby Breath", "White", new String[]{"Wedding", "Valentines", "Mothers Day"}, 1.00, new String[]{"Innocence", "Kindness", "Care", "Humble"}, Flower.Type.MAIN_FLOWER); - add("Eucalyptus", "Green", new String[]{"Wedding"}, 1.50, new String[]{"Love", "Kindness"} - , Flower.Type.MAIN_FLOWER); - add("Dusty Miller", "Green", new String[]{}, 1.50, new String[]{}, Flower.Type.FILLER); - add("Pistacia", "Green", new String[]{}, 1.50, new String[]{}, Flower.Type.FILLER); - add("Pittosporum", "Green", new String[]{}, 1.50, new String[]{}, Flower.Type.FILLER); - add("Chamomile", "White", new String[]{}, 1.90, new String[]{}, Flower.Type.FILLER); - add("Astilbe", "Pink", new String[]{}, 2.80, new String[]{}, Flower.Type.FILLER); - add("Hypericum", "Red", new String[]{}, 2.00, new String[]{}, Flower.Type.FILLER); - add("Freesia", "White", new String[]{}, 1.90, new String[]{}, Flower.Type.FILLER); - add("Helichrysum", "Yellow", new String[]{}, 1.50, new String[]{}, Flower.Type.FILLER); - add("Limonium", "Red", new String[]{}, 1.80, new String[]{}, Flower.Type.FILLER); - add("Limonium", "Dark Crimson", new String[]{}, 1.80, new String[]{}, Flower.Type.FILLER); - add("Limonium Perezii", "Purple", new String[]{}, 1.80, new String[]{}, Flower.Type.FILLER); - add("Statice", "Blue", new String[]{}, 1.50, new String[]{}, Flower.Type.FILLER); - add("Statice", "Purple", new String[]{}, 1.50, new String[]{}, Flower.Type.FILLER); - add("Rice Flower", "Pink", new String[]{}, 1.80, new String[]{}, Flower.Type.FILLER); + + add("Eucalyptus", "Green", new String[]{"Wedding"}, 1.5, + new String[]{"Love", "Kindness"}, Flower.Type.MAIN_FLOWER); + add("Dusty Miller", "Green", new String[]{}, 1.5, new String[]{}, Flower.Type.FILLER_FLOWER); + add("Pistacia", "Green", new String[]{}, 1.5, new String[]{}, Flower.Type.FILLER_FLOWER); + add("Pittosporum", "Green", new String[]{}, 1.5, new String[]{}, Flower.Type.FILLER_FLOWER); + add("Chamomile", "White", new String[]{}, 1.9, new String[]{}, Flower.Type.FILLER_FLOWER); + add("Astilbe", "Pink", new String[]{}, 2.8, new String[]{}, Flower.Type.FILLER_FLOWER); + add("Hypericum", "Red", new String[]{}, 2.0, new String[]{}, Flower.Type.FILLER_FLOWER); + add("Freesia", "White", new String[]{}, 1.9, new String[]{}, Flower.Type.FILLER_FLOWER); + add("Helichrysum", "Yellow", new String[]{}, 1.5, new String[]{}, Flower.Type.FILLER_FLOWER); + add("Limonium", "Red", new String[]{}, 1.8, new String[]{}, Flower.Type.FILLER_FLOWER); + add("Limonium", "Dark Crimson", new String[]{}, 1.8, new String[]{}, Flower.Type.FILLER_FLOWER); + add("Limonium Perezii", "Purple", new String[]{}, 1.8, new String[]{}, Flower.Type.FILLER_FLOWER); + add("Statice", "Blue", new String[]{}, 1.5, new String[]{}, Flower.Type.FILLER_FLOWER); + add("Statice", "Purple", new String[]{}, 1.5, new String[]{}, Flower.Type.FILLER_FLOWER); + add("Rice Flower", "Pink", new String[]{}, 1.8, new String[]{}, Flower.Type.FILLER_FLOWER); } /** @@ -180,6 +181,15 @@ public static ArrayList filterByColour(ArrayList listOfFlowers, public static ArrayList getAllFlowers(){ return flowerDict; + } + public static ArrayList getFlowersByType(Flower.Type type) { + ArrayList filteredFlowers = new ArrayList<>(); + for (Flower flower : flowerDict) { + if (flower.getType().equals(type)) { + filteredFlowers.add(flower); + } + } + return filteredFlowers; } } diff --git a/src/main/java/florizz/core/Parser.java b/src/main/java/florizz/core/Parser.java index 29b1f2470b..323670051f 100644 --- a/src/main/java/florizz/core/Parser.java +++ b/src/main/java/florizz/core/Parser.java @@ -45,6 +45,7 @@ public class Parser { private static final String PARSE_OCCASION_REGEX = "^\\s*[A-Za-z]+(?:\\s+[A-Za-z]+)?\\s*$"; private static final String PARSE_COLOUR_REGEX = "^\\s*[A-Za-z]+(?:\\s+[A-Za-z]+)?\\s*$"; private static final String SAVE_BOUQUET_REGEX = "^\\s*(yes|no)\\s*$"; + private static final String PARSE_SIZE_REGEX = "^\\s*[A-Za-z]+\\s*$"; public static Command parse (String input, boolean enableUi) throws FlorizzException { logger.entering("Parser", "parse"); @@ -368,13 +369,13 @@ private static InfoCommand handleInfoCommand(String flowerName) throws FlorizzEx * @return The parsed occasion. */ public static boolean parseOccasion(String argument) throws FlorizzException { - if (argument == null) { + if (argument == null || argument.isEmpty()) { System.out.println("No argument detected! " + "Please input an occasion"); return false; } - String detectedOccasion = FuzzyLogic.detectItem(argument); - if (detectedOccasion.isEmpty()) { + + if (!argument.matches(PARSE_OCCASION_REGEX)) { System.out.println("Incorrect format detected! " + "Please input a single occasion"); return false; @@ -389,7 +390,7 @@ public static boolean parseOccasion(String argument) throws FlorizzException { * @return The parsed colour String */ public static boolean parseColour(String argument) { - if (argument == null) { + if (argument == null || argument.isEmpty()) { System.out.println("No argument detected! " + "Please input a colour"); return false; @@ -410,7 +411,7 @@ public static boolean parseColour(String argument) { * @return The parsed save bouquet String */ public static boolean parseSaveBouquet(String argument) { - if (argument == null) { + if (argument == null || argument.isEmpty()) { System.out.println("No argument detected! " + "Please input a bouquet name to save"); return false; @@ -435,4 +436,25 @@ public static void checkRecommendExitCondition(String input) throws FlorizzExcep throw new FlorizzException("Leaving recommend"); } } + + /** + * Parses the size from the user input. + * @param argument the user input to be parsed. + * @return whether it is a valid size format + */ + public static boolean parseSize(String argument) { + if (argument == null || argument.isEmpty()) { + System.out.println("No argument detected! " + + "Please input a size of either small, medium or large"); + return false; + } + + if (!argument.matches(PARSE_SIZE_REGEX)) { + System.out.println("Incorrect format detected! " + + "Please input a single size"); + return false; + } + + return true; + } } diff --git a/src/main/java/florizz/core/Ui.java b/src/main/java/florizz/core/Ui.java index 83f3eda4bd..b8c0877415 100644 --- a/src/main/java/florizz/core/Ui.java +++ b/src/main/java/florizz/core/Ui.java @@ -61,11 +61,15 @@ public String getInput(){ * Prints the message indicating a new bouquet has been added. * @param bouquetAdded The bouquet that has been added. */ - public void printBouquetAdded(Bouquet bouquetAdded){ + public void printBouquetAdded(Bouquet bouquetAdded) { lastCommand = "OTHERS"; System.out.println("Added new bouquet to list:\n" + bouquetAdded); printBreakLine(); + } + public void printBouquetNotAdded(Bouquet bouquetDiscarded) { + System.out.println("Discarded the bouquet: " + bouquetDiscarded); + printBreakLine(); } /** @@ -434,7 +438,9 @@ public void printAskOccasion() { public void printAskBouquetName() { System.out.println("Great we managed to find some flowers for you!"); System.out.println("Before we carry on what would you like to call your bouquet?"); - System.out.println("Note: please take note 'cancel' cannot be used as a bouquet name"); + System.out.println("Note: please take note 'cancel' cannot be used as a bouquet name"); + printBreakLine(); + System.out.println("Type 'cancel' if you would like to exit the recommendation page"); } /** @@ -456,8 +462,8 @@ public void printAskColour(ArrayList eligibleFlowers) { for (String colour : colourList){ System.out.println("- " + colour); } - System.out.println("Type 'cancel' if you would like to exit the recommendation page"); printBreakLine(); + System.out.println("Type 'cancel' if you would like to exit the recommendation page"); } /** @@ -471,6 +477,7 @@ public String printAskSaveBouquet(Bouquet recommendedBouquet) { System.out.println("Would you like to save this bouquet to your list?"); printFullBouquet(recommendedBouquet); System.out.println("Type 'yes' to save, 'no' to discard"); + System.out.println("Type 'cancel' if you would like to exit the recommendation page"); return inputScanner.nextLine(); } @@ -600,5 +607,20 @@ protected void printFlowersTable(List tableData) throws FlorizzExcept public void printCancelCommand(){ System.out.println("Canceled command, returning to main menu."); } + + /** + * Prints text to ask user for size of bouquet + * @return raw string of user input + */ + public String printAskSize() { + System.out.println("What size would you like your recommended bouquet to be?" + System.lineSeparator() + + "1. Small" + System.lineSeparator() + + "2. Medium" + System.lineSeparator() + + "3. Large"); + printBreakLine(); + System.out.println("Type 'cancel' if you would like to exit the recommendation page"); + return inputScanner.nextLine().trim(); + } + } diff --git a/src/main/java/florizz/objects/Bouquet.java b/src/main/java/florizz/objects/Bouquet.java index 2e27716c66..05487018b7 100644 --- a/src/main/java/florizz/objects/Bouquet.java +++ b/src/main/java/florizz/objects/Bouquet.java @@ -48,6 +48,18 @@ public boolean equals(Object obj) { return Objects.equals(c.bouquetName.toUpperCase(), this.bouquetName.toUpperCase()); } + /** + * Get total quantity of flowers in the bouquet + * @return int total quantity of flowers + */ + public int totalNumberOfFlowers() { + int quantity = 0; + for (Flower flower : flowerHashMap.keySet()) { + quantity += flowerHashMap.get(flower); + } + return quantity; + } + /** * Checks if a flower exists in the bouquet. * diff --git a/src/main/java/florizz/objects/Flower.java b/src/main/java/florizz/objects/Flower.java index 98aef3fc09..e2f663a711 100644 --- a/src/main/java/florizz/objects/Flower.java +++ b/src/main/java/florizz/objects/Flower.java @@ -31,7 +31,7 @@ public enum Occasion { } public enum Type { - MAIN_FLOWER, FILLER + MAIN_FLOWER, FILLER_FLOWER } /** @@ -172,7 +172,7 @@ public String getNameAndColour() { /** * Gets the colour of the flower. - * @return The colour of the flower. + * @return The colour of the flower in lower case. */ public String getColour (){ return colourToString(colour); @@ -197,6 +197,14 @@ public Double getPrice () { public ArrayList getMeanings() { return meanings; } + /** + * Gets type of flower in enum Type + * @return Type of flower + */ + public Flower.Type getType() { + return type; + } + /** * Generates a string representation of the Flower object. * @return A string representation of the Flower object. @@ -274,10 +282,6 @@ public String tableMeaningToString() { return finalMeaning; } - public Type getType() { - return type; - } - @Override public boolean equals(Object obj) { if (obj == this) { diff --git a/src/test/java/florizz/command/RecommendTest.java b/src/test/java/florizz/command/RecommendTest.java new file mode 100644 index 0000000000..22494a3598 --- /dev/null +++ b/src/test/java/florizz/command/RecommendTest.java @@ -0,0 +1,173 @@ +package florizz.command; + +import florizz.core.FlorizzException; +import florizz.core.FlowerDictionary; +import florizz.core.Ui; +import florizz.objects.Bouquet; +import florizz.objects.Flower; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; + +import static florizz.objects.Flower.colourToString; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class RecommendTest { + private static final int SMALL_BOUQUET_FLOWER_COUNT = 1; + private static final int MEDIUM_BOUQUET_FLOWER_COUNT = 3; + private static final int LARGE_BOUQUET_FLOWER_COUNT = 5; + private static final int SMALL_BOUQUET_FILLER_COUNT = 2; + private static final int MEDIUM_BOUQUET_FILLER_COUNT = 4; + private static final int LARGE_BOUQUET_FILLER_COUNT = 6; + @Test + void testRecommendCommand_addRandomFlowersSmallValentines() { + Ui ui = new Ui(); + FlowerDictionary.startup(); + Flower.Occasion occasion = Flower.Occasion.VALENTINES; + ArrayList eligibleFlowersByOccasion = FlowerDictionary.filterByOccasion(occasion); + Bouquet recommendedBouquet = new Bouquet("TestBouquet"); + // NOTE: testSize must be in lowercase. In actual case, + // validation will be done before addRandomFlower is called. + String testSize = "small"; + Flower.Colour testColour = Flower.Colour.WHITE; + ArrayList eligibleFlowersByOccasionAndColour = + FlowerDictionary.filterByColour(eligibleFlowersByOccasion, testColour); + RecommendCommand testCommand = new RecommendCommand(); + try { + testCommand.addRandomFlowers(eligibleFlowersByOccasionAndColour, recommendedBouquet, testSize, testColour); + } catch (FlorizzException e) { + ui.printError(e); + } + + // check if all flowers in recommendedBouquet have the correct colour + for (Flower flower : recommendedBouquet.getFlowerList()) { + assertTrue(flower.getColour().equalsIgnoreCase(testColour.toString()) + || flower.getColour().equalsIgnoreCase("green")); + } + + // check if the number of flowers in recommendedBouquet is correct + assertEquals(SMALL_BOUQUET_FLOWER_COUNT + SMALL_BOUQUET_FILLER_COUNT, + recommendedBouquet.totalNumberOfFlowers()); + + // check if the number of main flowers is correct + int mainFlowerCount = 0; + for (Flower flower : recommendedBouquet.getFlowerList()) { + if (flower.getType() == Flower.Type.MAIN_FLOWER) { + mainFlowerCount += recommendedBouquet.getFlowerHashMap().get(flower); + } + } + assertEquals(SMALL_BOUQUET_FLOWER_COUNT, mainFlowerCount); + + // check if the number of filler flowers is correct + int fillerFlowerCount = 0; + for (Flower flower : recommendedBouquet.getFlowerList()) { + if (flower.getType() == Flower.Type.FILLER_FLOWER) { + fillerFlowerCount += recommendedBouquet.getFlowerHashMap().get(flower); + } + } + assertEquals(SMALL_BOUQUET_FILLER_COUNT, fillerFlowerCount); + } + + @Test + void testRecommendCommand_addRandomFlowersMediumMothersDay() { + Ui ui = new Ui(); + FlowerDictionary.startup(); + Flower.Occasion occasion = Flower.Occasion.MOTHERS_DAY; + ArrayList eligibleFlowersByOccasion = FlowerDictionary.filterByOccasion(occasion); + Bouquet recommendedBouquet = new Bouquet("TestBouquet"); + String testSize = "medium"; + Flower.Colour testColour = Flower.Colour.PINK; + ArrayList eligibleFlowersByOccasionAndColour = + FlowerDictionary.filterByColour(eligibleFlowersByOccasion, testColour); + RecommendCommand testCommand = new RecommendCommand(); + try { + testCommand.addRandomFlowers(eligibleFlowersByOccasionAndColour, recommendedBouquet, testSize, testColour); + } catch (FlorizzException e) { + ui.printError(e); + } + + ArrayList test = new ArrayList<>(); + test.add(recommendedBouquet); + ui.printAllBouquets(test); + + // check if all flowers in recommendedBouquet have the correct colour + for (Flower flower : recommendedBouquet.getFlowerList()) { + assertTrue(flower.getColour().equalsIgnoreCase(testColour.toString()) + || flower.getColour().equalsIgnoreCase("green")); + } + + // check if the number of flowers in recommendedBouquet is correct + assertEquals(MEDIUM_BOUQUET_FLOWER_COUNT + MEDIUM_BOUQUET_FILLER_COUNT, + recommendedBouquet.totalNumberOfFlowers()); + + // check if the number of main flowers is correct + int mainFlowerCount = 0; + for (Flower flower : recommendedBouquet.getFlowerList()) { + if (flower.getType() == Flower.Type.MAIN_FLOWER) { + mainFlowerCount += recommendedBouquet.getFlowerHashMap().get(flower); + } + } + assertEquals(MEDIUM_BOUQUET_FLOWER_COUNT, mainFlowerCount); + + // check if the number of filler flowers is correct + int fillerFlowerCount = 0; + for (Flower flower : recommendedBouquet.getFlowerList()) { + if (flower.getType() == Flower.Type.FILLER_FLOWER) { + fillerFlowerCount += recommendedBouquet.getFlowerHashMap().get(flower); + } + } + assertEquals(MEDIUM_BOUQUET_FILLER_COUNT, fillerFlowerCount); + } + + @Test + void testRecommendCommand_addRandomFlowersLargeFuneral() { + Ui ui = new Ui(); + FlowerDictionary.startup(); + Flower.Occasion occasion = Flower.Occasion.FUNERAL; + ArrayList eligibleFlowersByOccasion = FlowerDictionary.filterByOccasion(occasion); + Bouquet recommendedBouquet = new Bouquet("TestBouquet"); + String testSize = "large"; + Flower.Colour testColour = Flower.Colour.DARK_CRIMSON; + ArrayList eligibleFlowersByOccasionAndColour = + FlowerDictionary.filterByColour(eligibleFlowersByOccasion, testColour); + RecommendCommand testCommand = new RecommendCommand(); + try { + testCommand.addRandomFlowers(eligibleFlowersByOccasionAndColour, recommendedBouquet, testSize, testColour); + } catch (FlorizzException e) { + ui.printError(e); + } + + ArrayList test = new ArrayList<>(); + test.add(recommendedBouquet); + ui.printAllBouquets(test); + + // check if all flowers in recommendedBouquet have the correct colour + for (Flower flower : recommendedBouquet.getFlowerList()) { + assertTrue(flower.getColour().equalsIgnoreCase(colourToString(testColour)) + || flower.getColour().equalsIgnoreCase("green")); + } + + // check if the number of flowers in recommendedBouquet is correct + assertEquals(LARGE_BOUQUET_FLOWER_COUNT + LARGE_BOUQUET_FILLER_COUNT, + recommendedBouquet.totalNumberOfFlowers()); + + // check if the number of main flowers is correct + int mainFlowerCount = 0; + for (Flower flower : recommendedBouquet.getFlowerList()) { + if (flower.getType() == Flower.Type.MAIN_FLOWER) { + mainFlowerCount += recommendedBouquet.getFlowerHashMap().get(flower); + } + } + assertEquals(LARGE_BOUQUET_FLOWER_COUNT, mainFlowerCount); + + // check if the number of filler flowers is correct + int fillerFlowerCount = 0; + for (Flower flower : recommendedBouquet.getFlowerList()) { + if (flower.getType() == Flower.Type.FILLER_FLOWER) { + fillerFlowerCount += recommendedBouquet.getFlowerHashMap().get(flower); + } + } + assertEquals(LARGE_BOUQUET_FILLER_COUNT, fillerFlowerCount); + } +} diff --git a/src/test/java/florizz/core/FlowerDictionaryTest.java b/src/test/java/florizz/core/FlowerDictionaryTest.java new file mode 100644 index 0000000000..4e85090908 --- /dev/null +++ b/src/test/java/florizz/core/FlowerDictionaryTest.java @@ -0,0 +1,62 @@ +package florizz.core; + +import florizz.objects.Flower; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class FlowerDictionaryTest { + @Test + void testFilterByOccasion() { + FlowerDictionary.startup(); + ArrayList filteredFlowers = new ArrayList<>(); + filteredFlowers = FlowerDictionary.filterByOccasion(Flower.Occasion.FUNERAL); + // check if all flowers in filteredFlowers have the correct occasion + for (Flower flower : filteredFlowers) { + assertTrue(flower.getOccasion().contains(Flower.Occasion.FUNERAL)); + } + } + + @Test + void testFilterByName() { + FlowerDictionary.startup(); + Ui ui = new Ui(); + ArrayList filteredFlowers = new ArrayList<>(); + try { + filteredFlowers = FlowerDictionary.filterByName("Rose"); + } catch (FlorizzException e) { + ui.printError(e); + } + // check if all flowers in filteredFlowers have the correct name + for (Flower flower : filteredFlowers) { + assertEquals("Rose", flower.getFlowerName()); + } + } + + @Test + void testFilterByColour() { + FlowerDictionary.startup(); + ArrayList filteredFlowers = new ArrayList<>(); + filteredFlowers = FlowerDictionary.filterByColour(Flower.Colour.RED); + // check if all flowers in filteredFlowers have the correct colour + for (Flower flower : filteredFlowers) { + assertEquals(Flower.Colour.RED, flower.getColour()); + } + } + + @Test + void testFilterByColourWithList() { + FlowerDictionary.startup(); + ArrayList filteredFlowers = new ArrayList<>(); + ArrayList listOfFlowers = new ArrayList<>(); + listOfFlowers = FlowerDictionary.filterByOccasion(Flower.Occasion.FUNERAL); + filteredFlowers = FlowerDictionary.filterByColour(listOfFlowers, Flower.Colour.WHITE); + // check if all flowers in filteredFlowers have the correct colour + for (Flower flower : filteredFlowers) { + assertEquals(Flower.Colour.WHITE.toString(), flower.getColour().toUpperCase()); + } + } +} diff --git a/src/test/java/florizz/objects/BouquetTest.java b/src/test/java/florizz/objects/BouquetTest.java index a0f8e0933a..0b60692d83 100644 --- a/src/test/java/florizz/objects/BouquetTest.java +++ b/src/test/java/florizz/objects/BouquetTest.java @@ -1,5 +1,8 @@ package florizz.objects; +import florizz.core.FlorizzException; +import florizz.core.FlowerDictionary; +import florizz.core.Ui; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -20,4 +23,21 @@ void testEquals(){ assertEquals(testBouquet1, testBouquet2); assertNotEquals(testBouquet1, testBouquet3); } + + @Test + void testBouquetSize() { + int quantity = 3; + FlowerDictionary.startup(); + Ui ui = new Ui(); + Bouquet testBouquet = new Bouquet(); + Flower flowerToAdd = FlowerDictionary.get(1); + try { + testBouquet.addFlower(flowerToAdd, quantity); + } catch (FlorizzException e) { + ui.printError(e); + } + + // check for size + assertEquals(quantity, testBouquet.totalNumberOfFlowers()); + } }