From a34b04041ce53117096d40244a87ea66ee584c62 Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Thu, 7 Aug 2025 15:48:02 +0200 Subject: [PATCH 01/27] Add tests for Basket class --- domain-model.md | 19 ++++++ src/main/java/com/booleanuk/core/Basket.java | 0 src/main/java/com/booleanuk/core/Item.java | 0 src/main/java/com/booleanuk/core/Store.java | 0 .../java/com/booleanuk/core/BasketTest.java | 66 +++++++++++++++++++ .../java/com/booleanuk/core/ItemTest.java | 0 .../java/com/booleanuk/core/StoreTest.java | 0 7 files changed, 85 insertions(+) create mode 100644 domain-model.md create mode 100644 src/main/java/com/booleanuk/core/Basket.java create mode 100644 src/main/java/com/booleanuk/core/Item.java create mode 100644 src/main/java/com/booleanuk/core/Store.java create mode 100644 src/test/java/com/booleanuk/core/BasketTest.java create mode 100644 src/test/java/com/booleanuk/core/ItemTest.java create mode 100644 src/test/java/com/booleanuk/core/StoreTest.java diff --git a/domain-model.md b/domain-model.md new file mode 100644 index 000000000..576428df0 --- /dev/null +++ b/domain-model.md @@ -0,0 +1,19 @@ +| Class | Member | Method | Scenario | Output | +|--------|--------------------|----------------------|------------------------------|------------| +| Basket | List items | add(String sku) | Correct code basket not full | 1 | +| | int capacity | | Correct code basket full | 0 | +| | static stdCapacity | | Incorrect code | -1 | +| | static Stock stock | remove(String sku) | Exists | True | +| | | | Doesn't exist | False | +| | | getTotalCost() | | int | +| Stock | List stock | | | void | +| | | getPrice(String sku) | Exists | int | +| | | | Doesn't exist | -1 | +| | | getFillings() | | List | +| | | | | | +| Item | String sku | | | | +| | float price | | | | +| | String name | | | | +| | String variant | | | | +| | | | | | +| | | | | | 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..e69de29bb 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..e69de29bb diff --git a/src/main/java/com/booleanuk/core/Store.java b/src/main/java/com/booleanuk/core/Store.java new file mode 100644 index 000000000..e69de29bb 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..5fbe163ba --- /dev/null +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -0,0 +1,66 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class BasketTest { + @Test + public void testAddCorrectItemBasketNotFull(){ + Basket basket = new Basket(3); + Assertions.assertTrue(basket.getItems().isEmpty()); + Assertions.assertEquals(1, basket.add("BGLO")); + Assertions.assertFalse(basket.getItems().isEmpty()); + } + + @Test + public void testAddIncorrectItemBasketNotFull() { + Basket basket = new Basket(3); + Assertions.assertTrue(basket.getItems().isEmpty()); + Assertions.assertEquals(-1, basket.add("test")); + Assertions.assertTrue(basket.getItems().isEmpty()); + } + + @Test + public void testAddCorrectItemBasketFull(){ + Basket basket = new Basket(3); + basket.add("BGLO"); + basket.add("BGLO"); + basket.add("BGLO"); + + Assertions.assertEquals(0, basket.add("BGLO")); + } + + @Test + public void testRemovePresentItem(){ + Basket basket = new Basket(3); + basket.add("BGLO"); + + Assertions.assertTrue(basket.remove("BGLO")); + Assertions.assertTrue(basket.getItems().isEmpty()); + } + + @Test + public void testRemoveNonPresentItem(){ + Basket basket = new Basket(3); + basket.add("BGLO"); + + Assertions.assertTrue(basket.remove("test")); + Assertions.assertEquals(1, basket.getItems().size().size()); + } + + @Test + public void testGetTotalCostItemsPresent(){ + Basket basket = new Basket(3); + basket.add("BGLO"); + Assertions.assertEquals(0.49, basket.getTotalCost()); + + basket.add("BGLO"); + Assertions.assertEquals(0.98, basket.getTotalCost()); + } + + @Test + public void testGetTotalCostEmpty(){ + Basket basket = new Basket(3); + Assertions.assertEquals(0, basket.getTotalCost()); + } +} \ No newline at end of file diff --git a/src/test/java/com/booleanuk/core/ItemTest.java b/src/test/java/com/booleanuk/core/ItemTest.java new file mode 100644 index 000000000..e69de29bb diff --git a/src/test/java/com/booleanuk/core/StoreTest.java b/src/test/java/com/booleanuk/core/StoreTest.java new file mode 100644 index 000000000..e69de29bb From 2920d00c706ee99d5d5102a8ec46fb90a78c1250 Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Thu, 7 Aug 2025 16:15:20 +0200 Subject: [PATCH 02/27] Add test for stock class --- src/main/java/com/booleanuk/core/Stock.java | 1 + src/main/java/com/booleanuk/core/Store.java | 0 .../java/com/booleanuk/core/StockTest.java | 33 +++++++++++++++++++ .../java/com/booleanuk/core/StoreTest.java | 0 4 files changed, 34 insertions(+) create mode 100644 src/main/java/com/booleanuk/core/Stock.java delete mode 100644 src/main/java/com/booleanuk/core/Store.java create mode 100644 src/test/java/com/booleanuk/core/StockTest.java delete mode 100644 src/test/java/com/booleanuk/core/StoreTest.java diff --git a/src/main/java/com/booleanuk/core/Stock.java b/src/main/java/com/booleanuk/core/Stock.java new file mode 100644 index 000000000..4da09284f --- /dev/null +++ b/src/main/java/com/booleanuk/core/Stock.java @@ -0,0 +1 @@ +package com.booleanuk.core; \ No newline at end of file diff --git a/src/main/java/com/booleanuk/core/Store.java b/src/main/java/com/booleanuk/core/Store.java deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/test/java/com/booleanuk/core/StockTest.java b/src/test/java/com/booleanuk/core/StockTest.java new file mode 100644 index 000000000..99ae10096 --- /dev/null +++ b/src/test/java/com/booleanuk/core/StockTest.java @@ -0,0 +1,33 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class StockTest { + + @Test + public void testGetPriceValidCode(){ + Stock stock = new Stock(); + + Assertions.assertEquals(0.49f, stock.getPrice("BGLO")); + Assertions.assertEquals(1.29f, stock.getPrice("COFL")); + } + + public void testGetPriceInvalidCode(){ + Stock stock = new Stock(); + + Assertions.assertEquals(-1, stock.getPrice("erqwer")); + Assertions.assertEquals(-1, stock.getPrice("\n")); + } + + public void testGetFillings(){ + Stock stock = new Stock(); + + List fillings = stock.getFillings(); + Assertions.assertEquals(6, fillings.size()); + + for(Item filling : fillings){ + Assertions.assertEquals("Filling", filling.getVariant()); + } + } +} \ No newline at end of file diff --git a/src/test/java/com/booleanuk/core/StoreTest.java b/src/test/java/com/booleanuk/core/StoreTest.java deleted file mode 100644 index e69de29bb..000000000 From e7465d55b3b2915696b3bc2bae9b2d8f56ad4cd6 Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Thu, 7 Aug 2025 16:23:48 +0200 Subject: [PATCH 03/27] Add missing @ --- src/test/java/com/booleanuk/core/StockTest.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/booleanuk/core/StockTest.java b/src/test/java/com/booleanuk/core/StockTest.java index 99ae10096..4e5e9608d 100644 --- a/src/test/java/com/booleanuk/core/StockTest.java +++ b/src/test/java/com/booleanuk/core/StockTest.java @@ -3,6 +3,8 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.List; + public class StockTest { @Test @@ -13,6 +15,7 @@ public void testGetPriceValidCode(){ Assertions.assertEquals(1.29f, stock.getPrice("COFL")); } + @Test public void testGetPriceInvalidCode(){ Stock stock = new Stock(); @@ -20,6 +23,7 @@ public void testGetPriceInvalidCode(){ Assertions.assertEquals(-1, stock.getPrice("\n")); } + @Test public void testGetFillings(){ Stock stock = new Stock(); @@ -27,7 +31,7 @@ public void testGetFillings(){ Assertions.assertEquals(6, fillings.size()); for(Item filling : fillings){ - Assertions.assertEquals("Filling", filling.getVariant()); + Assertions.assertEquals("Filling", filling.getName()); } } } \ No newline at end of file From c957018fc7fcfca569c0d12e003c72d192474a10 Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Thu, 7 Aug 2025 16:24:19 +0200 Subject: [PATCH 04/27] Implement Stock class. --- src/main/java/com/booleanuk/core/Stock.java | 48 ++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/booleanuk/core/Stock.java b/src/main/java/com/booleanuk/core/Stock.java index 4da09284f..7cf906b83 100644 --- a/src/main/java/com/booleanuk/core/Stock.java +++ b/src/main/java/com/booleanuk/core/Stock.java @@ -1 +1,47 @@ -package com.booleanuk.core; \ No newline at end of file +package com.booleanuk.core; + +import java.util.ArrayList; +import java.util.List; + +public class Stock { + private List stock; + + public Stock(){ + stock = new ArrayList<>(); + + stock.addAll(List.of(new Item("BGLO", 0.49f, "Bagel", "Onion"), + new Item("BGLP", 0.39f, "Bagel", "Plain"), + new Item("BGLE", 0.49f, "Bagel", "Everything"), + new Item("BGLS", 0.49f, "Bagel", "Sesame"), + new Item("COFB", 0.99f, "Coffee", "Black"), + new Item("COFW", 1.19f, "Coffee", "White"), + new Item("COFC", 1.29f, "Coffee", "Capuccino"), + new Item("COFL", 1.29f, "Coffee", "Latte"), + new Item("FILB", 0.12f, "Filling", "Bacon"), + new Item("FILE", 0.12f, "Filling", "Egg"), + new Item("FILC", 0.12f, "Filling", "Cheese"), + new Item("FILX", 0.12f, "Filling", "Cream Cheese"), + new Item("FILS", 0.12f, "Filling", "Smoked Salmon"), + new Item("FILH", 0.12f, "Filling", "Ham"))); + } + + public float getPrice(String sku){ + for(Item item : this.stock){ + if(item.getSku().equals(sku)){ + return item.getPrice(); + } + } + return -1f; + } + + public List getFillings(){ + List retList = new ArrayList<>(); + + for(Item item : this.stock){ + if(item.getName().equals("Filling")){ + retList.add(item); + } + } + return retList; + } +} \ No newline at end of file From dabc17d35ca2bd6656d73d77585f0f9f44f9eb93 Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Thu, 7 Aug 2025 16:24:44 +0200 Subject: [PATCH 05/27] Add attributes as well as getters --- src/main/java/com/booleanuk/core/Item.java | 31 ++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/main/java/com/booleanuk/core/Item.java b/src/main/java/com/booleanuk/core/Item.java index e69de29bb..e680d1ed2 100644 --- a/src/main/java/com/booleanuk/core/Item.java +++ b/src/main/java/com/booleanuk/core/Item.java @@ -0,0 +1,31 @@ +package com.booleanuk.core; + +public class Item { + private String sku; + private float price; + private String name; + private String variant; + + public Item(String sku, float price, String name, String variant){ + this.sku = sku; + this.price = price; + this.name = name; + this.variant = variant; + } + + public String getSku(){ + return this.sku; + } + + public float getPrice(){ + return this.price; + } + + public String getName(){ + return this.name; + } + + public String getVariant(){ + return this.variant; + } +} \ No newline at end of file From 31de13422ea04ddc17a944d3e875190d408edf1b Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Thu, 7 Aug 2025 16:33:59 +0200 Subject: [PATCH 06/27] Add getter for specific items to stock --- domain-model.md | 3 ++- src/test/java/com/booleanuk/core/StockTest.java | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/domain-model.md b/domain-model.md index 576428df0..f64633869 100644 --- a/domain-model.md +++ b/domain-model.md @@ -10,7 +10,8 @@ | | | getPrice(String sku) | Exists | int | | | | | Doesn't exist | -1 | | | | getFillings() | | List | -| | | | | | +| | | getItem(String sku) | Exists | Item | +| | | | Does not exist | null | | Item | String sku | | | | | | float price | | | | | | String name | | | | diff --git a/src/test/java/com/booleanuk/core/StockTest.java b/src/test/java/com/booleanuk/core/StockTest.java index 4e5e9608d..81205b697 100644 --- a/src/test/java/com/booleanuk/core/StockTest.java +++ b/src/test/java/com/booleanuk/core/StockTest.java @@ -34,4 +34,11 @@ public void testGetFillings(){ Assertions.assertEquals("Filling", filling.getName()); } } + + @Test + public void testGetItem(){ + Stock stock = new Stock(); + + Assertions.assertEquals("BGLO", stock.getItem("BGLO").getSku()); + } } \ No newline at end of file From c093917d8be4d79f2136d86d1c71b9afaedfdb26 Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Thu, 7 Aug 2025 16:36:29 +0200 Subject: [PATCH 07/27] Add null test for invalid code when searching for item in stock --- src/test/java/com/booleanuk/core/StockTest.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/booleanuk/core/StockTest.java b/src/test/java/com/booleanuk/core/StockTest.java index 81205b697..e7882cd7a 100644 --- a/src/test/java/com/booleanuk/core/StockTest.java +++ b/src/test/java/com/booleanuk/core/StockTest.java @@ -36,9 +36,16 @@ public void testGetFillings(){ } @Test - public void testGetItem(){ + public void testGetItemExists(){ Stock stock = new Stock(); Assertions.assertEquals("BGLO", stock.getItem("BGLO").getSku()); } + + @Test + public void testGetItemCodeDoesNotExist(){ + Stock stock = new Stock(); + + Assertions.assertNull(stock.getItem("test").getSku()); + } } \ No newline at end of file From c8d4989fb7dca6dd74d3fa2b726b04b4aa30284c Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Thu, 7 Aug 2025 16:38:23 +0200 Subject: [PATCH 08/27] Fix method call on null object --- src/test/java/com/booleanuk/core/StockTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/booleanuk/core/StockTest.java b/src/test/java/com/booleanuk/core/StockTest.java index e7882cd7a..eca3676ea 100644 --- a/src/test/java/com/booleanuk/core/StockTest.java +++ b/src/test/java/com/booleanuk/core/StockTest.java @@ -46,6 +46,6 @@ public void testGetItemExists(){ public void testGetItemCodeDoesNotExist(){ Stock stock = new Stock(); - Assertions.assertNull(stock.getItem("test").getSku()); + Assertions.assertNull(stock.getItem("test")); } } \ No newline at end of file From 65597d744601247f0b6db11d9c9fd43e15869f12 Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Fri, 8 Aug 2025 09:57:23 +0200 Subject: [PATCH 09/27] Update tests, add new tests for child classes to item --- class_diagram.png | Bin 0 -> 45498 bytes .../java/com/booleanuk/core/BagelTest.java | 20 ++++++++++++++++++ .../java/com/booleanuk/core/BasketTest.java | 8 +++---- .../java/com/booleanuk/core/ItemTest.java | 8 +++++++ 4 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 class_diagram.png create mode 100644 src/test/java/com/booleanuk/core/BagelTest.java diff --git a/class_diagram.png b/class_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..f355afebe761c958142fc461dc10c53a090e793b GIT binary patch literal 45498 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 hNr literal 0 HcmV?d00001 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..4de5f13e9 --- /dev/null +++ b/src/test/java/com/booleanuk/core/BagelTest.java @@ -0,0 +1,20 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class BagelTest { + + @Test + public void testAddAndRemoveFilling(){ + Bagel bagel = new Bagel("BGLO", 0.49f, "Onion"); + Item filling = new Filling("FILB", 0.12f, "Bacon"); + + Assertions.assertTrue(bagel.getFillings().isEmpty()); + + bagel.addFilling(filling); + + Assertions.assertEquals(1, bagel.getFillings().size()); + } + +} diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 5fbe163ba..d2b61cf02 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -44,18 +44,18 @@ public void testRemoveNonPresentItem(){ Basket basket = new Basket(3); basket.add("BGLO"); - Assertions.assertTrue(basket.remove("test")); - Assertions.assertEquals(1, basket.getItems().size().size()); + Assertions.assertFalse(basket.remove("test")); + Assertions.assertEquals(1, basket.getItems().size()); } @Test public void testGetTotalCostItemsPresent(){ Basket basket = new Basket(3); basket.add("BGLO"); - Assertions.assertEquals(0.49, basket.getTotalCost()); + Assertions.assertEquals(0.49, basket.getTotalCost(), 0.0001f); basket.add("BGLO"); - Assertions.assertEquals(0.98, basket.getTotalCost()); + Assertions.assertEquals(0.98, basket.getTotalCost(), 0.0001f); } @Test diff --git a/src/test/java/com/booleanuk/core/ItemTest.java b/src/test/java/com/booleanuk/core/ItemTest.java index e69de29bb..4f880496e 100644 --- a/src/test/java/com/booleanuk/core/ItemTest.java +++ b/src/test/java/com/booleanuk/core/ItemTest.java @@ -0,0 +1,8 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ItemTest { + +} \ No newline at end of file From da13c02074f7b9219dd4f5d51b9bda5498dd99f3 Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Fri, 8 Aug 2025 10:02:22 +0200 Subject: [PATCH 10/27] Complete bagel test and add implementation --- src/main/java/com/booleanuk/core/Bagel.java | 4 ++++ src/test/java/com/booleanuk/core/BagelTest.java | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 src/main/java/com/booleanuk/core/Bagel.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..e74f6c330 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class Bagel { +} diff --git a/src/test/java/com/booleanuk/core/BagelTest.java b/src/test/java/com/booleanuk/core/BagelTest.java index 4de5f13e9..7285e51cc 100644 --- a/src/test/java/com/booleanuk/core/BagelTest.java +++ b/src/test/java/com/booleanuk/core/BagelTest.java @@ -15,6 +15,10 @@ public void testAddAndRemoveFilling(){ bagel.addFilling(filling); Assertions.assertEquals(1, bagel.getFillings().size()); + + bagel.removeFilling("Bacon"); + + Assertions.assertTrue(bagel.getFillings().isEmpty()); } } From 376b7e27ee502479957549d368e0d363784cdcaf Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Fri, 8 Aug 2025 10:52:40 +0200 Subject: [PATCH 11/27] Finishes --- Class_diagram.png | Bin 0 -> 163831 bytes class_diagram.png | Bin 45498 -> 0 bytes src/main/java/com/booleanuk/core/Coffee.java | 4 ++++ src/main/java/com/booleanuk/core/Filling.java | 4 ++++ 4 files changed, 8 insertions(+) create mode 100644 Class_diagram.png delete mode 100644 class_diagram.png create mode 100644 src/main/java/com/booleanuk/core/Coffee.java create mode 100644 src/main/java/com/booleanuk/core/Filling.java diff --git a/Class_diagram.png b/Class_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..fc35333296d1012aa6bfdbf84791ee0c50bd2e17 GIT binary patch literal 163831 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 hNr 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..08b04e421 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Coffee.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class Coffee { +} 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..b25b3ff10 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Filling.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class Filling { +} From ef7bd0e10d0fa87da368d0a1700895a5ed27943f Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Fri, 8 Aug 2025 10:53:04 +0200 Subject: [PATCH 12/27] Last commit --- domain-model.md | 45 +++++++------- src/main/java/com/booleanuk/core/Bagel.java | 29 ++++++++- src/main/java/com/booleanuk/core/Basket.java | 59 +++++++++++++++++++ src/main/java/com/booleanuk/core/Coffee.java | 5 +- src/main/java/com/booleanuk/core/Filling.java | 8 ++- src/main/java/com/booleanuk/core/Item.java | 2 +- src/main/java/com/booleanuk/core/Stock.java | 37 +++++++----- .../java/com/booleanuk/core/BagelTest.java | 2 +- 8 files changed, 148 insertions(+), 39 deletions(-) diff --git a/domain-model.md b/domain-model.md index f64633869..216d7b7aa 100644 --- a/domain-model.md +++ b/domain-model.md @@ -1,20 +1,25 @@ -| Class | Member | Method | Scenario | Output | -|--------|--------------------|----------------------|------------------------------|------------| -| Basket | List items | add(String sku) | Correct code basket not full | 1 | -| | int capacity | | Correct code basket full | 0 | -| | static stdCapacity | | Incorrect code | -1 | -| | static Stock stock | remove(String sku) | Exists | True | -| | | | Doesn't exist | False | -| | | getTotalCost() | | int | -| Stock | List stock | | | void | -| | | getPrice(String sku) | Exists | int | -| | | | Doesn't exist | -1 | -| | | getFillings() | | List | -| | | getItem(String sku) | Exists | Item | -| | | | Does not exist | null | -| Item | String sku | | | | -| | float price | | | | -| | String name | | | | -| | String variant | | | | -| | | | | | -| | | | | | +| Class | Member | Method | Scenario | Output | +|---------------|--------------------|-------------------------------|------------------------------|------------| +| Basket | List items | add(String sku) | Correct code basket not full | 1 | +| | int capacity | | Correct code basket full | 0 | +| | static stdCapacity | | Incorrect code | -1 | +| | static Stock stock | remove(String sku) | Exists | True | +| | | | Doesn't exist | False | +| | | getTotalCost() | | float | +| Stock | List stock | | | | +| | | getPrice(String sku) | Exists | int | +| | | | Doesn't exist | -1 | +| | | getFillings() | | List | +| | | getItem(String sku) | Exists | Item | +| | | | Does not exist | null | +| Abstract Item | String sku | getSku() | | sku | +| | float price | getPrice() | | price | +| | String name | getName() | | name | +| | String variant | getVariant() | | variant | +| | | | | | +| Bagel | List | addFilling(Filling filling) | | void | +| | | removeFilling(String variant) | Filling exists in list | true | +| Coffee | | | Filling does not exist | false | +| Filling | | | | | + + diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java index e74f6c330..7ea9b6fa6 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -1,4 +1,31 @@ package com.booleanuk.core; -public class Bagel { +import java.util.ArrayList; +import java.util.List; + +public class Bagel extends Item{ + List fillings; + + public Bagel(String sku, float price, String variant){ + super(sku, price, "Bagel", variant); + this.fillings = new ArrayList<>(); + } + + public void addFilling(Filling filling){ + this.fillings.add(filling); + } + + public boolean removeFilling(String variant){ + for(int i = 0; i < this.fillings.size(); i++){ + if(this.fillings.get(i).getVariant().equals(variant)){ + this.fillings.remove(i); + return true; + } + } + return false; + } + + public List getFillings(){ + return this.fillings; + } } diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index e69de29bb..efcc1ec83 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -0,0 +1,59 @@ +package com.booleanuk.core; + +import java.util.ArrayList; +import java.util.List; + +public class Basket { + private List items; + private int capacity; + static private int stdCapacity = 3; + static private Stock stock = new Stock(); + + public Basket(){ + this.capacity = stdCapacity; + items = new ArrayList<>(); + } + + public Basket(int capacity){ + this.capacity = capacity; + items = new ArrayList<>(); + } + + public List getItems(){ + return this.items; + } + + public int add(String sku) { + if(items.size() >= capacity){ + return 0; + } + + Item addItem = stock.getItem(sku); + + if(addItem == null){ + return -1; + } + + items.add(addItem); + return 1; + } + + public boolean remove(String sku){ + for(int i = 0; i < this.items.size(); i++){ + if(this.items.get(i).getSku().equals(sku)){ + this.items.remove(i); + return true; + } + } + return false; + } + + public float getTotalCost(){ + float acc = 0.0f; + for(Item curr : this.items){ + acc = acc + curr.getPrice(); + System.out.println(curr.getPrice()); + } + return acc; + } +} \ No newline at end of file diff --git a/src/main/java/com/booleanuk/core/Coffee.java b/src/main/java/com/booleanuk/core/Coffee.java index 08b04e421..0f87bbabd 100644 --- a/src/main/java/com/booleanuk/core/Coffee.java +++ b/src/main/java/com/booleanuk/core/Coffee.java @@ -1,4 +1,7 @@ package com.booleanuk.core; -public class Coffee { +public class Coffee extends Item{ + public Coffee(String sku, float price, String variant){ + super(sku, price, "Coffee", variant); + } } diff --git a/src/main/java/com/booleanuk/core/Filling.java b/src/main/java/com/booleanuk/core/Filling.java index b25b3ff10..bbeffab61 100644 --- a/src/main/java/com/booleanuk/core/Filling.java +++ b/src/main/java/com/booleanuk/core/Filling.java @@ -1,4 +1,10 @@ package com.booleanuk.core; -public class Filling { +import java.util.ArrayList; + +public class Filling extends Item{ + public Filling(String sku, float price, String variant){ + super(sku, price, "Filling", variant); + } + } diff --git a/src/main/java/com/booleanuk/core/Item.java b/src/main/java/com/booleanuk/core/Item.java index e680d1ed2..a85bd9223 100644 --- a/src/main/java/com/booleanuk/core/Item.java +++ b/src/main/java/com/booleanuk/core/Item.java @@ -1,6 +1,6 @@ package com.booleanuk.core; -public class Item { +public abstract class Item { private String sku; private float price; private String name; diff --git a/src/main/java/com/booleanuk/core/Stock.java b/src/main/java/com/booleanuk/core/Stock.java index 7cf906b83..530728f14 100644 --- a/src/main/java/com/booleanuk/core/Stock.java +++ b/src/main/java/com/booleanuk/core/Stock.java @@ -9,20 +9,20 @@ public class Stock { public Stock(){ stock = new ArrayList<>(); - stock.addAll(List.of(new Item("BGLO", 0.49f, "Bagel", "Onion"), - new Item("BGLP", 0.39f, "Bagel", "Plain"), - new Item("BGLE", 0.49f, "Bagel", "Everything"), - new Item("BGLS", 0.49f, "Bagel", "Sesame"), - new Item("COFB", 0.99f, "Coffee", "Black"), - new Item("COFW", 1.19f, "Coffee", "White"), - new Item("COFC", 1.29f, "Coffee", "Capuccino"), - new Item("COFL", 1.29f, "Coffee", "Latte"), - new Item("FILB", 0.12f, "Filling", "Bacon"), - new Item("FILE", 0.12f, "Filling", "Egg"), - new Item("FILC", 0.12f, "Filling", "Cheese"), - new Item("FILX", 0.12f, "Filling", "Cream Cheese"), - new Item("FILS", 0.12f, "Filling", "Smoked Salmon"), - new Item("FILH", 0.12f, "Filling", "Ham"))); + stock.addAll(List.of(new Bagel("BGLO", 0.49f, "Onion"), + new Bagel("BGLP", 0.39f, "Plain"), + new Bagel("BGLE", 0.49f, "Everything"), + new Bagel("BGLS", 0.49f, "Sesame"), + new Coffee("COFB", 0.99f, "Black"), + new Coffee("COFW", 1.19f, "White"), + new Coffee("COFC", 1.29f, "Cappuccino"), + new Coffee("COFL", 1.29f, "Latte"), + new Filling("FILB", 0.12f, "Bacon"), + new Filling("FILE", 0.12f, "Egg"), + new Filling("FILC", 0.12f, "Cheese"), + new Filling("FILX", 0.12f, "Cream Cheese"), + new Filling("FILS", 0.12f, "Smoked Salmon"), + new Filling("FILH", 0.12f, "Ham"))); } public float getPrice(String sku){ @@ -44,4 +44,13 @@ public List getFillings(){ } return retList; } + + public Item getItem(String sku){ + for(Item item : this.stock){ + if(item.getSku().equals(sku)){ + return item; + } + } + return null; + } } \ No newline at end of file diff --git a/src/test/java/com/booleanuk/core/BagelTest.java b/src/test/java/com/booleanuk/core/BagelTest.java index 7285e51cc..444a3dca2 100644 --- a/src/test/java/com/booleanuk/core/BagelTest.java +++ b/src/test/java/com/booleanuk/core/BagelTest.java @@ -8,7 +8,7 @@ public class BagelTest { @Test public void testAddAndRemoveFilling(){ Bagel bagel = new Bagel("BGLO", 0.49f, "Onion"); - Item filling = new Filling("FILB", 0.12f, "Bacon"); + Filling filling = new Filling("FILB", 0.12f, "Bacon"); Assertions.assertTrue(bagel.getFillings().isEmpty()); From e98d03b7b8145f0845b7d495ed4e018fc10a6c3e Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Fri, 8 Aug 2025 16:40:01 +0200 Subject: [PATCH 13/27] Add files into extension, and test case for basket for extension --- .../com/booleanuk/extension/BagelTest.java | 24 ++++++ .../com/booleanuk/extension/BasketTest.java | 85 +++++++++++++++++++ .../com/booleanuk/extension/ItemTest.java | 8 ++ .../com/booleanuk/extension/StockTest.java | 51 +++++++++++ 4 files changed, 168 insertions(+) create mode 100644 src/test/java/com/booleanuk/extension/BagelTest.java create mode 100644 src/test/java/com/booleanuk/extension/BasketTest.java create mode 100644 src/test/java/com/booleanuk/extension/ItemTest.java create mode 100644 src/test/java/com/booleanuk/extension/StockTest.java diff --git a/src/test/java/com/booleanuk/extension/BagelTest.java b/src/test/java/com/booleanuk/extension/BagelTest.java new file mode 100644 index 000000000..0c1d06c6b --- /dev/null +++ b/src/test/java/com/booleanuk/extension/BagelTest.java @@ -0,0 +1,24 @@ +package com.booleanuk.extension; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class BagelTest { + + @Test + public void testAddAndRemoveFilling(){ + Bagel bagel = new Bagel("BGLO", 0.49f, "Onion"); + Filling filling = new Filling("FILB", 0.12f, "Bacon"); + + Assertions.assertTrue(bagel.getFillings().isEmpty()); + + bagel.addFilling(filling); + + Assertions.assertEquals(1, bagel.getFillings().size()); + + bagel.removeFilling("Bacon"); + + Assertions.assertTrue(bagel.getFillings().isEmpty()); + } + +} diff --git a/src/test/java/com/booleanuk/extension/BasketTest.java b/src/test/java/com/booleanuk/extension/BasketTest.java new file mode 100644 index 000000000..b8fc9c760 --- /dev/null +++ b/src/test/java/com/booleanuk/extension/BasketTest.java @@ -0,0 +1,85 @@ +package com.booleanuk.extension; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class BasketTest { + @Test + public void testAddCorrectItemBasketNotFull(){ + Basket basket = new Basket(3); + Assertions.assertTrue(basket.getItems().isEmpty()); + Assertions.assertEquals(1, basket.add("BGLO")); + Assertions.assertFalse(basket.getItems().isEmpty()); + } + + @Test + public void testAddIncorrectItemBasketNotFull() { + Basket basket = new Basket(3); + Assertions.assertTrue(basket.getItems().isEmpty()); + Assertions.assertEquals(-1, basket.add("test")); + Assertions.assertTrue(basket.getItems().isEmpty()); + } + + @Test + public void testAddCorrectItemBasketFull(){ + Basket basket = new Basket(3); + basket.add("BGLO"); + basket.add("BGLO"); + basket.add("BGLO"); + + Assertions.assertEquals(0, basket.add("BGLO")); + } + + @Test + public void testRemovePresentItem(){ + Basket basket = new Basket(3); + basket.add("BGLO"); + + Assertions.assertTrue(basket.remove("BGLO")); + Assertions.assertTrue(basket.getItems().isEmpty()); + } + + @Test + public void testRemoveNonPresentItem(){ + Basket basket = new Basket(3); + basket.add("BGLO"); + + Assertions.assertFalse(basket.remove("test")); + Assertions.assertEquals(1, basket.getItems().size()); + } + + @Test + public void testGetTotalCostItemsPresent(){ + Basket basket = new Basket(3); + basket.add("BGLO"); + Assertions.assertEquals(0.49, basket.getTotalCost(), 0.0001f); + + basket.add("BGLO"); + Assertions.assertEquals(0.98, basket.getTotalCost(), 0.0001f); + } + + @Test + public void testGetTotalCostEmpty(){ + Basket basket = new Basket(3); + Assertions.assertEquals(0, basket.getTotalCost()); + } + + public boolean addMult(Basket basket, String sku, int times){ + if(times == 0){ + return true; + } + + return basket.add(sku) == 1 && addMult(basket, sku, times-1); + } + + @Test + public void testPriceWithDiscountNonEmpty(){ + Basket basket = new Basket(50); + Assertions.assertTrue(addMult(basket, "BGLO", 2)); + Assertions.assertTrue(addMult(basket, "BGLP", 12)); + Assertions.assertTrue(addMult(basket, "BGLE", 6)); + Assertions.assertTrue(addMult(basket, "COFB", 2)); + + Assertions.assertEquals(10.43, basket.priceWithDiscount()); + } +} \ No newline at end of file diff --git a/src/test/java/com/booleanuk/extension/ItemTest.java b/src/test/java/com/booleanuk/extension/ItemTest.java new file mode 100644 index 000000000..37ac49b51 --- /dev/null +++ b/src/test/java/com/booleanuk/extension/ItemTest.java @@ -0,0 +1,8 @@ +package com.booleanuk.extension; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ItemTest { + +} \ No newline at end of file diff --git a/src/test/java/com/booleanuk/extension/StockTest.java b/src/test/java/com/booleanuk/extension/StockTest.java new file mode 100644 index 000000000..3d7e5a9f2 --- /dev/null +++ b/src/test/java/com/booleanuk/extension/StockTest.java @@ -0,0 +1,51 @@ +package com.booleanuk.extension; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.List; + +public class StockTest { + + @Test + public void testGetPriceValidCode(){ + Stock stock = new Stock(); + + Assertions.assertEquals(0.49f, stock.getPrice("BGLO")); + Assertions.assertEquals(1.29f, stock.getPrice("COFL")); + } + + @Test + public void testGetPriceInvalidCode(){ + Stock stock = new Stock(); + + Assertions.assertEquals(-1, stock.getPrice("erqwer")); + Assertions.assertEquals(-1, stock.getPrice("\n")); + } + + @Test + public void testGetFillings(){ + Stock stock = new Stock(); + + List fillings = stock.getFillings(); + Assertions.assertEquals(6, fillings.size()); + + for(Item filling : fillings){ + Assertions.assertEquals("Filling", filling.getName()); + } + } + + @Test + public void testGetItemExists(){ + Stock stock = new Stock(); + + Assertions.assertEquals("BGLO", stock.getItem("BGLO").getSku()); + } + + @Test + public void testGetItemCodeDoesNotExist(){ + Stock stock = new Stock(); + + Assertions.assertNull(stock.getItem("test")); + } +} \ No newline at end of file From 9110fd5c5af4aabb6de15b229261fa04c3bce9cf Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Mon, 11 Aug 2025 09:32:15 +0200 Subject: [PATCH 14/27] Add domain model --- domain-model.md | 78 +++++++++++++------ src/main/java/com/booleanuk/core/Bagel.java | 9 +++ src/main/java/com/booleanuk/core/Basket.java | 1 - .../java/com/booleanuk/extension/Bagel.java | 40 ++++++++++ .../java/com/booleanuk/extension/Basket.java | 74 ++++++++++++++++++ .../java/com/booleanuk/extension/Coffee.java | 7 ++ .../java/com/booleanuk/extension/Filling.java | 10 +++ .../java/com/booleanuk/extension/Item.java | 31 ++++++++ .../java/com/booleanuk/extension/Stock.java | 56 +++++++++++++ 9 files changed, 282 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/booleanuk/extension/Bagel.java create mode 100644 src/main/java/com/booleanuk/extension/Basket.java create mode 100644 src/main/java/com/booleanuk/extension/Coffee.java create mode 100644 src/main/java/com/booleanuk/extension/Filling.java create mode 100644 src/main/java/com/booleanuk/extension/Item.java create mode 100644 src/main/java/com/booleanuk/extension/Stock.java diff --git a/domain-model.md b/domain-model.md index 216d7b7aa..56e20b48b 100644 --- a/domain-model.md +++ b/domain-model.md @@ -1,25 +1,57 @@ -| Class | Member | Method | Scenario | Output | -|---------------|--------------------|-------------------------------|------------------------------|------------| -| Basket | List items | add(String sku) | Correct code basket not full | 1 | -| | int capacity | | Correct code basket full | 0 | -| | static stdCapacity | | Incorrect code | -1 | -| | static Stock stock | remove(String sku) | Exists | True | -| | | | Doesn't exist | False | -| | | getTotalCost() | | float | -| Stock | List stock | | | | -| | | getPrice(String sku) | Exists | int | -| | | | Doesn't exist | -1 | -| | | getFillings() | | List | -| | | getItem(String sku) | Exists | Item | -| | | | Does not exist | null | -| Abstract Item | String sku | getSku() | | sku | -| | float price | getPrice() | | price | -| | String name | getName() | | name | -| | String variant | getVariant() | | variant | -| | | | | | -| Bagel | List | addFilling(Filling filling) | | void | -| | | removeFilling(String variant) | Filling exists in list | true | -| Coffee | | | Filling does not exist | false | -| Filling | | | | | +| Module | Class | Member | Method | Scenario | Output | +|--------|------------------|--------------------|-------------------------------|------------------------------|------------| +| Core | Basket | List items | add(String sku) | Correct code basket not full | 1 | +| | | int capacity | | Correct code basket full | 0 | +| | | static stdCapacity | | Incorrect code | -1 | +| | | static Stock stock | remove(String sku) | Exists | True | +| | | | | Doesn't exist | False | +| | | | getTotalCost() | | float | +| | Stock | List stock | | | | +| | | | getPrice(String sku) | Exists | price | +| | | | | Doesn't exist | -1 | +| | | | getFillings() | | List | +| | | | getItem(String sku) | Exists | Item | +| | | | | Does not exist | null | +| | Abstract Item | String sku | getSku() | | sku | +| | | float price | getPrice() | | price | +| | | String name | getName() | | name | +| | | String variant | getVariant() | | variant | +| | | | | | | +| | Bagel | List | addFilling(Filling filling) | | void | +| | | | removeFilling(String variant) | Filling exists in list | true | +| | Coffee | | | Filling does not exist | false | +| | Filling | | | | | +| | | | | | | +Extension 1: + As a user I want to take part of the special offers so that I can save money + +| Module | Class | Member | Method | Scenario | Output | +|--------|---------------|--------------------|-------------------------------|------------------------------|---------------| +| Core | Basket | List items | add(String sku) | Correct code basket not full | 1 | +| | | int capacity | | Correct code basket full | 0 | +| | | static stdCapacity | | Incorrect code | -1 | +| | | static Stock stock | remove(String sku) | Exists | True | +| | | | | Doesn't exist | False | +| | | | getTotalCost() | | float | +| | | | getDiscountetCost() | | | +| | Stock | List stock | | | | +| | | | getPrice(String sku) | Exists | price | +| | | | | Doesn't exist | -1 | +| | | | getFillings() | | List | +| | | | getItem(String sku) | Exists | Item | +| | | | | Does not exist | null | +| | Abstract Item | String sku | getSku() | | sku | +| | | float price | getPrice() | | price | +| | | String name | getName() | | name | +| | | String variant | getVariant() | | variant | +| | | | | | | +| | Bagel | List | addFilling(Filling filling) | | void | +| | | | removeFilling(String variant) | Filling exists in list | true | +| | | | | Filling does not exist | false | +| | | | getFillings() | | List | +| | Coffee | | | | | +| | Filling | | | | | +| | | | | | | + diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java index 7ea9b6fa6..59d3ff7c4 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -28,4 +28,13 @@ public boolean removeFilling(String variant){ public List getFillings(){ return this.fillings; } + + @Override + public float getPrice(){ + float acc = 0; + for(Filling filling : this.fillings){ + acc += filling.getPrice(); + } + return super.getPrice() + acc; + } } diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index efcc1ec83..ed9a29eeb 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -52,7 +52,6 @@ public float getTotalCost(){ float acc = 0.0f; for(Item curr : this.items){ acc = acc + curr.getPrice(); - System.out.println(curr.getPrice()); } return acc; } 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..3f0e6dfaa --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Bagel.java @@ -0,0 +1,40 @@ +package com.booleanuk.extension; + +import java.util.ArrayList; +import java.util.List; + +public class Bagel extends Item{ + List fillings; + + public Bagel(String sku, float price, String variant){ + super(sku, price, "Bagel", variant); + this.fillings = new ArrayList<>(); + } + + public void addFilling(Filling filling){ + this.fillings.add(filling); + } + + public boolean removeFilling(String variant){ + for(int i = 0; i < this.fillings.size(); i++){ + if(this.fillings.get(i).getVariant().equals(variant)){ + this.fillings.remove(i); + return true; + } + } + return false; + } + + public List getFillings(){ + return this.fillings; + } + + @Override + public float getPrice(){ + float acc = 0; + for(Filling filling : this.fillings){ + acc += filling.getPrice(); + } + return super.getPrice() + acc; + } +} 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..8dfaa57f1 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Basket.java @@ -0,0 +1,74 @@ +package com.booleanuk.extension; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Basket { + private List items; + private int capacity; + static private int stdCapacity = 3; + static private Stock stock = new Stock(); + + public Basket(){ + this.capacity = stdCapacity; + items = new ArrayList<>(); + } + + public Basket(int capacity){ + this.capacity = capacity; + items = new ArrayList<>(); + } + + public List getItems(){ + return this.items; + } + + public int add(String sku) { + if(items.size() >= capacity){ + return 0; + } + + Item addItem = stock.getItem(sku); + + if(addItem == null){ + return -1; + } + + items.add(addItem); + return 1; + } + + public boolean remove(String sku){ + for(int i = 0; i < this.items.size(); i++){ + if(this.items.get(i).getSku().equals(sku)){ + this.items.remove(i); + return true; + } + } + return false; + } + + public float getTotalCost(){ + float acc = 0.0f; + for(Item curr : this.items){ + acc = acc + curr.getPrice(); + } + return acc; + } + + public boolean checkForTwelve(Map itemCount){ + + } + + public float priceWithDiscount(){ + Map itemCount = new HashMap<>(); + for(Item item : this.items){ + String sku = item.getSku(); + + itemCount.putIfAbsent(sku, 0); + itemCount.put(sku, itemCount.get(sku)+1); + } + } +} \ No newline at end of file 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..25418e52f --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Coffee.java @@ -0,0 +1,7 @@ +package com.booleanuk.extension; + +public class Coffee extends Item{ + public Coffee(String sku, float price, String variant){ + super(sku, price, "Coffee", variant); + } +} 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..de6142195 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Filling.java @@ -0,0 +1,10 @@ +package com.booleanuk.extension; + +import java.util.ArrayList; + +public class Filling extends Item{ + public Filling(String sku, float price, String variant){ + super(sku, price, "Filling", variant); + } + +} 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..7be4d47b5 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Item.java @@ -0,0 +1,31 @@ +package com.booleanuk.extension; + +public abstract class Item { + private String sku; + private float price; + private String name; + private String variant; + + public Item(String sku, float price, String name, String variant){ + this.sku = sku; + this.price = price; + this.name = name; + this.variant = variant; + } + + public String getSku(){ + return this.sku; + } + + public float getPrice(){ + return this.price; + } + + public String getName(){ + return this.name; + } + + public String getVariant(){ + return this.variant; + } +} \ No newline at end of file diff --git a/src/main/java/com/booleanuk/extension/Stock.java b/src/main/java/com/booleanuk/extension/Stock.java new file mode 100644 index 000000000..abc2cd88c --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Stock.java @@ -0,0 +1,56 @@ +package com.booleanuk.extension; + +import java.util.ArrayList; +import java.util.List; + +public class Stock { + private List stock; + + public Stock(){ + stock = new ArrayList<>(); + + stock.addAll(List.of(new Bagel("BGLO", 0.49f, "Onion"), + new Bagel("BGLP", 0.39f, "Plain"), + new Bagel("BGLE", 0.49f, "Everything"), + new Bagel("BGLS", 0.49f, "Sesame"), + new Coffee("COFB", 0.99f, "Black"), + new Coffee("COFW", 1.19f, "White"), + new Coffee("COFC", 1.29f, "Cappuccino"), + new Coffee("COFL", 1.29f, "Latte"), + new Filling("FILB", 0.12f, "Bacon"), + new Filling("FILE", 0.12f, "Egg"), + new Filling("FILC", 0.12f, "Cheese"), + new Filling("FILX", 0.12f, "Cream Cheese"), + new Filling("FILS", 0.12f, "Smoked Salmon"), + new Filling("FILH", 0.12f, "Ham"))); + } + + public float getPrice(String sku){ + for(Item item : this.stock){ + if(item.getSku().equals(sku)){ + return item.getPrice(); + } + } + return -1f; + } + + public List getFillings(){ + List retList = new ArrayList<>(); + + for(Item item : this.stock){ + if(item.getName().equals("Filling")){ + retList.add(item); + } + } + return retList; + } + + public Item getItem(String sku){ + for(Item item : this.stock){ + if(item.getSku().equals(sku)){ + return item; + } + } + return null; + } +} \ No newline at end of file From b1be6a4864d4961982465a73ec87ccfd3362414b Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Mon, 11 Aug 2025 10:19:07 +0200 Subject: [PATCH 15/27] Implement discounted price and add extra test --- .../java/com/booleanuk/extension/Basket.java | 47 ++++++++++++++++--- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/booleanuk/extension/Basket.java b/src/main/java/com/booleanuk/extension/Basket.java index 8dfaa57f1..9a7c85da8 100644 --- a/src/main/java/com/booleanuk/extension/Basket.java +++ b/src/main/java/com/booleanuk/extension/Basket.java @@ -1,9 +1,6 @@ package com.booleanuk.extension; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class Basket { private List items; @@ -58,9 +55,6 @@ public float getTotalCost(){ return acc; } - public boolean checkForTwelve(Map itemCount){ - - } public float priceWithDiscount(){ Map itemCount = new HashMap<>(); @@ -69,6 +63,45 @@ public float priceWithDiscount(){ itemCount.putIfAbsent(sku, 0); itemCount.put(sku, itemCount.get(sku)+1); + + if(item instanceof Bagel){ + Bagel bagel = (Bagel) item; + for(Filling filling : bagel.getFillings()){ + sku = filling.getSku(); + itemCount.putIfAbsent(sku, 0); + itemCount.put(sku, itemCount.get(sku)+1); + } + } + } + + Set> itemCountVals = itemCount.entrySet(); + + float acc = 0; + System.out.println(itemCount); + for(Map.Entry entry : itemCountVals){ + String key = entry.getKey(); + Integer val = entry.getValue(); + + while (key.toLowerCase().contains("bgl") && val >= 12) { + acc += 3.99f; + val -= 12; + entry.setValue(val); + } + + while (key.toLowerCase().contains("bgl") && val >= 6) { + acc += 2.49f; + val -= 6; + entry.setValue(val); + } + + while(val > 0) { + acc += stock.getPrice(key); + val -= 1; + entry.setValue(val); + } + System.out.println(key); + System.out.println(acc); } + return acc; } } \ No newline at end of file From 877414e42146f195d47f982f24851295baebf6c6 Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Mon, 11 Aug 2025 10:59:28 +0200 Subject: [PATCH 16/27] Create test class for reciept, add domain model for reciept --- .../java/com/booleanuk/extension/Basket.java | 20 ++++++++++++++++--- .../java/com/booleanuk/extension/Stock.java | 15 +++++++++++++- .../com/booleanuk/extension/RecieptTest.java | 4 ++++ 3 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 src/test/java/com/booleanuk/extension/RecieptTest.java diff --git a/src/main/java/com/booleanuk/extension/Basket.java b/src/main/java/com/booleanuk/extension/Basket.java index 9a7c85da8..536b44fba 100644 --- a/src/main/java/com/booleanuk/extension/Basket.java +++ b/src/main/java/com/booleanuk/extension/Basket.java @@ -5,17 +5,22 @@ public class Basket { private List items; private int capacity; + //private Reciept reciept; static private int stdCapacity = 3; static private Stock stock = new Stock(); public Basket(){ this.capacity = stdCapacity; - items = new ArrayList<>(); } public Basket(int capacity){ this.capacity = capacity; + initAttributes(); + } + + private void initAttributes(){ items = new ArrayList<>(); + //this.reciept = new Reciept(items, stock); } public List getItems(){ @@ -55,8 +60,7 @@ public float getTotalCost(){ return acc; } - - public float priceWithDiscount(){ + private Map countItems(){ Map itemCount = new HashMap<>(); for(Item item : this.items){ String sku = item.getSku(); @@ -73,6 +77,12 @@ public float priceWithDiscount(){ } } } + return itemCount; + } + + public float priceWithDiscount(){ + + Map itemCount = countItems(); Set> itemCountVals = itemCount.entrySet(); @@ -101,7 +111,11 @@ public float priceWithDiscount(){ } System.out.println(key); System.out.println(acc); + } return acc; } + public String getReciept(){ + return ""; + } } \ No newline at end of file diff --git a/src/main/java/com/booleanuk/extension/Stock.java b/src/main/java/com/booleanuk/extension/Stock.java index abc2cd88c..eb020d39f 100644 --- a/src/main/java/com/booleanuk/extension/Stock.java +++ b/src/main/java/com/booleanuk/extension/Stock.java @@ -48,9 +48,22 @@ public List getFillings(){ public Item getItem(String sku){ for(Item item : this.stock){ if(item.getSku().equals(sku)){ - return item; + return copyItem(item); } } return null; } + + private Item copyItem(Item item){ + if(item instanceof Filling) { + return new Filling(item.getSku(), item.getPrice(), item.getVariant()); + } + if(item instanceof Bagel) { + return new Bagel(item.getSku(), item.getPrice(), item.getVariant()); + } + if(item instanceof Coffee) { + return new Coffee(item.getSku(), item.getPrice(), item.getVariant()); + } + return null; + } } \ No newline at end of file diff --git a/src/test/java/com/booleanuk/extension/RecieptTest.java b/src/test/java/com/booleanuk/extension/RecieptTest.java new file mode 100644 index 000000000..9c65aaa51 --- /dev/null +++ b/src/test/java/com/booleanuk/extension/RecieptTest.java @@ -0,0 +1,4 @@ +package com.booleanuk.extension; + +public class RecieptTest { +} From 9bc983895aa7b683f06c962d21729afca4b6a3bf Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Mon, 11 Aug 2025 11:21:39 +0200 Subject: [PATCH 17/27] Change expected results on basket to include coffee discount --- .../com/booleanuk/extension/BasketTest.java | 12 +++++- .../com/booleanuk/extension/RecieptTest.java | 38 +++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/booleanuk/extension/BasketTest.java b/src/test/java/com/booleanuk/extension/BasketTest.java index b8fc9c760..175f112ce 100644 --- a/src/test/java/com/booleanuk/extension/BasketTest.java +++ b/src/test/java/com/booleanuk/extension/BasketTest.java @@ -78,8 +78,16 @@ public void testPriceWithDiscountNonEmpty(){ Assertions.assertTrue(addMult(basket, "BGLO", 2)); Assertions.assertTrue(addMult(basket, "BGLP", 12)); Assertions.assertTrue(addMult(basket, "BGLE", 6)); - Assertions.assertTrue(addMult(basket, "COFB", 2)); + Assertions.assertTrue(addMult(basket, "COFB", 3)); + + float delta = 0.001f; + + Assertions.assertEquals(9.97, basket.priceWithDiscount(), delta); + + basket = new Basket(50); + + Assertions.assertTrue(addMult(basket, "BGLP", 16)); + Assertions.assertEquals(5.55, basket.priceWithDiscount(), delta); - Assertions.assertEquals(10.43, basket.priceWithDiscount()); } } \ No newline at end of file diff --git a/src/test/java/com/booleanuk/extension/RecieptTest.java b/src/test/java/com/booleanuk/extension/RecieptTest.java index 9c65aaa51..8b8fb79e9 100644 --- a/src/test/java/com/booleanuk/extension/RecieptTest.java +++ b/src/test/java/com/booleanuk/extension/RecieptTest.java @@ -1,4 +1,42 @@ package com.booleanuk.extension; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + public class RecieptTest { + + public boolean addMult(Basket basket, String sku, int times){ + if(times == 0){ + return true; + } + + return basket.add(sku) == 1 && addMult(basket, sku, times-1); + } + + @Test + public void testPrintRecieptNormal(){ + Basket basket = new Basket(); + + addMult(basket, "BGLO", 2); + addMult(basket, "BGLP", 12); + addMult(basket, "BGLE", 6); + addMult(basket, "COFB", 3); + + Assertions.assertEquals(" ~~~ Bob's Bagels ~~~\n" + + "\n" + + " 2021-03-16 21:38:44\n" + + "\n" + + "----------------------------\n" + + "\n" + + "Onion Bagel 2 £0.98\n" + + "Plain Bagel 12 £3.99\n" + + "Everything Bagel 6 £2.49\n" + + "Coffee 3 £2.97\n" + + "\n" + + "----------------------------\n" + + "Total £10.43\n" + + "\n" + + " Thank you\n" + + " for your order!", basket.getReciept()); + } } From 7cfd9ecfe418a4728fa69c46954361f23dff6b87 Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Mon, 11 Aug 2025 11:22:00 +0200 Subject: [PATCH 18/27] Change implementation to include discount --- .../java/com/booleanuk/extension/Basket.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/java/com/booleanuk/extension/Basket.java b/src/main/java/com/booleanuk/extension/Basket.java index 536b44fba..ae3725d31 100644 --- a/src/main/java/com/booleanuk/extension/Basket.java +++ b/src/main/java/com/booleanuk/extension/Basket.java @@ -105,6 +105,16 @@ public float priceWithDiscount(){ } while(val > 0) { + if(key.toLowerCase().contains("bgl")) { + Map.Entry coffee = findCoffee(itemCountVals); + if(coffee != null){ + coffee.setValue(coffee.getValue()-1); + val -= 1; + entry.setValue(val); + acc += 1.25f; + continue; + } + } acc += stock.getPrice(key); val -= 1; entry.setValue(val); @@ -115,6 +125,18 @@ public float priceWithDiscount(){ } return acc; } + + private Map.Entry findCoffee(Set> itemCount){ + for(Map.Entry entry : itemCount){ + if(entry.getKey().toLowerCase().contains("cof") && entry.getValue() > 0){ + return entry; + } + } + return null; + } + + + public String getReciept(){ return ""; } From 8e18ed6dd64a4d925cd1b7a24bc23c97fc9b84d8 Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Mon, 11 Aug 2025 11:23:45 +0200 Subject: [PATCH 19/27] Expand domain model and add comment to basket --- src/main/java/com/booleanuk/extension/Basket.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/booleanuk/extension/Basket.java b/src/main/java/com/booleanuk/extension/Basket.java index ae3725d31..575a0cfb8 100644 --- a/src/main/java/com/booleanuk/extension/Basket.java +++ b/src/main/java/com/booleanuk/extension/Basket.java @@ -112,7 +112,7 @@ public float priceWithDiscount(){ val -= 1; entry.setValue(val); acc += 1.25f; - continue; + continue; //Used now for simplicity, no good though } } acc += stock.getPrice(key); From 153fc00ab2944aaa488a394e7d08d2da2bce7f81 Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Mon, 11 Aug 2025 11:24:10 +0200 Subject: [PATCH 20/27] Expand domain model --- domain-model.md | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/domain-model.md b/domain-model.md index 56e20b48b..b5c5eb225 100644 --- a/domain-model.md +++ b/domain-model.md @@ -23,7 +23,7 @@ | | Filling | | | | | | | | | | | | Extension 1: - As a user I want to take part of the special offers so that I can save money + As a user I want to take part of the special offers so that I can save money. | Module | Class | Member | Method | Scenario | Output | |--------|---------------|--------------------|-------------------------------|------------------------------|---------------| @@ -53,5 +53,35 @@ Extension 1: | | Filling | | | | | | | | | | | | +Extension 2: +As a user I want to get a reciept with my order so that I can know what I have bought. - +| Module | Class | Member | Method | Scenario | Output | +|--------|---------------|--------------------|-------------------------------|------------------------------|---------------| +| Core | Basket | List items | add(String sku) | Correct code basket not full | 1 | +| | | int capacity | | Correct code basket full | 0 | +| | | static stdCapacity | | Incorrect code | -1 | +| | | static Stock stock | remove(String sku) | Exists | True | +| | | | | Doesn't exist | False | +| | | | getTotalCost() | | float | +| | | | getDiscountetCost() | | | +| | Stock | List stock | | | | +| | | | getPrice(String sku) | Exists | price | +| | | | | Doesn't exist | -1 | +| | | | getFillings() | | List | +| | | | getItem(String sku) | Exists | Item | +| | | | | Does not exist | null | +| | Abstract Item | String sku | getSku() | | sku | +| | | float price | getPrice() | | price | +| | | String name | getName() | | name | +| | | String variant | getVariant() | | variant | +| | | | | | | +| | Bagel | List | addFilling(Filling filling) | | void | +| | | | removeFilling(String variant) | Filling exists in list | true | +| | | | | Filling does not exist | false | +| | | | getFillings() | | List | +| | Coffee | | | | | +| | Filling | | | | | +| | | | | | | +| | Reciept | List items | printReciept() | | String | +| | | Stock stock | | | | From 8e8b7deb51e2c2607e71ddad595eeb34158db3b6 Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Mon, 11 Aug 2025 11:26:08 +0200 Subject: [PATCH 21/27] Test reciept object directly instead of through basket --- src/test/java/com/booleanuk/extension/RecieptTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/booleanuk/extension/RecieptTest.java b/src/test/java/com/booleanuk/extension/RecieptTest.java index 8b8fb79e9..60b978b7b 100644 --- a/src/test/java/com/booleanuk/extension/RecieptTest.java +++ b/src/test/java/com/booleanuk/extension/RecieptTest.java @@ -22,6 +22,8 @@ public void testPrintRecieptNormal(){ addMult(basket, "BGLE", 6); addMult(basket, "COFB", 3); + Reciept reciept = new Reciept(basket.getItems()); + Assertions.assertEquals(" ~~~ Bob's Bagels ~~~\n" + "\n" + " 2021-03-16 21:38:44\n" + @@ -37,6 +39,6 @@ public void testPrintRecieptNormal(){ "Total £10.43\n" + "\n" + " Thank you\n" + - " for your order!", basket.getReciept()); + " for your order!", reciept.getReciept()); } } From abec22eca502ef4e9f9799c78b4de62bba524aa7 Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Mon, 11 Aug 2025 14:19:27 +0200 Subject: [PATCH 22/27] Add tests for Reciept class --- .../java/com/booleanuk/extension/Reciept.java | 4 ++++ .../com/booleanuk/extension/RecieptTest.java | 17 +++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/booleanuk/extension/Reciept.java diff --git a/src/main/java/com/booleanuk/extension/Reciept.java b/src/main/java/com/booleanuk/extension/Reciept.java new file mode 100644 index 000000000..f21e15ef1 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Reciept.java @@ -0,0 +1,4 @@ +package com.booleanuk.extension; + +public class Reciept { +} diff --git a/src/test/java/com/booleanuk/extension/RecieptTest.java b/src/test/java/com/booleanuk/extension/RecieptTest.java index 60b978b7b..0c5fd1cf0 100644 --- a/src/test/java/com/booleanuk/extension/RecieptTest.java +++ b/src/test/java/com/booleanuk/extension/RecieptTest.java @@ -3,6 +3,8 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.Map; + public class RecieptTest { public boolean addMult(Basket basket, String sku, int times){ @@ -15,14 +17,17 @@ public boolean addMult(Basket basket, String sku, int times){ @Test public void testPrintRecieptNormal(){ - Basket basket = new Basket(); - addMult(basket, "BGLO", 2); - addMult(basket, "BGLP", 12); - addMult(basket, "BGLE", 6); - addMult(basket, "COFB", 3); + Stock stock = new Stock(); + + Map map = Map.of( + "BGLO", 2, + "BGLP", 12, + "BGLE", 6, + "COFB", 3 + ); - Reciept reciept = new Reciept(basket.getItems()); + Reciept reciept = new Reciept(map, stock); Assertions.assertEquals(" ~~~ Bob's Bagels ~~~\n" + "\n" + From 59cdccd0592d2121420d9adf32eac5f3656a2548 Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Mon, 11 Aug 2025 16:22:06 +0200 Subject: [PATCH 23/27] Change tests to reflect new method --- .../com/booleanuk/extension/PriceInfo.java | 4 ++ .../com/booleanuk/extension/RecieptTest.java | 49 +++++++------------ 2 files changed, 22 insertions(+), 31 deletions(-) create mode 100644 src/main/java/com/booleanuk/extension/PriceInfo.java diff --git a/src/main/java/com/booleanuk/extension/PriceInfo.java b/src/main/java/com/booleanuk/extension/PriceInfo.java new file mode 100644 index 000000000..93417d2df --- /dev/null +++ b/src/main/java/com/booleanuk/extension/PriceInfo.java @@ -0,0 +1,4 @@ +package com.booleanuk.extension; + +public class PriceInfo { +} diff --git a/src/test/java/com/booleanuk/extension/RecieptTest.java b/src/test/java/com/booleanuk/extension/RecieptTest.java index 0c5fd1cf0..714133882 100644 --- a/src/test/java/com/booleanuk/extension/RecieptTest.java +++ b/src/test/java/com/booleanuk/extension/RecieptTest.java @@ -7,43 +7,30 @@ public class RecieptTest { - public boolean addMult(Basket basket, String sku, int times){ - if(times == 0){ - return true; + private boolean addMult(Basket basket, String sku, int times){ + boolean ret = true; + for(int i = 0; i < times; i++){ + ret = ret && basket.add(sku) == 1; } - return basket.add(sku) == 1 && addMult(basket, sku, times-1); + return ret; } @Test public void testPrintRecieptNormal(){ - Stock stock = new Stock(); - - Map map = Map.of( - "BGLO", 2, - "BGLP", 12, - "BGLE", 6, - "COFB", 3 - ); - - Reciept reciept = new Reciept(map, stock); - - Assertions.assertEquals(" ~~~ Bob's Bagels ~~~\n" + - "\n" + - " 2021-03-16 21:38:44\n" + - "\n" + - "----------------------------\n" + - "\n" + - "Onion Bagel 2 £0.98\n" + - "Plain Bagel 12 £3.99\n" + - "Everything Bagel 6 £2.49\n" + - "Coffee 3 £2.97\n" + - "\n" + - "----------------------------\n" + - "Total £10.43\n" + - "\n" + - " Thank you\n" + - " for your order!", reciept.getReciept()); + Basket basket = new Basket(50); + addMult(basket,"BGLO", 2); + addMult(basket,"BGLP", 12); + addMult(basket,"BGLE", 6); + addMult(basket,"COFB", 3); + + Reciept reciept = new Reciept(basket); + System.out.println(reciept.getReciept()); + Assertions.assertTrue(reciept.getReciept().contains("Plain Bagel 12 £3.99")); + Assertions.assertTrue(reciept.getReciept().contains("Everything Bagel 6 £2.49")); + Assertions.assertTrue(reciept.getReciept().contains("Black Coffee 1 £0.99")); + Assertions.assertTrue(reciept.getReciept().contains("Coffee Combo 2 £2.5")); + Assertions.assertTrue(reciept.getReciept().contains("Total £10.43")); } } From 5ff591bdb23b37927aa96f3c77f0884f7494609e Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Mon, 11 Aug 2025 16:27:54 +0200 Subject: [PATCH 24/27] Add reciept functionallity --- .../java/com/booleanuk/extension/Basket.java | 84 ++++++++++++++----- .../com/booleanuk/extension/PriceInfo.java | 56 +++++++++++++ .../java/com/booleanuk/extension/Reciept.java | 58 +++++++++++++ .../com/booleanuk/extension/RecieptTest.java | 2 +- 4 files changed, 179 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/booleanuk/extension/Basket.java b/src/main/java/com/booleanuk/extension/Basket.java index 575a0cfb8..dbff6f567 100644 --- a/src/main/java/com/booleanuk/extension/Basket.java +++ b/src/main/java/com/booleanuk/extension/Basket.java @@ -5,22 +5,21 @@ public class Basket { private List items; private int capacity; - //private Reciept reciept; static private int stdCapacity = 3; static private Stock stock = new Stock(); public Basket(){ this.capacity = stdCapacity; + this.initAttributes(); } public Basket(int capacity){ this.capacity = capacity; - initAttributes(); + this.initAttributes(); } private void initAttributes(){ items = new ArrayList<>(); - //this.reciept = new Reciept(items, stock); } public List getItems(){ @@ -80,48 +79,93 @@ private Map countItems(){ return itemCount; } - public float priceWithDiscount(){ + public void updatePriceInfo(){ + //this.priceInfo.clear(); Map itemCount = countItems(); - Set> itemCountVals = itemCount.entrySet(); + } + + public List getPriceInfo(){ + Map inputMap = this.countItems(); + List infos = new ArrayList<>(); + + Set> entries = inputMap.entrySet(); + + for(Map.Entry entry : entries) { + + Item item = stock.getItem(entry.getKey()); + String name = item.getVariant() + " " + item.getName(); + + PriceInfo currInfo = new PriceInfo(name, 0, 0, 0); + - float acc = 0; - System.out.println(itemCount); - for(Map.Entry entry : itemCountVals){ String key = entry.getKey(); Integer val = entry.getValue(); - while (key.toLowerCase().contains("bgl") && val >= 12) { - acc += 3.99f; + currInfo.incCost(3.99f); + currInfo.incCount(12); + currInfo.incDiscount(stock.getPrice(key) * 12 - 3.99f); val -= 12; entry.setValue(val); } while (key.toLowerCase().contains("bgl") && val >= 6) { - acc += 2.49f; + currInfo.incCost(2.49f); + currInfo.incCount(6); + currInfo.incDiscount(stock.getPrice(key) * 12 - 2.49f); val -= 6; entry.setValue(val); } - while(val > 0) { - if(key.toLowerCase().contains("bgl")) { - Map.Entry coffee = findCoffee(itemCountVals); - if(coffee != null){ - coffee.setValue(coffee.getValue()-1); + while (val > 0) { + if (key.toLowerCase().contains("bgl")) { + Map.Entry coffee = findCoffee(entries); + if (coffee != null) { + coffee.setValue(coffee.getValue() - 1); val -= 1; entry.setValue(val); - acc += 1.25f; + + PriceInfo coffeeCombo = getPriceInfoByName(infos, "Coffee Combo"); + if(coffeeCombo == null){ + coffeeCombo = new PriceInfo("Coffee Combo", 0, 0, 0); + infos.add(coffeeCombo); + } + + coffeeCombo.incCost(1.25f); + coffeeCombo.incCount(1); + float discount = stock.getPrice(coffee.getKey()) + stock.getPrice(key) - 1.25f; + coffeeCombo.incDiscount(discount); continue; //Used now for simplicity, no good though } } - acc += stock.getPrice(key); + currInfo.incCost(stock.getPrice(key)); + currInfo.incCount(1); val -= 1; entry.setValue(val); } - System.out.println(key); - System.out.println(acc); + if(currInfo.getCount() > 0) { + infos.add(currInfo); + } + } + return infos; + } + + public PriceInfo getPriceInfoByName(List entries,String name){ + for(PriceInfo entry : entries){ + if(entry.getName().equals(name)){ + return entry; + } + } + return null; + } + public float priceWithDiscount(){ + + List priceInfos = getPriceInfo(); + float acc = 0; + for(PriceInfo info : priceInfos){ + acc += info.getCost(); } return acc; } diff --git a/src/main/java/com/booleanuk/extension/PriceInfo.java b/src/main/java/com/booleanuk/extension/PriceInfo.java index 93417d2df..abdfebe3f 100644 --- a/src/main/java/com/booleanuk/extension/PriceInfo.java +++ b/src/main/java/com/booleanuk/extension/PriceInfo.java @@ -1,4 +1,60 @@ package com.booleanuk.extension; public class PriceInfo { + private String name; + private int count; + private float discount; + private float cost; + + public PriceInfo(String name, int count, float cost, float discount){ + this.name = name; + this.count = count; + this.cost = cost; + this.discount = discount; + } + + public float getDiscount() { + return discount; + } + + public int getCount() { + return count; + } + + public String getName() { + return name; + } + + public float getCost() { + return cost; + } + + public void setName(String name) { + this.name = name; + } + + public void setDiscount(float discount) { + this.discount = discount; + } + + public void setCount(int count) { + this.count = count; + } + + public void setCost(float cost) { + this.cost = cost; + } + + public void incDiscount(float add){ + this.setDiscount(this.getDiscount() + add); + } + + public void incCount(int add){ + this.setCount(this.getCount() + add); + } + + public void incCost(float add){ + this.setCost(this.getCost() + add); + } + } diff --git a/src/main/java/com/booleanuk/extension/Reciept.java b/src/main/java/com/booleanuk/extension/Reciept.java index f21e15ef1..4e0039085 100644 --- a/src/main/java/com/booleanuk/extension/Reciept.java +++ b/src/main/java/com/booleanuk/extension/Reciept.java @@ -1,4 +1,62 @@ package com.booleanuk.extension; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + public class Reciept { + private Basket basket; + + public Reciept(Basket basket){ + this.basket = basket; + } + + public String getReciept(){ + StringBuilder sb = new StringBuilder(); + + sb.append(" ~~~ Bob's Bagels ~~~\n"); + sb.append("\n"); + LocalDateTime now = LocalDateTime.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String formattedDateTime = now.format(formatter); + + sb.append(formattedDateTime); + sb.append("\n"); + sb.append("\n"); + sb.append("----------------------------"); + sb.append("\n"); + int countStart = 19; + int priceStart = 4; + List priceInfo = basket.getPriceInfo(); + float acc = 0; + for(PriceInfo curr : priceInfo){ + sb.append(curr.getName()); + sb.append(blankSpace(curr.getName(), countStart)); + sb.append(curr.getCount()); + sb.append(blankSpace(String.valueOf(curr.getCount()), priceStart)); + sb.append("£"); + sb.append(curr.getCost()); + sb.append("\n"); + acc += curr.getCost(); + } + sb.append("\n"); + sb.append("----------------------------\n"); + sb.append("Total"); + sb.append(blankSpace("Total", countStart+priceStart)); + sb.append(String.format( "£%.2f", acc)); + + return sb.toString(); + } + + public String blankSpace(String nameVar, int startIndex){ + int offset = startIndex-nameVar.length(); + + StringBuilder sb = new StringBuilder(); + sb.repeat(" ", offset); + return sb.toString(); + } + } diff --git a/src/test/java/com/booleanuk/extension/RecieptTest.java b/src/test/java/com/booleanuk/extension/RecieptTest.java index 714133882..7880ec090 100644 --- a/src/test/java/com/booleanuk/extension/RecieptTest.java +++ b/src/test/java/com/booleanuk/extension/RecieptTest.java @@ -31,6 +31,6 @@ public void testPrintRecieptNormal(){ Assertions.assertTrue(reciept.getReciept().contains("Everything Bagel 6 £2.49")); Assertions.assertTrue(reciept.getReciept().contains("Black Coffee 1 £0.99")); Assertions.assertTrue(reciept.getReciept().contains("Coffee Combo 2 £2.5")); - Assertions.assertTrue(reciept.getReciept().contains("Total £10.43")); + Assertions.assertTrue(reciept.getReciept().contains("Total £9.97")); } } From bd5539d1dabc22e00dc44c437cb08fa3e3a2cdbd Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Mon, 11 Aug 2025 16:30:08 +0200 Subject: [PATCH 25/27] Add changes to domain model --- domain-model.md | 59 +++++++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/domain-model.md b/domain-model.md index b5c5eb225..7bed87f0f 100644 --- a/domain-model.md +++ b/domain-model.md @@ -56,32 +56,33 @@ Extension 1: Extension 2: As a user I want to get a reciept with my order so that I can know what I have bought. -| Module | Class | Member | Method | Scenario | Output | -|--------|---------------|--------------------|-------------------------------|------------------------------|---------------| -| Core | Basket | List items | add(String sku) | Correct code basket not full | 1 | -| | | int capacity | | Correct code basket full | 0 | -| | | static stdCapacity | | Incorrect code | -1 | -| | | static Stock stock | remove(String sku) | Exists | True | -| | | | | Doesn't exist | False | -| | | | getTotalCost() | | float | -| | | | getDiscountetCost() | | | -| | Stock | List stock | | | | -| | | | getPrice(String sku) | Exists | price | -| | | | | Doesn't exist | -1 | -| | | | getFillings() | | List | -| | | | getItem(String sku) | Exists | Item | -| | | | | Does not exist | null | -| | Abstract Item | String sku | getSku() | | sku | -| | | float price | getPrice() | | price | -| | | String name | getName() | | name | -| | | String variant | getVariant() | | variant | -| | | | | | | -| | Bagel | List | addFilling(Filling filling) | | void | -| | | | removeFilling(String variant) | Filling exists in list | true | -| | | | | Filling does not exist | false | -| | | | getFillings() | | List | -| | Coffee | | | | | -| | Filling | | | | | -| | | | | | | -| | Reciept | List items | printReciept() | | String | -| | | Stock stock | | | | +| Module | Class | Member | Method | Scenario | Output | +|--------|---------------|--------------------|-------------------------------|------------------------------|-----------------| +| Core | Basket | List items | add(String sku) | Correct code basket not full | 1 | +| | | int capacity | | Correct code basket full | 0 | +| | | static stdCapacity | | Incorrect code | -1 | +| | | static Stock stock | remove(String sku) | Exists | True | +| | | | | Doesn't exist | False | +| | | | getTotalCost() | | float | +| | | | getDiscountetCost() | | | +| | | | getPriceInfo() | | List | +| | Stock | List stock | | | | +| | | | getPrice(String sku) | Exists | price | +| | | | | Doesn't exist | -1 | +| | | | getFillings() | | List | +| | | | getItem(String sku) | Exists | Item | +| | | | | Does not exist | null | +| | Abstract Item | String sku | getSku() | | sku | +| | | float price | getPrice() | | price | +| | | String name | getName() | | name | +| | | String variant | getVariant() | | variant | +| | | | | | | +| | Bagel | List | addFilling(Filling filling) | | void | +| | | | removeFilling(String variant) | Filling exists in list | true | +| | | | | Filling does not exist | false | +| | | | getFillings() | | List | +| | Coffee | | | | | +| | Filling | | | | | +| | | | | | | +| | Reciept | Basket basket | getReciept() | | String | +| | | | | | | From 6119be8455ce9b47c99b628226bd3e2721a8c205 Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Tue, 12 Aug 2025 08:56:10 +0200 Subject: [PATCH 26/27] Expand domain model and add test for discounted reciept --- domain-model.md | 43 +++++++++++++++++++ .../com/booleanuk/extension/RecieptTest.java | 20 +++++++++ 2 files changed, 63 insertions(+) diff --git a/domain-model.md b/domain-model.md index 7bed87f0f..248c1ef08 100644 --- a/domain-model.md +++ b/domain-model.md @@ -86,3 +86,46 @@ As a user I want to get a reciept with my order so that I can know what I have b | | | | | | | | | Reciept | Basket basket | getReciept() | | String | | | | | | | | +| | PriceInfo | String name | | | | +| | | float cost | | | | +| | | float discount | | | | +| | | int count | | | | + +Extension 3: +As a user I want to get a reciept with my order and discounts so that I can know what I have bought andhow much I have saved. + +| Module | Class | Member | Method | Scenario | Output | +|--------|---------------|--------------------|-------------------------------|------------------------------|-----------------| +| Core | Basket | List items | add(String sku) | Correct code basket not full | 1 | +| | | int capacity | | Correct code basket full | 0 | +| | | static stdCapacity | | Incorrect code | -1 | +| | | static Stock stock | remove(String sku) | Exists | True | +| | | | | Doesn't exist | False | +| | | | getTotalCost() | | float | +| | | | getDiscountetCost() | | | +| | | | getPriceInfo() | | List | +| | Stock | List stock | | | | +| | | | getPrice(String sku) | Exists | price | +| | | | | Doesn't exist | -1 | +| | | | getFillings() | | List | +| | | | getItem(String sku) | Exists | Item | +| | | | | Does not exist | null | +| | Abstract Item | String sku | getSku() | | sku | +| | | float price | getPrice() | | price | +| | | String name | getName() | | name | +| | | String variant | getVariant() | | variant | +| | | | | | | +| | Bagel | List | addFilling(Filling filling) | | void | +| | | | removeFilling(String variant) | Filling exists in list | true | +| | | | | Filling does not exist | false | +| | | | getFillings() | | List | +| | Coffee | | | | | +| | Filling | | | | | +| | | | | | | +| | Reciept | Basket basket | getReciept() | | String | +| | | | getDiscountedReciept() | | String | +| | PriceInfo | String name | | | | +| | | float cost | | | | +| | | float discount | | | | +| | | int count | | | | + diff --git a/src/test/java/com/booleanuk/extension/RecieptTest.java b/src/test/java/com/booleanuk/extension/RecieptTest.java index 7880ec090..050c9e735 100644 --- a/src/test/java/com/booleanuk/extension/RecieptTest.java +++ b/src/test/java/com/booleanuk/extension/RecieptTest.java @@ -33,4 +33,24 @@ public void testPrintRecieptNormal(){ Assertions.assertTrue(reciept.getReciept().contains("Coffee Combo 2 £2.5")); Assertions.assertTrue(reciept.getReciept().contains("Total £9.97")); } + + @Test + public void testPrintDiscountedRecieptNormal(){ + + Basket basket = new Basket(50); + addMult(basket,"BGLO", 2); + addMult(basket,"BGLP", 12); + addMult(basket,"BGLE", 6); + addMult(basket,"COFB", 3); + + Reciept reciept = new Reciept(basket); + System.out.println(reciept.getDiscountedReciept()); + Assertions.assertTrue(reciept.getDiscountedReciept().contains("Plain Bagel 12 £3.99\n" + + " (-£0.69)")); + Assertions.assertTrue(reciept.getDiscontedReciept().contains("Everything Bagel 6 £2.49\n" + + " (-£0.45)")); + Assertions.assertTrue(reciept.getDiscountedReciept().contains("Black Coffee 1 £0.99")); + Assertions.assertTrue(reciept.getDiscountedReciept().contains("Coffee Combo 2 £2.5")); + Assertions.assertTrue(reciept.getDiscountedReciept().contains("Total £9.97")); + } } From 26c9c5aa18034b674738eac35069cae6e0c7345d Mon Sep 17 00:00:00 2001 From: Lucas Holter Date: Tue, 12 Aug 2025 09:13:12 +0200 Subject: [PATCH 27/27] Add implementation and fix bug with discount --- .../java/com/booleanuk/extension/Basket.java | 2 +- .../java/com/booleanuk/extension/Reciept.java | 21 +++++++++++++++++++ .../com/booleanuk/extension/RecieptTest.java | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/booleanuk/extension/Basket.java b/src/main/java/com/booleanuk/extension/Basket.java index dbff6f567..6eea1849c 100644 --- a/src/main/java/com/booleanuk/extension/Basket.java +++ b/src/main/java/com/booleanuk/extension/Basket.java @@ -113,7 +113,7 @@ public List getPriceInfo(){ while (key.toLowerCase().contains("bgl") && val >= 6) { currInfo.incCost(2.49f); currInfo.incCount(6); - currInfo.incDiscount(stock.getPrice(key) * 12 - 2.49f); + currInfo.incDiscount(stock.getPrice(key) * 6 - 2.49f); val -= 6; entry.setValue(val); } diff --git a/src/main/java/com/booleanuk/extension/Reciept.java b/src/main/java/com/booleanuk/extension/Reciept.java index 4e0039085..0c421f286 100644 --- a/src/main/java/com/booleanuk/extension/Reciept.java +++ b/src/main/java/com/booleanuk/extension/Reciept.java @@ -15,6 +15,13 @@ public Reciept(Basket basket){ } public String getReciept(){ + return buildReciept(false); + } + public String getDiscountedReciept(){ + return buildReciept(true); + } + + public String buildReciept(boolean discounted){ StringBuilder sb = new StringBuilder(); sb.append(" ~~~ Bob's Bagels ~~~\n"); @@ -32,6 +39,7 @@ public String getReciept(){ int priceStart = 4; List priceInfo = basket.getPriceInfo(); float acc = 0; + float discountedAcc = 0; for(PriceInfo curr : priceInfo){ sb.append(curr.getName()); sb.append(blankSpace(curr.getName(), countStart)); @@ -41,12 +49,25 @@ public String getReciept(){ sb.append(curr.getCost()); sb.append("\n"); acc += curr.getCost(); + if(discounted && curr.getDiscount() > 0){ + sb.append(blankSpace("", countStart+priceStart-2)); + sb.append("(-£"); + sb.append(String.format("%.2f",curr.getDiscount())); + sb.append(")\n"); + discountedAcc += curr.getDiscount(); + } } sb.append("\n"); sb.append("----------------------------\n"); sb.append("Total"); sb.append(blankSpace("Total", countStart+priceStart)); sb.append(String.format( "£%.2f", acc)); + if(discounted && discountedAcc > 0){ + sb.append("\n"); + sb.append("You saved a total of £"); + sb.append(String.format("%.2f\n", discountedAcc)); + sb.append(" on this shop"); + } return sb.toString(); } diff --git a/src/test/java/com/booleanuk/extension/RecieptTest.java b/src/test/java/com/booleanuk/extension/RecieptTest.java index 050c9e735..022437d3a 100644 --- a/src/test/java/com/booleanuk/extension/RecieptTest.java +++ b/src/test/java/com/booleanuk/extension/RecieptTest.java @@ -47,7 +47,7 @@ public void testPrintDiscountedRecieptNormal(){ System.out.println(reciept.getDiscountedReciept()); Assertions.assertTrue(reciept.getDiscountedReciept().contains("Plain Bagel 12 £3.99\n" + " (-£0.69)")); - Assertions.assertTrue(reciept.getDiscontedReciept().contains("Everything Bagel 6 £2.49\n" + + Assertions.assertTrue(reciept.getDiscountedReciept().contains("Everything Bagel 6 £2.49\n" + " (-£0.45)")); Assertions.assertTrue(reciept.getDiscountedReciept().contains("Black Coffee 1 £0.99")); Assertions.assertTrue(reciept.getDiscountedReciept().contains("Coffee Combo 2 £2.5"));