diff --git a/src/class-diagram-core.png b/src/class-diagram-core.png new file mode 100644 index 000000000..abeada47b Binary files /dev/null and b/src/class-diagram-core.png differ diff --git a/src/domain-model.md b/src/domain-model.md new file mode 100644 index 000000000..dff97036a --- /dev/null +++ b/src/domain-model.md @@ -0,0 +1,122 @@ +# User stories + +As a member of the public: +- I'd like to add a specific type of bagel to my basket. +- I'd like to remove a bagel from my basket. +- I'd like to know when my basket is full when I try adding an item beyond my basket capacity. +- I'd like to know if I try to remove an item that doesn't exist in my basket. + +As a Bob's Bagel manager: +- I'd like to change the capacity of baskets. +- I want customers to only be able to order things that we stock in our inventory. + +As a customer: +- I'd like to know the total cost of items in my basket. +- I'd like to know the cost of a bagel before I add it to my basket. +- I'd like to be able to choose fillings for my bagel. +- I'd like to know the cost of each filling. + +| Classes | Instance variable | Methods | Scenario | Output | +|-------------------|--------------------------------|--------------------------------------------------|--------------------------------------------------|------------------------------------------------| +| publicMember | -Basket basket | boolean addBagelToBasket(String variant) | if basket is not full and variant in Inventory | add Bagel to Basket and return true | +| | -Inventory inventory | | if basket is full | return false | +| | | boolean removeItem(String item) | if item in basket | remove item from Basket and return true | +| | | | if item not in basket | return false | +| | | boolean isBasketFull() | if basket is full | return true | +| | | | if basket is not full | return false | +| | | boolean addItemToBasket(Item) | if basket is not full | add Item to basket | +| ----------------- | ----------------------------- | ---------------------------------------------- | --------------------------------------------- | -------------------------------------------- | +| Manager | Inherits basket and inventory | boolean changeBasketCapacity(int capacity) | if capacity not negative | change basket capacity and return true | +| | from public member | | if capacity negative | return false | +| ----------------- | ----------------------------- | ----------------------------------------------- | ---------------------------------------------- | --------------------------------------------- | +| Customer | Inherits basket and inventory | float getTotalCost() | always | return total cost of items | +| | | float getBagelPrice(String variant) | always | return Bagel price | +| | | boolean addFilling(String bagel,String filling) | if Filling is in inventory | add Filling to Bagel and return true | +| | | | if Filling is not in inventory | return false | +| | | float getFillingPrice(String filling) | always | return Filling price | +| | | float getTotalBagelPrice(Bagel) | always | return Bagel price with Filling | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Basket | -int capacity | List getItems() | if Basket contains at least one item | return List of items | +| | -List items | | if Basket is empty | return empty List | +| | | boolean removeItem(String item) | if item in basket | remove item from Basket and return true | +| | | | if item not in basket | return false | +| | | boolean addItemToBasket(Item item) | if Basket is not full and Item not Filling | add item to Basket and return true | +| | | | if Basket is full | return false | +| | | int getCurrentCapacity() | always | return capacity | +| | | float getTotalCost() | if Basket contains at least one item | return sum of all item prices | +| | | | if Basket is empty | return 0 | +| | | boolean setCapacity(int capacity) | if called by Manager | change basket capacity and return true | +| | | | if not called by Manager | return false | +| | | boolean isFull() | if items.size() >= capacity | return true | +| | | | if Basket is not full | return false | +| | | int getNumberOfItems() | always | return number of items | +| | | boolean addBagelToBasket(String variant) | if basket is not full | add Bagel to Basket | +| | | boolean addFilling(String bagel,String filling) | if bagel already in basket | add Filling to Bagel and return true | +| | | | if bagel not in basket and basket not full | add new Bagel to basket and return true | +| | | | if bagel not in basket and basket is full | return false | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Inventory | -Map items | boolean inInventory(String item) | if item in inventory map | return true | +| | | | if item not in inventory map | return false | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Item - interface | | float getPrice() | always | return price | +| | | String getVariant() | always | return variant | +| | | String getSKU() | always | return SKU | +| | | String getNAme() | always | return name | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Bagel | -List fillings | void addFilling(String filling) | always | add Filling to Bagel | +| | - float price | | | | +| | - String variant | List getFillings() | always | return list of fillings | +| | - String sku | | | | +| | - String name | boolean removeFilling(String filling) | if Filling in fillings list | remove Filling from list and return true | +| | | | if Filling not in fillings list | return false | +| | | implements all Item methods | | | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Coffee | - float price | implements all Item methods | | | +| | - String variant | | | | +| | - String sku | | | | +| | - String name | | | | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Filling | - float price | implements all Item methods | | | +| | - String variant | | | | +| | - String sku | | | | +| | - String name | | | | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | + + +## Extension 1: Discounts + +As a customer: +- When I place an order, and it contains 6 bagels I will get a discount: 6 bagels for 2.49 +- When I place an order, and it contains 12 bagels I will get a discount: 12 bagels for 3.99 +- When I place an order, and it contains 1 coffee and 1 bagel I will get a discount: coffee & bagel for 1.25 + + +Extension of the domain model over: + +| Classes | Instance variables | Methods | Scenario | Output | +|----------|----------------------|-----------------------------------------------|-----------------------------------------------|------------------------------------------------------------------------| +| Order | int numberOfFillings | float getTotalCost() | always | return number of bagels in order | +| | List bagels | float applyBagelDiscount(int remainingBagels) | remainingBagels < 6 | no bulk discount applied | +| | List coffees | | remainingBagels = 6 | 2.49 special offer | +| | | | remainingBagels < 12 && remainingBagels > 6 | special offer 2.49 + total cost of rest of bagels | +| | | | remainingBagels = 12 | 3.99 special offer | +| | | | remainingBagels > 12 && remainingBagels < 18 | 3.99 special offer + total cost of rest of bagels | +| | | | remainingBagels >= 18 && remainingBagels < 24 | 3.99 special offer + 2.49 special offer + total cost of rest of bagels | +| | | | remainingBagels >= 24 .... | 3.99 + 3.99 + total cost of rest of bagels | +| | | List getBagels | always | return list of bagels | +| | | List getCoffees | always | return list of coffees | +| Basket | | Order placeOrder(List) | always | return Order | +| Customer | | Order placeOrder() | always | return Order | + +## Extension 2: Receipt + +Extension of the domain model over: + +| Classes | Instance variables | Methods | Scenario | Output | +|---------|--------------------|-----------------------|----------|------------------------------------| +| Receipt | Order order | String makeReceipt() | always | return String with receipt details | +| Order | | Receipt makeReceipt() | always | return Receipt | +| | | void printReceipt() | always | print Receipt details | +| | | | | | +| | | | | | + diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java new file mode 100644 index 000000000..a66f30f60 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -0,0 +1,79 @@ +package com.booleanuk.core; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class Bagel implements Item{ + private List fillings = new ArrayList<>(); + private String variant; + private String name; + private String sku; + private float price; + + public Bagel(String variant) { + this.variant = variant.toUpperCase(); + this.name = "Bagel"; + this.price = 0.49F; + setRest(); + } + + private void setRest(){ + switch (this.variant) { + case "ONION" -> this.sku = "BGLO"; + case "PLAIN" -> { + this.price = 0.39F; + this.sku = "BGLP"; + } + case "EVERYTHING" -> this.sku = "BGLE"; + case "SESAME" -> this.sku = "BGLS"; + } + } + + @Override + public String getVariant() { + return this.variant; + } + + @Override + public float getPrice(){ + float totalPrice = this.price; + + if (!fillings.isEmpty()){ + for (Filling filling : fillings) { + totalPrice += filling.getPrice(); + } + } + return totalPrice; + } + + @Override + public String getSku() { + return this.sku; + } + + @Override + public String getName() { + return this.name; + } + + public void addFilling(String filling){ + String addFilling = filling.toUpperCase(); + fillings.add(new Filling(addFilling)); + } + + + public ListgetFillings() { + return fillings; + } + + public boolean removeFilling(String filling) { + String fillingToRemove = filling.toUpperCase(); + for(Filling fillingInList: fillings){ + if (fillingInList.getVariant().equals(fillingToRemove)){ + fillings.remove(fillingInList); + return true; + } + }return false; + } +} diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java new file mode 100644 index 000000000..d7fe524b1 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -0,0 +1,96 @@ +package com.booleanuk.core; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class Basket { + private static int capacity; + private final int DEFAULT_CAPACITY = 5; + private List items; + + public Basket(){ + capacity = DEFAULT_CAPACITY; + this.items = new ArrayList<>(); + } + public void addBagelToBasket(String variant) { + if (!this.isFull()) { + String item = variant.toUpperCase(); + Bagel bagel = new Bagel(item); + items.add(bagel); + } + } + + public boolean addItemToBasket(Item variant) { + if (!this.isFull() && !(variant instanceof Filling)){ + items.add(variant); + return true; + }return false; + } + + public boolean isFull() { + return items.size() >= capacity; + } + + public boolean removeItem(String itemToRemove){ + if (!items.isEmpty()) { + for (Item item : items){ + if (Objects.equals(item.getVariant().toUpperCase(), itemToRemove.toUpperCase())){ + items.remove(item); + return true; + } + } + } return false; + } + + public boolean setCapacity(int newCapacity, Manager manager){ + if (manager == null) { + throw new SecurityException("Only managers can change basket capacity"); + } + if (newCapacity >= 0){ + capacity = newCapacity; + return true; + } else return false; + } + + public float getTotalCost() { + float sum = 0; + for (Item item: items){ + sum += item.getPrice(); + } + return sum; + } + + public boolean addFillingToBagel(String bagel, String filling) { + String bagelToUpper = bagel.toUpperCase(); + String fillingToUpper = filling.toUpperCase(); + for (Item item : items) { + if (item instanceof Bagel && item.getVariant().toUpperCase().equals(bagelToUpper)) { + ((Bagel) item).addFilling(filling); + return true; + } + } + + if(isFull()){ + System.out.println("Cannot add new bagel. The basket is full."); + return false; + } + + Bagel newBagel = new Bagel(bagelToUpper); + newBagel.addFilling(fillingToUpper); + items.add(newBagel); + return true; + } + + public List getItems() { + return items; + } + + public int getCurrentCapacity() { + return capacity; + } + + public int getNumberOfItems() { + return items.size(); + } +} diff --git a/src/main/java/com/booleanuk/core/Coffee.java b/src/main/java/com/booleanuk/core/Coffee.java new file mode 100644 index 000000000..a79a9b58f --- /dev/null +++ b/src/main/java/com/booleanuk/core/Coffee.java @@ -0,0 +1,49 @@ +package com.booleanuk.core; + +public class Coffee implements Item { + private String variant; + private String name; + private String sku; + private float price; + + public Coffee(String variant) { + this.variant = variant.toUpperCase(); + this.name = "Coffee"; + this.price = 1.29F; + setRest(); + } + + private void setRest(){ + switch (this.variant) { + case "BLACK" -> { + this.price = 0.99F; + this.sku = "COFB"; + } + case "WHITE" -> { + this.price = 1.19F; + this.sku = "COFW"; + } case "CAPUCCINO" -> this.sku = "COFC"; + case "LATTE" -> this.sku = "COFL"; + } + } + + @Override + public String getVariant() { + return this.variant; + } + + @Override + public float getPrice() { + return this.price; + } + + @Override + public String getSku() { + return this.sku; + } + + @Override + public String getName() { + return this.name; + } +} diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java new file mode 100644 index 000000000..fd723cd71 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -0,0 +1,46 @@ +package com.booleanuk.core; + +public class Customer extends PublicMember { + + public Customer(Basket basket, Inventory inventory) { + super(basket, inventory); + } + + + public float getTotalCost() { + return basket.getTotalCost(); + } + + public float getBagelPrice(String variant) { + Item item = inventory.getItem(variant); + if (item != null) { + return item.getPrice(); + } return 0; + } + + public boolean addFilling(String bagel, String filling) { + if (!inventory.inInventory(bagel)) { + System.out.println("We don't sell this bagel here!"); + return false; + } + + if (!inventory.inInventory(filling)) { + System.out.println("We don't sell this filling here!"); + return false; + } + + return basket.addFillingToBagel(bagel, filling); + } + + + public float getFillingPrice(String variant) { + Item item = inventory.getItem(variant); + if (item != null) { + return item.getPrice(); + } return 0; + } + + public float getTotalBagelPrice(Bagel bagel) { + return bagel.getPrice(); + } +} diff --git a/src/main/java/com/booleanuk/core/Filling.java b/src/main/java/com/booleanuk/core/Filling.java new file mode 100644 index 000000000..b4b288ee8 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Filling.java @@ -0,0 +1,46 @@ +package com.booleanuk.core; + +public class Filling implements Item { + private String variant; + private String name; + private String sku; + private float price; + + public Filling (String variant) { + this.variant = variant.toUpperCase(); + this.name = "Filling"; + this.price = 0.12F; + setRest(); + } + + private void setRest(){ + switch(this.variant) { + case "BACON" -> this.sku = "FILB"; + case "CHEESE" -> this.sku = "FILC"; + case "CREAM CHEESE" -> this.sku = "FILX"; + case "SMOKED SALMON" -> this.sku = "FILS"; + case "HAM" -> this.sku = "FILH"; + case "EGG" -> this.sku = "FILE"; + } + } + + @Override + public String getVariant() { + return this.variant; + } + + @Override + public float getPrice() { + return this.price; + } + + @Override + public String getSku() { + return this.sku; + } + + @Override + public String getName() { + return this.name; + } +} diff --git a/src/main/java/com/booleanuk/core/Inventory.java b/src/main/java/com/booleanuk/core/Inventory.java new file mode 100644 index 000000000..7c72b2ec5 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Inventory.java @@ -0,0 +1,46 @@ +package com.booleanuk.core; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class Inventory { + private Map inventory = new HashMap<>(); + + public Inventory(){ + setDefaultInventory(); + } + + public boolean inInventory(String variant) { + String item = variant.toUpperCase(); + for (String key : inventory.keySet()) { + if (Objects.equals(key, item)) { + return true; + } + } return false; + } + + private void setDefaultInventory(){ + inventory.put("ONION", new Bagel("Onion")); + inventory.put("PLAIN", new Bagel("Plain")); + inventory.put("EVERYTHING", new Bagel("Everything")); + inventory.put("SESAME", new Bagel("Sesame")); + + inventory.put("BLACK", new Coffee("Black")); + inventory.put("WHITE", new Coffee("White")); + inventory.put("CAPUCCINO", new Coffee("Capuccino")); + inventory.put("LATTE", new Coffee("Latte")); + + inventory.put("BACON", new Filling("Bacon")); + inventory.put("EGG", new Filling("Egg")); + inventory.put("CHEESE", new Filling("Cheese")); + inventory.put("CREAM CHEESE", new Filling("Cream Cheese")); + inventory.put("SMOKED SALMON", new Filling("Smoked Salmon")); + inventory.put("HAM", new Filling("Ham")); + + } + + public Item getItem(String variant){ + return inventory.get(variant.toUpperCase()); + } +} diff --git a/src/main/java/com/booleanuk/core/Item.java b/src/main/java/com/booleanuk/core/Item.java new file mode 100644 index 000000000..1fd379168 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Item.java @@ -0,0 +1,9 @@ +package com.booleanuk.core; + +public interface Item { + + String getVariant(); + float getPrice(); + String getSku(); + String getName(); +} diff --git a/src/main/java/com/booleanuk/core/Manager.java b/src/main/java/com/booleanuk/core/Manager.java new file mode 100644 index 000000000..5657e4e0b --- /dev/null +++ b/src/main/java/com/booleanuk/core/Manager.java @@ -0,0 +1,13 @@ +package com.booleanuk.core; + +public class Manager extends PublicMember { + + public Manager(Basket basket, Inventory inventory) { + super(basket, inventory); + } + + public Boolean changeBasketCapacity(int capacity){ + return basket.setCapacity(capacity, this); + } + +} diff --git a/src/main/java/com/booleanuk/core/PublicMember.java b/src/main/java/com/booleanuk/core/PublicMember.java new file mode 100644 index 000000000..ac52e1c58 --- /dev/null +++ b/src/main/java/com/booleanuk/core/PublicMember.java @@ -0,0 +1,34 @@ +package com.booleanuk.core; + +public class PublicMember { + protected Basket basket; + protected Inventory inventory; + + public PublicMember(Basket basket, Inventory inventory){ + this.basket = basket; + this.inventory = inventory; + } + + public boolean addBagelToBasket(String variant){ + String item = variant.toUpperCase(); + if (inventory.inInventory(item) && !basket.isFull()){ + basket.addBagelToBasket(item); + return true; + } else return false; + } + + public void addItemToBasket(Item bagel){ + if (!basket.isFull()){ + basket.addItemToBasket(bagel); + } + } + + public boolean removeItem(String item) { + String itemUpperCase = item.toUpperCase(); + return basket.removeItem(itemUpperCase); + } + + public Boolean isBasketFull() { + return basket.isFull(); + } +} diff --git a/src/main/java/com/booleanuk/extension/Bagel.java b/src/main/java/com/booleanuk/extension/Bagel.java new file mode 100644 index 000000000..f92b54892 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Bagel.java @@ -0,0 +1,78 @@ +package com.booleanuk.extension; + +import java.util.ArrayList; +import java.util.List; + +public class Bagel implements Item { + private List fillings = new ArrayList<>(); + private String variant; + private String name; + private String sku; + private float price; + + public Bagel(String variant) { + this.variant = variant.toUpperCase(); + this.name = "Bagel"; + this.price = 0.49F; + setRest(); + } + + private void setRest(){ + switch (this.variant) { + case "ONION" -> this.sku = "BGLO"; + case "PLAIN" -> { + this.price = 0.39F; + this.sku = "BGLP"; + } + case "EVERYTHING" -> this.sku = "BGLE"; + case "SESAME" -> this.sku = "BGLS"; + } + } + + @Override + public String getVariant() { + return this.variant; + } + + @Override + public float getPrice(){ + float totalPrice = this.price; + + if (!fillings.isEmpty()){ + for (Filling filling : fillings) { + totalPrice += filling.getPrice(); + } + } + return totalPrice; + } + + @Override + public String getSku() { + return this.sku; + } + + @Override + public String getName() { + return this.name; + } + + public void addFilling(String filling){ + String addFilling = filling.toUpperCase(); + fillings.add(new Filling(addFilling)); + } + + + public ListgetFillings() { + return fillings; + } + + public boolean removeFilling(String filling) { + String fillingToRemove = filling.toUpperCase(); + for(Filling fillingInList: fillings){ + if (fillingInList.getVariant().equals(fillingToRemove)){ + fillings.remove(fillingInList); + return true; + } + }return false; + } +} diff --git a/src/main/java/com/booleanuk/extension/Basket.java b/src/main/java/com/booleanuk/extension/Basket.java new file mode 100644 index 000000000..4ac5487fe --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Basket.java @@ -0,0 +1,101 @@ +package com.booleanuk.extension; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class Basket { + private static int capacity; + private final int DEFAULT_CAPACITY = 12; + private List items; + + public Basket(){ + capacity = DEFAULT_CAPACITY; + this.items = new ArrayList<>(); + } + public void addBagelToBasket(String variant) { + if (!this.isFull()) { + String item = variant.toUpperCase(); + Bagel bagel = new Bagel(item); + items.add(bagel); + } + } + + public boolean addItemToBasket(Item variant) { + if (!this.isFull() && !(variant instanceof Filling)){ + items.add(variant); + return true; + }return false; + } + + public boolean isFull() { + return items.size() >= capacity; + } + + public boolean removeItem(String itemToRemove){ + if (!items.isEmpty()) { + for (Item item : items){ + if (Objects.equals(item.getVariant().toUpperCase(), itemToRemove.toUpperCase())){ + items.remove(item); + return true; + } + } + } return false; + } + + public boolean setCapacity(int newCapacity, Manager manager){ + if (manager == null) { + throw new SecurityException("Only managers can change basket capacity"); + } + if (newCapacity >= 0){ + capacity = newCapacity; + return true; + } else return false; + } + + public float getTotalCost() { + float sum = 0; + for (Item item: items){ + sum += item.getPrice(); + } + return sum; + } + + public boolean addFillingToBagel(String bagel, String filling) { + String bagelToUpper = bagel.toUpperCase(); + String fillingToUpper = filling.toUpperCase(); + for (Item item : items) { + if (item instanceof Bagel && item.getVariant().toUpperCase().equals(bagelToUpper)) { + ((Bagel) item).addFilling(filling); + return true; + } + } + + if(isFull()){ + System.out.println("Cannot add new bagel. The basket is full."); + return false; + } + + Bagel newBagel = new Bagel(bagelToUpper); + newBagel.addFilling(fillingToUpper); + items.add(newBagel); + return true; + } + + public List getItems() { + return items; + } + + public int getCurrentCapacity() { + return capacity; + } + + public int getNumberOfItems() { + return items.size(); + } + + public Order placeOrder(){ + return new Order(items); + } + +} diff --git a/src/main/java/com/booleanuk/extension/Coffee.java b/src/main/java/com/booleanuk/extension/Coffee.java new file mode 100644 index 000000000..87fd3d572 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Coffee.java @@ -0,0 +1,49 @@ +package com.booleanuk.extension; + +public class Coffee implements Item { + private String variant; + private String name; + private String sku; + private float price; + + public Coffee(String variant) { + this.variant = variant.toUpperCase(); + this.name = "Coffee"; + this.price = 1.29F; + setRest(); + } + + private void setRest(){ + switch (this.variant) { + case "BLACK" -> { + this.price = 0.99F; + this.sku = "COFB"; + } + case "WHITE" -> { + this.price = 1.19F; + this.sku = "COFW"; + } case "CAPUCCINO" -> this.sku = "COFC"; + case "LATTE" -> this.sku = "COFL"; + } + } + + @Override + public String getVariant() { + return this.variant; + } + + @Override + public float getPrice() { + return this.price; + } + + @Override + public String getSku() { + return this.sku; + } + + @Override + public String getName() { + return this.name; + } +} diff --git a/src/main/java/com/booleanuk/extension/Customer.java b/src/main/java/com/booleanuk/extension/Customer.java new file mode 100644 index 000000000..deba32489 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Customer.java @@ -0,0 +1,50 @@ +package com.booleanuk.extension; + +public class Customer extends PublicMember { + + public Customer(Basket basket, Inventory inventory) { + super(basket, inventory); + } + + + public float getTotalCost() { + return basket.getTotalCost(); + } + + public float getBagelPrice(String variant) { + Item item = inventory.getItem(variant); + if (item != null) { + return item.getPrice(); + } return 0; + } + + public boolean addFilling(String bagel, String filling) { + if (!inventory.inInventory(bagel)) { + System.out.println("We don't sell this bagel here!"); + return false; + } + + if (!inventory.inInventory(filling)) { + System.out.println("We don't sell this filling here!"); + return false; + } + + return basket.addFillingToBagel(bagel, filling); + } + + + public float getFillingPrice(String variant) { + Item item = inventory.getItem(variant); + if (item != null) { + return item.getPrice(); + } return 0; + } + + public float getTotalBagelPrice(Bagel bagel) { + return bagel.getPrice(); + } + + public Order placeOrder() { + return basket.placeOrder(); + } +} diff --git a/src/main/java/com/booleanuk/extension/Filling.java b/src/main/java/com/booleanuk/extension/Filling.java new file mode 100644 index 000000000..661316571 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Filling.java @@ -0,0 +1,46 @@ +package com.booleanuk.extension; + +public class Filling implements Item { + private String variant; + private String name; + private String sku; + private float price; + + public Filling (String variant) { + this.variant = variant.toUpperCase(); + this.name = "Filling"; + this.price = 0.12F; + setRest(); + } + + private void setRest(){ + switch(this.variant) { + case "BACON" -> this.sku = "FILB"; + case "CHEESE" -> this.sku = "FILC"; + case "CREAM CHEESE" -> this.sku = "FILX"; + case "SMOKED SALMON" -> this.sku = "FILS"; + case "HAM" -> this.sku = "FILH"; + case "EGG" -> this.sku = "FILE"; + } + } + + @Override + public String getVariant() { + return this.variant; + } + + @Override + public float getPrice() { + return this.price; + } + + @Override + public String getSku() { + return this.sku; + } + + @Override + public String getName() { + return this.name; + } +} diff --git a/src/main/java/com/booleanuk/extension/Inventory.java b/src/main/java/com/booleanuk/extension/Inventory.java new file mode 100644 index 000000000..2e2241ae0 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Inventory.java @@ -0,0 +1,46 @@ +package com.booleanuk.extension; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class Inventory { + private Map inventory = new HashMap<>(); + + public Inventory(){ + setDefaultInventory(); + } + + public boolean inInventory(String variant) { + String item = variant.toUpperCase(); + for (String key : inventory.keySet()) { + if (Objects.equals(key, item)) { + return true; + } + } return false; + } + + private void setDefaultInventory(){ + inventory.put("ONION", new Bagel("Onion")); + inventory.put("PLAIN", new Bagel("Plain")); + inventory.put("EVERYTHING", new Bagel("Everything")); + inventory.put("SESAME", new Bagel("Sesame")); + + inventory.put("BLACK", new Coffee("Black")); + inventory.put("WHITE", new Coffee("White")); + inventory.put("CAPUCCINO", new Coffee("Capuccino")); + inventory.put("LATTE", new Coffee("Latte")); + + inventory.put("BACON", new Filling("Bacon")); + inventory.put("EGG", new Filling("Egg")); + inventory.put("CHEESE", new Filling("Cheese")); + inventory.put("CREAM CHEESE", new Filling("Cream Cheese")); + inventory.put("SMOKED SALMON", new Filling("Smoked Salmon")); + inventory.put("HAM", new Filling("Ham")); + + } + + public Item getItem(String variant){ + return inventory.get(variant.toUpperCase()); + } +} diff --git a/src/main/java/com/booleanuk/extension/Item.java b/src/main/java/com/booleanuk/extension/Item.java new file mode 100644 index 000000000..78e31b16c --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Item.java @@ -0,0 +1,9 @@ +package com.booleanuk.extension; + +public interface Item { + + String getVariant(); + float getPrice(); + String getSku(); + String getName(); +} diff --git a/src/main/java/com/booleanuk/extension/Manager.java b/src/main/java/com/booleanuk/extension/Manager.java new file mode 100644 index 000000000..08e7b054f --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Manager.java @@ -0,0 +1,13 @@ +package com.booleanuk.extension; + +public class Manager extends PublicMember { + + public Manager(Basket basket, Inventory inventory) { + super(basket, inventory); + } + + public Boolean changeBasketCapacity(int capacity){ + return basket.setCapacity(capacity, this); + } + +} diff --git a/src/main/java/com/booleanuk/extension/Order.java b/src/main/java/com/booleanuk/extension/Order.java new file mode 100644 index 000000000..219605e7b --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Order.java @@ -0,0 +1,103 @@ +package com.booleanuk.extension; + + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +public class Order { + private List bagels; + private List coffees; + + public Order(List basketItems) { + this.bagels = new ArrayList<>(); + this.coffees = new ArrayList<>(); + + for (Item item : basketItems) { + if (item instanceof Bagel) { + bagels.add((Bagel) item); + } else if (item instanceof Coffee) { + coffees.add((Coffee) item); + } + } + } + + public float getTotalCost() { + float total = 0; + + int blackCoffeeCount = 0; + for (Coffee coffee : coffees) { + if (coffee.getVariant().equals("BLACK")) { + blackCoffeeCount++; + } + } + + int totalFillings = 0; + for (Bagel bagel : bagels) { + totalFillings += bagel.getFillings().size(); + } + + int coffeeAndBagelCombo = Math.min(blackCoffeeCount, bagels.size()); + int remainingBagels = bagels.size() - coffeeAndBagelCombo; + int remainingBlackCoffees = blackCoffeeCount - coffeeAndBagelCombo; + + total += coffeeAndBagelCombo * 1.25f; + total += applyBagelDiscounts(remainingBagels); + total += remainingBlackCoffees * 0.99f; + + for (Coffee coffee : coffees) { + if (!coffee.getVariant().equals("BLACK")) { + total += coffee.getPrice(); + } + } + + total += totalFillings * 0.12f; + + return total; + } + + private float applyBagelDiscounts(int remainingBagels) { + float total = 0; + + if (remainingBagels >= 12) { + int twelvePacks = remainingBagels / 12; + total += twelvePacks * 3.99f; + remainingBagels -= twelvePacks * 12; + } + + if (remainingBagels >= 6) { + int sixPacks = remainingBagels / 6; + total += sixPacks * 2.49f; + remainingBagels -= sixPacks * 6; + } + + int startIndex = bagels.size() - remainingBagels; + for (int i = startIndex; i < bagels.size(); i++) { + Bagel bagel = bagels.get(i); + total += getBagelPrice(bagel); + } + + return total; + } + + private float getBagelPrice(Bagel bagel) { + return bagel.getVariant().equals("PLAIN") ? 0.39f : 0.49f; + } + + public List getBagels() { + return bagels; + } + + public List getCoffees() { + return coffees; + } + + public Receipt makeReceipt(){ + return new Receipt(this); + } + + public void printReceipt(){ + Receipt receipt = makeReceipt(); + receipt.printReceipt(); + } +} diff --git a/src/main/java/com/booleanuk/extension/PublicMember.java b/src/main/java/com/booleanuk/extension/PublicMember.java new file mode 100644 index 000000000..736565fdb --- /dev/null +++ b/src/main/java/com/booleanuk/extension/PublicMember.java @@ -0,0 +1,34 @@ +package com.booleanuk.extension; + +public class PublicMember { + protected Basket basket; + protected Inventory inventory; + + public PublicMember(Basket basket, Inventory inventory){ + this.basket = basket; + this.inventory = inventory; + } + + public boolean addBagelToBasket(String variant){ + String item = variant.toUpperCase(); + if (inventory.inInventory(item) && !basket.isFull()){ + basket.addBagelToBasket(item); + return true; + } else return false; + } + + public void addItemToBasket(Item bagel){ + if (!basket.isFull()){ + basket.addItemToBasket(bagel); + } + } + + public boolean removeItem(String item) { + String itemUpperCase = item.toUpperCase(); + return basket.removeItem(itemUpperCase); + } + + public Boolean isBasketFull() { + return basket.isFull(); + } +} diff --git a/src/main/java/com/booleanuk/extension/Receipt.java b/src/main/java/com/booleanuk/extension/Receipt.java new file mode 100644 index 000000000..6c5987394 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Receipt.java @@ -0,0 +1,58 @@ +package com.booleanuk.extension; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.Map; + +public class Receipt { + private Order order; + + public Receipt(Order order) { + this.order = order; + } + + public void printReceipt() { + System.out.println(makeReceipt()); + } + + public String makeReceipt() { + StringBuilder receipt = new StringBuilder(); + + receipt.append(" ~~~ Bob's Bagels ~~~\n\n"); + receipt.append(" ").append(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))).append("\n\n"); + receipt.append("----------------------------\n\n"); + + Map bagelCounts = new HashMap<>(); + Map bagelTotals = new HashMap<>(); + + for (Bagel bagel : order.getBagels()) { + String variant = bagel.getVariant(); + bagelCounts.put(variant, bagelCounts.getOrDefault(variant, 0) + 1); + bagelTotals.put(variant, bagelTotals.getOrDefault(variant, 0F) + bagel.getPrice()); + } + + for (String variant : bagelCounts.keySet()) { + int count = bagelCounts.get(variant); + float totalPrice = bagelTotals.get(variant); + String name = variant + " Bagel"; + receipt.append(String.format("%-15s %8d £%.2f\n", name, count, totalPrice)); + } + + int coffeeCount = order.getCoffees().size(); + if (coffeeCount > 0) { + float coffeeTotal = 0; + for (Coffee coffee : order.getCoffees()) { + coffeeTotal += coffee.getPrice(); + } + receipt.append(String.format("%-15s %8d £%.2f\n", "Coffee", coffeeCount, coffeeTotal)); + } + + receipt.append("\n----------------------------\n"); + receipt.append(String.format("Total%18s£%.2f\n", "", order.getTotalCost())); + receipt.append("\n Thank you\n"); + receipt.append(" for your order!\n"); + + return receipt.toString(); + } +} diff --git a/src/test/java/com/booleanuk/core/BagelTest.java b/src/test/java/com/booleanuk/core/BagelTest.java new file mode 100644 index 000000000..848bf2106 --- /dev/null +++ b/src/test/java/com/booleanuk/core/BagelTest.java @@ -0,0 +1,59 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.List; + +public class BagelTest { + @Test + public void getFillings(){ + Bagel bagel = new Bagel("onion"); + Assertions.assertTrue(bagel.getFillings().isEmpty()); + + bagel.addFilling("egg"); + Assertions.assertFalse(bagel.getFillings().isEmpty()); + } + @Test + public void addFillingOk(){ + Bagel bagel = new Bagel("onion"); + bagel.addFilling("egg"); + bagel.addFilling("bacon"); + bagel.addFilling("ham"); + bagel.addFilling("CHEEse"); + + List fillings = bagel.getFillings(); + + Assertions.assertEquals("EGG", fillings.get(0).getVariant()); + Assertions.assertEquals("BACON", fillings.get(1).getVariant()); + Assertions.assertEquals("HAM", fillings.get(2).getVariant()); + Assertions.assertEquals("CHEESE", fillings.get(3).getVariant()); + + + + } + + @Test + public void getTotalPrice(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Customer customer = new Customer(basket, inventory); + + customer.addBagelToBasket("onion"); + customer.addFilling("onion", "cheese"); + customer.addBagelToBasket("plain"); + customer.addBagelToBasket("everything"); + + Assertions.assertEquals(1.49F, customer.getTotalCost()); + } + + @Test + public void removeFilling(){ + Bagel bagel = new Bagel("sesame"); + bagel.addFilling("egg"); + + Assertions.assertTrue(bagel.removeFilling("egg")); + Assertions.assertFalse(bagel.removeFilling("egg")); + + } +} diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java new file mode 100644 index 000000000..19f6280b2 --- /dev/null +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -0,0 +1,133 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class BasketTest { + + @Test + public void getItems(){ + Basket basket = new Basket(); + Bagel bagel = new Bagel("onion"); + basket.addItemToBasket(bagel); + + Assertions.assertTrue(basket.getItems().contains(bagel)); + + } + @Test + public void getItemsEmptyBasket(){ + Basket basket = new Basket(); + + Assertions.assertTrue(basket.getItems().isEmpty()); + } + + @Test + public void removeItemOk(){ + Basket basket = new Basket(); + basket.addBagelToBasket("onion"); + + Assertions.assertTrue(basket.removeItem("onion")); + } + + @Test + public void removeItemNotOk(){ + Basket basket = new Basket(); + Assertions.assertFalse(basket.removeItem("onion")); + } + + @Test + public void addItemToBasketOK(){ + Basket basket = new Basket(); + Bagel bagel = new Bagel("plain"); + Coffee coffee = new Coffee("black"); + + Assertions.assertTrue(basket.addItemToBasket(bagel)); + Assertions.assertTrue(basket.addItemToBasket(coffee)); + } + + @Test + public void addItemToBasketNotOk(){ + Basket basket = new Basket(); + Bagel bagel = new Bagel("plain"); + Bagel bagel2 = new Bagel("plain"); + Bagel bagel3 = new Bagel("plain"); + Bagel bagel4 = new Bagel("plain"); + Bagel bagel5 = new Bagel("plain"); + Coffee coffee = new Coffee("black"); + Filling filling = new Filling("egg"); + + Assertions.assertFalse(basket.addItemToBasket(filling)); + + basket.addItemToBasket(bagel); + basket.addItemToBasket(bagel2); + basket.addItemToBasket(bagel3); + basket.addItemToBasket(bagel4); + basket.addItemToBasket(bagel5); + + Assertions.assertFalse(basket.addItemToBasket(coffee)); + } + + @Test + public void getCurrentCapacity(){ + Basket basket = new Basket(); + Assertions.assertEquals(5, basket.getCurrentCapacity()); + } + + @Test + public void getTotalCost(){ + Basket basket = new Basket(); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + Assertions.assertEquals(0.98F, basket.getTotalCost()); + } + + @Test + public void getTotalCostEmptyBasket(){ + Basket basket = new Basket(); + Assertions.assertEquals(0.0F, basket.getTotalCost()); + } + + @Test + public void setCapacityOk(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Manager manager = new Manager(basket, inventory); + + Assertions.assertEquals(true,manager.changeBasketCapacity(10)); + } + + @Test + public void isFull(){ + Basket basket = new Basket(); + Assertions.assertFalse(basket.isFull()); + } + + @Test + public void isFullTrue(){ + Basket basket = new Basket(); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + + + Assertions.assertTrue(basket.isFull()); + } + + @Test + public void getNumberOfItems(){ + Basket basket = new Basket(); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + + Assertions.assertEquals(5, basket.getNumberOfItems()); + } + +} diff --git a/src/test/java/com/booleanuk/core/CustomerTest.java b/src/test/java/com/booleanuk/core/CustomerTest.java new file mode 100644 index 000000000..c8a59bf55 --- /dev/null +++ b/src/test/java/com/booleanuk/core/CustomerTest.java @@ -0,0 +1,102 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class CustomerTest { + + @Test + public void getTotalCostWithItems(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Customer customer = new Customer(basket, inventory); + + customer.addBagelToBasket("onion"); + customer.addBagelToBasket("onion"); + + Assertions.assertEquals(0.98F, customer.getTotalCost()); + } + + + @Test + public void getTotalCostWithNoItems(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Customer customer = new Customer(basket, inventory); + + Assertions.assertEquals(0.0, customer.getTotalCost()); + } + + @Test + public void getBagelPrice(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Customer customer = new Customer(basket, inventory); + + Assertions.assertEquals(0.49F, customer.getBagelPrice("Everything")); + Assertions.assertEquals(0.49F, customer.getBagelPrice("Onion")); + Assertions.assertEquals(0.39F, customer.getBagelPrice("Plain")); + Assertions.assertEquals(0.49F, customer.getBagelPrice("Sesame")); + } + + @Test + public void addFillingOk(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Customer customer = new Customer(basket, inventory); + + + Assertions.assertEquals(true, customer.addFilling("onion", "egg")); + } + + @Test + public void addFillingNotOk(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Customer customer = new Customer(basket, inventory); + + + Assertions.assertEquals(false, customer.addFilling("everything", "eggy")); + } + + @Test + public void getTotalCostWithItemsWithFILLING(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Customer customer = new Customer(basket, inventory); + + customer.addBagelToBasket("onion"); + customer.addFilling("onion", "cheese"); + customer.addBagelToBasket("plain"); + customer.addBagelToBasket("everything"); + + Assertions.assertEquals(1.49F, customer.getTotalCost()); + } + + @Test + public void getFillingPrice(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Customer customer = new Customer(basket, inventory); + + Assertions.assertEquals(0.12F, customer.getFillingPrice("Cheese")); + Assertions.assertEquals(0.12F, customer.getFillingPrice("Bacon")); + Assertions.assertEquals(0.12F, customer.getFillingPrice("Egg")); + Assertions.assertEquals(0.12F, customer.getFillingPrice("Cream cheese")); + Assertions.assertEquals(0.12F, customer.getFillingPrice("smoked salmon")); + Assertions.assertEquals(0.12F, customer.getFillingPrice("ham")); + } + + @Test + public void getTotalBagelPrice(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Customer customer = new Customer(basket, inventory); + + Bagel bagel = new Bagel("onion"); + customer.addItemToBasket(bagel); + customer.addFilling("onion","egg"); + + Assertions.assertEquals(0.61F, customer.getTotalBagelPrice(bagel)); + } +} diff --git a/src/test/java/com/booleanuk/core/InventoryTest.java b/src/test/java/com/booleanuk/core/InventoryTest.java new file mode 100644 index 000000000..e5d07e57f --- /dev/null +++ b/src/test/java/com/booleanuk/core/InventoryTest.java @@ -0,0 +1,28 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class InventoryTest { + + @Test + public void inInventoryTrue(){ + Inventory inventory = new Inventory(); + Assertions.assertTrue(inventory.inInventory("onion")); + Assertions.assertTrue(inventory.inInventory("plain")); + Assertions.assertTrue(inventory.inInventory("bacon")); + Assertions.assertTrue(inventory.inInventory("EGG")); + Assertions.assertTrue(inventory.inInventory("BlAck")); + Assertions.assertTrue(inventory.inInventory("Cream CHEESE")); + } + + @Test + public void inInventoryFalse(){ + Inventory inventory = new Inventory(); + Assertions.assertFalse(inventory.inInventory("eggy")); + Assertions.assertFalse(inventory.inInventory(" ")); + Assertions.assertFalse(inventory.inInventory("LAtteee")); + Assertions.assertFalse(inventory.inInventory("toast")); + Assertions.assertFalse(inventory.inInventory("something")); + } +} diff --git a/src/test/java/com/booleanuk/core/ItemsTest.java b/src/test/java/com/booleanuk/core/ItemsTest.java new file mode 100644 index 000000000..86763308f --- /dev/null +++ b/src/test/java/com/booleanuk/core/ItemsTest.java @@ -0,0 +1,103 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ItemsTest { + Bagel onion = new Bagel("onion"); + Bagel plain = new Bagel("plain"); + Bagel everything = new Bagel("Everything"); + Bagel sesame = new Bagel("sesame"); + + Coffee black = new Coffee("black"); + Coffee white = new Coffee("white"); + Coffee capuccino = new Coffee("capuccino"); + Coffee latte = new Coffee("latte"); + + Filling bacon = new Filling("bacon"); + Filling egg = new Filling("egg"); + Filling cheese = new Filling("cheese"); + Filling creamCheese = new Filling("cream Cheese"); + Filling smokedSalmon = new Filling("smoked salmon"); + Filling ham = new Filling("ham"); + + @Test + public void getPrice(){ + Assertions.assertEquals(0.49F, onion.getPrice()); + Assertions.assertEquals(0.39F, plain.getPrice()); + Assertions.assertEquals(0.49F, everything.getPrice()); + Assertions.assertEquals(0.49F, sesame.getPrice()); + + Assertions.assertEquals(0.99F, black.getPrice()); + Assertions.assertEquals(1.19F, white.getPrice()); + Assertions.assertEquals(1.29F, capuccino.getPrice()); + Assertions.assertEquals(1.29F, latte.getPrice()); + + Assertions.assertEquals(0.12F, bacon.getPrice()); + Assertions.assertEquals(0.12F, egg.getPrice()); + Assertions.assertEquals(0.12F, cheese.getPrice()); + Assertions.assertEquals(0.12F, creamCheese.getPrice()); + Assertions.assertEquals(0.12F, smokedSalmon.getPrice()); + Assertions.assertEquals(0.12F, ham.getPrice()); + } + + @Test + public void getVariant(){ + Assertions.assertEquals("ONION", onion.getVariant()); + Assertions.assertEquals("PLAIN", plain.getVariant()); + Assertions.assertEquals("EVERYTHING", everything.getVariant()); + Assertions.assertEquals("SESAME",sesame.getVariant()); + + Assertions.assertEquals("BLACK", black.getVariant()); + Assertions.assertEquals("WHITE", white.getVariant()); + Assertions.assertEquals("CAPUCCINO", capuccino.getVariant()); + Assertions.assertEquals("LATTE", latte.getVariant()); + + Assertions.assertEquals("BACON", bacon.getVariant()); + Assertions.assertEquals("EGG", egg.getVariant()); + Assertions.assertEquals("CHEESE", cheese.getVariant()); + Assertions.assertEquals("CREAM CHEESE", creamCheese.getVariant()); + Assertions.assertEquals("SMOKED SALMON", smokedSalmon.getVariant()); + Assertions.assertEquals("HAM", ham.getVariant()); + } + + @Test + public void getSKU(){ + Assertions.assertEquals("BGLO", onion.getSku()); + Assertions.assertEquals("BGLP", plain.getSku()); + Assertions.assertEquals("BGLE", everything.getSku()); + Assertions.assertEquals("BGLS",sesame.getSku()); + + Assertions.assertEquals("COFB", black.getSku()); + Assertions.assertEquals("COFW", white.getSku()); + Assertions.assertEquals("COFC", capuccino.getSku()); + Assertions.assertEquals("COFL", latte.getSku()); + + Assertions.assertEquals("FILB", bacon.getSku()); + Assertions.assertEquals("FILE", egg.getSku()); + Assertions.assertEquals("FILC", cheese.getSku()); + Assertions.assertEquals("FILX", creamCheese.getSku()); + Assertions.assertEquals("FILS", smokedSalmon.getSku()); + Assertions.assertEquals("FILH", ham.getSku()); + } + + @Test + public void getName(){ + Assertions.assertEquals("Bagel", onion.getName()); + Assertions.assertEquals("Bagel", plain.getName()); + Assertions.assertEquals("Bagel", everything.getName()); + Assertions.assertEquals("Bagel",sesame.getName()); + + Assertions.assertEquals("Coffee", black.getName()); + Assertions.assertEquals("Coffee", white.getName()); + Assertions.assertEquals("Coffee", capuccino.getName()); + Assertions.assertEquals("Coffee", latte.getName()); + + Assertions.assertEquals("Filling", bacon.getName()); + Assertions.assertEquals("Filling", egg.getName()); + Assertions.assertEquals("Filling", cheese.getName()); + Assertions.assertEquals("Filling", creamCheese.getName()); + Assertions.assertEquals("Filling", smokedSalmon.getName()); + Assertions.assertEquals("Filling", ham.getName()); + } +} diff --git a/src/test/java/com/booleanuk/core/ManagerTest.java b/src/test/java/com/booleanuk/core/ManagerTest.java new file mode 100644 index 000000000..d23cc8d52 --- /dev/null +++ b/src/test/java/com/booleanuk/core/ManagerTest.java @@ -0,0 +1,31 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ManagerTest { + + @Test + public void changeBasketCapacityOk(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Manager manager = new Manager(basket, inventory); + + Assertions.assertEquals(true, manager.changeBasketCapacity(10)); + Assertions.assertEquals(true, manager.changeBasketCapacity(100)); + Assertions.assertEquals(true, manager.changeBasketCapacity(50)); + + } + + @Test + public void changeBasketCapacityNotOk() { + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Manager manager = new Manager(basket, inventory); + + Assertions.assertEquals(false, manager.changeBasketCapacity(-10)); + Assertions.assertEquals(false, manager.changeBasketCapacity(-100)); + Assertions.assertEquals(false, manager.changeBasketCapacity(-1)); + } + +} diff --git a/src/test/java/com/booleanuk/core/PublicMemberTest.java b/src/test/java/com/booleanuk/core/PublicMemberTest.java new file mode 100644 index 000000000..84b5a1f83 --- /dev/null +++ b/src/test/java/com/booleanuk/core/PublicMemberTest.java @@ -0,0 +1,101 @@ +package com.booleanuk.core; + + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class PublicMemberTest { + + @Test + public void addBagelToBasketOk(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + PublicMember member = new PublicMember(basket, inventory); + + Assertions.assertTrue(member.addBagelToBasket("Onion")); + Assertions.assertTrue(member.addBagelToBasket("Plain")); + Assertions.assertTrue(member.addBagelToBasket("everything")); + Assertions.assertTrue(member.addBagelToBasket("Sesame")); + Assertions.assertTrue(member.addBagelToBasket("OnIOn")); + } + + @Test + public void addBagelToBasketNotOk(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + PublicMember member = new PublicMember(basket, inventory); + + Assertions.assertFalse(member.addBagelToBasket(" ")); + Assertions.assertFalse(member.addBagelToBasket("Sesamee")); + Assertions.assertFalse(member.addBagelToBasket("Cheeseee")); + Assertions.assertFalse(member.addBagelToBasket("Eggy")); + } + + @Test + public void addBagelToBasketFULL(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + PublicMember member = new PublicMember(basket, inventory); + + Assertions.assertTrue(member.addBagelToBasket("Onion")); + Assertions.assertTrue(member.addBagelToBasket("Plain")); + Assertions.assertTrue(member.addBagelToBasket("everything")); + Assertions.assertTrue(member.addBagelToBasket("Sesame")); + Assertions.assertTrue(member.addBagelToBasket("OnIOn")); + Assertions.assertFalse(member.addBagelToBasket("Onion")); + Assertions.assertFalse(member.addBagelToBasket("Plain")); + + } + + @Test + public void removeItemOK(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + PublicMember member = new PublicMember(basket, inventory); + member.addBagelToBasket("Sesame"); + + Assertions.assertTrue(member.removeItem("Sesame")); + + } + + @Test + public void removeItemNotOk(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + PublicMember member = new PublicMember(basket, inventory); + member.addBagelToBasket("Sesame"); + + Assertions.assertFalse(member.removeItem("Onion")); + + } + + @Test + public void isBasketFullTrue(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + PublicMember member = new PublicMember(basket, inventory); + member.addBagelToBasket("Sesame"); + member.addBagelToBasket("Sesame"); + member.addBagelToBasket("Sesame"); + member.addBagelToBasket("Sesame"); + member.addBagelToBasket("Sesame"); + member.addBagelToBasket("Sesame"); + + + Assertions.assertEquals(true, member.isBasketFull()); + } + + @Test + public void isBasketFullFalse(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + PublicMember member = new PublicMember(basket, inventory); + member.addBagelToBasket("Sesame"); + member.addBagelToBasket("Sesame"); + member.addBagelToBasket("Sesame"); + + Assertions.assertEquals(false, member.isBasketFull()); + } + + +} diff --git a/src/test/java/com/booleanuk/extension/OrderTest.java b/src/test/java/com/booleanuk/extension/OrderTest.java new file mode 100644 index 000000000..0f81986a2 --- /dev/null +++ b/src/test/java/com/booleanuk/extension/OrderTest.java @@ -0,0 +1,141 @@ +package com.booleanuk.extension; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +public class OrderTest { + Bagel plain = new Bagel("Plain"); + Bagel everything = new Bagel("Everything"); + Bagel sesame = new Bagel("Sesame"); + Coffee black = new Coffee("Black"); + + @Test + public void emptyOrder(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Customer customer = new Customer(basket,inventory); + Order order = customer.placeOrder(); + + Assertions.assertEquals(0, order.getBagels().size()); + Assertions.assertEquals(0, order.getCoffees().size()); + Assertions.assertEquals(0, order.getTotalCost()); + } + + @Test + public void coffeeAndBagelOrder(){ + List items = new ArrayList<>(); + items.add(black); + items.add(plain); + Order order = new Order(items); + + Assertions.assertEquals(1, order.getBagels().size()); + Assertions.assertEquals(1, order.getCoffees().size()); + Assertions.assertEquals(1.25F, order.getTotalCost()); + + items.add(black); + items.add(everything); + Order order2 = new Order(items); + + Assertions.assertEquals(2.5F, order2.getTotalCost()); + } + + @Test + public void coffeeAndBagelOrderExtraCoffee(){ + List items = new ArrayList<>(); + items.add(black); + items.add(black); + items.add(plain); + Order order = new Order(items); + + Assertions.assertEquals(2.24F, order.getTotalCost()); + } + + @Test + public void sixBagelsDiscount(){ + List items = new ArrayList<>(); + for (int i =0; i<6;i++){ + items.add(plain); + } + Order order = new Order(items); + + Assertions.assertEquals(2.49F, order.getTotalCost()); + } + + @Test + public void sevenBagels(){ + List items = new ArrayList<>(); + for (int i =0; i<7;i++){ + items.add(everything); + } + Order order = new Order(items); + + Assertions.assertEquals(2.98F, order.getTotalCost()); + } + + @Test + public void twelveBagelsDiscount(){ + List items = new ArrayList<>(); + for (int i =0; i<12;i++){ + items.add(everything); + } + Order order = new Order(items); + Assertions.assertEquals(3.99F, order.getTotalCost()); + } + + @Test + public void sixteenBagels(){ + List items = new ArrayList<>(); + for (int i =0; i<16;i++){ + items.add(plain); + } + Order order = new Order(items); + Assertions.assertEquals(5.55F, order.getTotalCost(), 0.001); + } + + @Test + public void eighteenBagels(){ + List items = new ArrayList<>(); + for (int i =0; i<18;i++){ + items.add(plain); + } + Order order = new Order(items); + Assertions.assertEquals(6.48F, order.getTotalCost()); + } + + @Test + public void testFillingNotDiscount(){ + List items = new ArrayList<>(); + for (int i =0; i<5;i++){ + items.add(everything); + } + Bagel bagelWithFilling = new Bagel("sesame"); + bagelWithFilling.addFilling("egg"); + items.add(bagelWithFilling); + + Order order = new Order(items); + Assertions.assertEquals(2.61F, order.getTotalCost()); + } + + @Test + public void twentyBagels(){ + List items = new ArrayList<>(); + for (int i =0; i < 20;i++){ + items.add(sesame); + } + Order order = new Order(items); + Assertions.assertEquals(7.46F, order.getTotalCost(),0.001); + } + + @Test + public void twentyfourBagels(){ + List items = new ArrayList<>(); + for (int i =0; i < 24;i++){ + items.add(plain); + } + Order order = new Order(items); + Assertions.assertEquals(7.98F, order.getTotalCost(),0.001); + } +} \ No newline at end of file diff --git a/src/test/java/com/booleanuk/extension/ReceiptTest.java b/src/test/java/com/booleanuk/extension/ReceiptTest.java new file mode 100644 index 000000000..dddb55bda --- /dev/null +++ b/src/test/java/com/booleanuk/extension/ReceiptTest.java @@ -0,0 +1,80 @@ +package com.booleanuk.extension; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.List; + +public class ReceiptTest { + + Bagel plain = new Bagel("Plain"); + Bagel sesame = new Bagel("Sesame"); + Coffee black = new Coffee("Black"); + + + @Test + public void createReceipt() { + List items = new ArrayList<>(); + items.add(plain); + Order order = new Order(items); + Receipt receipt = new Receipt(order); + receipt.printReceipt(); + + Assertions.assertNotNull(receipt); + } + + @Test + public void checkPrintTop() { + List items = new ArrayList<>(); + items.add(plain); + Order order = new Order(items); + Receipt receipt = new Receipt(order); + + String content = receipt.makeReceipt(); + + Assertions.assertTrue(content.contains("~~~ Bob's Bagels ~~~")); + Assertions.assertTrue(content.contains("----------------------------")); + } + + @Test + public void checkPrintBottom() { + List items = new ArrayList<>(); + items.add(sesame); + Order order = new Order(items); + Receipt receipt = new Receipt(order); + + String content = receipt.makeReceipt(); + + Assertions.assertTrue(content.contains("Thank you")); + Assertions.assertTrue(content.contains("for your order!")); + } + + @Test + public void oneItemReceipt() { + List items = new ArrayList<>(); + items.add(plain); + Order order = new Order(items); + Receipt receipt = new Receipt(order); + + String content = receipt.makeReceipt(); + + Assertions.assertTrue(content.contains("PLAIN Bagel")); + Assertions.assertTrue(content.contains("1")); + Assertions.assertTrue(content.contains("£0.39")); + Assertions.assertTrue(content.contains("Total")); + } + + @Test + public void totalSum() { + List items = new ArrayList<>(); + items.add(plain); + items.add(black); + + Order order = new Order(items); + Receipt receipt = new Receipt(order); + String content = receipt.makeReceipt(); + + Assertions.assertTrue(content.contains("Total")); + Assertions.assertTrue(content.contains("£1.25")); + } +} \ No newline at end of file