From a682190871367e046e4264ed99f000102d0a8688 Mon Sep 17 00:00:00 2001 From: Andre Velkov Janusev Date: Mon, 18 Aug 2025 13:57:05 +0200 Subject: [PATCH 1/9] initial domain model and classes , next -> tests --- src/main/java/com/booleanuk/core/Bagel.java | 73 +++++++++++++++++++ .../java/com/booleanuk/core/Customer.java | 41 +++++++++++ src/main/java/com/booleanuk/core/Filling.java | 48 ++++++++++++ .../java/com/booleanuk/core/Inventory.java | 17 +++++ src/main/java/com/booleanuk/core/Manager.java | 22 ++++++ .../com/booleanuk/core/models/domain-model.md | 26 +++++++ 6 files changed, 227 insertions(+) create mode 100644 src/main/java/com/booleanuk/core/Bagel.java create mode 100644 src/main/java/com/booleanuk/core/Customer.java create mode 100644 src/main/java/com/booleanuk/core/Filling.java create mode 100644 src/main/java/com/booleanuk/core/Inventory.java create mode 100644 src/main/java/com/booleanuk/core/Manager.java create mode 100644 src/main/java/com/booleanuk/core/models/domain-model.md 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..670acb212 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -0,0 +1,73 @@ +package com.booleanuk.core; + +import java.util.List; + +public class Bagel { + private String sku; + private String name; + private String variant; + private int price; + private Filling filling; +// TODO: fix -> this -> setter methods + public Bagel(String sku, Filling filling, int price, String variant, String name) { + this.sku = sku; + this.filling = filling; + this.price = price; + this.variant = variant; + this.name = name; + } + + public Bagel() { + + } + + public String getSku() { + return sku; + } + + public void setSku(String sku) { + this.sku = sku; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getVariant() { + return variant; + } + + public void setVariant(String variant) { + this.variant = variant; + } + + public int getPrice() { + return price; + } + + public void setPrice(int price) { + this.price = price; + } + + public Filling getFilling() { + return filling; + } + + public void setFilling(Filling filling) { + this.filling = filling; + } + + public void chooseFilling(List fillings){ + + } + + public void getFillingCost(List fillings) { + + } + + +} diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java new file mode 100644 index 000000000..195e2de3a --- /dev/null +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -0,0 +1,41 @@ +package com.booleanuk.core; + +import java.util.List; + +public class Customer { + private Basket basket; + + public Customer() { + + } + + public void addBagelToBasket(Bagel bagel) { + + } + + public void removeBagelFromBasket(Bagel bagel) { + + } + + public void viewTotalCost() { + + } + + public void viewBagelPrice() { + + } + + public int selectFillings(int option) { + + return -1; + } + + public void viewFillingsPrice(List fillings) { + + } + + public void orderBagelAtSpecificTime() { + + } + +} 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..0d97d5d47 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Filling.java @@ -0,0 +1,48 @@ +package com.booleanuk.core; + +public class Filling { + private String id; + private int price; + private String sku; + private String variant; + + public Filling(String id, int price, String sku, String variant) { + setId(id); + setPrice(price); + setSku(sku); + setVariant(variant); + } + + public int getPrice() { + return price; + } + + public void setPrice(int price) { + this.price = price; + } + + public String getSku() { + return sku; + } + + public void setSku(String sku) { + this.sku = sku; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getVariant() { + return variant; + } + + public void setVariant(String variant) { + this.variant = variant; + } + +} \ No newline at end of file diff --git a/src/main/java/com/booleanuk/core/Inventory.java b/src/main/java/com/booleanuk/core/Inventory.java new file mode 100644 index 000000000..319942bea --- /dev/null +++ b/src/main/java/com/booleanuk/core/Inventory.java @@ -0,0 +1,17 @@ +package com.booleanuk.core; + +import java.util.ArrayList; +import java.util.List; + +public class Inventory { + private List inventoryList = new ArrayList<>(); + + + public void addItem() { + + } + + public void removeItem() { + + } +} diff --git a/src/main/java/com/booleanuk/core/Manager.java b/src/main/java/com/booleanuk/core/Manager.java new file mode 100644 index 000000000..1f6e6c453 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Manager.java @@ -0,0 +1,22 @@ +package com.booleanuk.core; + + +public class Manager { + + public Manager() { + + } + + public void changeBasketCapacity() { + + } + + public void addItemToInv() { + + } + + public void removeItemToInv() { + + } + +} \ No newline at end of file diff --git a/src/main/java/com/booleanuk/core/models/domain-model.md b/src/main/java/com/booleanuk/core/models/domain-model.md new file mode 100644 index 000000000..e98885fb8 --- /dev/null +++ b/src/main/java/com/booleanuk/core/models/domain-model.md @@ -0,0 +1,26 @@ +| **Classes** | **Methods** | **Scenario** | **Outputs** | +|-------------|-------------------------------------------|------------------------------------------------------------|------------------------------------------------| +| `Basket` | `addBagel(Bagel bagel)` | If user adds a bagel to an empty basket | Adds the bagel to the basket | +| | | If user adds a bagel and basket is full | Error message: "Basket is full." | +| | `removeBagel(Bagel bagel)` | If user tries to remove a bagel in the basket | Removes the bagel from the basket | +| | | If user tries to remove a bagel not in the basket | Error message: "Item not in basket." | +| | `getTotalCost()` | When the user checks the total cost of the basket | Returns total price of all items in the basket | +| `Bagel` | `getPrice()` | If user checks the price of a specific bagel | Returns price of the bagel | +| | `chooseFillings(List fillings)` | If user selects fillings for a bagel | Updates the bagel with selected fillings | +| | `getFillingCost(List fillings)` | If user checks the cost of fillings | Returns total cost of selected fillings | +| `Manager` | `changeBasketCapacity(int capacity)` | If manager decides to change basket capacity | Updates basket capacity | +| | `addToInventory(Bagel bagel)` | If manager adds new item to inventory not in inventory | Updates inventory | +| | | If manager adds new item which is in inventory | Returns error: "Item already exists." | +| `Customer` | `addBagelToBasket(Bagel bagel)` | If customer adds a bagel to their basket | Adds the bagel to the basket | +| | | If the bagel is out of stock | Returns error: "Bagel out of stock." | +| | | If the bagel is out of stock | Returns error: "Bagel out of stock." | +| | `removeBagelFromBasket(Bagel bagel)` | If customer removes a bagel from their basket | Removes the bagel from the basket | +| | | If the bagel is not in the basket | Returns error: "Bagel not in basket." | +| | `viewTotalCost()` | If customer checks the total cost of items in their basket | Returns total cost of all items in the basket | +| | `viewBagelPrice(Bagel bagel)` | If customer checks the price of a specific bagel | Returns price of the selected bagel | +| | `selectFillings(int option)` | If customer selects fillings for a bagel | Updates the bagel with selected fillings | +| | `viewFillingCost(List fillings)` | If customer checks the cost of selected fillings | Returns total cost of selected fillings | +| | `orderBagelAtSpecificTime` | If customer wants to order bagel before set time | | +| `Inventory` | `addItem` | If manager wants to add new item to inventory | Update inventory | +| | `removeItem` | If manager wants to remove item from inventory | Remove item from inventory | +| `Filling` | `` | | | \ No newline at end of file From 8a4b1fdd09cdb5eaca7241eee196fc8c37bf5bb7 Mon Sep 17 00:00:00 2001 From: Andre Velkov Janusev Date: Mon, 18 Aug 2025 15:17:40 +0200 Subject: [PATCH 2/9] add initial test classes --- src/main/java/com/booleanuk/core/Bagel.java | 4 +- src/main/java/com/booleanuk/core/Basket.java | 51 +++++++++++++++++++ .../java/com/booleanuk/core/Customer.java | 12 +++-- src/main/java/com/booleanuk/core/Filling.java | 18 ++----- src/main/java/com/booleanuk/core/Main.java | 7 +++ .../com/booleanuk/core/models/domain-model.md | 4 +- .../java/com/booleanuk/core/BagelTest.java | 28 ++++++++++ .../java/com/booleanuk/core/BasketTest.java | 46 +++++++++++++++++ .../java/com/booleanuk/core/CustomerTest.java | 32 ++++++++++++ .../java/com/booleanuk/core/FillingTest.java | 41 +++++++++++++++ 10 files changed, 222 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/booleanuk/core/Basket.java create mode 100644 src/main/java/com/booleanuk/core/Main.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/CustomerTest.java create mode 100644 src/test/java/com/booleanuk/core/FillingTest.java diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java index 670acb212..646c2fd1b 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -8,10 +8,10 @@ public class Bagel { private String variant; private int price; private Filling filling; + // TODO: fix -> this -> setter methods - public Bagel(String sku, Filling filling, int price, String variant, String name) { + public Bagel(String sku, int price, String variant, String name) { this.sku = sku; - this.filling = filling; this.price = price; this.variant = variant; this.name = name; 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..e842745a2 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -0,0 +1,51 @@ +package com.booleanuk.core; + +import java.util.ArrayList; + +public class Basket { + private ArrayList bagels = new ArrayList<>(); + private String basketType; + private int capacity; + + public Basket(String basketType, int capacity) { + setBasketType(basketType); + setCapacity(capacity); + } + + public String getBasketType() { + return basketType; + } + + public void setBasketType(String basketType) { + this.basketType = basketType; + } + + public int getCapacity() { + return capacity; + } + + public void setCapacity(int capacity) { + this.capacity = capacity; + } + + public ArrayList getBagels() { + return bagels; + } + + public void setBagels(ArrayList bagels) { + this.bagels = bagels; + } + + public void addBagel(Bagel bagel) { + + } + + public void removeBagel(Bagel bagel) { + + } + + public int getTotalCost() { + return -1; + } + +} diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java index 195e2de3a..0339e8e2d 100644 --- a/src/main/java/com/booleanuk/core/Customer.java +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -1,12 +1,13 @@ package com.booleanuk.core; +import java.sql.Time; import java.util.List; public class Customer { private Basket basket; - public Customer() { - + public Customer(Basket basket) { + this.basket = basket; } public void addBagelToBasket(Bagel bagel) { @@ -34,8 +35,13 @@ public void viewFillingsPrice(List fillings) { } - public void orderBagelAtSpecificTime() { + public String orderBagelAtSpecificTime(Time time) { + + return "Order: " + time + ", Bagel: "; + } + public int returnBasketCapacity() { + return this.basket.getBagels().size(); } } diff --git a/src/main/java/com/booleanuk/core/Filling.java b/src/main/java/com/booleanuk/core/Filling.java index 0d97d5d47..3991e1d42 100644 --- a/src/main/java/com/booleanuk/core/Filling.java +++ b/src/main/java/com/booleanuk/core/Filling.java @@ -1,23 +1,21 @@ package com.booleanuk.core; public class Filling { - private String id; - private int price; + private float price; private String sku; private String variant; - public Filling(String id, int price, String sku, String variant) { - setId(id); + public Filling(float price, String sku, String variant) { setPrice(price); setSku(sku); setVariant(variant); } - public int getPrice() { + public float getPrice() { return price; } - public void setPrice(int price) { + public void setPrice(float price) { this.price = price; } @@ -29,14 +27,6 @@ public void setSku(String sku) { this.sku = sku; } - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - public String getVariant() { return variant; } diff --git a/src/main/java/com/booleanuk/core/Main.java b/src/main/java/com/booleanuk/core/Main.java new file mode 100644 index 000000000..e9f326f0b --- /dev/null +++ b/src/main/java/com/booleanuk/core/Main.java @@ -0,0 +1,7 @@ +package com.booleanuk.core; + +public class Main { + public static void main(String[] args) { + + } +} diff --git a/src/main/java/com/booleanuk/core/models/domain-model.md b/src/main/java/com/booleanuk/core/models/domain-model.md index e98885fb8..f23616c0d 100644 --- a/src/main/java/com/booleanuk/core/models/domain-model.md +++ b/src/main/java/com/booleanuk/core/models/domain-model.md @@ -11,10 +11,10 @@ | `Manager` | `changeBasketCapacity(int capacity)` | If manager decides to change basket capacity | Updates basket capacity | | | `addToInventory(Bagel bagel)` | If manager adds new item to inventory not in inventory | Updates inventory | | | | If manager adds new item which is in inventory | Returns error: "Item already exists." | -| `Customer` | `addBagelToBasket(Bagel bagel)` | If customer adds a bagel to their basket | Adds the bagel to the basket | +| `Customer` | `addBagelToBasket(String stu)` | If customer adds a bagel to their basket | Adds the bagel to the basket | | | | If the bagel is out of stock | Returns error: "Bagel out of stock." | | | | If the bagel is out of stock | Returns error: "Bagel out of stock." | -| | `removeBagelFromBasket(Bagel bagel)` | If customer removes a bagel from their basket | Removes the bagel from the basket | +| | `removeBagelFromBasket(String stu)` | If customer removes a bagel from their basket | Removes the bagel from the basket | | | | If the bagel is not in the basket | Returns error: "Bagel not in basket." | | | `viewTotalCost()` | If customer checks the total cost of items in their basket | Returns total cost of all items in the basket | | | `viewBagelPrice(Bagel bagel)` | If customer checks the price of a specific bagel | Returns price of the selected bagel | 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..bb556a89e --- /dev/null +++ b/src/test/java/com/booleanuk/core/BagelTest.java @@ -0,0 +1,28 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class BagelTest { + + + @Test + public void bagelFillingShouldReturnFillingOrErrorMsg() { + Bagel bagel = new Bagel("test", 10, "nice one", "nice"); + Assertions.assertNotNull(bagel.getFilling()); + Bagel bagel2 = new Bagel("test", 10, "nice one", "nice"); + Filling filling = new Filling(0.5f, "SKU", "niceFilling"); + filling.setPrice(0.13f); + bagel2.setFilling(filling); + Assertions.assertEquals(0.13f, bagel2.getFilling().getPrice()); + } + + @Test + public void getCorrectFillingCost() { + Bagel bagel = new Bagel("test", 10, "nice one", "nice"); + Filling filling = new Filling(0.5f, "SKU", "niceFilling"); + Assertions.assertEquals(10.5, bagel.getPrice()); + filling.setPrice(0.13f); + Assertions.assertEquals(10.13, bagel.getPrice()); + } +} 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..e6fb85e0e --- /dev/null +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -0,0 +1,46 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class BasketTest { + + @Test + public void testBasketConstructor() { + Basket basket = new Basket("small", 10); + + Assertions.assertEquals(10, basket.getCapacity()); + Assertions.assertNotNull(basket.getBasketType()); + Basket basket2 = new Basket("", 0); + Assertions.assertNotEquals(0, basket2.getCapacity()); // Should default to 5; + Assertions.assertNotNull(basket2.getBasketType()); // should default to small + } + + @Test + public void setBasketTypeNotNull() { + Basket basket = new Basket("small", 5); + + basket.setBasketType("medium"); + Assertions.assertNotNull(basket.getBasketType()); + basket.setBasketType(""); + Assertions.assertNotNull(basket.getBasketType()); + basket.setBasketType(" ab"); + Assertions.assertNotNull(basket.getBasketType()); + basket.setBasketType(null); + Assertions.assertNotNull(basket.getBasketType()); + } + + @Test + public void getTotalCostOfBasket() { + Basket basket = new Basket("", 0); + Bagel bagel = new Bagel("test", 10, "nice one", "nice"); + + basket.addBagel(bagel); + Assertions.assertEquals(10, basket.getTotalCost()); + Bagel bagel2 = new Bagel("test2", 55, "good one", "good"); + basket.addBagel(bagel2); + Assertions.assertEquals(65, basket.getTotalCost()); + basket.removeBagel(bagel); + Assertions.assertEquals(55, basket.getTotalCost()); + } +} diff --git a/src/test/java/com/booleanuk/core/CustomerTest.java b/src/test/java/com/booleanuk/core/CustomerTest.java new file mode 100644 index 000000000..49f4e68ef --- /dev/null +++ b/src/test/java/com/booleanuk/core/CustomerTest.java @@ -0,0 +1,32 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.sql.Time; + +public class CustomerTest { + + @Test + public void verifyBasketAfterAddAndRemove() { + Basket basket = new Basket("", 5); + Customer customer = new Customer(basket); + + customer.addBagelToBasket(new Bagel("test1", 10, "test1", "test1")); + customer.addBagelToBasket(new Bagel("2", 4, "test1", "test1")); + Assertions.assertEquals(2, customer.returnBasketCapacity()); + customer.addBagelToBasket(new Bagel("3", 34, "test1", "test1")); + Assertions.assertEquals(3, customer.returnBasketCapacity()); + customer.removeBagelFromBasket(new Bagel("4", 11, "test1", "test1")); + Assertions.assertEquals(2, customer.returnBasketCapacity()); + } + + @Test + public void orderBagelAtSpecificTimeShouldReturnTimeAndBagels() { + Basket basket = new Basket("", 5); + Customer customer = new Customer(basket); + Time time = Time.valueOf("10:00"); + + Assertions.assertEquals("Order: 10:00 , Bagel: ", customer.orderBagelAtSpecificTime(time)); + } +} 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..241f22b07 --- /dev/null +++ b/src/test/java/com/booleanuk/core/FillingTest.java @@ -0,0 +1,41 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class FillingTest { + + @Test + public void testFillingConstructor() { + // Test 1: Ensure constructor initializes correctly + Filling filling = new Filling(10.0f, "SKU123", "Vanilla"); + + Assertions.assertEquals(10.0f, filling.getPrice()); + Assertions.assertEquals("SKU123", filling.getSku()); + Assertions.assertEquals("Vanilla", filling.getVariant()); + } + + @Test + public void testSettersAndGetters() { + // Test 2: Test setters and getters after object creation + Filling filling = new Filling(10.0f, "SKU123", "Vanilla"); + + filling.setPrice(12.5f); + filling.setSku("SKU456"); + filling.setVariant("Chocolate"); + + Assertions.assertEquals(12.5f, filling.getPrice()); + Assertions.assertEquals("SKU456", filling.getSku()); + Assertions.assertEquals("Chocolate", filling.getVariant()); + } + + @Test + public void testNullOrEmptyValues() { + // Test 3: Test setting null or empty values + Filling filling = new Filling(0.0f, "", ""); + + Assertions.assertEquals(0.0f, filling.getPrice()); + Assertions.assertEquals("", filling.getSku()); + Assertions.assertEquals("", filling.getVariant()); + } +} From fc5b05de42c301990bbab7cd0b14c34a8cde7d51 Mon Sep 17 00:00:00 2001 From: Andre Velkov Janusev Date: Tue, 19 Aug 2025 10:04:23 +0200 Subject: [PATCH 3/9] commit base/start of class diagram --- .../com/booleanuk/core/models/domain-model.md | 3 ++- .../java/com/booleanuk/core/models/firstSc.png | Bin 0 -> 69211 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/booleanuk/core/models/firstSc.png diff --git a/src/main/java/com/booleanuk/core/models/domain-model.md b/src/main/java/com/booleanuk/core/models/domain-model.md index f23616c0d..a907ad004 100644 --- a/src/main/java/com/booleanuk/core/models/domain-model.md +++ b/src/main/java/com/booleanuk/core/models/domain-model.md @@ -5,6 +5,7 @@ | | `removeBagel(Bagel bagel)` | If user tries to remove a bagel in the basket | Removes the bagel from the basket | | | | If user tries to remove a bagel not in the basket | Error message: "Item not in basket." | | | `getTotalCost()` | When the user checks the total cost of the basket | Returns total price of all items in the basket | +| | `isBasketFull()` | When customer tries to add new -> check if full | Returns true if full | | `Bagel` | `getPrice()` | If user checks the price of a specific bagel | Returns price of the bagel | | | `chooseFillings(List fillings)` | If user selects fillings for a bagel | Updates the bagel with selected fillings | | | `getFillingCost(List fillings)` | If user checks the cost of fillings | Returns total cost of selected fillings | @@ -23,4 +24,4 @@ | | `orderBagelAtSpecificTime` | If customer wants to order bagel before set time | | | `Inventory` | `addItem` | If manager wants to add new item to inventory | Update inventory | | | `removeItem` | If manager wants to remove item from inventory | Remove item from inventory | -| `Filling` | `` | | | \ No newline at end of file +| `Filling` | `` | | | \ No newline at end of file diff --git a/src/main/java/com/booleanuk/core/models/firstSc.png b/src/main/java/com/booleanuk/core/models/firstSc.png new file mode 100644 index 0000000000000000000000000000000000000000..9e8896fb1108b699dc91b551dfbb679ce4c11d06 GIT binary patch literal 69211 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 literal 0 HcmV?d00001 From 1b80b5d040f4fd1814e12440df096c3aad1e8167 Mon Sep 17 00:00:00 2001 From: Andre Velkov Janusev Date: Tue, 19 Aug 2025 12:08:23 +0200 Subject: [PATCH 4/9] classes passing first testcases, -> further implementation and tuning --- src/main/java/com/booleanuk/core/Bagel.java | 68 +++++++------------ src/main/java/com/booleanuk/core/Basket.java | 18 +++-- .../java/com/booleanuk/core/Customer.java | 29 +++++--- src/main/java/com/booleanuk/core/Filling.java | 36 ++++++---- .../java/com/booleanuk/core/Inventory.java | 20 +++++- src/main/java/com/booleanuk/core/Main.java | 26 +++++++ src/main/java/com/booleanuk/core/Product.java | 47 +++++++++++++ .../java/com/booleanuk/core/BagelTest.java | 23 ++++--- .../java/com/booleanuk/core/BasketTest.java | 9 +-- .../java/com/booleanuk/core/CustomerTest.java | 57 +++++++++++++--- .../java/com/booleanuk/core/FillingTest.java | 19 +++--- 11 files changed, 249 insertions(+), 103 deletions(-) create mode 100644 src/main/java/com/booleanuk/core/Product.java diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java index 646c2fd1b..0da3a2be4 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -2,59 +2,32 @@ import java.util.List; -public class Bagel { - private String sku; - private String name; - private String variant; - private int price; +public class Bagel extends Product { private Filling filling; -// TODO: fix -> this -> setter methods - public Bagel(String sku, int price, String variant, String name) { - this.sku = sku; - this.price = price; - this.variant = variant; - this.name = name; - } - - public Bagel() { - - } + public Bagel(String sku, float price, String variant) { + super(sku, price, variant); - public String getSku() { - return sku; + setPrice(price); } - public void setSku(String sku) { - this.sku = sku; - } - - public String getName() { - return name; - } + public void setPrice(float price) { + if (price <= 0) + throw new IllegalArgumentException("Price must be more than 0"); - public void setName(String name) { - this.name = name; + super.setPrice(price); } - public String getVariant() { - return variant; - } - - public void setVariant(String variant) { - this.variant = variant; - } - - public int getPrice() { - return price; - } - - public void setPrice(int price) { - this.price = price; + @Override + public float getPrice() { + if (filling != null) + return super.getPrice() + filling.getPrice(); + else + return super.getPrice(); } public Filling getFilling() { - return filling; + return this.filling; } public void setFilling(Filling filling) { @@ -65,9 +38,16 @@ public void chooseFilling(List fillings){ } - public void getFillingCost(List fillings) { - + public float getFillingCost() { + return (this.filling != null) ? this.filling.getPrice() : 0f; } +// public int getBagelTotPrice() { +// return 0; +// } + @Override + public String toString() { + return this.getVariant(); + } } diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index e842745a2..8b201f660 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -17,6 +17,9 @@ public String getBasketType() { } public void setBasketType(String basketType) { + if (basketType == null || basketType.toLowerCase().trim().isEmpty()) + basketType = "small"; + this.basketType = basketType; } @@ -25,6 +28,9 @@ public int getCapacity() { } public void setCapacity(int capacity) { + if (capacity <= 0) + capacity = 5; + this.capacity = capacity; } @@ -37,15 +43,19 @@ public void setBagels(ArrayList bagels) { } public void addBagel(Bagel bagel) { - + bagels.add(bagel); } public void removeBagel(Bagel bagel) { - + bagels.remove(bagel); } - public int getTotalCost() { - return -1; + public float getTotalCost() { + float totCost = 0; + for (Bagel bagel: bagels) + totCost += bagel.getPrice(); + + return totCost; } } diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java index 0339e8e2d..687dd020d 100644 --- a/src/main/java/com/booleanuk/core/Customer.java +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -1,29 +1,41 @@ package com.booleanuk.core; import java.sql.Time; +import java.util.ArrayList; import java.util.List; public class Customer { - private Basket basket; + private Basket basket = null; public Customer(Basket basket) { this.basket = basket; } public void addBagelToBasket(Bagel bagel) { - + basket.addBagel(bagel); } public void removeBagelFromBasket(Bagel bagel) { - + basket.removeBagel(bagel); } - public void viewTotalCost() { + public float getTotalCost() { + ArrayList bagels = basket.getBagels(); + + float totCost = 0; + for (Bagel bagel : bagels) + totCost += bagel.getPrice(); + return totCost; } - public void viewBagelPrice() { + public float getBagelPrice(Bagel bagel) { + ArrayList bagels = basket.getBagels(); + for (Bagel b : bagels) + if (b.getSku().equals(bagel.getSku())) + return b.getPrice(); + return -1; } public int selectFillings(int option) { @@ -35,12 +47,11 @@ public void viewFillingsPrice(List fillings) { } - public String orderBagelAtSpecificTime(Time time) { - - return "Order: " + time + ", Bagel: "; + public String orderBagelAtSpecificTime(Time time, Bagel bagel) { + return "Order: " + time + ", Bagel: " + bagel.toString(); } - public int returnBasketCapacity() { + public int getAmountOfBagelsInBasket() { return this.basket.getBagels().size(); } diff --git a/src/main/java/com/booleanuk/core/Filling.java b/src/main/java/com/booleanuk/core/Filling.java index 3991e1d42..2ad604f3e 100644 --- a/src/main/java/com/booleanuk/core/Filling.java +++ b/src/main/java/com/booleanuk/core/Filling.java @@ -1,38 +1,50 @@ package com.booleanuk.core; -public class Filling { - private float price; - private String sku; - private String variant; +public class Filling extends Product { + + public Filling(String sku, float price, String variant) { + super(sku, price, variant); - public Filling(float price, String sku, String variant) { setPrice(price); setSku(sku); - setVariant(variant); } public float getPrice() { - return price; + return super.getPrice(); } public void setPrice(float price) { - this.price = price; + if (price < 0) + price = 1f; + super.setPrice(price); } public String getSku() { - return sku; + return super.getSku(); } public void setSku(String sku) { - this.sku = sku; + if (sku.toUpperCase().trim().isEmpty()) + sku = "FIL"; + + String upperCase = sku.toUpperCase().trim(); + + super.setSku(upperCase); } public String getVariant() { - return variant; + return super.getVariant(); } public void setVariant(String variant) { - this.variant = variant; + if (variant.trim().isEmpty()) + variant = "plain"; + + super.setVariant(variant); } + @Override + public String toString() { + return this.getVariant(); + } } \ No newline at end of file diff --git a/src/main/java/com/booleanuk/core/Inventory.java b/src/main/java/com/booleanuk/core/Inventory.java index 319942bea..2729cbf20 100644 --- a/src/main/java/com/booleanuk/core/Inventory.java +++ b/src/main/java/com/booleanuk/core/Inventory.java @@ -4,14 +4,28 @@ import java.util.List; public class Inventory { - private List inventoryList = new ArrayList<>(); + private List products = new ArrayList<>(); - public void addItem() { + public void addProduct(Product product) { + products.add(product); + } + + public void removeProduct(Product product) { } - public void removeItem() { + public List getInventoryList() { + return this.products; + } + public void printInventory() { + for (Product p : products) { + System.out.println(p); +// if (p instanceof Bagel) { +// System.out.println("ISSA BAGEL"); +// } + } } + } diff --git a/src/main/java/com/booleanuk/core/Main.java b/src/main/java/com/booleanuk/core/Main.java index e9f326f0b..7beaf65e8 100644 --- a/src/main/java/com/booleanuk/core/Main.java +++ b/src/main/java/com/booleanuk/core/Main.java @@ -2,6 +2,32 @@ public class Main { public static void main(String[] args) { + Inventory inventory = new Inventory(); + // Load inventory on start + loadInventoryOnStart(inventory); + inventory.printInventory(); + + + } + + public static void loadInventoryOnStart(Inventory inventory) { + // Add all items to the inventory + + // Add Bagels + inventory.addProduct(new Bagel("BGLO", 0.49f, "Onion")); + inventory.addProduct(new Bagel("BGLP", 0.39f, "Plain")); + inventory.addProduct(new Bagel("BGLE", 0.49f, "Everything")); + inventory.addProduct(new Bagel("BGLS", 0.49f, "Sesame")); + + // Add Fillings + inventory.addProduct(new Filling("FILB", 0.12f, "Bacon")); + inventory.addProduct(new Filling("FILE", 0.12f, "Egg")); + inventory.addProduct(new Filling("FILC", 0.12f, "Cheese")); + inventory.addProduct(new Filling("FILX", 0.12f, "Cream Cheese")); + inventory.addProduct(new Filling("FILS", 0.12f, "Smoked Salmon")); + inventory.addProduct(new Filling("FILH", 0.12f, "Ham")); + + // Add Coffees } } diff --git a/src/main/java/com/booleanuk/core/Product.java b/src/main/java/com/booleanuk/core/Product.java new file mode 100644 index 000000000..0b6091df9 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Product.java @@ -0,0 +1,47 @@ +package com.booleanuk.core; + +public class Product { + private String sku; + private float price; + private String variant; + + public Product(String sku, float price, String variant) { + setSku(sku); + setPrice(price); + setVariant(variant); + } + + // Getters and setters + public String getSku() { + return sku; + } + + public void setSku(String sku) { + this.sku = sku; + } + + public float getPrice() { + return this.price; + } + + public void setPrice(float price) { + if (price == 0f || price < 0f) { + throw new IllegalArgumentException("Price must be greater than zero"); + } + + this.price = price; + } + + public String getVariant() { + return variant; + } + + public void setVariant(String variant) { + this.variant = variant; + } + + @Override + public String toString() { + return "Product [SKU=" + sku + ", Price=" + price + ", Variant=" + variant + "]"; + } +} diff --git a/src/test/java/com/booleanuk/core/BagelTest.java b/src/test/java/com/booleanuk/core/BagelTest.java index bb556a89e..aee492abb 100644 --- a/src/test/java/com/booleanuk/core/BagelTest.java +++ b/src/test/java/com/booleanuk/core/BagelTest.java @@ -8,10 +8,11 @@ public class BagelTest { @Test public void bagelFillingShouldReturnFillingOrErrorMsg() { - Bagel bagel = new Bagel("test", 10, "nice one", "nice"); - Assertions.assertNotNull(bagel.getFilling()); - Bagel bagel2 = new Bagel("test", 10, "nice one", "nice"); - Filling filling = new Filling(0.5f, "SKU", "niceFilling"); + Bagel bagel = new Bagel("test", 10, "nice one"); + Assertions.assertNull(bagel.getFilling()); + Bagel bagel2 = new Bagel("test", 10, "nice one"); + Filling filling = new Filling("SKU", 0.5f, "filling"); + Assertions.assertEquals(0.5f, filling.getPrice()); filling.setPrice(0.13f); bagel2.setFilling(filling); Assertions.assertEquals(0.13f, bagel2.getFilling().getPrice()); @@ -19,10 +20,16 @@ public void bagelFillingShouldReturnFillingOrErrorMsg() { @Test public void getCorrectFillingCost() { - Bagel bagel = new Bagel("test", 10, "nice one", "nice"); - Filling filling = new Filling(0.5f, "SKU", "niceFilling"); - Assertions.assertEquals(10.5, bagel.getPrice()); + Bagel bagel = new Bagel("SKU1", 10f, "nice one"); + Filling filling = new Filling("SKU", 0.5f, "filling"); + Assertions.assertEquals(10f, bagel.getPrice()); + bagel.setFilling(filling); + Assertions.assertEquals(10.5f, bagel.getPrice()); filling.setPrice(0.13f); - Assertions.assertEquals(10.13, bagel.getPrice()); + Assertions.assertEquals(10.13f, bagel.getPrice()); + + Assertions.assertThrows(IllegalArgumentException.class, () -> bagel.setPrice(0)); + Assertions.assertDoesNotThrow(() -> bagel.setPrice(1)); } + } diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index e6fb85e0e..f6be75f7f 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -8,11 +8,12 @@ public class BasketTest { @Test public void testBasketConstructor() { Basket basket = new Basket("small", 10); - Assertions.assertEquals(10, basket.getCapacity()); Assertions.assertNotNull(basket.getBasketType()); - Basket basket2 = new Basket("", 0); + + Basket basket2 = new Basket(" ", 0); Assertions.assertNotEquals(0, basket2.getCapacity()); // Should default to 5; + Assertions.assertEquals(5, basket2.getCapacity()); Assertions.assertNotNull(basket2.getBasketType()); // should default to small } @@ -33,11 +34,11 @@ public void setBasketTypeNotNull() { @Test public void getTotalCostOfBasket() { Basket basket = new Basket("", 0); - Bagel bagel = new Bagel("test", 10, "nice one", "nice"); + Bagel bagel = new Bagel("sku", 10, "nice one"); basket.addBagel(bagel); Assertions.assertEquals(10, basket.getTotalCost()); - Bagel bagel2 = new Bagel("test2", 55, "good one", "good"); + Bagel bagel2 = new Bagel("sku2", 55, "good one"); basket.addBagel(bagel2); Assertions.assertEquals(65, basket.getTotalCost()); basket.removeBagel(bagel); diff --git a/src/test/java/com/booleanuk/core/CustomerTest.java b/src/test/java/com/booleanuk/core/CustomerTest.java index 49f4e68ef..b477ed23c 100644 --- a/src/test/java/com/booleanuk/core/CustomerTest.java +++ b/src/test/java/com/booleanuk/core/CustomerTest.java @@ -12,21 +12,60 @@ public void verifyBasketAfterAddAndRemove() { Basket basket = new Basket("", 5); Customer customer = new Customer(basket); - customer.addBagelToBasket(new Bagel("test1", 10, "test1", "test1")); - customer.addBagelToBasket(new Bagel("2", 4, "test1", "test1")); - Assertions.assertEquals(2, customer.returnBasketCapacity()); - customer.addBagelToBasket(new Bagel("3", 34, "test1", "test1")); - Assertions.assertEquals(3, customer.returnBasketCapacity()); - customer.removeBagelFromBasket(new Bagel("4", 11, "test1", "test1")); - Assertions.assertEquals(2, customer.returnBasketCapacity()); + Bagel bagel = new Bagel("new", 5, "test"); + + customer.addBagelToBasket(new Bagel("test1", 10, "test1")); + customer.addBagelToBasket(new Bagel("2", 4, "test1")); + Assertions.assertEquals(2, customer.getAmountOfBagelsInBasket()); + customer.addBagelToBasket(bagel); + Assertions.assertEquals(3, customer.getAmountOfBagelsInBasket()); + customer.removeBagelFromBasket(new Bagel("4", 11, "test1")); + Assertions.assertEquals(3, customer.getAmountOfBagelsInBasket()); + customer.removeBagelFromBasket(bagel); + Assertions.assertEquals(2, customer.getAmountOfBagelsInBasket()); } @Test public void orderBagelAtSpecificTimeShouldReturnTimeAndBagels() { Basket basket = new Basket("", 5); Customer customer = new Customer(basket); - Time time = Time.valueOf("10:00"); + Bagel bagel = new Bagel("SKU123", 10f, "NICEUU"); + customer.addBagelToBasket(bagel); + Time time = Time.valueOf("10:00:00"); + Assertions.assertEquals("Order: 10:00:00, Bagel: NICEUU", customer.orderBagelAtSpecificTime(time, bagel)); + } + + @Test + public void getCorrectTotalCostOfCustomerBasket() { + Customer customer = new Customer(new Basket("", 5)); + customer.addBagelToBasket(new Bagel("test1", 10, "test1")); + customer.addBagelToBasket(new Bagel("2", 4, "test1")); + + Bagel bagel = new Bagel("SKU123", 14f, "NIce one"); + Filling filling = new Filling("SKU123", 0.8f, "Chocolate"); + bagel.setFilling(filling); + customer.addBagelToBasket(bagel); + + Assertions.assertEquals(28.8f, customer.getTotalCost()); + customer.removeBagelFromBasket(bagel); + Assertions.assertEquals(14, customer.getTotalCost()); + } + + @Test + public void getSingleBagelPriceFromBasket() { + Customer customer = new Customer(new Basket("", 5)); + customer.addBagelToBasket(new Bagel("test1", 10, "test1")); + customer.addBagelToBasket(new Bagel("2", 4, "test1")); + + Bagel bagel = new Bagel("SKU123", 14f, "NIce one"); + Filling filling = new Filling("SKU123", 0.8f, "Chocolate"); + bagel.setFilling(filling); + customer.addBagelToBasket(bagel); + + Assertions.assertEquals(14.8f, customer.getBagelPrice(bagel)); + customer.removeBagelFromBasket(bagel); + Assertions.assertNotEquals(14.8f, customer.getBagelPrice(bagel)); + Assertions.assertEquals(-1, customer.getBagelPrice(bagel)); - Assertions.assertEquals("Order: 10:00 , Bagel: ", customer.orderBagelAtSpecificTime(time)); } } diff --git a/src/test/java/com/booleanuk/core/FillingTest.java b/src/test/java/com/booleanuk/core/FillingTest.java index 241f22b07..79c5c88ce 100644 --- a/src/test/java/com/booleanuk/core/FillingTest.java +++ b/src/test/java/com/booleanuk/core/FillingTest.java @@ -7,8 +7,7 @@ public class FillingTest { @Test public void testFillingConstructor() { - // Test 1: Ensure constructor initializes correctly - Filling filling = new Filling(10.0f, "SKU123", "Vanilla"); + Filling filling = new Filling("sku123", 10.0f, "Vanilla"); Assertions.assertEquals(10.0f, filling.getPrice()); Assertions.assertEquals("SKU123", filling.getSku()); @@ -17,8 +16,7 @@ public void testFillingConstructor() { @Test public void testSettersAndGetters() { - // Test 2: Test setters and getters after object creation - Filling filling = new Filling(10.0f, "SKU123", "Vanilla"); + Filling filling = new Filling("sku123", 10.0f, "Vanilla"); filling.setPrice(12.5f); filling.setSku("SKU456"); @@ -31,11 +29,12 @@ public void testSettersAndGetters() { @Test public void testNullOrEmptyValues() { - // Test 3: Test setting null or empty values - Filling filling = new Filling(0.0f, "", ""); - - Assertions.assertEquals(0.0f, filling.getPrice()); - Assertions.assertEquals("", filling.getSku()); - Assertions.assertEquals("", filling.getVariant()); + Assertions.assertThrows(IllegalArgumentException.class, () -> { + new Filling("", 0.0f, ""); + }); + Filling filling = new Filling("", -1f, ""); + Assertions.assertEquals(1f, filling.getPrice()); //defaults + Assertions.assertEquals("FIL", filling.getSku()); //defaults + Assertions.assertEquals("plain", filling.getVariant()); //defaults } } From c4280f8390871539f62861ef48d0eb175c5ce889 Mon Sep 17 00:00:00 2001 From: Andre Velkov Janusev Date: Tue, 19 Aug 2025 12:28:17 +0200 Subject: [PATCH 5/9] add test classes for inventory and product, --- .../java/com/booleanuk/core/Inventory.java | 2 +- .../java/com/booleanuk/core/BagelTest.java | 18 +++---- .../java/com/booleanuk/core/BasketTest.java | 26 +++++----- .../java/com/booleanuk/core/CustomerTest.java | 22 ++++---- .../java/com/booleanuk/core/FillingTest.java | 22 ++++---- .../com/booleanuk/core/InventoryTest.java | 52 +++++++++++++++++++ .../java/com/booleanuk/core/ProductTest.java | 35 +++++++++++++ 7 files changed, 132 insertions(+), 45 deletions(-) create mode 100644 src/test/java/com/booleanuk/core/InventoryTest.java create mode 100644 src/test/java/com/booleanuk/core/ProductTest.java diff --git a/src/main/java/com/booleanuk/core/Inventory.java b/src/main/java/com/booleanuk/core/Inventory.java index 2729cbf20..379a3936a 100644 --- a/src/main/java/com/booleanuk/core/Inventory.java +++ b/src/main/java/com/booleanuk/core/Inventory.java @@ -12,7 +12,7 @@ public void addProduct(Product product) { } public void removeProduct(Product product) { - + products.remove(product); } public List getInventoryList() { diff --git a/src/test/java/com/booleanuk/core/BagelTest.java b/src/test/java/com/booleanuk/core/BagelTest.java index aee492abb..043bbdbb9 100644 --- a/src/test/java/com/booleanuk/core/BagelTest.java +++ b/src/test/java/com/booleanuk/core/BagelTest.java @@ -1,6 +1,6 @@ package com.booleanuk.core; -import org.junit.jupiter.api.Assertions; +import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; public class BagelTest { @@ -9,27 +9,27 @@ public class BagelTest { @Test public void bagelFillingShouldReturnFillingOrErrorMsg() { Bagel bagel = new Bagel("test", 10, "nice one"); - Assertions.assertNull(bagel.getFilling()); + assertNull(bagel.getFilling()); Bagel bagel2 = new Bagel("test", 10, "nice one"); Filling filling = new Filling("SKU", 0.5f, "filling"); - Assertions.assertEquals(0.5f, filling.getPrice()); + assertEquals(0.5f, filling.getPrice()); filling.setPrice(0.13f); bagel2.setFilling(filling); - Assertions.assertEquals(0.13f, bagel2.getFilling().getPrice()); + assertEquals(0.13f, bagel2.getFilling().getPrice()); } @Test public void getCorrectFillingCost() { Bagel bagel = new Bagel("SKU1", 10f, "nice one"); Filling filling = new Filling("SKU", 0.5f, "filling"); - Assertions.assertEquals(10f, bagel.getPrice()); + assertEquals(10f, bagel.getPrice()); bagel.setFilling(filling); - Assertions.assertEquals(10.5f, bagel.getPrice()); + assertEquals(10.5f, bagel.getPrice()); filling.setPrice(0.13f); - Assertions.assertEquals(10.13f, bagel.getPrice()); + assertEquals(10.13f, bagel.getPrice()); - Assertions.assertThrows(IllegalArgumentException.class, () -> bagel.setPrice(0)); - Assertions.assertDoesNotThrow(() -> bagel.setPrice(1)); + assertThrows(IllegalArgumentException.class, () -> bagel.setPrice(0)); + assertDoesNotThrow(() -> bagel.setPrice(1)); } } diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index f6be75f7f..f463cce7b 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -1,6 +1,6 @@ package com.booleanuk.core; -import org.junit.jupiter.api.Assertions; +import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; public class BasketTest { @@ -8,13 +8,13 @@ public class BasketTest { @Test public void testBasketConstructor() { Basket basket = new Basket("small", 10); - Assertions.assertEquals(10, basket.getCapacity()); - Assertions.assertNotNull(basket.getBasketType()); + assertEquals(10, basket.getCapacity()); + assertNotNull(basket.getBasketType()); Basket basket2 = new Basket(" ", 0); - Assertions.assertNotEquals(0, basket2.getCapacity()); // Should default to 5; - Assertions.assertEquals(5, basket2.getCapacity()); - Assertions.assertNotNull(basket2.getBasketType()); // should default to small + assertNotEquals(0, basket2.getCapacity()); // Should default to 5; + assertEquals(5, basket2.getCapacity()); + assertNotNull(basket2.getBasketType()); // should default to small } @Test @@ -22,13 +22,13 @@ public void setBasketTypeNotNull() { Basket basket = new Basket("small", 5); basket.setBasketType("medium"); - Assertions.assertNotNull(basket.getBasketType()); + assertNotNull(basket.getBasketType()); basket.setBasketType(""); - Assertions.assertNotNull(basket.getBasketType()); + assertNotNull(basket.getBasketType()); basket.setBasketType(" ab"); - Assertions.assertNotNull(basket.getBasketType()); + assertNotNull(basket.getBasketType()); basket.setBasketType(null); - Assertions.assertNotNull(basket.getBasketType()); + assertNotNull(basket.getBasketType()); } @Test @@ -37,11 +37,11 @@ public void getTotalCostOfBasket() { Bagel bagel = new Bagel("sku", 10, "nice one"); basket.addBagel(bagel); - Assertions.assertEquals(10, basket.getTotalCost()); + assertEquals(10, basket.getTotalCost()); Bagel bagel2 = new Bagel("sku2", 55, "good one"); basket.addBagel(bagel2); - Assertions.assertEquals(65, basket.getTotalCost()); + assertEquals(65, basket.getTotalCost()); basket.removeBagel(bagel); - Assertions.assertEquals(55, basket.getTotalCost()); + assertEquals(55, basket.getTotalCost()); } } diff --git a/src/test/java/com/booleanuk/core/CustomerTest.java b/src/test/java/com/booleanuk/core/CustomerTest.java index b477ed23c..ca103803a 100644 --- a/src/test/java/com/booleanuk/core/CustomerTest.java +++ b/src/test/java/com/booleanuk/core/CustomerTest.java @@ -1,6 +1,6 @@ package com.booleanuk.core; -import org.junit.jupiter.api.Assertions; +import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; import java.sql.Time; @@ -16,13 +16,13 @@ public void verifyBasketAfterAddAndRemove() { customer.addBagelToBasket(new Bagel("test1", 10, "test1")); customer.addBagelToBasket(new Bagel("2", 4, "test1")); - Assertions.assertEquals(2, customer.getAmountOfBagelsInBasket()); + assertEquals(2, customer.getAmountOfBagelsInBasket()); customer.addBagelToBasket(bagel); - Assertions.assertEquals(3, customer.getAmountOfBagelsInBasket()); + assertEquals(3, customer.getAmountOfBagelsInBasket()); customer.removeBagelFromBasket(new Bagel("4", 11, "test1")); - Assertions.assertEquals(3, customer.getAmountOfBagelsInBasket()); + assertEquals(3, customer.getAmountOfBagelsInBasket()); customer.removeBagelFromBasket(bagel); - Assertions.assertEquals(2, customer.getAmountOfBagelsInBasket()); + assertEquals(2, customer.getAmountOfBagelsInBasket()); } @Test @@ -32,7 +32,7 @@ public void orderBagelAtSpecificTimeShouldReturnTimeAndBagels() { Bagel bagel = new Bagel("SKU123", 10f, "NICEUU"); customer.addBagelToBasket(bagel); Time time = Time.valueOf("10:00:00"); - Assertions.assertEquals("Order: 10:00:00, Bagel: NICEUU", customer.orderBagelAtSpecificTime(time, bagel)); + assertEquals("Order: 10:00:00, Bagel: NICEUU", customer.orderBagelAtSpecificTime(time, bagel)); } @Test @@ -46,9 +46,9 @@ public void getCorrectTotalCostOfCustomerBasket() { bagel.setFilling(filling); customer.addBagelToBasket(bagel); - Assertions.assertEquals(28.8f, customer.getTotalCost()); + assertEquals(28.8f, customer.getTotalCost()); customer.removeBagelFromBasket(bagel); - Assertions.assertEquals(14, customer.getTotalCost()); + assertEquals(14, customer.getTotalCost()); } @Test @@ -62,10 +62,10 @@ public void getSingleBagelPriceFromBasket() { bagel.setFilling(filling); customer.addBagelToBasket(bagel); - Assertions.assertEquals(14.8f, customer.getBagelPrice(bagel)); + assertEquals(14.8f, customer.getBagelPrice(bagel)); customer.removeBagelFromBasket(bagel); - Assertions.assertNotEquals(14.8f, customer.getBagelPrice(bagel)); - Assertions.assertEquals(-1, customer.getBagelPrice(bagel)); + assertNotEquals(14.8f, customer.getBagelPrice(bagel)); + assertEquals(-1, customer.getBagelPrice(bagel)); } } diff --git a/src/test/java/com/booleanuk/core/FillingTest.java b/src/test/java/com/booleanuk/core/FillingTest.java index 79c5c88ce..352b64e43 100644 --- a/src/test/java/com/booleanuk/core/FillingTest.java +++ b/src/test/java/com/booleanuk/core/FillingTest.java @@ -1,6 +1,6 @@ package com.booleanuk.core; -import org.junit.jupiter.api.Assertions; +import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; public class FillingTest { @@ -9,9 +9,9 @@ public class FillingTest { public void testFillingConstructor() { Filling filling = new Filling("sku123", 10.0f, "Vanilla"); - Assertions.assertEquals(10.0f, filling.getPrice()); - Assertions.assertEquals("SKU123", filling.getSku()); - Assertions.assertEquals("Vanilla", filling.getVariant()); + assertEquals(10.0f, filling.getPrice()); + assertEquals("SKU123", filling.getSku()); + assertEquals("Vanilla", filling.getVariant()); } @Test @@ -22,19 +22,19 @@ public void testSettersAndGetters() { filling.setSku("SKU456"); filling.setVariant("Chocolate"); - Assertions.assertEquals(12.5f, filling.getPrice()); - Assertions.assertEquals("SKU456", filling.getSku()); - Assertions.assertEquals("Chocolate", filling.getVariant()); + assertEquals(12.5f, filling.getPrice()); + assertEquals("SKU456", filling.getSku()); + assertEquals("Chocolate", filling.getVariant()); } @Test public void testNullOrEmptyValues() { - Assertions.assertThrows(IllegalArgumentException.class, () -> { + assertThrows(IllegalArgumentException.class, () -> { new Filling("", 0.0f, ""); }); Filling filling = new Filling("", -1f, ""); - Assertions.assertEquals(1f, filling.getPrice()); //defaults - Assertions.assertEquals("FIL", filling.getSku()); //defaults - Assertions.assertEquals("plain", filling.getVariant()); //defaults + assertEquals(1f, filling.getPrice()); //defaults + assertEquals("FIL", filling.getSku()); //defaults + assertEquals("plain", filling.getVariant()); //defaults } } diff --git a/src/test/java/com/booleanuk/core/InventoryTest.java b/src/test/java/com/booleanuk/core/InventoryTest.java new file mode 100644 index 000000000..58ee7c108 --- /dev/null +++ b/src/test/java/com/booleanuk/core/InventoryTest.java @@ -0,0 +1,52 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; +import java.util.List; + +public class InventoryTest { + + @Test + public void testAddProductToInventory() { + Inventory inventory = new Inventory(); + Product product = new Product("ABC123", 99.99f, "Red"); + + inventory.addProduct(product); + List products = inventory.getInventoryList(); + assertEquals(1, products.size()); // 1 product in the inventory + assertEquals(product, products.get(0)); // + } + + @Test + public void testGetInventoryList() { + Inventory inventory = new Inventory(); + Product product1 = new Product("ABC123", 99.99f, "Red"); + Product product2 = new Product("DEF456", 29.99f, "Blue"); + + inventory.addProduct(product1); + inventory.addProduct(product2); + + List products = inventory.getInventoryList(); + assertEquals(2, products.size()); // 2 products + assertTrue(products.contains(product1)); + assertTrue(products.contains(product2)); + } + + @Test + public void testRemoveProductFromInventory() { + Inventory inventory = new Inventory(); + Product product1 = new Product("ABC123", 99.99f, "Red"); + Product product2 = new Product("DEF456", 29.99f, "Blue"); + + inventory.addProduct(product1); + inventory.addProduct(product2); + + inventory.removeProduct(product1); + + List products = inventory.getInventoryList(); + assertEquals(1, products.size()); // 1 product + assertFalse(products.contains(product1)); // false + assertTrue(products.contains(product2)); // true + } +} + diff --git a/src/test/java/com/booleanuk/core/ProductTest.java b/src/test/java/com/booleanuk/core/ProductTest.java new file mode 100644 index 000000000..bfd8c6345 --- /dev/null +++ b/src/test/java/com/booleanuk/core/ProductTest.java @@ -0,0 +1,35 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +public class ProductTest { + + @Test + public void testProductCreationWithValidData() { + Product product = new Product("ABC123", 99.99f, "Red"); + + // Check if the product's SKU, price, and variant are set correctly + assertEquals("ABC123", product.getSku()); + assertEquals(99.99f, product.getPrice()); + assertEquals("Red", product.getVariant()); + + product.setSku("ABC"); + assertEquals("ABC", product.getSku()); + } + + @Test + public void testSetPriceThrowsExceptionForNegativePrice() { + assertThrows(IllegalArgumentException.class, () -> { + new Product("XYZ456", -50f, "Blue"); + }); + } + + @Test + public void testSetPriceThrowsExceptionForZeroPrice() { + assertThrows(IllegalArgumentException.class, () -> { + new Product("XYZ456", 0f, "Blue"); + }); + } +} + From 0f092b1cd271281451338f3f18a5c065d0aa919e Mon Sep 17 00:00:00 2001 From: Andre Velkov Janusev Date: Tue, 19 Aug 2025 13:17:20 +0200 Subject: [PATCH 6/9] change Product to abstract --- src/main/java/com/booleanuk/core/Bagel.java | 4 ---- src/main/java/com/booleanuk/core/Product.java | 2 +- src/test/java/com/booleanuk/core/InventoryTest.java | 10 +++++----- src/test/java/com/booleanuk/core/ProductTest.java | 6 +++--- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java index 0da3a2be4..51720c47f 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -42,10 +42,6 @@ public float getFillingCost() { return (this.filling != null) ? this.filling.getPrice() : 0f; } -// public int getBagelTotPrice() { -// return 0; -// } - @Override public String toString() { return this.getVariant(); diff --git a/src/main/java/com/booleanuk/core/Product.java b/src/main/java/com/booleanuk/core/Product.java index 0b6091df9..25e93ebe1 100644 --- a/src/main/java/com/booleanuk/core/Product.java +++ b/src/main/java/com/booleanuk/core/Product.java @@ -1,6 +1,6 @@ package com.booleanuk.core; -public class Product { +public abstract class Product { private String sku; private float price; private String variant; diff --git a/src/test/java/com/booleanuk/core/InventoryTest.java b/src/test/java/com/booleanuk/core/InventoryTest.java index 58ee7c108..9d3980eeb 100644 --- a/src/test/java/com/booleanuk/core/InventoryTest.java +++ b/src/test/java/com/booleanuk/core/InventoryTest.java @@ -9,7 +9,7 @@ public class InventoryTest { @Test public void testAddProductToInventory() { Inventory inventory = new Inventory(); - Product product = new Product("ABC123", 99.99f, "Red"); + Product product = new Bagel("ABC123", 99.99f, "Red"); inventory.addProduct(product); List products = inventory.getInventoryList(); @@ -20,8 +20,8 @@ public void testAddProductToInventory() { @Test public void testGetInventoryList() { Inventory inventory = new Inventory(); - Product product1 = new Product("ABC123", 99.99f, "Red"); - Product product2 = new Product("DEF456", 29.99f, "Blue"); + Product product1 = new Bagel("ABC123", 99.99f, "Red"); + Product product2 = new Bagel("DEF456", 29.99f, "Blue"); inventory.addProduct(product1); inventory.addProduct(product2); @@ -35,8 +35,8 @@ public void testGetInventoryList() { @Test public void testRemoveProductFromInventory() { Inventory inventory = new Inventory(); - Product product1 = new Product("ABC123", 99.99f, "Red"); - Product product2 = new Product("DEF456", 29.99f, "Blue"); + Product product1 = new Bagel("ABC123", 99.99f, "Red"); + Product product2 = new Bagel("DEF456", 29.99f, "Blue"); inventory.addProduct(product1); inventory.addProduct(product2); diff --git a/src/test/java/com/booleanuk/core/ProductTest.java b/src/test/java/com/booleanuk/core/ProductTest.java index bfd8c6345..6b95dee4a 100644 --- a/src/test/java/com/booleanuk/core/ProductTest.java +++ b/src/test/java/com/booleanuk/core/ProductTest.java @@ -7,7 +7,7 @@ public class ProductTest { @Test public void testProductCreationWithValidData() { - Product product = new Product("ABC123", 99.99f, "Red"); + Product product = new Bagel("ABC123", 99.99f, "Red"); // Check if the product's SKU, price, and variant are set correctly assertEquals("ABC123", product.getSku()); @@ -21,14 +21,14 @@ public void testProductCreationWithValidData() { @Test public void testSetPriceThrowsExceptionForNegativePrice() { assertThrows(IllegalArgumentException.class, () -> { - new Product("XYZ456", -50f, "Blue"); + new Bagel("XYZ456", -50f, "Blue"); }); } @Test public void testSetPriceThrowsExceptionForZeroPrice() { assertThrows(IllegalArgumentException.class, () -> { - new Product("XYZ456", 0f, "Blue"); + new Bagel("XYZ456", 0f, "Blue"); }); } } From 8405bf51adf02565056af1303b4bf1cb51e28e0c Mon Sep 17 00:00:00 2001 From: Andre Velkov Janusev Date: Tue, 19 Aug 2025 16:44:10 +0200 Subject: [PATCH 7/9] passes tests and created user story scenarios to run in main --- src/main/java/com/booleanuk/core/Bagel.java | 10 +-- src/main/java/com/booleanuk/core/Basket.java | 20 +++-- .../java/com/booleanuk/core/Customer.java | 56 ++++++++++-- src/main/java/com/booleanuk/core/Filling.java | 4 +- .../java/com/booleanuk/core/Inventory.java | 8 +- src/main/java/com/booleanuk/core/Main.java | 87 +++++++++++++++---- src/main/java/com/booleanuk/core/Manager.java | 17 ++-- src/main/java/com/booleanuk/core/Product.java | 12 ++- .../java/com/booleanuk/core/BagelTest.java | 10 +-- .../java/com/booleanuk/core/BasketTest.java | 4 +- .../java/com/booleanuk/core/CustomerTest.java | 52 +++++++---- .../java/com/booleanuk/core/FillingTest.java | 8 +- .../com/booleanuk/core/InventoryTest.java | 10 +-- .../java/com/booleanuk/core/ProductTest.java | 6 +- .../java/com/booleanuk/core/TestHelper.java | 29 +++++++ 15 files changed, 245 insertions(+), 88 deletions(-) create mode 100644 src/test/java/com/booleanuk/core/TestHelper.java diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java index 51720c47f..256cb754e 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -1,12 +1,10 @@ package com.booleanuk.core; -import java.util.List; - public class Bagel extends Product { private Filling filling; - public Bagel(String sku, float price, String variant) { - super(sku, price, variant); + public Bagel(String sku, float price, String variant, ProductType type) { + super(sku, price, variant, type); setPrice(price); } @@ -34,10 +32,6 @@ public void setFilling(Filling filling) { this.filling = filling; } - public void chooseFilling(List fillings){ - - } - public float getFillingCost() { return (this.filling != null) ? this.filling.getPrice() : 0f; } diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 8b201f660..f2e47dc75 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -27,6 +27,10 @@ public int getCapacity() { return capacity; } + public boolean isFull() { + return bagels.size() == this.capacity; + } + public void setCapacity(int capacity) { if (capacity <= 0) capacity = 5; @@ -38,16 +42,18 @@ public ArrayList getBagels() { return bagels; } - public void setBagels(ArrayList bagels) { - this.bagels = bagels; - } +// public void setBagels(ArrayList bagels) { +// this.bagels = bagels; +// } - public void addBagel(Bagel bagel) { - bagels.add(bagel); + public boolean addBagel(Bagel bagel) { + if (!isFull()) + return bagels.add(bagel); + return false; } - public void removeBagel(Bagel bagel) { - bagels.remove(bagel); + public boolean removeBagel(Bagel bagel) { + return bagels.remove(bagel); } public float getTotalCost() { diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java index 687dd020d..08e7f7101 100644 --- a/src/main/java/com/booleanuk/core/Customer.java +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -6,17 +6,30 @@ public class Customer { private Basket basket = null; +// private Inventory inventory = null; + private List products = null; - public Customer(Basket basket) { + public Customer(Basket basket, List inventory) { this.basket = basket; + this.products = inventory; } public void addBagelToBasket(Bagel bagel) { - basket.addBagel(bagel); + for (Product p: products) + if (p.getSku().equals(bagel.getSku())) { + if (basket.addBagel(bagel)) { + System.out.println("Added to basket."); + break; + } else + System.out.println("Basket is full, you cant add more bagelZ"); + } } public void removeBagelFromBasket(Bagel bagel) { - basket.removeBagel(bagel); + if (basket.removeBagel(bagel)) + System.out.println("Bagel removed from basket"); + else + System.out.println("Nothing to remove."); } public float getTotalCost() { @@ -38,17 +51,42 @@ public float getBagelPrice(Bagel bagel) { return -1; } - public int selectFillings(int option) { - - return -1; + public void viewFillingsAndPrice() { + for (Product product: products) + if (product.getType() == Product.ProductType.FILLING) { + System.out.printf("Filling: %-20s --> %.2f SEK\n", product.getVariant(), product.getPrice()); + } } - public void viewFillingsPrice(List fillings) { + public Bagel getBagelAndPickFilling(String filling){ + Filling fill = (Filling) products.stream() + .filter(product -> product.getType() == Product.ProductType.FILLING && + product.getVariant().equalsIgnoreCase(filling.trim())) + .map(product -> (Filling) product).findFirst().orElse(null); + + Bagel bagel = (Bagel) products.stream() + .filter(product -> product.getType() == Product.ProductType.BAGEL && + product.getVariant().equalsIgnoreCase("plain")) + .map(product -> (Bagel) product).findFirst().orElse(null); + + if (bagel != null && fill != null) + bagel.setFilling(fill); + basket.addBagel(bagel); + System.out.printf("Bagel with %s added. \n", fill.getVariant()); +// bagel.setFilling(fill); +// basket.addBagel(bagel); + + return bagel; } - public String orderBagelAtSpecificTime(Time time, Bagel bagel) { - return "Order: " + time + ", Bagel: " + bagel.toString(); + public String orderBagelAtSpecificTime(Time time, String bagelType) { + + Bagel bagel = (Bagel) products.stream().filter(product -> product.getVariant() + .equalsIgnoreCase(bagelType)) + .map(product -> (Bagel) product).findFirst().orElse(null); + + return (bagel != null) ? "Order: " + time + ", Bagel: " + bagel.toString() : "Camon little boy"; } public int getAmountOfBagelsInBasket() { diff --git a/src/main/java/com/booleanuk/core/Filling.java b/src/main/java/com/booleanuk/core/Filling.java index 2ad604f3e..fd359e4df 100644 --- a/src/main/java/com/booleanuk/core/Filling.java +++ b/src/main/java/com/booleanuk/core/Filling.java @@ -2,8 +2,8 @@ public class Filling extends Product { - public Filling(String sku, float price, String variant) { - super(sku, price, variant); + public Filling(String sku, float price, String variant, ProductType type) { + super(sku, price, variant, type); setPrice(price); setSku(sku); diff --git a/src/main/java/com/booleanuk/core/Inventory.java b/src/main/java/com/booleanuk/core/Inventory.java index 379a3936a..7228d204a 100644 --- a/src/main/java/com/booleanuk/core/Inventory.java +++ b/src/main/java/com/booleanuk/core/Inventory.java @@ -6,7 +6,6 @@ public class Inventory { private List products = new ArrayList<>(); - public void addProduct(Product product) { products.add(product); } @@ -19,6 +18,13 @@ public List getInventoryList() { return this.products; } + public Product getProduct(Product.ProductType type, String variant) { + for (Product p: products) + if (p.getType() == type && p.getVariant().toLowerCase().equals(variant.toLowerCase().trim())) + return p; + return null; + } + public void printInventory() { for (Product p : products) { System.out.println(p); diff --git a/src/main/java/com/booleanuk/core/Main.java b/src/main/java/com/booleanuk/core/Main.java index 7beaf65e8..e4aa20606 100644 --- a/src/main/java/com/booleanuk/core/Main.java +++ b/src/main/java/com/booleanuk/core/Main.java @@ -1,33 +1,90 @@ package com.booleanuk.core; +import java.sql.Time; +import java.util.List; + public class Main { public static void main(String[] args) { - Inventory inventory = new Inventory(); + System.out.println("\n"); // Load inventory on start - loadInventoryOnStart(inventory); - inventory.printInventory(); + Inventory inv = loadInventoryOnStart(); + List list = inv.getInventoryList(); + // inv.printInventory(); + + Basket basket = new Basket("small", 5); + Customer customer = new Customer(basket, list); + + Bagel bagel1 = new Bagel("BGLO", 0.49f, "Onion", Product.ProductType.BAGEL); + Bagel bagel2 = new Bagel("BGLP", 0.39f, "Plain", Product.ProductType.BAGEL); + Bagel bagel3 = new Bagel("BGLE", 0.49f, "Everything", Product.ProductType.BAGEL); + Bagel bagel4 = new Bagel("BGLS", 0.49f, "Sesame", Product.ProductType.BAGEL); + Bagel bagel5 = new Bagel("BGLS", 0.49f, "Sesame", Product.ProductType.BAGEL); + Bagel bagel6 = new Bagel("BGLS", 0.49f, "Sesame", Product.ProductType.BAGEL); + + + // Story 1: + Time time = Time.valueOf("07:45:00"); + String s = customer.orderBagelAtSpecificTime(time, "everything"); + System.out.println(s); + + // Story 2: + customer.addBagelToBasket(bagel1); + customer.removeBagelFromBasket(bagel1); + // Story 3: + customer.addBagelToBasket(bagel1); + customer.addBagelToBasket(bagel2); + customer.addBagelToBasket(bagel3); + customer.addBagelToBasket(bagel4); + customer.addBagelToBasket(bagel5); + customer.addBagelToBasket(bagel6); // full + // Story 4: + Manager manager = new Manager(inv); + manager.changeBasketCapacity(basket, 10); + customer.addBagelToBasket(bagel6); // not full anymore + // Story 5: + customer.removeBagelFromBasket(bagel1); // should remove + customer.removeBagelFromBasket(bagel1); // nothing to remove + + // Story 6: + System.out.println(customer.getTotalCost()); + + // Story 7: + System.out.println(customer.getBagelPrice(bagel4)); + + // Story 8 and 9: + customer.viewFillingsAndPrice(); + customer.getBagelAndPickFilling("cheese"); + + // Story 10: + Bagel test = new Bagel("sku123", 10f, "test", Product.ProductType.BAGEL); + Bagel test2 = new Bagel("sku999", 10f, "test", Product.ProductType.BAGEL); + manager.addItemToInv(test); + customer.addBagelToBasket(test); // should work + customer.addBagelToBasket(test2); // should not work } - public static void loadInventoryOnStart(Inventory inventory) { + public static Inventory loadInventoryOnStart() { // Add all items to the inventory - + Inventory inventory = new Inventory(); // Add Bagels - inventory.addProduct(new Bagel("BGLO", 0.49f, "Onion")); - inventory.addProduct(new Bagel("BGLP", 0.39f, "Plain")); - inventory.addProduct(new Bagel("BGLE", 0.49f, "Everything")); - inventory.addProduct(new Bagel("BGLS", 0.49f, "Sesame")); + inventory.addProduct(new Bagel("BGLO", 0.49f, "Onion", Product.ProductType.BAGEL)); + inventory.addProduct(new Bagel("BGLP", 0.39f, "Plain", Product.ProductType.BAGEL)); + inventory.addProduct(new Bagel("BGLE", 0.49f, "Everything", Product.ProductType.BAGEL)); + inventory.addProduct(new Bagel("BGLS", 0.49f, "Sesame", Product.ProductType.BAGEL)); // Add Fillings - inventory.addProduct(new Filling("FILB", 0.12f, "Bacon")); - inventory.addProduct(new Filling("FILE", 0.12f, "Egg")); - inventory.addProduct(new Filling("FILC", 0.12f, "Cheese")); - inventory.addProduct(new Filling("FILX", 0.12f, "Cream Cheese")); - inventory.addProduct(new Filling("FILS", 0.12f, "Smoked Salmon")); - inventory.addProduct(new Filling("FILH", 0.12f, "Ham")); + inventory.addProduct(new Filling("FILB", 0.12f, "Bacon", Product.ProductType.FILLING)); + inventory.addProduct(new Filling("FILE", 0.12f, "Egg", Product.ProductType.FILLING)); + inventory.addProduct(new Filling("FILC", 0.12f, "Cheese", Product.ProductType.FILLING)); + inventory.addProduct(new Filling("FILX", 0.12f, "Cream Cheese", Product.ProductType.FILLING)); + inventory.addProduct(new Filling("FILS", 0.12f, "Smoked Salmon", Product.ProductType.FILLING)); + inventory.addProduct(new Filling("FILH", 0.12f, "Ham", Product.ProductType.FILLING)); // Add Coffees + + return inventory; } } diff --git a/src/main/java/com/booleanuk/core/Manager.java b/src/main/java/com/booleanuk/core/Manager.java index 1f6e6c453..fd3f262bc 100644 --- a/src/main/java/com/booleanuk/core/Manager.java +++ b/src/main/java/com/booleanuk/core/Manager.java @@ -2,21 +2,22 @@ public class Manager { + private Inventory inventory; - public Manager() { - + public Manager(Inventory inventory) { + this.inventory = inventory; } - public void changeBasketCapacity() { - + public void changeBasketCapacity(Basket basket, int num) { + basket.setCapacity(num); } - public void addItemToInv() { - + public void addItemToInv(Product product) { + inventory.addProduct(product); } - public void removeItemToInv() { - + public void removeItemToInv(Product product) { + inventory.removeProduct(product); } } \ No newline at end of file diff --git a/src/main/java/com/booleanuk/core/Product.java b/src/main/java/com/booleanuk/core/Product.java index 25e93ebe1..65ffea68d 100644 --- a/src/main/java/com/booleanuk/core/Product.java +++ b/src/main/java/com/booleanuk/core/Product.java @@ -4,11 +4,13 @@ public abstract class Product { private String sku; private float price; private String variant; + private ProductType type; - public Product(String sku, float price, String variant) { + public Product(String sku, float price, String variant, ProductType type) { setSku(sku); setPrice(price); setVariant(variant); + this.type = type; } // Getters and setters @@ -40,8 +42,16 @@ public void setVariant(String variant) { this.variant = variant; } + public Enum getType() { + return this.type; + } + @Override public String toString() { return "Product [SKU=" + sku + ", Price=" + price + ", Variant=" + variant + "]"; } + + public enum ProductType { + FILLING, BAGEL, COFFEE; + } } diff --git a/src/test/java/com/booleanuk/core/BagelTest.java b/src/test/java/com/booleanuk/core/BagelTest.java index 043bbdbb9..e7be04cb6 100644 --- a/src/test/java/com/booleanuk/core/BagelTest.java +++ b/src/test/java/com/booleanuk/core/BagelTest.java @@ -8,10 +8,10 @@ public class BagelTest { @Test public void bagelFillingShouldReturnFillingOrErrorMsg() { - Bagel bagel = new Bagel("test", 10, "nice one"); + Bagel bagel = new Bagel("test", 10, "nice one", Product.ProductType.BAGEL); assertNull(bagel.getFilling()); - Bagel bagel2 = new Bagel("test", 10, "nice one"); - Filling filling = new Filling("SKU", 0.5f, "filling"); + Bagel bagel2 = new Bagel("test", 10, "nice one", Product.ProductType.BAGEL); + Filling filling = new Filling("SKU", 0.5f, "filling", Product.ProductType.FILLING); assertEquals(0.5f, filling.getPrice()); filling.setPrice(0.13f); bagel2.setFilling(filling); @@ -20,8 +20,8 @@ public void bagelFillingShouldReturnFillingOrErrorMsg() { @Test public void getCorrectFillingCost() { - Bagel bagel = new Bagel("SKU1", 10f, "nice one"); - Filling filling = new Filling("SKU", 0.5f, "filling"); + Bagel bagel = new Bagel("SKU1", 10f, "nice one", Product.ProductType.BAGEL); + Filling filling = new Filling("SKU", 0.5f, "filling", Product.ProductType.FILLING); assertEquals(10f, bagel.getPrice()); bagel.setFilling(filling); assertEquals(10.5f, bagel.getPrice()); diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index f463cce7b..7359252d9 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -34,11 +34,11 @@ public void setBasketTypeNotNull() { @Test public void getTotalCostOfBasket() { Basket basket = new Basket("", 0); - Bagel bagel = new Bagel("sku", 10, "nice one"); + Bagel bagel = new Bagel("sku", 10, "nice one", Product.ProductType.BAGEL); basket.addBagel(bagel); assertEquals(10, basket.getTotalCost()); - Bagel bagel2 = new Bagel("sku2", 55, "good one"); + Bagel bagel2 = new Bagel("sku2", 55, "good one", Product.ProductType.BAGEL); basket.addBagel(bagel2); assertEquals(65, basket.getTotalCost()); basket.removeBagel(bagel); diff --git a/src/test/java/com/booleanuk/core/CustomerTest.java b/src/test/java/com/booleanuk/core/CustomerTest.java index ca103803a..6d6794a4a 100644 --- a/src/test/java/com/booleanuk/core/CustomerTest.java +++ b/src/test/java/com/booleanuk/core/CustomerTest.java @@ -4,22 +4,25 @@ import org.junit.jupiter.api.Test; import java.sql.Time; +import java.util.List; public class CustomerTest { + TestHelper test = new TestHelper(); + List inventory = test.loadInventoryOnStart(); @Test public void verifyBasketAfterAddAndRemove() { Basket basket = new Basket("", 5); - Customer customer = new Customer(basket); + Customer customer = new Customer(basket, inventory); - Bagel bagel = new Bagel("new", 5, "test"); + Bagel bagel = new Bagel("new", 5, "test", Product.ProductType.BAGEL); - customer.addBagelToBasket(new Bagel("test1", 10, "test1")); - customer.addBagelToBasket(new Bagel("2", 4, "test1")); + customer.addBagelToBasket(new Bagel("test1", 10, "test1", Product.ProductType.BAGEL)); + customer.addBagelToBasket(new Bagel("2", 4, "test1", Product.ProductType.BAGEL)); assertEquals(2, customer.getAmountOfBagelsInBasket()); customer.addBagelToBasket(bagel); assertEquals(3, customer.getAmountOfBagelsInBasket()); - customer.removeBagelFromBasket(new Bagel("4", 11, "test1")); + customer.removeBagelFromBasket(new Bagel("4", 11, "test1", Product.ProductType.BAGEL)); assertEquals(3, customer.getAmountOfBagelsInBasket()); customer.removeBagelFromBasket(bagel); assertEquals(2, customer.getAmountOfBagelsInBasket()); @@ -28,21 +31,21 @@ public void verifyBasketAfterAddAndRemove() { @Test public void orderBagelAtSpecificTimeShouldReturnTimeAndBagels() { Basket basket = new Basket("", 5); - Customer customer = new Customer(basket); - Bagel bagel = new Bagel("SKU123", 10f, "NICEUU"); + Customer customer = new Customer(basket, inventory); + Bagel bagel = new Bagel("SKU123", 10f, "NICEUU", Product.ProductType.BAGEL); customer.addBagelToBasket(bagel); Time time = Time.valueOf("10:00:00"); - assertEquals("Order: 10:00:00, Bagel: NICEUU", customer.orderBagelAtSpecificTime(time, bagel)); + assertEquals("Order: 10:00:00, Bagel: NICEUU", customer.orderBagelAtSpecificTime(time, "plain")); } @Test public void getCorrectTotalCostOfCustomerBasket() { - Customer customer = new Customer(new Basket("", 5)); - customer.addBagelToBasket(new Bagel("test1", 10, "test1")); - customer.addBagelToBasket(new Bagel("2", 4, "test1")); + Customer customer = new Customer(new Basket("", 5), inventory); + customer.addBagelToBasket(new Bagel("test1", 10, "test1", Product.ProductType.BAGEL)); + customer.addBagelToBasket(new Bagel("2", 4, "test1", Product.ProductType.BAGEL)); - Bagel bagel = new Bagel("SKU123", 14f, "NIce one"); - Filling filling = new Filling("SKU123", 0.8f, "Chocolate"); + Bagel bagel = new Bagel("SKU123", 14f, "NIce one", Product.ProductType.BAGEL); + Filling filling = new Filling("SKU123", 0.8f, "Chocolate", Product.ProductType.FILLING); bagel.setFilling(filling); customer.addBagelToBasket(bagel); @@ -53,12 +56,12 @@ public void getCorrectTotalCostOfCustomerBasket() { @Test public void getSingleBagelPriceFromBasket() { - Customer customer = new Customer(new Basket("", 5)); - customer.addBagelToBasket(new Bagel("test1", 10, "test1")); - customer.addBagelToBasket(new Bagel("2", 4, "test1")); + Customer customer = new Customer(new Basket("", 5), inventory); + customer.addBagelToBasket(new Bagel("test1", 10, "test1", Product.ProductType.BAGEL)); + customer.addBagelToBasket(new Bagel("2", 4, "test1", Product.ProductType.BAGEL)); - Bagel bagel = new Bagel("SKU123", 14f, "NIce one"); - Filling filling = new Filling("SKU123", 0.8f, "Chocolate"); + Bagel bagel = new Bagel("SKU123", 14f, "NIce one", Product.ProductType.BAGEL); + Filling filling = new Filling("SKU123", 0.8f, "Chocolate", Product.ProductType.FILLING); bagel.setFilling(filling); customer.addBagelToBasket(bagel); @@ -66,6 +69,19 @@ public void getSingleBagelPriceFromBasket() { customer.removeBagelFromBasket(bagel); assertNotEquals(14.8f, customer.getBagelPrice(bagel)); assertEquals(-1, customer.getBagelPrice(bagel)); + } + +// @Test +// public void displayAllFillingsAndPrice() { +// Customer customer = new Customer(new Basket("", 5), inventory); +// customer.viewFillingsPrice(); +// } + @Test + public void chooseAndRetrieveBagelWithFilling() { + Customer customer = new Customer(new Basket("", 5), inventory); + customer.getBagelAndPickFilling("bacon"); + assertEquals(1, customer.getAmountOfBagelsInBasket()); + assertEquals(0.51f, customer.getTotalCost()); } } diff --git a/src/test/java/com/booleanuk/core/FillingTest.java b/src/test/java/com/booleanuk/core/FillingTest.java index 352b64e43..4617b2d92 100644 --- a/src/test/java/com/booleanuk/core/FillingTest.java +++ b/src/test/java/com/booleanuk/core/FillingTest.java @@ -7,7 +7,7 @@ public class FillingTest { @Test public void testFillingConstructor() { - Filling filling = new Filling("sku123", 10.0f, "Vanilla"); + Filling filling = new Filling("sku123", 10.0f, "Vanilla", Product.ProductType.FILLING); assertEquals(10.0f, filling.getPrice()); assertEquals("SKU123", filling.getSku()); @@ -16,7 +16,7 @@ public void testFillingConstructor() { @Test public void testSettersAndGetters() { - Filling filling = new Filling("sku123", 10.0f, "Vanilla"); + Filling filling = new Filling("sku123", 10.0f, "Vanilla", Product.ProductType.FILLING); filling.setPrice(12.5f); filling.setSku("SKU456"); @@ -30,9 +30,9 @@ public void testSettersAndGetters() { @Test public void testNullOrEmptyValues() { assertThrows(IllegalArgumentException.class, () -> { - new Filling("", 0.0f, ""); + new Filling("", 0.0f, "", Product.ProductType.FILLING); }); - Filling filling = new Filling("", -1f, ""); + Filling filling = new Filling("", -1f, "", Product.ProductType.FILLING); assertEquals(1f, filling.getPrice()); //defaults assertEquals("FIL", filling.getSku()); //defaults assertEquals("plain", filling.getVariant()); //defaults diff --git a/src/test/java/com/booleanuk/core/InventoryTest.java b/src/test/java/com/booleanuk/core/InventoryTest.java index 9d3980eeb..420a4d3fd 100644 --- a/src/test/java/com/booleanuk/core/InventoryTest.java +++ b/src/test/java/com/booleanuk/core/InventoryTest.java @@ -9,7 +9,7 @@ public class InventoryTest { @Test public void testAddProductToInventory() { Inventory inventory = new Inventory(); - Product product = new Bagel("ABC123", 99.99f, "Red"); + Product product = new Bagel("ABC123", 99.99f, "Red", Product.ProductType.BAGEL); inventory.addProduct(product); List products = inventory.getInventoryList(); @@ -20,8 +20,8 @@ public void testAddProductToInventory() { @Test public void testGetInventoryList() { Inventory inventory = new Inventory(); - Product product1 = new Bagel("ABC123", 99.99f, "Red"); - Product product2 = new Bagel("DEF456", 29.99f, "Blue"); + Product product1 = new Bagel("ABC123", 99.99f, "Red", Product.ProductType.BAGEL); + Product product2 = new Bagel("DEF456", 29.99f, "Blue", Product.ProductType.BAGEL); inventory.addProduct(product1); inventory.addProduct(product2); @@ -35,8 +35,8 @@ public void testGetInventoryList() { @Test public void testRemoveProductFromInventory() { Inventory inventory = new Inventory(); - Product product1 = new Bagel("ABC123", 99.99f, "Red"); - Product product2 = new Bagel("DEF456", 29.99f, "Blue"); + Product product1 = new Bagel("ABC123", 99.99f, "Red", Product.ProductType.BAGEL); + Product product2 = new Bagel("DEF456", 29.99f, "Blue", Product.ProductType.BAGEL); inventory.addProduct(product1); inventory.addProduct(product2); diff --git a/src/test/java/com/booleanuk/core/ProductTest.java b/src/test/java/com/booleanuk/core/ProductTest.java index 6b95dee4a..3a6c3cdfc 100644 --- a/src/test/java/com/booleanuk/core/ProductTest.java +++ b/src/test/java/com/booleanuk/core/ProductTest.java @@ -7,7 +7,7 @@ public class ProductTest { @Test public void testProductCreationWithValidData() { - Product product = new Bagel("ABC123", 99.99f, "Red"); + Product product = new Bagel("ABC123", 99.99f, "Red", Product.ProductType.BAGEL); // Check if the product's SKU, price, and variant are set correctly assertEquals("ABC123", product.getSku()); @@ -21,14 +21,14 @@ public void testProductCreationWithValidData() { @Test public void testSetPriceThrowsExceptionForNegativePrice() { assertThrows(IllegalArgumentException.class, () -> { - new Bagel("XYZ456", -50f, "Blue"); + new Bagel("XYZ456", -50f, "Blue", Product.ProductType.BAGEL); }); } @Test public void testSetPriceThrowsExceptionForZeroPrice() { assertThrows(IllegalArgumentException.class, () -> { - new Bagel("XYZ456", 0f, "Blue"); + new Bagel("XYZ456", 0f, "Blue", Product.ProductType.BAGEL); }); } } diff --git a/src/test/java/com/booleanuk/core/TestHelper.java b/src/test/java/com/booleanuk/core/TestHelper.java new file mode 100644 index 000000000..9ad42443e --- /dev/null +++ b/src/test/java/com/booleanuk/core/TestHelper.java @@ -0,0 +1,29 @@ +package com.booleanuk.core; + +import java.util.List; + +public class TestHelper { + + public List loadInventoryOnStart() { + // Add all items to the inventory + Inventory inventory = new Inventory(); + // Add Bagels + inventory.addProduct(new Bagel("BGLO", 0.49f, "Onion", Product.ProductType.BAGEL)); + inventory.addProduct(new Bagel("BGLP", 0.39f, "Plain", Product.ProductType.BAGEL)); + inventory.addProduct(new Bagel("BGLE", 0.49f, "Everything", Product.ProductType.BAGEL)); + inventory.addProduct(new Bagel("BGLS", 0.49f, "Sesame", Product.ProductType.BAGEL)); + + // Add Fillings + inventory.addProduct(new Filling("FILB", 0.12f, "Bacon", Product.ProductType.FILLING)); + inventory.addProduct(new Filling("FILE", 0.12f, "Egg", Product.ProductType.FILLING)); + inventory.addProduct(new Filling("FILC", 0.12f, "Cheese", Product.ProductType.FILLING)); + inventory.addProduct(new Filling("FILX", 0.12f, "Cream Cheese", Product.ProductType.FILLING)); + inventory.addProduct(new Filling("FILS", 0.12f, "Smoked Salmon", Product.ProductType.FILLING)); + inventory.addProduct(new Filling("FILH", 0.12f, "Ham", Product.ProductType.FILLING)); + + // Add Coffees + + return inventory.getInventoryList(); + } + +} From 5b80c73b92c3571a6b242ccd3feb8df61e6f1911 Mon Sep 17 00:00:00 2001 From: Andre Velkov Janusev Date: Tue, 19 Aug 2025 16:51:36 +0200 Subject: [PATCH 8/9] upd, package change --- src/main/java/com/booleanuk/core/Basket.java | 2 ++ src/main/java/com/booleanuk/core/Customer.java | 4 ++++ src/main/java/com/booleanuk/core/Inventory.java | 2 ++ src/main/java/com/booleanuk/core/Main.java | 5 ++++- src/main/java/com/booleanuk/core/Manager.java | 2 ++ src/main/java/com/booleanuk/core/{ => Products}/Bagel.java | 2 +- src/main/java/com/booleanuk/core/{ => Products}/Filling.java | 2 +- src/main/java/com/booleanuk/core/{ => Products}/Product.java | 2 +- src/test/java/com/booleanuk/core/BagelTest.java | 4 ++++ src/test/java/com/booleanuk/core/BasketTest.java | 3 +++ src/test/java/com/booleanuk/core/CustomerTest.java | 4 ++++ src/test/java/com/booleanuk/core/FillingTest.java | 3 +++ src/test/java/com/booleanuk/core/InventoryTest.java | 2 ++ src/test/java/com/booleanuk/core/ProductTest.java | 2 ++ src/test/java/com/booleanuk/core/TestHelper.java | 4 ++++ 15 files changed, 39 insertions(+), 4 deletions(-) rename src/main/java/com/booleanuk/core/{ => Products}/Bagel.java (96%) rename src/main/java/com/booleanuk/core/{ => Products}/Filling.java (96%) rename src/main/java/com/booleanuk/core/{ => Products}/Product.java (96%) diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index f2e47dc75..b53081c69 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -1,5 +1,7 @@ package com.booleanuk.core; +import com.booleanuk.core.Products.Bagel; + import java.util.ArrayList; public class Basket { diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java index 08e7f7101..98b678c85 100644 --- a/src/main/java/com/booleanuk/core/Customer.java +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -1,5 +1,9 @@ package com.booleanuk.core; +import com.booleanuk.core.Products.Bagel; +import com.booleanuk.core.Products.Filling; +import com.booleanuk.core.Products.Product; + import java.sql.Time; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/booleanuk/core/Inventory.java b/src/main/java/com/booleanuk/core/Inventory.java index 7228d204a..7cc25f489 100644 --- a/src/main/java/com/booleanuk/core/Inventory.java +++ b/src/main/java/com/booleanuk/core/Inventory.java @@ -1,5 +1,7 @@ package com.booleanuk.core; +import com.booleanuk.core.Products.Product; + import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/booleanuk/core/Main.java b/src/main/java/com/booleanuk/core/Main.java index e4aa20606..41ed9f191 100644 --- a/src/main/java/com/booleanuk/core/Main.java +++ b/src/main/java/com/booleanuk/core/Main.java @@ -1,5 +1,9 @@ package com.booleanuk.core; +import com.booleanuk.core.Products.Bagel; +import com.booleanuk.core.Products.Filling; +import com.booleanuk.core.Products.Product; + import java.sql.Time; import java.util.List; @@ -21,7 +25,6 @@ public static void main(String[] args) { Bagel bagel5 = new Bagel("BGLS", 0.49f, "Sesame", Product.ProductType.BAGEL); Bagel bagel6 = new Bagel("BGLS", 0.49f, "Sesame", Product.ProductType.BAGEL); - // Story 1: Time time = Time.valueOf("07:45:00"); String s = customer.orderBagelAtSpecificTime(time, "everything"); diff --git a/src/main/java/com/booleanuk/core/Manager.java b/src/main/java/com/booleanuk/core/Manager.java index fd3f262bc..331d5b8d6 100644 --- a/src/main/java/com/booleanuk/core/Manager.java +++ b/src/main/java/com/booleanuk/core/Manager.java @@ -1,6 +1,8 @@ package com.booleanuk.core; +import com.booleanuk.core.Products.Product; + public class Manager { private Inventory inventory; diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Products/Bagel.java similarity index 96% rename from src/main/java/com/booleanuk/core/Bagel.java rename to src/main/java/com/booleanuk/core/Products/Bagel.java index 256cb754e..5f59ac636 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Products/Bagel.java @@ -1,4 +1,4 @@ -package com.booleanuk.core; +package com.booleanuk.core.Products; public class Bagel extends Product { private Filling filling; diff --git a/src/main/java/com/booleanuk/core/Filling.java b/src/main/java/com/booleanuk/core/Products/Filling.java similarity index 96% rename from src/main/java/com/booleanuk/core/Filling.java rename to src/main/java/com/booleanuk/core/Products/Filling.java index fd359e4df..27a4e07ca 100644 --- a/src/main/java/com/booleanuk/core/Filling.java +++ b/src/main/java/com/booleanuk/core/Products/Filling.java @@ -1,4 +1,4 @@ -package com.booleanuk.core; +package com.booleanuk.core.Products; public class Filling extends Product { diff --git a/src/main/java/com/booleanuk/core/Product.java b/src/main/java/com/booleanuk/core/Products/Product.java similarity index 96% rename from src/main/java/com/booleanuk/core/Product.java rename to src/main/java/com/booleanuk/core/Products/Product.java index 65ffea68d..11e23bd56 100644 --- a/src/main/java/com/booleanuk/core/Product.java +++ b/src/main/java/com/booleanuk/core/Products/Product.java @@ -1,4 +1,4 @@ -package com.booleanuk.core; +package com.booleanuk.core.Products; public abstract class Product { private String sku; diff --git a/src/test/java/com/booleanuk/core/BagelTest.java b/src/test/java/com/booleanuk/core/BagelTest.java index e7be04cb6..28637d172 100644 --- a/src/test/java/com/booleanuk/core/BagelTest.java +++ b/src/test/java/com/booleanuk/core/BagelTest.java @@ -1,6 +1,10 @@ package com.booleanuk.core; import static org.junit.jupiter.api.Assertions.*; + +import com.booleanuk.core.Products.Bagel; +import com.booleanuk.core.Products.Filling; +import com.booleanuk.core.Products.Product; import org.junit.jupiter.api.Test; public class BagelTest { diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 7359252d9..ce7160b83 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -1,6 +1,9 @@ package com.booleanuk.core; import static org.junit.jupiter.api.Assertions.*; + +import com.booleanuk.core.Products.Bagel; +import com.booleanuk.core.Products.Product; import org.junit.jupiter.api.Test; public class BasketTest { diff --git a/src/test/java/com/booleanuk/core/CustomerTest.java b/src/test/java/com/booleanuk/core/CustomerTest.java index 6d6794a4a..03e950b16 100644 --- a/src/test/java/com/booleanuk/core/CustomerTest.java +++ b/src/test/java/com/booleanuk/core/CustomerTest.java @@ -1,6 +1,10 @@ package com.booleanuk.core; import static org.junit.jupiter.api.Assertions.*; + +import com.booleanuk.core.Products.Bagel; +import com.booleanuk.core.Products.Filling; +import com.booleanuk.core.Products.Product; import org.junit.jupiter.api.Test; import java.sql.Time; diff --git a/src/test/java/com/booleanuk/core/FillingTest.java b/src/test/java/com/booleanuk/core/FillingTest.java index 4617b2d92..a0a822013 100644 --- a/src/test/java/com/booleanuk/core/FillingTest.java +++ b/src/test/java/com/booleanuk/core/FillingTest.java @@ -1,6 +1,9 @@ package com.booleanuk.core; import static org.junit.jupiter.api.Assertions.*; + +import com.booleanuk.core.Products.Filling; +import com.booleanuk.core.Products.Product; import org.junit.jupiter.api.Test; public class FillingTest { diff --git a/src/test/java/com/booleanuk/core/InventoryTest.java b/src/test/java/com/booleanuk/core/InventoryTest.java index 420a4d3fd..8b625b254 100644 --- a/src/test/java/com/booleanuk/core/InventoryTest.java +++ b/src/test/java/com/booleanuk/core/InventoryTest.java @@ -1,5 +1,7 @@ package com.booleanuk.core; +import com.booleanuk.core.Products.Bagel; +import com.booleanuk.core.Products.Product; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; import java.util.List; diff --git a/src/test/java/com/booleanuk/core/ProductTest.java b/src/test/java/com/booleanuk/core/ProductTest.java index 3a6c3cdfc..af13264f9 100644 --- a/src/test/java/com/booleanuk/core/ProductTest.java +++ b/src/test/java/com/booleanuk/core/ProductTest.java @@ -1,5 +1,7 @@ package com.booleanuk.core; +import com.booleanuk.core.Products.Bagel; +import com.booleanuk.core.Products.Product; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/com/booleanuk/core/TestHelper.java b/src/test/java/com/booleanuk/core/TestHelper.java index 9ad42443e..55871e8d9 100644 --- a/src/test/java/com/booleanuk/core/TestHelper.java +++ b/src/test/java/com/booleanuk/core/TestHelper.java @@ -1,5 +1,9 @@ package com.booleanuk.core; +import com.booleanuk.core.Products.Bagel; +import com.booleanuk.core.Products.Filling; +import com.booleanuk.core.Products.Product; + import java.util.List; public class TestHelper { From 209f2610a77f7e9e568fdfed5a7ac2e72d814b3b Mon Sep 17 00:00:00 2001 From: Andre Velkov Janusev Date: Tue, 19 Aug 2025 17:07:06 +0200 Subject: [PATCH 9/9] fix test errors --- .../java/com/booleanuk/core/CustomerTest.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/test/java/com/booleanuk/core/CustomerTest.java b/src/test/java/com/booleanuk/core/CustomerTest.java index 03e950b16..d86d8a16a 100644 --- a/src/test/java/com/booleanuk/core/CustomerTest.java +++ b/src/test/java/com/booleanuk/core/CustomerTest.java @@ -19,10 +19,10 @@ public void verifyBasketAfterAddAndRemove() { Basket basket = new Basket("", 5); Customer customer = new Customer(basket, inventory); - Bagel bagel = new Bagel("new", 5, "test", Product.ProductType.BAGEL); + Bagel bagel = new Bagel("BGLP", 0.39f, "Plain", Product.ProductType.BAGEL); - customer.addBagelToBasket(new Bagel("test1", 10, "test1", Product.ProductType.BAGEL)); - customer.addBagelToBasket(new Bagel("2", 4, "test1", Product.ProductType.BAGEL)); + customer.addBagelToBasket(new Bagel("BGLO", 0.49f, "Onion", Product.ProductType.BAGEL)); + customer.addBagelToBasket(new Bagel("BGLP", 0.39f, "Plain", Product.ProductType.BAGEL)); assertEquals(2, customer.getAmountOfBagelsInBasket()); customer.addBagelToBasket(bagel); assertEquals(3, customer.getAmountOfBagelsInBasket()); @@ -36,42 +36,42 @@ public void verifyBasketAfterAddAndRemove() { public void orderBagelAtSpecificTimeShouldReturnTimeAndBagels() { Basket basket = new Basket("", 5); Customer customer = new Customer(basket, inventory); - Bagel bagel = new Bagel("SKU123", 10f, "NICEUU", Product.ProductType.BAGEL); + Bagel bagel = new Bagel("BGLP", 0.39f, "Plain", Product.ProductType.BAGEL); customer.addBagelToBasket(bagel); Time time = Time.valueOf("10:00:00"); - assertEquals("Order: 10:00:00, Bagel: NICEUU", customer.orderBagelAtSpecificTime(time, "plain")); + assertEquals("Order: 10:00:00, Bagel: Plain", customer.orderBagelAtSpecificTime(time, "plain")); } @Test public void getCorrectTotalCostOfCustomerBasket() { Customer customer = new Customer(new Basket("", 5), inventory); - customer.addBagelToBasket(new Bagel("test1", 10, "test1", Product.ProductType.BAGEL)); - customer.addBagelToBasket(new Bagel("2", 4, "test1", Product.ProductType.BAGEL)); + customer.addBagelToBasket(new Bagel("BGLP", 0.39f, "Plain", Product.ProductType.BAGEL)); + customer.addBagelToBasket(new Bagel("BGLO", 0.49f, "Onion", Product.ProductType.BAGEL)); - Bagel bagel = new Bagel("SKU123", 14f, "NIce one", Product.ProductType.BAGEL); + Bagel bagel = new Bagel("BGLO", 0.49f, "Onion", Product.ProductType.BAGEL); Filling filling = new Filling("SKU123", 0.8f, "Chocolate", Product.ProductType.FILLING); bagel.setFilling(filling); customer.addBagelToBasket(bagel); - assertEquals(28.8f, customer.getTotalCost()); + assertEquals(2.17f, customer.getTotalCost()); customer.removeBagelFromBasket(bagel); - assertEquals(14, customer.getTotalCost()); + assertEquals(0.8799999952316284, customer.getTotalCost()); } @Test public void getSingleBagelPriceFromBasket() { Customer customer = new Customer(new Basket("", 5), inventory); - customer.addBagelToBasket(new Bagel("test1", 10, "test1", Product.ProductType.BAGEL)); - customer.addBagelToBasket(new Bagel("2", 4, "test1", Product.ProductType.BAGEL)); + customer.addBagelToBasket(new Bagel("BGLO", 0.49f, "Onion", Product.ProductType.BAGEL)); + customer.addBagelToBasket(new Bagel("BGLO", 0.49f, "Onion", Product.ProductType.BAGEL)); - Bagel bagel = new Bagel("SKU123", 14f, "NIce one", Product.ProductType.BAGEL); + Bagel bagel = new Bagel("BGLE", 0.49f, "Everything", Product.ProductType.BAGEL); Filling filling = new Filling("SKU123", 0.8f, "Chocolate", Product.ProductType.FILLING); bagel.setFilling(filling); customer.addBagelToBasket(bagel); - assertEquals(14.8f, customer.getBagelPrice(bagel)); + assertEquals(1.29f, customer.getBagelPrice(bagel)); customer.removeBagelFromBasket(bagel); - assertNotEquals(14.8f, customer.getBagelPrice(bagel)); + assertNotEquals(0.98f, customer.getBagelPrice(bagel)); assertEquals(-1, customer.getBagelPrice(bagel)); }