From a6dfc85dbca77e228e04dbe590d1cec36f3f0e9c Mon Sep 17 00:00:00 2001 From: Jonathan van Oudheusden Date: Fri, 8 Aug 2025 14:53:17 +0200 Subject: [PATCH 1/6] added domain --- BagelDomain.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 BagelDomain.md diff --git a/BagelDomain.md b/BagelDomain.md new file mode 100644 index 000000000..13f9fea4f --- /dev/null +++ b/BagelDomain.md @@ -0,0 +1,25 @@ + +| Classes | variables | Methods | Scenario | Outputs | +| ------------ | ----------------------------------------------------------- | ---------------------------------------------------------------------------- | ------------------------------------------------- | ---------------------------------------------------------------------- | +| Basket | Map> orders | Basket() | create method | empty Basket | +| | int orderLimit | addOrder("String bagelName, int amount) | if bagelName is not correct or int amount is <= 0 | returns false | +| | | | if basket size is gone over | returns false | +| | | | if both valid and bagel is not in basket yet | returns true, and the bagel is added to the basket | +| | | | if both are valid and bagel is already in basket | returns true, and the amount is added to the bagel in basket | +| | | changeOrder(String bagelOrderToBeChanged, String new bagelOrder, int amount) | if all are valid | the bagel version is changed and set to a new amount, true is returned | +| | | | | nothing happens and false is returned | +| | | removeOrder(String bagelName) | If name is in basket | the order is removed and true is returnd | +| | | | if not | returns false | +| | | changeSizeLimit(int newSizeLimit) | if >0 | returns true | +| | | | if < 0 | returns false | +| | | getTotalCost | empty or full | it calculated and returns the cost of all bagels and fillings | +| | | | | | +| Bagel | String type | Bagel(String type) | if valid bagel type | set as that bagel | +| | | | if not | sets as default bagel | +| | String filling | changeBagelType(STring new type) | if valid bagel | return true | +| | | | if not valid bagel | returns false | +| | | changeFilling | if valid filiing | return true | +| | | | if not valid filling | return false | +| | | | | | +| StoreManager | Map priceListBagels | getBagelPrices() | | returns map of bagel and prices | +| | Map priceListFilling | getFillingPrices() | | returns map of fillings and prices | From fb2db8a6ff90de98b32cb40409db7a5cb691bb37 Mon Sep 17 00:00:00 2001 From: Jonathan van Oudheusden Date: Fri, 8 Aug 2025 15:24:10 +0200 Subject: [PATCH 2/6] implement skeleton classes and test --- src/main/java/com/booleanuk/core/Bagel.java | 22 ++++++++++++ src/main/java/com/booleanuk/core/Basket.java | 35 +++++++++++++++++++ .../java/com/booleanuk/core/StoreManager.java | 22 ++++++++++++ .../java/com/booleanuk/core/BagelTest.java | 13 +++++++ .../java/com/booleanuk/core/BasketTest.java | 28 +++++++++++++++ .../com/booleanuk/core/StoreManagerTest.java | 13 +++++++ 6 files changed, 133 insertions(+) create mode 100644 src/main/java/com/booleanuk/core/Bagel.java create mode 100644 src/main/java/com/booleanuk/core/Basket.java create mode 100644 src/main/java/com/booleanuk/core/StoreManager.java create mode 100644 src/test/java/com/booleanuk/core/BagelTest.java create mode 100644 src/test/java/com/booleanuk/core/BasketTest.java create mode 100644 src/test/java/com/booleanuk/core/StoreManagerTest.java 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..5792b67c1 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -0,0 +1,22 @@ +package com.booleanuk.core; + +public class Bagel { + + String bagelType; + String filligType; + + public Bagel(String bagelType) { + setBagelType(bagelType); + setBagelType("none"); + } + + public boolean setBagelType(String bagelType) { + this.bagelType = bagelType; + return false; + } + + public boolean setFilligType(String filligType) { + this.filligType = filligType; + 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..8a51d9761 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -0,0 +1,35 @@ +package com.booleanuk.core; + +import java.util.HashMap; +import java.util.Map; + +public class Basket { + + int orderLimit = 3; + Map> orders; + + public Basket() { + orders = new HashMap<>(); + } + + public boolean addOrder(String bagelCode, int amount) { + return false; + } + + public boolean changeOrder(String bagelToChange, String newBagel, int amount) { + return false; + } + + public boolean removeOrder(String bagel) { + return false; + } + + public boolean changeBasketSizeLimit(int newSizeLimit) { + return false; + } + + public int getTotalCost() { + return -1; + } + +} diff --git a/src/main/java/com/booleanuk/core/StoreManager.java b/src/main/java/com/booleanuk/core/StoreManager.java new file mode 100644 index 000000000..6136ae500 --- /dev/null +++ b/src/main/java/com/booleanuk/core/StoreManager.java @@ -0,0 +1,22 @@ +package com.booleanuk.core; + +import java.util.HashMap; +import java.util.Map; + +public class StoreManager { + Map bagelPrices; + Map fillingPrices; + + public Map getBagelPrices() { + return bagelPrices; + } + + public Map getFillingPrices() { + return fillingPrices; + } + + public StoreManager(){ + bagelPrices = new HashMap<>(); + fillingPrices = new HashMap<>(); + } +} 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..615ae644c --- /dev/null +++ b/src/test/java/com/booleanuk/core/BagelTest.java @@ -0,0 +1,13 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Test; + +public class BagelTest { + @Test + void setBagelType() { + } + + @Test + void setFilligType() { + } +} 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..a5ebee607 --- /dev/null +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -0,0 +1,28 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class BasketTest { + + @Test + void addOrder() { + } + + @Test + void changeOrder() { + } + + @Test + void removeOrder() { + } + + @Test + void changeBasketSizeLimit() { + } + + @Test + void getTotalCost() { + } +} \ No newline at end of file diff --git a/src/test/java/com/booleanuk/core/StoreManagerTest.java b/src/test/java/com/booleanuk/core/StoreManagerTest.java new file mode 100644 index 000000000..e62d55137 --- /dev/null +++ b/src/test/java/com/booleanuk/core/StoreManagerTest.java @@ -0,0 +1,13 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Test; + +public class StoreManagerTest { + @Test + void getBagelPrices() { + } + + @Test + void getFillingPrices() { + } +} From 60dcedc00dfd98743fdb9e53d36c052f62dab01a Mon Sep 17 00:00:00 2001 From: Jonathan van Oudheusden Date: Fri, 8 Aug 2025 18:53:20 +0200 Subject: [PATCH 3/6] implemented everything --- BagelDomain.md | 7 +- src/main/java/com/booleanuk/core/Bagel.java | 27 +++++++- src/main/java/com/booleanuk/core/Basket.java | 66 ++++++++++++++++++- .../java/com/booleanuk/core/StoreManager.java | 19 ++++++ .../java/com/booleanuk/core/BagelTest.java | 17 +++++ .../java/com/booleanuk/core/BasketTest.java | 60 +++++++++++++++++ .../com/booleanuk/core/StoreManagerTest.java | 24 +++++++ 7 files changed, 212 insertions(+), 8 deletions(-) diff --git a/BagelDomain.md b/BagelDomain.md index 13f9fea4f..dc52d1859 100644 --- a/BagelDomain.md +++ b/BagelDomain.md @@ -16,10 +16,13 @@ | | | | | | | Bagel | String type | Bagel(String type) | if valid bagel type | set as that bagel | | | | | if not | sets as default bagel | -| | String filling | changeBagelType(STring new type) | if valid bagel | return true | +| | String filling | setBagelType(STring new type) | if valid bagel | return true | | | | | if not valid bagel | returns false | -| | | changeFilling | if valid filiing | return true | +| | | setFillingType | if valid filiing | return true | | | | | if not valid filling | return false | | | | | | | | StoreManager | Map priceListBagels | getBagelPrices() | | returns map of bagel and prices | | | Map priceListFilling | getFillingPrices() | | returns map of fillings and prices | +| | | getBagelPrice() | if valid | returns price | +| | | getFillingPrice() | if valid | returns price | +| | | | if not | returns -1 | diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java index 5792b67c1..c968d0d39 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -5,18 +5,39 @@ public class Bagel { String bagelType; String filligType; + StoreManager manager; + public Bagel(String bagelType) { + manager = new StoreManager(); + setBagelType(bagelType); - setBagelType("none"); + setFilligType("none"); + } public boolean setBagelType(String bagelType) { - this.bagelType = bagelType; + if (manager.getBagelPrices().containsKey(bagelType)) { + this.bagelType = bagelType; + return true; + } + this.bagelType = "BGLP"; return false; } + public String getBagelType() { + return bagelType; + } + public boolean setFilligType(String filligType) { - this.filligType = filligType; + if (manager.getFillingPrices().containsKey(filligType)) { + this.filligType = filligType; + return true; + } + this.filligType = "none"; return false; } + + public String getFilligType(){ + return filligType; + } } diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 8a51d9761..76f10e633 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -5,31 +5,91 @@ public class Basket { - int orderLimit = 3; + int orderLimit; Map> orders; + StoreManager manager; + public Basket() { + this. manager = new StoreManager(); + changeBasketSizeLimit(5); orders = new HashMap<>(); } + public Map> getOrders() { + return orders; + } + public boolean addOrder(String bagelCode, int amount) { + if (manager.getBagelPrices().containsKey(bagelCode) && amount > 0 && getOrderSize() + amount <= orderLimit) { + orders.put(bagelCode, Map.entry(new Bagel(bagelCode), amount)); + return true; + } return false; } public boolean changeOrder(String bagelToChange, String newBagel, int amount) { + int prevAmount = 0; + if (orders.containsKey(bagelToChange) && manager.getBagelPrices().containsKey(newBagel) && amount > 0) { + if (bagelToChange.equals(newBagel)) { + prevAmount = orders.get(bagelToChange).getValue(); + } else { + orders.remove(bagelToChange); + } + return addOrder(newBagel, amount + prevAmount); + } return false; } public boolean removeOrder(String bagel) { + if (orders.containsKey(bagel)) { + orders.remove(bagel); + return true; + } return false; } public boolean changeBasketSizeLimit(int newSizeLimit) { + if (newSizeLimit > 0) { + this.orderLimit = newSizeLimit; + return true; + } return false; } - public int getTotalCost() { - return -1; + private int getOrderSize() { + int count =0; + for (var order : orders.entrySet()) { + count+= order.getValue().getValue(); + + } + return count; + } + + public boolean setFilling(String bagel, String filling) { + if (orders.containsKey(bagel)) { + var orderSet = orders.get(bagel); + if (orderSet.getKey().setFilligType(filling)) { + return true; + } + + } + return false; + } + + public float getTotalCost() { + float cost =0; + for (var order : orders.entrySet()) { + var singleOrder = order.getValue(); + Bagel bagel = singleOrder.getKey(); + int amount = singleOrder.getValue(); + + cost += (manager.getBagelPrice(bagel.getBagelType())) * amount; + cost += manager.getFillingPrice(bagel.getFilligType()) * amount; + + + } + return cost; } } diff --git a/src/main/java/com/booleanuk/core/StoreManager.java b/src/main/java/com/booleanuk/core/StoreManager.java index 6136ae500..d7c710bfd 100644 --- a/src/main/java/com/booleanuk/core/StoreManager.java +++ b/src/main/java/com/booleanuk/core/StoreManager.java @@ -15,8 +15,27 @@ public Map getFillingPrices() { return fillingPrices; } + public float getFillingPrice(String filling) { + return fillingPrices.getOrDefault(filling, 0f); + } + + public float getBagelPrice(String bagel) { + return bagelPrices.getOrDefault(bagel, 0f); + } + public StoreManager(){ bagelPrices = new HashMap<>(); + bagelPrices.put("BGLO", 0.49f); + bagelPrices.put("BGLP", 0.39f); + bagelPrices.put("BGLE", 0.49f); + bagelPrices.put("BGLS", 0.49f); + fillingPrices = new HashMap<>(); + fillingPrices.put("Bacon", 0.12f); + fillingPrices.put("Egg", 0.12f); + fillingPrices.put("Cheese", 0.12f); + fillingPrices.put("Cream Cheese", 0.12f); + fillingPrices.put("Smoked Salmon", 0.12f); + fillingPrices.put("Ham", 0.12f); } } diff --git a/src/test/java/com/booleanuk/core/BagelTest.java b/src/test/java/com/booleanuk/core/BagelTest.java index 615ae644c..72d1d140e 100644 --- a/src/test/java/com/booleanuk/core/BagelTest.java +++ b/src/test/java/com/booleanuk/core/BagelTest.java @@ -1,13 +1,30 @@ package com.booleanuk.core; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; public class BagelTest { @Test void setBagelType() { + Bagel bagel = new Bagel("BGLP"); + Bagel bagel1 = new Bagel("BGLO"); + Assertions.assertNotEquals(bagel.getBagelType(), bagel1.getBagelType()); + bagel1.setBagelType("BGLP"); + Assertions.assertEquals(bagel.getBagelType(), bagel1.getBagelType()); + bagel.setBagelType("wow"); + Assertions.assertEquals(bagel.getBagelType(), bagel1.getBagelType()); + } @Test void setFilligType() { + Bagel bagel = new Bagel("BGLP"); + Bagel bagel1 = new Bagel("BGLP"); + Assertions.assertEquals(bagel.getFilligType(), bagel1.getFilligType()); + bagel.setFilligType("Bacon"); + Assertions.assertNotEquals(bagel.getFilligType(), bagel1.getFilligType()); + bagel.setFilligType("wow"); + Assertions.assertEquals(bagel.getFilligType(), bagel1.getFilligType()); + } } diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index a5ebee607..32122d4f2 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -1,5 +1,6 @@ package com.booleanuk.core; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; @@ -8,21 +9,80 @@ class BasketTest { @Test void addOrder() { + Basket basket = new Basket(); + Assertions.assertEquals(0, basket.getOrders().size()); + Assertions.assertTrue(basket.addOrder("BGLP",1)); + Assertions.assertEquals(1, basket.getOrders().size()); + Assertions.assertTrue(basket.addOrder("BGLP",1)); + Assertions.assertEquals(1, basket.getOrders().size()); + Assertions.assertFalse(basket.addOrder("BGLO",0)); + Assertions.assertEquals(1, basket.getOrders().size()); + Assertions.assertTrue(basket.addOrder("BGLO", 2)); + Assertions.assertEquals(2, basket.getOrders().size()); + } @Test void changeOrder() { + Basket basket = new Basket(); + basket.addOrder("BGLP",1); + Assertions.assertTrue(basket.changeOrder("BGLP", "BGLO",1)); + Assertions.assertEquals(1, basket.getOrders().size()); + Assertions.assertFalse(basket.changeOrder("BGLP", "BGLP",1)); + Assertions.assertFalse(basket.changeOrder("krekrje", "BGLP",1)); + Assertions.assertFalse(basket.changeOrder("BGLO", "BGLO",-8)); + Assertions.assertTrue(basket.changeOrder("BGLO", "BGLO",2)); + Assertions.assertEquals(3, basket.getOrders().get("BGLO").getValue()); } @Test void removeOrder() { + Basket basket = new Basket(); + Assertions.assertEquals(0, basket.getOrders().size()); + basket.addOrder("BGLP",1); + Assertions.assertEquals(1, basket.getOrders().size()); + Assertions.assertFalse(basket.removeOrder("BGLO")); + Assertions.assertEquals(1, basket.getOrders().size()); + Assertions.assertTrue(basket.removeOrder("BGLP")); + Assertions.assertEquals(0, basket.getOrders().size()); } @Test void changeBasketSizeLimit() { + Basket basket = new Basket(); + Assertions.assertEquals(0, basket.getOrders().size()); + Assertions.assertFalse(basket.addOrder("BGLP",6)); + Assertions.assertEquals(0, basket.getOrders().size()); + Assertions.assertFalse(basket.changeBasketSizeLimit(-1)); + Assertions.assertFalse(basket.addOrder("BGLP",6)); + Assertions.assertEquals(0, basket.getOrders().size()); + Assertions.assertTrue(basket.changeBasketSizeLimit(10)); + Assertions.assertTrue(basket.addOrder("BGLP",6)); + Assertions.assertEquals(1, basket.getOrders().size()); + } + + @Test + void setFillingTest() { + Basket basket = new Basket(); + basket.addOrder("BGLP",1); + Assertions.assertEquals("none", basket.getOrders().get("BGLP").getKey().getFilligType()); + Assertions.assertFalse(basket.setFilling("re", "Bacon")); + Assertions.assertFalse(basket.setFilling("BGLP", "er")); + Assertions.assertEquals("none", basket.getOrders().get("BGLP").getKey().getFilligType()); + Assertions.assertTrue(basket.setFilling("BGLP", "Bacon")); + Assertions.assertEquals("Bacon", basket.getOrders().get("BGLP").getKey().getFilligType()); } @Test void getTotalCost() { + Basket basket = new Basket(); + Assertions.assertEquals(0, basket.getTotalCost()); + basket.addOrder("BGLP", 1); + Assertions.assertEquals(0.39f, basket.getTotalCost()); + basket.setFilling("BGLP", "Bacon"); + Assertions.assertEquals(0.51f, basket.getTotalCost()); + basket.addOrder("BGLO", 2); + Assertions.assertEquals(1.49f, basket.getTotalCost()); + } } \ No newline at end of file diff --git a/src/test/java/com/booleanuk/core/StoreManagerTest.java b/src/test/java/com/booleanuk/core/StoreManagerTest.java index e62d55137..bf9159583 100644 --- a/src/test/java/com/booleanuk/core/StoreManagerTest.java +++ b/src/test/java/com/booleanuk/core/StoreManagerTest.java @@ -1,13 +1,37 @@ package com.booleanuk.core; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; public class StoreManagerTest { + @Test void getBagelPrices() { + StoreManager manager = new StoreManager(); + var prices = manager.getBagelPrices(); + Assertions.assertEquals(4, prices.size()); } @Test void getFillingPrices() { + StoreManager manager = new StoreManager(); + var prices = manager.getFillingPrices(); + Assertions.assertEquals(6, prices.size()); + } + + @Test + void getFillingPrice() { + StoreManager manager = new StoreManager(); + var filingPrice = manager.getFillingPrice("Bacon"); + Assertions.assertEquals(.12f, filingPrice); + } + + @Test + void getBagelPrice() { + StoreManager manager = new StoreManager(); + var filingPrice = manager.getBagelPrice("BGLO"); + Assertions.assertEquals(.49f, filingPrice); + } } From e5596189cdeb96b62f812d06b2910e6c72cfbe36 Mon Sep 17 00:00:00 2001 From: Jonathan van Oudheusden Date: Mon, 11 Aug 2025 16:09:27 +0200 Subject: [PATCH 4/6] refacter using inheritence --- .../java/com/booleanuk/core/BaconFilling.java | 7 ++ src/main/java/com/booleanuk/core/Bagel.java | 71 +++++++++++++------ src/main/java/com/booleanuk/core/Basket.java | 55 +++++++------- .../com/booleanuk/core/CheeseFilling.java | 7 ++ .../booleanuk/core/CreamCheeseFilling.java | 7 ++ .../java/com/booleanuk/core/EggFilling.java | 7 ++ .../com/booleanuk/core/EverythingBagel.java | 8 +++ src/main/java/com/booleanuk/core/Filling.java | 43 +++++++++++ .../java/com/booleanuk/core/HamFilling.java | 9 +++ .../java/com/booleanuk/core/OnionBagel.java | 7 ++ .../java/com/booleanuk/core/PlainBagel.java | 10 +++ .../java/com/booleanuk/core/SesameBagel.java | 7 ++ .../booleanuk/core/SmokedSalmonFilling.java | 7 ++ .../java/com/booleanuk/core/StoreManager.java | 41 ----------- .../java/com/booleanuk/core/BagelTest.java | 62 +++++++++++----- .../java/com/booleanuk/core/BasketTest.java | 30 ++++---- .../java/com/booleanuk/core/FillingTest.java | 42 +++++++++++ .../com/booleanuk/core/StoreManagerTest.java | 37 ---------- 18 files changed, 300 insertions(+), 157 deletions(-) create mode 100644 src/main/java/com/booleanuk/core/BaconFilling.java create mode 100644 src/main/java/com/booleanuk/core/CheeseFilling.java create mode 100644 src/main/java/com/booleanuk/core/CreamCheeseFilling.java create mode 100644 src/main/java/com/booleanuk/core/EggFilling.java create mode 100644 src/main/java/com/booleanuk/core/EverythingBagel.java create mode 100644 src/main/java/com/booleanuk/core/Filling.java create mode 100644 src/main/java/com/booleanuk/core/HamFilling.java create mode 100644 src/main/java/com/booleanuk/core/OnionBagel.java create mode 100644 src/main/java/com/booleanuk/core/PlainBagel.java create mode 100644 src/main/java/com/booleanuk/core/SesameBagel.java create mode 100644 src/main/java/com/booleanuk/core/SmokedSalmonFilling.java delete mode 100644 src/main/java/com/booleanuk/core/StoreManager.java create mode 100644 src/test/java/com/booleanuk/core/FillingTest.java delete mode 100644 src/test/java/com/booleanuk/core/StoreManagerTest.java diff --git a/src/main/java/com/booleanuk/core/BaconFilling.java b/src/main/java/com/booleanuk/core/BaconFilling.java new file mode 100644 index 000000000..1090483a8 --- /dev/null +++ b/src/main/java/com/booleanuk/core/BaconFilling.java @@ -0,0 +1,7 @@ +package com.booleanuk.core; + +public class BaconFilling extends Filling{ + public BaconFilling() { + super ("Bacon Filling", "FILB"); + } +} diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java index c968d0d39..449d28691 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -1,43 +1,70 @@ package com.booleanuk.core; -public class Bagel { +import java.util.HashMap; +import java.util.Map; - String bagelType; - String filligType; +public abstract class Bagel { - StoreManager manager; + private final String bagelName; + private final String sku; + private final float cost; - public Bagel(String bagelType) { - manager = new StoreManager(); + private Filling filling; - setBagelType(bagelType); - setFilligType("none"); + Bagel(String bagelName, String sku, float cost) { + this.sku = sku; + this.bagelName = bagelName; + this.cost = cost; + } + public String getBagel() { + return bagelName; } - public boolean setBagelType(String bagelType) { - if (manager.getBagelPrices().containsKey(bagelType)) { - this.bagelType = bagelType; - return true; + public String getSku() { + return sku; + } + + public float getCost() { + float fulCost = cost; + if (filling != null) { + fulCost += filling.getCost(); } - this.bagelType = "BGLP"; - return false; + return fulCost; } - public String getBagelType() { - return bagelType; + public Filling getFilling() { + return this.filling; } - public boolean setFilligType(String filligType) { - if (manager.getFillingPrices().containsKey(filligType)) { - this.filligType = filligType; + + public boolean setFilling(String fillingSKU) { + Filling filling = Filling.getFillingFromSKU(fillingSKU); + if (filling != null) { + this.filling = filling; return true; } - this.filligType = "none"; return false; } - public String getFilligType(){ - return filligType; + public static Bagel getBagelFromSKU(String sku) { + return switch (sku) { + case "BGLP" -> new PlainBagel(); + case "BGLO" -> new OnionBagel(); + case "BGLE" -> new EverythingBagel(); + case "BGLS" -> new SesameBagel(); + default -> null; + }; } + + public static Map getBagelPrices() { + Bagel[] bagels = {new PlainBagel(), new OnionBagel(), new SesameBagel(), new EverythingBagel()}; + Map priceList = new HashMap<>(); + for (Bagel bagel: bagels) { + priceList.put(bagel.getBagel(), bagel.getCost()); + } + return priceList; + } + + } diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 76f10e633..f601980a2 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -8,11 +8,8 @@ public class Basket { int orderLimit; Map> orders; - StoreManager manager; - public Basket() { - this. manager = new StoreManager(); - changeBasketSizeLimit(5); + setBasketSizeLimit(5); orders = new HashMap<>(); } @@ -20,36 +17,42 @@ public Map> getOrders() { return orders; } - public boolean addOrder(String bagelCode, int amount) { - if (manager.getBagelPrices().containsKey(bagelCode) && amount > 0 && getOrderSize() + amount <= orderLimit) { - orders.put(bagelCode, Map.entry(new Bagel(bagelCode), amount)); + public boolean addOrder(String sku, int amount) { + Bagel bagel = Bagel.getBagelFromSKU(sku); + if (bagel != null && amount > 0 && getOrderSize() + amount <= orderLimit) { + orders.merge(sku, Map.entry(bagel, amount), + (a, b) -> Map.entry(bagel, a.getValue()+b.getValue())); return true; } return false; } - public boolean changeOrder(String bagelToChange, String newBagel, int amount) { + public boolean changeOrder(String prevSKU, String newBagelSKU, int amount) { int prevAmount = 0; - if (orders.containsKey(bagelToChange) && manager.getBagelPrices().containsKey(newBagel) && amount > 0) { - if (bagelToChange.equals(newBagel)) { - prevAmount = orders.get(bagelToChange).getValue(); + Bagel newBagel = Bagel.getBagelFromSKU(newBagelSKU); + if (orders.containsKey(prevSKU) && newBagel != null && amount > 0) { + + if (prevSKU.equals(newBagelSKU)) { + return addOrder(newBagelSKU, amount); } else { - orders.remove(bagelToChange); + if (addOrder(newBagelSKU, amount)){ + orders.remove(prevSKU); + return true; + } } - return addOrder(newBagel, amount + prevAmount); } return false; } - public boolean removeOrder(String bagel) { - if (orders.containsKey(bagel)) { - orders.remove(bagel); + public boolean removeOrder(String bagelSKU) { + if (orders.containsKey(bagelSKU)) { + orders.remove(bagelSKU); return true; } return false; } - public boolean changeBasketSizeLimit(int newSizeLimit) { + public boolean setBasketSizeLimit(int newSizeLimit) { if (newSizeLimit > 0) { this.orderLimit = newSizeLimit; return true; @@ -61,18 +64,19 @@ private int getOrderSize() { int count =0; for (var order : orders.entrySet()) { count+= order.getValue().getValue(); - } return count; } - public boolean setFilling(String bagel, String filling) { - if (orders.containsKey(bagel)) { - var orderSet = orders.get(bagel); - if (orderSet.getKey().setFilligType(filling)) { + public boolean setFilling(String bagelSKU, String fillingSKU) { + if (orders.containsKey(bagelSKU)) { + var set = orders.get(bagelSKU); + Bagel bagel = set.getKey(); + if (bagel.setFilling(fillingSKU)) { + orders.remove(bagelSKU); + orders.put(bagel.getSku() + fillingSKU, set); return true; } - } return false; } @@ -84,10 +88,7 @@ public float getTotalCost() { Bagel bagel = singleOrder.getKey(); int amount = singleOrder.getValue(); - cost += (manager.getBagelPrice(bagel.getBagelType())) * amount; - cost += manager.getFillingPrice(bagel.getFilligType()) * amount; - - + cost += bagel.getCost() * amount; } return cost; } diff --git a/src/main/java/com/booleanuk/core/CheeseFilling.java b/src/main/java/com/booleanuk/core/CheeseFilling.java new file mode 100644 index 000000000..88cca1a30 --- /dev/null +++ b/src/main/java/com/booleanuk/core/CheeseFilling.java @@ -0,0 +1,7 @@ +package com.booleanuk.core; + +public class CheeseFilling extends Filling{ + public CheeseFilling() { + super("Cheese Filling", "FILC"); + } +} diff --git a/src/main/java/com/booleanuk/core/CreamCheeseFilling.java b/src/main/java/com/booleanuk/core/CreamCheeseFilling.java new file mode 100644 index 000000000..080437f40 --- /dev/null +++ b/src/main/java/com/booleanuk/core/CreamCheeseFilling.java @@ -0,0 +1,7 @@ +package com.booleanuk.core; + +public class CreamCheeseFilling extends Filling{ + public CreamCheeseFilling() { + super("Cream Cheese Filling", "FILX"); + } +} diff --git a/src/main/java/com/booleanuk/core/EggFilling.java b/src/main/java/com/booleanuk/core/EggFilling.java new file mode 100644 index 000000000..4cb9df31a --- /dev/null +++ b/src/main/java/com/booleanuk/core/EggFilling.java @@ -0,0 +1,7 @@ +package com.booleanuk.core; + +public class EggFilling extends Filling{ + public EggFilling() { + super("Egg Filling", "FILE"); + } +} diff --git a/src/main/java/com/booleanuk/core/EverythingBagel.java b/src/main/java/com/booleanuk/core/EverythingBagel.java new file mode 100644 index 000000000..9993efe78 --- /dev/null +++ b/src/main/java/com/booleanuk/core/EverythingBagel.java @@ -0,0 +1,8 @@ +package com.booleanuk.core; + +public class EverythingBagel extends Bagel{ + public EverythingBagel() { + super("Everything Bagel","BGLE" , 0.49f); + } + +} 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..e4f4ca0aa --- /dev/null +++ b/src/main/java/com/booleanuk/core/Filling.java @@ -0,0 +1,43 @@ +package com.booleanuk.core; + +import java.util.HashMap; +import java.util.Map; + +public abstract class Filling { + + private final String filling; + private final String sku; + + public Filling(String filling, String sku) { + this.filling = filling; + this.sku = sku; + } + + public String getFilling(){return filling;} + + public float getCost() { + return 0.12f;} + + + public static Filling getFillingFromSKU(String sku) { + return switch (sku) { + case "FILB" -> new BaconFilling(); + case "FILX" -> new CreamCheeseFilling(); + case "FILE" -> new EggFilling(); + case "FILC" -> new CheeseFilling(); + case "FILS" -> new SmokedSalmonFilling(); + case "FILH" -> new HamFilling(); + default -> null; + }; + } + + public static Map getFillingPrices() { + Filling[] fillings = {new BaconFilling(), new CreamCheeseFilling(), new EggFilling(), + new CheeseFilling(), new SmokedSalmonFilling(), new HamFilling()}; + Map priceList = new HashMap<>(); + for (Filling filling: fillings) { + priceList.put(filling.getFilling(), filling.getCost()); + } + return priceList; + } +} diff --git a/src/main/java/com/booleanuk/core/HamFilling.java b/src/main/java/com/booleanuk/core/HamFilling.java new file mode 100644 index 000000000..8ed658396 --- /dev/null +++ b/src/main/java/com/booleanuk/core/HamFilling.java @@ -0,0 +1,9 @@ +package com.booleanuk.core; + +public class HamFilling extends Filling { + public HamFilling() { + super("Ham Filling", "FILH"); + } + + +} diff --git a/src/main/java/com/booleanuk/core/OnionBagel.java b/src/main/java/com/booleanuk/core/OnionBagel.java new file mode 100644 index 000000000..669e32714 --- /dev/null +++ b/src/main/java/com/booleanuk/core/OnionBagel.java @@ -0,0 +1,7 @@ +package com.booleanuk.core; + +public class OnionBagel extends Bagel { + public OnionBagel() { + super("Onion Bagel", "BGLO", 0.49f); + } +} diff --git a/src/main/java/com/booleanuk/core/PlainBagel.java b/src/main/java/com/booleanuk/core/PlainBagel.java new file mode 100644 index 000000000..fec7ccc24 --- /dev/null +++ b/src/main/java/com/booleanuk/core/PlainBagel.java @@ -0,0 +1,10 @@ +package com.booleanuk.core; + +public class PlainBagel extends Bagel{ + + public PlainBagel() { + super("Plain Bagel", "BGLP", 0.39f); + } + + +} diff --git a/src/main/java/com/booleanuk/core/SesameBagel.java b/src/main/java/com/booleanuk/core/SesameBagel.java new file mode 100644 index 000000000..141aa1e7a --- /dev/null +++ b/src/main/java/com/booleanuk/core/SesameBagel.java @@ -0,0 +1,7 @@ +package com.booleanuk.core; + +public class SesameBagel extends Bagel{ + public SesameBagel() { + super("Sesame Bagel", "BGLS", 0.49f); + } +} diff --git a/src/main/java/com/booleanuk/core/SmokedSalmonFilling.java b/src/main/java/com/booleanuk/core/SmokedSalmonFilling.java new file mode 100644 index 000000000..09189579b --- /dev/null +++ b/src/main/java/com/booleanuk/core/SmokedSalmonFilling.java @@ -0,0 +1,7 @@ +package com.booleanuk.core; + +public class SmokedSalmonFilling extends Filling{ + public SmokedSalmonFilling() { + super("Smoked Salmon Filling", "FILS"); + } +} diff --git a/src/main/java/com/booleanuk/core/StoreManager.java b/src/main/java/com/booleanuk/core/StoreManager.java deleted file mode 100644 index d7c710bfd..000000000 --- a/src/main/java/com/booleanuk/core/StoreManager.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.booleanuk.core; - -import java.util.HashMap; -import java.util.Map; - -public class StoreManager { - Map bagelPrices; - Map fillingPrices; - - public Map getBagelPrices() { - return bagelPrices; - } - - public Map getFillingPrices() { - return fillingPrices; - } - - public float getFillingPrice(String filling) { - return fillingPrices.getOrDefault(filling, 0f); - } - - public float getBagelPrice(String bagel) { - return bagelPrices.getOrDefault(bagel, 0f); - } - - public StoreManager(){ - bagelPrices = new HashMap<>(); - bagelPrices.put("BGLO", 0.49f); - bagelPrices.put("BGLP", 0.39f); - bagelPrices.put("BGLE", 0.49f); - bagelPrices.put("BGLS", 0.49f); - - fillingPrices = new HashMap<>(); - fillingPrices.put("Bacon", 0.12f); - fillingPrices.put("Egg", 0.12f); - fillingPrices.put("Cheese", 0.12f); - fillingPrices.put("Cream Cheese", 0.12f); - fillingPrices.put("Smoked Salmon", 0.12f); - fillingPrices.put("Ham", 0.12f); - } -} diff --git a/src/test/java/com/booleanuk/core/BagelTest.java b/src/test/java/com/booleanuk/core/BagelTest.java index 72d1d140e..fb21a71e1 100644 --- a/src/test/java/com/booleanuk/core/BagelTest.java +++ b/src/test/java/com/booleanuk/core/BagelTest.java @@ -5,26 +5,56 @@ public class BagelTest { @Test - void setBagelType() { - Bagel bagel = new Bagel("BGLP"); - Bagel bagel1 = new Bagel("BGLO"); - Assertions.assertNotEquals(bagel.getBagelType(), bagel1.getBagelType()); - bagel1.setBagelType("BGLP"); - Assertions.assertEquals(bagel.getBagelType(), bagel1.getBagelType()); - bagel.setBagelType("wow"); - Assertions.assertEquals(bagel.getBagelType(), bagel1.getBagelType()); + void getBagel() { + Bagel bagel = new PlainBagel(); + Assertions.assertEquals("Plain Bagel", bagel.getBagel()); + Bagel onionBagel = new OnionBagel(); + Assertions.assertEquals("Onion Bagel", onionBagel.getBagel()); + } + + @Test + void getSku() { + Bagel bagel = new PlainBagel(); + Assertions.assertEquals("BGLP", bagel.getSku()); + Bagel onionBagel = new OnionBagel(); + Assertions.assertEquals("BGLO", onionBagel.getSku()); + } + @Test + void getCost() { + Bagel bagel = new PlainBagel(); + Assertions.assertEquals(0.39f, bagel.getCost()); + Bagel onionBagel = new OnionBagel(); + Assertions.assertEquals(0.49f, onionBagel.getCost()); + } + + @Test + void getFilling() { + Assertions.assertNull(new PlainBagel().getFilling()); + Assertions.assertNull(new SesameBagel().getFilling()); } @Test - void setFilligType() { - Bagel bagel = new Bagel("BGLP"); - Bagel bagel1 = new Bagel("BGLP"); - Assertions.assertEquals(bagel.getFilligType(), bagel1.getFilligType()); - bagel.setFilligType("Bacon"); - Assertions.assertNotEquals(bagel.getFilligType(), bagel1.getFilligType()); - bagel.setFilligType("wow"); - Assertions.assertEquals(bagel.getFilligType(), bagel1.getFilligType()); + void setFilling() { + Bagel bagel = new PlainBagel(); + Assertions.assertFalse(bagel.setFilling("not a filling")); + Assertions.assertNull(bagel.getFilling()); + Assertions.assertTrue(bagel.setFilling("FILX")); + Assertions.assertEquals("Cream Cheese Filling", bagel.getFilling().getFilling()); } + + @Test + void getBagelFromSKU() { + Assertions.assertEquals("Plain Bagel", Bagel.getBagelFromSKU("BGLP").getBagel()); + Assertions.assertNull(Bagel.getBagelFromSKU("now a bagel")); + Assertions.assertEquals("Sesame Bagel", Bagel.getBagelFromSKU("BGLS").getBagel()); + } + + @Test + void getBagelPrices() { + var bagels = Bagel.getBagelPrices(); + Assertions.assertEquals(4, bagels.size()); + } + } diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 32122d4f2..4af18c4dd 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -3,12 +3,11 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; - class BasketTest { + @Test - void addOrder() { + void addAndGetOrders() { Basket basket = new Basket(); Assertions.assertEquals(0, basket.getOrders().size()); Assertions.assertTrue(basket.addOrder("BGLP",1)); @@ -19,7 +18,6 @@ void addOrder() { Assertions.assertEquals(1, basket.getOrders().size()); Assertions.assertTrue(basket.addOrder("BGLO", 2)); Assertions.assertEquals(2, basket.getOrders().size()); - } @Test @@ -48,29 +46,33 @@ void removeOrder() { } @Test - void changeBasketSizeLimit() { + void setBasketSizeLimit() { Basket basket = new Basket(); Assertions.assertEquals(0, basket.getOrders().size()); Assertions.assertFalse(basket.addOrder("BGLP",6)); Assertions.assertEquals(0, basket.getOrders().size()); - Assertions.assertFalse(basket.changeBasketSizeLimit(-1)); + Assertions.assertFalse(basket.setBasketSizeLimit(-1)); Assertions.assertFalse(basket.addOrder("BGLP",6)); Assertions.assertEquals(0, basket.getOrders().size()); - Assertions.assertTrue(basket.changeBasketSizeLimit(10)); + Assertions.assertTrue(basket.setBasketSizeLimit(10)); Assertions.assertTrue(basket.addOrder("BGLP",6)); Assertions.assertEquals(1, basket.getOrders().size()); } @Test - void setFillingTest() { + void setFilling() { Basket basket = new Basket(); basket.addOrder("BGLP",1); - Assertions.assertEquals("none", basket.getOrders().get("BGLP").getKey().getFilligType()); + Assertions.assertNull( basket.getOrders().get("BGLP").getKey().getFilling()); Assertions.assertFalse(basket.setFilling("re", "Bacon")); Assertions.assertFalse(basket.setFilling("BGLP", "er")); - Assertions.assertEquals("none", basket.getOrders().get("BGLP").getKey().getFilligType()); - Assertions.assertTrue(basket.setFilling("BGLP", "Bacon")); - Assertions.assertEquals("Bacon", basket.getOrders().get("BGLP").getKey().getFilligType()); + Assertions.assertNull( basket.getOrders().get("BGLP").getKey().getFilling()); + Assertions.assertTrue(basket.setFilling("BGLP", "FILB")); + Assertions.assertEquals("Bacon Filling", basket.getOrders().get("BGLPFILB").getKey().getFilling().getFilling()); + Assertions.assertTrue(basket.setFilling("BGLPFILB", "FILH")); + Assertions.assertEquals("Ham Filling", basket.getOrders().get("BGLPFILH").getKey().getFilling().getFilling()); + + } @Test @@ -79,10 +81,10 @@ void getTotalCost() { Assertions.assertEquals(0, basket.getTotalCost()); basket.addOrder("BGLP", 1); Assertions.assertEquals(0.39f, basket.getTotalCost()); - basket.setFilling("BGLP", "Bacon"); + basket.setFilling("BGLP", "FILB"); Assertions.assertEquals(0.51f, basket.getTotalCost()); basket.addOrder("BGLO", 2); Assertions.assertEquals(1.49f, basket.getTotalCost()); - } + } \ No newline at end of file diff --git a/src/test/java/com/booleanuk/core/FillingTest.java b/src/test/java/com/booleanuk/core/FillingTest.java new file mode 100644 index 000000000..8a77841bb --- /dev/null +++ b/src/test/java/com/booleanuk/core/FillingTest.java @@ -0,0 +1,42 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class FillingTest { + + @Test + void getFilling() { + Filling fillingHam = new HamFilling(); + Assertions.assertEquals("Ham Filling", fillingHam.getFilling()); + Filling fillingCheese = new CheeseFilling(); + Assertions.assertEquals("Cheese Filling", fillingCheese.getFilling()); + } + + @Test + void getCost() { + Filling fillingHam = new HamFilling(); + Assertions.assertEquals(0.12f, fillingHam.getCost()); + Filling fillingCheese = new CheeseFilling(); + Assertions.assertEquals(0.12f, fillingCheese.getCost()); + + + } + + @Test + void getFillingFromSKU() { + Assertions.assertEquals("Cheese Filling", Filling.getFillingFromSKU("FILC").getFilling()); + Assertions.assertEquals("Cream Cheese Filling", Filling.getFillingFromSKU("FILX").getFilling()); + Assertions.assertNull(Filling.getFillingFromSKU("not a filling")); + + + } + + @Test + void getFillingPrices() { + var fillings = Filling.getFillingPrices(); + Assertions.assertEquals(6, fillings.size()); + } +} \ No newline at end of file diff --git a/src/test/java/com/booleanuk/core/StoreManagerTest.java b/src/test/java/com/booleanuk/core/StoreManagerTest.java deleted file mode 100644 index bf9159583..000000000 --- a/src/test/java/com/booleanuk/core/StoreManagerTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.booleanuk.core; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -public class StoreManagerTest { - - @Test - void getBagelPrices() { - StoreManager manager = new StoreManager(); - var prices = manager.getBagelPrices(); - Assertions.assertEquals(4, prices.size()); - } - - @Test - void getFillingPrices() { - StoreManager manager = new StoreManager(); - var prices = manager.getFillingPrices(); - Assertions.assertEquals(6, prices.size()); - } - - @Test - void getFillingPrice() { - StoreManager manager = new StoreManager(); - var filingPrice = manager.getFillingPrice("Bacon"); - Assertions.assertEquals(.12f, filingPrice); - } - - @Test - void getBagelPrice() { - StoreManager manager = new StoreManager(); - var filingPrice = manager.getBagelPrice("BGLO"); - Assertions.assertEquals(.49f, filingPrice); - - } -} From 6d42adff1406770d777e72f19bf96596df530652 Mon Sep 17 00:00:00 2001 From: Jonathan van Oudheusden Date: Tue, 12 Aug 2025 22:06:02 +0200 Subject: [PATCH 5/6] implement receipt properly --- src/main/java/com/booleanuk/core/Bagel.java | 27 ++++-- src/main/java/com/booleanuk/core/Basket.java | 20 ++-- src/main/java/com/booleanuk/core/Filling.java | 12 ++- .../java/com/booleanuk/core/StoreManeger.java | 19 ++++ .../extension/BundleEverythingBagle.java | 9 ++ .../extension/BundledOnionBagle.java | 10 ++ .../extension/BundledPlainBagle.java | 9 ++ .../booleanuk/extension/ExtentionBasket.java | 91 +++++++++++++++++++ .../com/booleanuk/extension/ReceiptItem.java | 8 ++ .../java/com/booleanuk/core/BagelTest.java | 18 ++-- .../java/com/booleanuk/core/BasketTest.java | 22 +---- .../java/com/booleanuk/core/FillingTest.java | 12 +-- .../extension/ExtentionBasketTest.java | 47 ++++++++++ 13 files changed, 247 insertions(+), 57 deletions(-) create mode 100644 src/main/java/com/booleanuk/core/StoreManeger.java create mode 100644 src/main/java/com/booleanuk/extension/BundleEverythingBagle.java create mode 100644 src/main/java/com/booleanuk/extension/BundledOnionBagle.java create mode 100644 src/main/java/com/booleanuk/extension/BundledPlainBagle.java create mode 100644 src/main/java/com/booleanuk/extension/ExtentionBasket.java create mode 100644 src/main/java/com/booleanuk/extension/ReceiptItem.java create mode 100644 src/test/java/com/booleanuk/extension/ExtentionBasketTest.java diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java index 449d28691..a2c4b1db5 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -1,9 +1,11 @@ package com.booleanuk.core; +import com.booleanuk.extension.ReceiptItem; + import java.util.HashMap; import java.util.Map; -public abstract class Bagel { +public abstract class Bagel implements ReceiptItem { private final String bagelName; private final String sku; @@ -11,26 +13,27 @@ public abstract class Bagel { private Filling filling; - Bagel(String bagelName, String sku, float cost) { + protected Bagel(String bagelName, String sku, float cost) { this.sku = sku; this.bagelName = bagelName; this.cost = cost; } - public String getBagel() { + public String getName() { return bagelName; } - public String getSku() { + public String getSKU() { return sku; } public float getCost() { - float fulCost = cost; - if (filling != null) { - fulCost += filling.getCost(); - } - return fulCost; + return this.cost; +// float fulCost = cost; +// if (filling != null) { +// fulCost += filling.getCost(); +// } +// return fulCost; } public Filling getFilling() { @@ -47,6 +50,10 @@ public boolean setFilling(String fillingSKU) { return false; } + public void removeFilling() { + this.filling = null; + } + public static Bagel getBagelFromSKU(String sku) { return switch (sku) { case "BGLP" -> new PlainBagel(); @@ -61,7 +68,7 @@ public static Map getBagelPrices() { Bagel[] bagels = {new PlainBagel(), new OnionBagel(), new SesameBagel(), new EverythingBagel()}; Map priceList = new HashMap<>(); for (Bagel bagel: bagels) { - priceList.put(bagel.getBagel(), bagel.getCost()); + priceList.put(bagel.getName(), bagel.getCost()); } return priceList; } diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index f601980a2..317a245ca 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -5,11 +5,9 @@ public class Basket { - int orderLimit; Map> orders; public Basket() { - setBasketSizeLimit(5); orders = new HashMap<>(); } @@ -18,6 +16,8 @@ public Map> getOrders() { } public boolean addOrder(String sku, int amount) { + int orderLimit = StoreManeger.getBasketSize(); + Bagel bagel = Bagel.getBagelFromSKU(sku); if (bagel != null && amount > 0 && getOrderSize() + amount <= orderLimit) { orders.merge(sku, Map.entry(bagel, amount), @@ -52,13 +52,13 @@ public boolean removeOrder(String bagelSKU) { return false; } - public boolean setBasketSizeLimit(int newSizeLimit) { - if (newSizeLimit > 0) { - this.orderLimit = newSizeLimit; - return true; - } - return false; - } +// public boolean setBasketSizeLimit(int newSizeLimit) { +// if (newSizeLimit > 0) { +// this.orderLimit = newSizeLimit; +// return true; +// } +// return false; +// } private int getOrderSize() { int count =0; @@ -74,7 +74,7 @@ public boolean setFilling(String bagelSKU, String fillingSKU) { Bagel bagel = set.getKey(); if (bagel.setFilling(fillingSKU)) { orders.remove(bagelSKU); - orders.put(bagel.getSku() + fillingSKU, set); + orders.put(bagel.getSKU() + fillingSKU, set); return true; } } diff --git a/src/main/java/com/booleanuk/core/Filling.java b/src/main/java/com/booleanuk/core/Filling.java index e4f4ca0aa..a065521af 100644 --- a/src/main/java/com/booleanuk/core/Filling.java +++ b/src/main/java/com/booleanuk/core/Filling.java @@ -1,9 +1,11 @@ package com.booleanuk.core; +import com.booleanuk.extension.ReceiptItem; + import java.util.HashMap; import java.util.Map; -public abstract class Filling { +public abstract class Filling implements ReceiptItem { private final String filling; private final String sku; @@ -13,11 +15,15 @@ public Filling(String filling, String sku) { this.sku = sku; } - public String getFilling(){return filling;} + public String getName(){return filling;} public float getCost() { return 0.12f;} + public String getSKU() { + return sku; + } + public static Filling getFillingFromSKU(String sku) { return switch (sku) { @@ -36,7 +42,7 @@ public static Map getFillingPrices() { new CheeseFilling(), new SmokedSalmonFilling(), new HamFilling()}; Map priceList = new HashMap<>(); for (Filling filling: fillings) { - priceList.put(filling.getFilling(), filling.getCost()); + priceList.put(filling.getName(), filling.getCost()); } return priceList; } diff --git a/src/main/java/com/booleanuk/core/StoreManeger.java b/src/main/java/com/booleanuk/core/StoreManeger.java new file mode 100644 index 000000000..62946b097 --- /dev/null +++ b/src/main/java/com/booleanuk/core/StoreManeger.java @@ -0,0 +1,19 @@ +package com.booleanuk.core; + +public abstract class StoreManeger { + + static private int basketSize = 15; + + public static int getBasketSize() { + return basketSize; + } + + public static boolean setBasketSize(int newBasketSize, boolean isManeger) { + if (!isManeger) + return false; + basketSize = newBasketSize; + return true; + } + + +} diff --git a/src/main/java/com/booleanuk/extension/BundleEverythingBagle.java b/src/main/java/com/booleanuk/extension/BundleEverythingBagle.java new file mode 100644 index 000000000..ada302b81 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/BundleEverythingBagle.java @@ -0,0 +1,9 @@ +package com.booleanuk.extension; + +import com.booleanuk.core.Bagel; + +public class BundleEverythingBagle extends Bagel { + public BundleEverythingBagle() { + super("Bundle 6 Everything Bagle", "BBGLE", 6); + } +} diff --git a/src/main/java/com/booleanuk/extension/BundledOnionBagle.java b/src/main/java/com/booleanuk/extension/BundledOnionBagle.java new file mode 100644 index 000000000..f6c0dc79f --- /dev/null +++ b/src/main/java/com/booleanuk/extension/BundledOnionBagle.java @@ -0,0 +1,10 @@ +package com.booleanuk.extension; + +import com.booleanuk.core.Bagel; + +public class BundledOnionBagle extends Bagel { + + public BundledOnionBagle(){ + super("Bundle: 6 Onion Bagles", "BBGLO", 2.49f); + } +} diff --git a/src/main/java/com/booleanuk/extension/BundledPlainBagle.java b/src/main/java/com/booleanuk/extension/BundledPlainBagle.java new file mode 100644 index 000000000..12c0f2371 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/BundledPlainBagle.java @@ -0,0 +1,9 @@ +package com.booleanuk.extension; + +import com.booleanuk.core.Bagel; + +public class BundledPlainBagle extends Bagel { + public BundledPlainBagle() { + super("Bunlde 12 Plain Bagles", "BBGLP", 3.99f); + } +} diff --git a/src/main/java/com/booleanuk/extension/ExtentionBasket.java b/src/main/java/com/booleanuk/extension/ExtentionBasket.java new file mode 100644 index 000000000..0f4f6f8f5 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/ExtentionBasket.java @@ -0,0 +1,91 @@ +package com.booleanuk.extension; + +import com.booleanuk.core.Bagel; +import com.booleanuk.core.Basket; +import com.booleanuk.core.Filling; + +import java.util.*; + +public class ExtentionBasket extends Basket { + + public ExtentionBasket() { + super(); + } + + @Override + public float getTotalCost() { + var receipt = getReceipt(); + float cost = 0; + for (var entry : receipt) { + ReceiptItem item = entry.getKey(); + float costPerItem = item.getCost() * entry.getValue(); + cost += costPerItem; + } + + return cost; + + } + + public float countCostBundle(Bagel originalBagel, Bagel bundleBagel, int count, int neededToBundleCount) { + int bundleCount = count % neededToBundleCount; + float bundleCost = bundleBagel.getCost() * bundleCount; + float originalCost = originalBagel.getCost() * (count - (bundleCount * neededToBundleCount)); + return bundleCost + originalCost; + + + + } + + public List> getReceipt() { + Map> receipt = new HashMap<>(); + + for (var set: super.getOrders().entrySet()) { + Bagel bagel = set.getValue().getKey(); + int amount = set.getValue().getValue(); + Filling filling = bagel.getFilling(); + receipt.merge(bagel.getSKU(), Map.entry(bagel, amount), + (a,b) -> + Map.entry(bagel,a.getValue() + b.getValue() ) + ); + if (filling != null) { + receipt.merge(filling.getSKU(), Map.entry(filling, amount), + (a,b) -> + Map.entry(filling, a.getValue() + b.getValue())); + } + + } + + receipt = bundleReceipts(receipt); + + return receipt.values().stream().sorted( + Comparator.comparing(a -> a.getKey().getName()) + ).toList(); + } + + private Map> bundleReceipts(Map> receipt) { + var returnValue = new HashMap<>(receipt); + for (var set : receipt.values()) { + ReceiptItem bagel = set.getKey(); + int count = set.getValue(); + if (bagel.getSKU().equals("BGLO") && count >= 6) { + turnIntoBundle(returnValue, count, bagel, 6, new BundledOnionBagle()); + } else if (bagel.getSKU().equals("BGLP") && count >= 12) { + turnIntoBundle(returnValue, count, bagel, 12, new BundledPlainBagle()); + } else if (bagel.getSKU().equals("BGLE")&& count >= 6) { + turnIntoBundle(returnValue, count, bagel, 6, new BundleEverythingBagle()); + } + } + return returnValue; + + } + + private static Map> turnIntoBundle(Map> receipt, int count, + ReceiptItem bagel, int needToHave, Bagel bundle) { + int bundleCount = count / needToHave; + receipt.put(bundle.getSKU(), Map.entry(bundle, bundleCount)); + receipt.replace(bagel.getSKU(), + Map.entry(bagel, (count - (bundleCount * needToHave))) + ); + return receipt; + } +} diff --git a/src/main/java/com/booleanuk/extension/ReceiptItem.java b/src/main/java/com/booleanuk/extension/ReceiptItem.java new file mode 100644 index 000000000..3d1e54cf4 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/ReceiptItem.java @@ -0,0 +1,8 @@ +package com.booleanuk.extension; + +public interface ReceiptItem { + + String getName(); + String getSKU(); + float getCost(); +} diff --git a/src/test/java/com/booleanuk/core/BagelTest.java b/src/test/java/com/booleanuk/core/BagelTest.java index fb21a71e1..9ad5634d7 100644 --- a/src/test/java/com/booleanuk/core/BagelTest.java +++ b/src/test/java/com/booleanuk/core/BagelTest.java @@ -5,19 +5,19 @@ public class BagelTest { @Test - void getBagel() { + void getName() { Bagel bagel = new PlainBagel(); - Assertions.assertEquals("Plain Bagel", bagel.getBagel()); + Assertions.assertEquals("Plain Bagel", bagel.getName()); Bagel onionBagel = new OnionBagel(); - Assertions.assertEquals("Onion Bagel", onionBagel.getBagel()); + Assertions.assertEquals("Onion Bagel", onionBagel.getName()); } @Test - void getSku() { + void getSKU() { Bagel bagel = new PlainBagel(); - Assertions.assertEquals("BGLP", bagel.getSku()); + Assertions.assertEquals("BGLP", bagel.getSKU()); Bagel onionBagel = new OnionBagel(); - Assertions.assertEquals("BGLO", onionBagel.getSku()); + Assertions.assertEquals("BGLO", onionBagel.getSKU()); } @Test @@ -40,15 +40,15 @@ void setFilling() { Assertions.assertFalse(bagel.setFilling("not a filling")); Assertions.assertNull(bagel.getFilling()); Assertions.assertTrue(bagel.setFilling("FILX")); - Assertions.assertEquals("Cream Cheese Filling", bagel.getFilling().getFilling()); + Assertions.assertEquals("Cream Cheese Filling", bagel.getFilling().getName()); } @Test void getBagelFromSKU() { - Assertions.assertEquals("Plain Bagel", Bagel.getBagelFromSKU("BGLP").getBagel()); + Assertions.assertEquals("Plain Bagel", Bagel.getBagelFromSKU("BGLP").getName()); Assertions.assertNull(Bagel.getBagelFromSKU("now a bagel")); - Assertions.assertEquals("Sesame Bagel", Bagel.getBagelFromSKU("BGLS").getBagel()); + Assertions.assertEquals("Sesame Bagel", Bagel.getBagelFromSKU("BGLS").getName()); } @Test diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 4af18c4dd..7b0e4d2a6 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -45,20 +45,6 @@ void removeOrder() { Assertions.assertEquals(0, basket.getOrders().size()); } - @Test - void setBasketSizeLimit() { - Basket basket = new Basket(); - Assertions.assertEquals(0, basket.getOrders().size()); - Assertions.assertFalse(basket.addOrder("BGLP",6)); - Assertions.assertEquals(0, basket.getOrders().size()); - Assertions.assertFalse(basket.setBasketSizeLimit(-1)); - Assertions.assertFalse(basket.addOrder("BGLP",6)); - Assertions.assertEquals(0, basket.getOrders().size()); - Assertions.assertTrue(basket.setBasketSizeLimit(10)); - Assertions.assertTrue(basket.addOrder("BGLP",6)); - Assertions.assertEquals(1, basket.getOrders().size()); - } - @Test void setFilling() { Basket basket = new Basket(); @@ -68,9 +54,9 @@ void setFilling() { Assertions.assertFalse(basket.setFilling("BGLP", "er")); Assertions.assertNull( basket.getOrders().get("BGLP").getKey().getFilling()); Assertions.assertTrue(basket.setFilling("BGLP", "FILB")); - Assertions.assertEquals("Bacon Filling", basket.getOrders().get("BGLPFILB").getKey().getFilling().getFilling()); + Assertions.assertEquals("Bacon Filling", basket.getOrders().get("BGLPFILB").getKey().getFilling().getName()); Assertions.assertTrue(basket.setFilling("BGLPFILB", "FILH")); - Assertions.assertEquals("Ham Filling", basket.getOrders().get("BGLPFILH").getKey().getFilling().getFilling()); + Assertions.assertEquals("Ham Filling", basket.getOrders().get("BGLPFILH").getKey().getFilling().getName()); } @@ -82,9 +68,9 @@ void getTotalCost() { basket.addOrder("BGLP", 1); Assertions.assertEquals(0.39f, basket.getTotalCost()); basket.setFilling("BGLP", "FILB"); - Assertions.assertEquals(0.51f, basket.getTotalCost()); + Assertions.assertEquals(0.39f, basket.getTotalCost()); basket.addOrder("BGLO", 2); - Assertions.assertEquals(1.49f, basket.getTotalCost()); + Assertions.assertEquals(1.37f, basket.getTotalCost()); } } \ No newline at end of file diff --git a/src/test/java/com/booleanuk/core/FillingTest.java b/src/test/java/com/booleanuk/core/FillingTest.java index 8a77841bb..7daaed8e0 100644 --- a/src/test/java/com/booleanuk/core/FillingTest.java +++ b/src/test/java/com/booleanuk/core/FillingTest.java @@ -3,16 +3,14 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; - class FillingTest { @Test - void getFilling() { + void getName() { Filling fillingHam = new HamFilling(); - Assertions.assertEquals("Ham Filling", fillingHam.getFilling()); + Assertions.assertEquals("Ham Filling", fillingHam.getName()); Filling fillingCheese = new CheeseFilling(); - Assertions.assertEquals("Cheese Filling", fillingCheese.getFilling()); + Assertions.assertEquals("Cheese Filling", fillingCheese.getName()); } @Test @@ -27,8 +25,8 @@ void getCost() { @Test void getFillingFromSKU() { - Assertions.assertEquals("Cheese Filling", Filling.getFillingFromSKU("FILC").getFilling()); - Assertions.assertEquals("Cream Cheese Filling", Filling.getFillingFromSKU("FILX").getFilling()); + Assertions.assertEquals("Cheese Filling", Filling.getFillingFromSKU("FILC").getName()); + Assertions.assertEquals("Cream Cheese Filling", Filling.getFillingFromSKU("FILX").getName()); Assertions.assertNull(Filling.getFillingFromSKU("not a filling")); diff --git a/src/test/java/com/booleanuk/extension/ExtentionBasketTest.java b/src/test/java/com/booleanuk/extension/ExtentionBasketTest.java new file mode 100644 index 000000000..f2e2b0688 --- /dev/null +++ b/src/test/java/com/booleanuk/extension/ExtentionBasketTest.java @@ -0,0 +1,47 @@ +package com.booleanuk.extension; + +import com.booleanuk.core.Basket; +import com.booleanuk.core.PlainBagel; +import com.booleanuk.core.StoreManeger; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class ExtentionBasketTest { + + @Test + void getTotalCost() { + ExtentionBasket basket = new ExtentionBasket(); + basket.addOrder("BGLO", 3); + basket.setFilling("BGLO", "FILH"); + Assertions.assertEquals(1.83f, basket.getTotalCost()); + basket.addOrder("BGLP", 3); + basket.setFilling("BGLP", "FILH"); + Assertions.assertEquals(3.36f, basket.getTotalCost(), 0.0001); + basket.addOrder("BGLP", 11); + Assertions.assertEquals(6.96f, basket.getTotalCost(), 0.0001); + } + + @Test + void countCostBundle() { + ExtentionBasket basket = new ExtentionBasket(); + StoreManeger.setBasketSize(99, true); + basket.addOrder("BGLP", 13); + Assertions.assertEquals(4.38, basket.countCostBundle(new PlainBagel(), new BundledPlainBagle(), 13, 12), 0.001); + } + + @Test + void getReceipt() { + ExtentionBasket basket = new ExtentionBasket(); + basket.addOrder("BGLO", 3); + basket.setFilling("BGLO", "FILH"); + Assertions.assertEquals(2, basket.getReceipt().size()); + basket.addOrder("BGLP", 3); + basket.setFilling("BGLP", "FILH"); + basket.addOrder("BGLP", 11); + Assertions.assertEquals(4, basket.getReceipt().size()); + + } + +} \ No newline at end of file From 90e0157a2b6cd1aa757daa4805d2926135e64872 Mon Sep 17 00:00:00 2001 From: Jonathan van Oudheusden Date: Tue, 12 Aug 2025 23:24:30 +0200 Subject: [PATCH 6/6] implement the top 3 extentions --- BagelDomain.md | 20 ++-- EXTENSION1.md | 4 +- README.md | 16 +-- src/main/java/com/booleanuk/core/Basket.java | 36 +++---- .../java/com/booleanuk/core/CoffeeBlack.java | 12 +++ .../com/booleanuk/core/CoffeeCapuccino.java | 12 +++ .../java/com/booleanuk/core/CoffeeLatte.java | 12 +++ .../java/com/booleanuk/core/CoffeeWhite.java | 12 +++ .../com/booleanuk/core/EverythingBagel.java | 2 +- .../java/com/booleanuk/core/OnionBagel.java | 2 +- .../java/com/booleanuk/core/PlainBagel.java | 2 +- .../java/com/booleanuk/core/SesameBagel.java | 2 +- .../core/{Bagel.java => StoreItem.java} | 24 ++--- .../{StoreManeger.java => StoreManager.java} | 8 +- .../extension/BundleEverythingBagle.java | 6 +- .../extension/BundledCoffeeBagel.java | 10 ++ .../extension/BundledOnionBagle.java | 4 +- .../extension/BundledPlainBagle.java | 6 +- .../booleanuk/extension/ExtentionBasket.java | 97 ++++++++++++++++--- .../java/com/booleanuk/core/BagelTest.java | 60 ------------ .../com/booleanuk/core/StoreItemTest.java | 60 ++++++++++++ .../com/booleanuk/core/StoreManagerTest.java | 22 +++++ .../extension/ExtentionBasketTest.java | 23 ++++- 23 files changed, 306 insertions(+), 146 deletions(-) create mode 100644 src/main/java/com/booleanuk/core/CoffeeBlack.java create mode 100644 src/main/java/com/booleanuk/core/CoffeeCapuccino.java create mode 100644 src/main/java/com/booleanuk/core/CoffeeLatte.java create mode 100644 src/main/java/com/booleanuk/core/CoffeeWhite.java rename src/main/java/com/booleanuk/core/{Bagel.java => StoreItem.java} (63%) rename src/main/java/com/booleanuk/core/{StoreManeger.java => StoreManager.java} (69%) create mode 100644 src/main/java/com/booleanuk/extension/BundledCoffeeBagel.java delete mode 100644 src/test/java/com/booleanuk/core/BagelTest.java create mode 100644 src/test/java/com/booleanuk/core/StoreItemTest.java create mode 100644 src/test/java/com/booleanuk/core/StoreManagerTest.java diff --git a/BagelDomain.md b/BagelDomain.md index dc52d1859..a2e0027b9 100644 --- a/BagelDomain.md +++ b/BagelDomain.md @@ -1,27 +1,27 @@ | Classes | variables | Methods | Scenario | Outputs | | ------------ | ----------------------------------------------------------- | ---------------------------------------------------------------------------- | ------------------------------------------------- | ---------------------------------------------------------------------- | -| Basket | Map> orders | Basket() | create method | empty Basket | +| Basket | Map> orders | Basket() | create method | empty Basket | | | int orderLimit | addOrder("String bagelName, int amount) | if bagelName is not correct or int amount is <= 0 | returns false | | | | | if basket size is gone over | returns false | -| | | | if both valid and bagel is not in basket yet | returns true, and the bagel is added to the basket | -| | | | if both are valid and bagel is already in basket | returns true, and the amount is added to the bagel in basket | -| | | changeOrder(String bagelOrderToBeChanged, String new bagelOrder, int amount) | if all are valid | the bagel version is changed and set to a new amount, true is returned | +| | | | if both valid and storeItem is not in basket yet | returns true, and the storeItem is added to the basket | +| | | | if both are valid and storeItem is already in basket | returns true, and the amount is added to the storeItem in basket | +| | | changeOrder(String bagelOrderToBeChanged, String new bagelOrder, int amount) | if all are valid | the storeItem version is changed and set to a new amount, true is returned | | | | | | nothing happens and false is returned | | | | removeOrder(String bagelName) | If name is in basket | the order is removed and true is returnd | | | | | if not | returns false | | | | changeSizeLimit(int newSizeLimit) | if >0 | returns true | | | | | if < 0 | returns false | -| | | getTotalCost | empty or full | it calculated and returns the cost of all bagels and fillings | +| | | getTotalCost | empty or full | it calculated and returns the cost of all storeItems and fillings | | | | | | | -| Bagel | String type | Bagel(String type) | if valid bagel type | set as that bagel | -| | | | if not | sets as default bagel | -| | String filling | setBagelType(STring new type) | if valid bagel | return true | -| | | | if not valid bagel | returns false | +| Bagel | String type | Bagel(String type) | if valid storeItem type | set as that storeItem | +| | | | if not | sets as default storeItem | +| | String filling | setBagelType(STring new type) | if valid storeItem | return true | +| | | | if not valid storeItem | returns false | | | | setFillingType | if valid filiing | return true | | | | | if not valid filling | return false | | | | | | | -| StoreManager | Map priceListBagels | getBagelPrices() | | returns map of bagel and prices | +| StoreManager | Map priceListBagels | getBagelPrices() | | returns map of storeItem and prices | | | Map priceListFilling | getFillingPrices() | | returns map of fillings and prices | | | | getBagelPrice() | if valid | returns price | | | | getFillingPrice() | if valid | returns price | diff --git a/EXTENSION1.md b/EXTENSION1.md index 9e2c3cfd5..2afdd2b4e 100644 --- a/EXTENSION1.md +++ b/EXTENSION1.md @@ -2,7 +2,7 @@ In a normal supermarket, things are identified using Stock Keeping Units, or SKUs. -In Bob's Bagels, we'll use the first 3 letters of a bagel with an extra letter for the variant. For example: an 'everything bagel' has a SKU of `BGLE`. +In Bob's Bagels, we'll use the first 3 letters of a storeItem with an extra letter for the variant. For example: an 'everything storeItem' has a SKU of `BGLE`. Our goods are priced individually. In addition, some items are multi-priced: buy n of them, and they'll cost you y pounds. @@ -15,7 +15,7 @@ Our goods are priced individually. In addition, some items are multi-priced: buy | BGLE | Bagel | Everything | .49 | 6 for 2.49 | | COFB | Coffee | Black | .99 | Coffee & Bagel for 1.25 | -Every Bagel is available for the `6 for 2.49` and `12 for 3.99` offer, but fillings still cost the extra amount per bagel. +Every Bagel is available for the `6 for 2.49` and `12 for 3.99` offer, but fillings still cost the extra amount per storeItem. #### Example orders ``` diff --git a/README.md b/README.md index e2aa7ee51..d3133aeb1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Bob's Bagels - Object-oriented Programming -![](./assets/bagels.jpg) +![](./assets/storeItems.jpg) ## Learning Objectives - Design a domain from user stories @@ -26,21 +26,21 @@ ``` 1. As a member of the public, -So I can order a bagel before work, -I'd like to add a specific type of bagel to my basket. +So I can order a storeItem before work, +I'd like to add a specific type of storeItem to my basket. ``` ``` 2. As a member of the public, So I can change my order, -I'd like to remove a bagel from my basket. +I'd like to remove a storeItem from my basket. ``` ``` 3. As a member of the public, -So that I can not overfill my small bagel basket +So that I can not overfill my small storeItem basket I'd like to know when my basket is full when I try adding an item beyond my basket capacity. ``` @@ -69,21 +69,21 @@ I'd like to know the total cost of items in my basket. 7. As a customer, So I know what the damage will be, -I'd like to know the cost of a bagel before I add it to my basket. +I'd like to know the cost of a storeItem before I add it to my basket. ``` ``` 8. As a customer, So I can shake things up a bit, -I'd like to be able to choose fillings for my bagel. +I'd like to be able to choose fillings for my storeItem. ``` ``` 9. As a customer, So I don't over-spend, -I'd like to know the cost of each filling before I add it to my bagel order. +I'd like to know the cost of each filling before I add it to my storeItem order. ``` ``` diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 317a245ca..baa95f942 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -5,23 +5,23 @@ public class Basket { - Map> orders; + Map> orders; public Basket() { orders = new HashMap<>(); } - public Map> getOrders() { + public Map> getOrders() { return orders; } public boolean addOrder(String sku, int amount) { - int orderLimit = StoreManeger.getBasketSize(); + int orderLimit = StoreManager.getBasketSize(); - Bagel bagel = Bagel.getBagelFromSKU(sku); - if (bagel != null && amount > 0 && getOrderSize() + amount <= orderLimit) { - orders.merge(sku, Map.entry(bagel, amount), - (a, b) -> Map.entry(bagel, a.getValue()+b.getValue())); + StoreItem storeItem = StoreItem.getBagelFromSKU(sku); + if (storeItem != null && amount > 0 && getOrderSize() + amount <= orderLimit) { + orders.merge(sku, Map.entry(storeItem, amount), + (a, b) -> Map.entry(storeItem, a.getValue()+b.getValue())); return true; } return false; @@ -29,8 +29,8 @@ public boolean addOrder(String sku, int amount) { public boolean changeOrder(String prevSKU, String newBagelSKU, int amount) { int prevAmount = 0; - Bagel newBagel = Bagel.getBagelFromSKU(newBagelSKU); - if (orders.containsKey(prevSKU) && newBagel != null && amount > 0) { + StoreItem newStoreItem = StoreItem.getBagelFromSKU(newBagelSKU); + if (orders.containsKey(prevSKU) && newStoreItem != null && amount > 0) { if (prevSKU.equals(newBagelSKU)) { return addOrder(newBagelSKU, amount); @@ -52,13 +52,7 @@ public boolean removeOrder(String bagelSKU) { return false; } -// public boolean setBasketSizeLimit(int newSizeLimit) { -// if (newSizeLimit > 0) { -// this.orderLimit = newSizeLimit; -// return true; -// } -// return false; -// } + private int getOrderSize() { int count =0; @@ -71,10 +65,10 @@ private int getOrderSize() { public boolean setFilling(String bagelSKU, String fillingSKU) { if (orders.containsKey(bagelSKU)) { var set = orders.get(bagelSKU); - Bagel bagel = set.getKey(); - if (bagel.setFilling(fillingSKU)) { + StoreItem storeItem = set.getKey(); + if (storeItem.setFilling(fillingSKU)) { orders.remove(bagelSKU); - orders.put(bagel.getSKU() + fillingSKU, set); + orders.put(storeItem.getSKU() + fillingSKU, set); return true; } } @@ -85,10 +79,10 @@ public float getTotalCost() { float cost =0; for (var order : orders.entrySet()) { var singleOrder = order.getValue(); - Bagel bagel = singleOrder.getKey(); + StoreItem storeItem = singleOrder.getKey(); int amount = singleOrder.getValue(); - cost += bagel.getCost() * amount; + cost += storeItem.getCost() * amount; } return cost; } diff --git a/src/main/java/com/booleanuk/core/CoffeeBlack.java b/src/main/java/com/booleanuk/core/CoffeeBlack.java new file mode 100644 index 000000000..6b2787770 --- /dev/null +++ b/src/main/java/com/booleanuk/core/CoffeeBlack.java @@ -0,0 +1,12 @@ +package com.booleanuk.core; + +public class CoffeeBlack extends StoreItem { + public CoffeeBlack() { + super("Coffee Black", "COFB", 0.99f); + } + + @Override + public boolean setFilling(String filling) { + return false; + } +} diff --git a/src/main/java/com/booleanuk/core/CoffeeCapuccino.java b/src/main/java/com/booleanuk/core/CoffeeCapuccino.java new file mode 100644 index 000000000..c4f3d2794 --- /dev/null +++ b/src/main/java/com/booleanuk/core/CoffeeCapuccino.java @@ -0,0 +1,12 @@ +package com.booleanuk.core; + +public class CoffeeCapuccino extends StoreItem{ + public CoffeeCapuccino() { + super("Coffee Cappuccino", "COFC", 1.29f); + } + + @Override + public boolean setFilling(String filling) { + return false; + } +} diff --git a/src/main/java/com/booleanuk/core/CoffeeLatte.java b/src/main/java/com/booleanuk/core/CoffeeLatte.java new file mode 100644 index 000000000..3dcae01b3 --- /dev/null +++ b/src/main/java/com/booleanuk/core/CoffeeLatte.java @@ -0,0 +1,12 @@ +package com.booleanuk.core; + +public class CoffeeLatte extends StoreItem{ + public CoffeeLatte() { + super("Coffee Latte", "COFL", 1.29f); + } + + @Override + public boolean setFilling(String filling) { + return false; + } +} diff --git a/src/main/java/com/booleanuk/core/CoffeeWhite.java b/src/main/java/com/booleanuk/core/CoffeeWhite.java new file mode 100644 index 000000000..ad7c9a8a8 --- /dev/null +++ b/src/main/java/com/booleanuk/core/CoffeeWhite.java @@ -0,0 +1,12 @@ +package com.booleanuk.core; + +public class CoffeeWhite extends StoreItem{ + public CoffeeWhite() { + super("Coffee White", "COFW", 1.19f); + } + + @Override + public boolean setFilling(String filling) { + return false; + } +} diff --git a/src/main/java/com/booleanuk/core/EverythingBagel.java b/src/main/java/com/booleanuk/core/EverythingBagel.java index 9993efe78..b307f9a9f 100644 --- a/src/main/java/com/booleanuk/core/EverythingBagel.java +++ b/src/main/java/com/booleanuk/core/EverythingBagel.java @@ -1,6 +1,6 @@ package com.booleanuk.core; -public class EverythingBagel extends Bagel{ +public class EverythingBagel extends StoreItem { public EverythingBagel() { super("Everything Bagel","BGLE" , 0.49f); } diff --git a/src/main/java/com/booleanuk/core/OnionBagel.java b/src/main/java/com/booleanuk/core/OnionBagel.java index 669e32714..94d30da2e 100644 --- a/src/main/java/com/booleanuk/core/OnionBagel.java +++ b/src/main/java/com/booleanuk/core/OnionBagel.java @@ -1,6 +1,6 @@ package com.booleanuk.core; -public class OnionBagel extends Bagel { +public class OnionBagel extends StoreItem { public OnionBagel() { super("Onion Bagel", "BGLO", 0.49f); } diff --git a/src/main/java/com/booleanuk/core/PlainBagel.java b/src/main/java/com/booleanuk/core/PlainBagel.java index fec7ccc24..11bffd7cf 100644 --- a/src/main/java/com/booleanuk/core/PlainBagel.java +++ b/src/main/java/com/booleanuk/core/PlainBagel.java @@ -1,6 +1,6 @@ package com.booleanuk.core; -public class PlainBagel extends Bagel{ +public class PlainBagel extends StoreItem { public PlainBagel() { super("Plain Bagel", "BGLP", 0.39f); diff --git a/src/main/java/com/booleanuk/core/SesameBagel.java b/src/main/java/com/booleanuk/core/SesameBagel.java index 141aa1e7a..26c5c6941 100644 --- a/src/main/java/com/booleanuk/core/SesameBagel.java +++ b/src/main/java/com/booleanuk/core/SesameBagel.java @@ -1,6 +1,6 @@ package com.booleanuk.core; -public class SesameBagel extends Bagel{ +public class SesameBagel extends StoreItem { public SesameBagel() { super("Sesame Bagel", "BGLS", 0.49f); } diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/StoreItem.java similarity index 63% rename from src/main/java/com/booleanuk/core/Bagel.java rename to src/main/java/com/booleanuk/core/StoreItem.java index a2c4b1db5..503222d37 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/StoreItem.java @@ -5,7 +5,7 @@ import java.util.HashMap; import java.util.Map; -public abstract class Bagel implements ReceiptItem { +public abstract class StoreItem implements ReceiptItem { private final String bagelName; private final String sku; @@ -13,7 +13,7 @@ public abstract class Bagel implements ReceiptItem { private Filling filling; - protected Bagel(String bagelName, String sku, float cost) { + protected StoreItem(String bagelName, String sku, float cost) { this.sku = sku; this.bagelName = bagelName; this.cost = cost; @@ -29,11 +29,6 @@ public String getSKU() { public float getCost() { return this.cost; -// float fulCost = cost; -// if (filling != null) { -// fulCost += filling.getCost(); -// } -// return fulCost; } public Filling getFilling() { @@ -54,21 +49,26 @@ public void removeFilling() { this.filling = null; } - public static Bagel getBagelFromSKU(String sku) { + public static StoreItem getBagelFromSKU(String sku) { return switch (sku) { case "BGLP" -> new PlainBagel(); case "BGLO" -> new OnionBagel(); case "BGLE" -> new EverythingBagel(); case "BGLS" -> new SesameBagel(); + case "COFB" -> new CoffeeBlack(); + case "COFW" -> new CoffeeWhite(); + case "COFC" -> new CoffeeCapuccino(); + case "COFL" -> new CoffeeLatte(); default -> null; }; } - public static Map getBagelPrices() { - Bagel[] bagels = {new PlainBagel(), new OnionBagel(), new SesameBagel(), new EverythingBagel()}; + public static Map getStoreItemPrices() { + StoreItem[] storeItems = {new PlainBagel(), new OnionBagel(), new SesameBagel(), new EverythingBagel(), + new CoffeeBlack(), new CoffeeWhite(), new CoffeeCapuccino(), new CoffeeLatte()}; Map priceList = new HashMap<>(); - for (Bagel bagel: bagels) { - priceList.put(bagel.getName(), bagel.getCost()); + for (StoreItem storeItem : storeItems) { + priceList.put(storeItem.getName(), storeItem.getCost()); } return priceList; } diff --git a/src/main/java/com/booleanuk/core/StoreManeger.java b/src/main/java/com/booleanuk/core/StoreManager.java similarity index 69% rename from src/main/java/com/booleanuk/core/StoreManeger.java rename to src/main/java/com/booleanuk/core/StoreManager.java index 62946b097..c4a374020 100644 --- a/src/main/java/com/booleanuk/core/StoreManeger.java +++ b/src/main/java/com/booleanuk/core/StoreManager.java @@ -1,15 +1,15 @@ package com.booleanuk.core; -public abstract class StoreManeger { +public abstract class StoreManager { - static private int basketSize = 15; + static private int basketSize = 25; public static int getBasketSize() { return basketSize; } - public static boolean setBasketSize(int newBasketSize, boolean isManeger) { - if (!isManeger) + public static boolean setBasketSize(int newBasketSize, boolean isManager) { + if (!isManager) return false; basketSize = newBasketSize; return true; diff --git a/src/main/java/com/booleanuk/extension/BundleEverythingBagle.java b/src/main/java/com/booleanuk/extension/BundleEverythingBagle.java index ada302b81..320c871aa 100644 --- a/src/main/java/com/booleanuk/extension/BundleEverythingBagle.java +++ b/src/main/java/com/booleanuk/extension/BundleEverythingBagle.java @@ -1,9 +1,9 @@ package com.booleanuk.extension; -import com.booleanuk.core.Bagel; +import com.booleanuk.core.StoreItem; -public class BundleEverythingBagle extends Bagel { +public class BundleEverythingBagle extends StoreItem { public BundleEverythingBagle() { - super("Bundle 6 Everything Bagle", "BBGLE", 6); + super("Bundle: 6 Everything Bagle", "BBGLE", 6); } } diff --git a/src/main/java/com/booleanuk/extension/BundledCoffeeBagel.java b/src/main/java/com/booleanuk/extension/BundledCoffeeBagel.java new file mode 100644 index 000000000..7ef58400e --- /dev/null +++ b/src/main/java/com/booleanuk/extension/BundledCoffeeBagel.java @@ -0,0 +1,10 @@ +package com.booleanuk.extension; + +import com.booleanuk.core.StoreItem; + +public class BundledCoffeeBagel extends StoreItem { + + public BundledCoffeeBagel(){ + super("Bundle: Coffee and Bagel", "BCOFB", 1.25f); + } +} diff --git a/src/main/java/com/booleanuk/extension/BundledOnionBagle.java b/src/main/java/com/booleanuk/extension/BundledOnionBagle.java index f6c0dc79f..cd25bafe0 100644 --- a/src/main/java/com/booleanuk/extension/BundledOnionBagle.java +++ b/src/main/java/com/booleanuk/extension/BundledOnionBagle.java @@ -1,8 +1,8 @@ package com.booleanuk.extension; -import com.booleanuk.core.Bagel; +import com.booleanuk.core.StoreItem; -public class BundledOnionBagle extends Bagel { +public class BundledOnionBagle extends StoreItem { public BundledOnionBagle(){ super("Bundle: 6 Onion Bagles", "BBGLO", 2.49f); diff --git a/src/main/java/com/booleanuk/extension/BundledPlainBagle.java b/src/main/java/com/booleanuk/extension/BundledPlainBagle.java index 12c0f2371..8d9ad3a3a 100644 --- a/src/main/java/com/booleanuk/extension/BundledPlainBagle.java +++ b/src/main/java/com/booleanuk/extension/BundledPlainBagle.java @@ -1,9 +1,9 @@ package com.booleanuk.extension; -import com.booleanuk.core.Bagel; +import com.booleanuk.core.StoreItem; -public class BundledPlainBagle extends Bagel { +public class BundledPlainBagle extends StoreItem { public BundledPlainBagle() { - super("Bunlde 12 Plain Bagles", "BBGLP", 3.99f); + super("Bundle: 12 Plain Bagles", "BBGLP", 3.99f); } } diff --git a/src/main/java/com/booleanuk/extension/ExtentionBasket.java b/src/main/java/com/booleanuk/extension/ExtentionBasket.java index 0f4f6f8f5..b7c023a22 100644 --- a/src/main/java/com/booleanuk/extension/ExtentionBasket.java +++ b/src/main/java/com/booleanuk/extension/ExtentionBasket.java @@ -1,8 +1,6 @@ package com.booleanuk.extension; -import com.booleanuk.core.Bagel; -import com.booleanuk.core.Basket; -import com.booleanuk.core.Filling; +import com.booleanuk.core.*; import java.util.*; @@ -26,10 +24,10 @@ public float getTotalCost() { } - public float countCostBundle(Bagel originalBagel, Bagel bundleBagel, int count, int neededToBundleCount) { + public float countCostBundle(StoreItem originalStoreItem, StoreItem bundleStoreItem, int count, int neededToBundleCount) { int bundleCount = count % neededToBundleCount; - float bundleCost = bundleBagel.getCost() * bundleCount; - float originalCost = originalBagel.getCost() * (count - (bundleCount * neededToBundleCount)); + float bundleCost = bundleStoreItem.getCost() * bundleCount; + float originalCost = originalStoreItem.getCost() * (count - (bundleCount * neededToBundleCount)); return bundleCost + originalCost; @@ -40,12 +38,12 @@ public List> getReceipt() { Map> receipt = new HashMap<>(); for (var set: super.getOrders().entrySet()) { - Bagel bagel = set.getValue().getKey(); + StoreItem storeItem = set.getValue().getKey(); int amount = set.getValue().getValue(); - Filling filling = bagel.getFilling(); - receipt.merge(bagel.getSKU(), Map.entry(bagel, amount), + Filling filling = storeItem.getFilling(); + receipt.merge(storeItem.getSKU(), Map.entry(storeItem, amount), (a,b) -> - Map.entry(bagel,a.getValue() + b.getValue() ) + Map.entry(storeItem,a.getValue() + b.getValue() ) ); if (filling != null) { receipt.merge(filling.getSKU(), Map.entry(filling, amount), @@ -75,12 +73,47 @@ private Map> bundleReceipts(Map> coffeeBundleCreator(Map> receipt) { + var localReceipt = new HashMap<>(receipt); + var bagel = receipt.getOrDefault("BGLP", null); + var coffee = receipt.getOrDefault("COFB", null); + + if (bagel != null && coffee != null) { + int overlap = Math.min(bagel.getValue(), coffee.getValue()); + + int newBagelCount = bagel.getValue() - overlap; + int newCoffeeCount = coffee.getValue() - overlap; + + if (newBagelCount > 0) { + localReceipt.put(bagel.getKey().getSKU(), Map.entry(bagel.getKey(), newBagelCount)); + } else { + localReceipt.remove(bagel.getKey().getSKU()); + } + + if (newCoffeeCount > 0) { + localReceipt.put(coffee.getKey().getSKU(), Map.entry(coffee.getKey(), newBagelCount)); + } else { + localReceipt.remove(coffee.getKey().getSKU()); + } + ReceiptItem bundleCoffee = new BundledCoffeeBagel(); + localReceipt.put(bundleCoffee.getSKU(), Map.entry(bundleCoffee, overlap)); + + + + } + + + + return localReceipt; + } + private static Map> turnIntoBundle(Map> receipt, int count, - ReceiptItem bagel, int needToHave, Bagel bundle) { + ReceiptItem bagel, int needToHave, StoreItem bundle) { int bundleCount = count / needToHave; receipt.put(bundle.getSKU(), Map.entry(bundle, bundleCount)); receipt.replace(bagel.getSKU(), @@ -88,4 +121,44 @@ private static Map> turnIntoBundle(Map