From 5fc9b97de0858941baa552fe7e45f1cf658376c3 Mon Sep 17 00:00:00 2001 From: Roderick Leito Date: Sun, 10 Aug 2025 21:59:41 +0200 Subject: [PATCH 1/3] Committed en pushed my work in the wrong repository by accident. You can see my commits history in the repository: "java-tdd-oop-encapsulation" --- src/main/java/com/booleanuk/core/Bagel.java | 29 +++++ src/main/java/com/booleanuk/core/Basket.java | 68 ++++++++++++ .../java/com/booleanuk/core/BasketItem.java | 46 ++++++++ src/main/java/com/booleanuk/core/Filling.java | 29 +++++ .../java/com/booleanuk/core/Inventory.java | 38 +++++++ .../java/com/booleanuk/core/BasketTest.java | 101 ++++++++++++++++++ 6 files changed, 311 insertions(+) create mode 100644 src/main/java/com/booleanuk/core/Bagel.java create mode 100644 src/main/java/com/booleanuk/core/Basket.java create mode 100644 src/main/java/com/booleanuk/core/BasketItem.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/test/java/com/booleanuk/core/BasketTest.java diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java new file mode 100644 index 000000000..a750628e4 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -0,0 +1,29 @@ +package com.booleanuk.core; + +public class Bagel { + private String type; + private float price; + + public Bagel(String type, float price){ + this.type = type; + this.price = price; + } + + public String getType() { + return type; + } + + public boolean setType(String type) { + this.type = type; + return false; + } + + public float getPrice() { + return price; + } + + public boolean setPrice(float price) { + this.price = price; + return false; + } +} diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java new file mode 100644 index 000000000..7b1939f37 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -0,0 +1,68 @@ +package com.booleanuk.core; + +import java.util.ArrayList; +import java.util.List; + +public class Basket { + private List basketList; + private int capacity; + + public Basket(int capacity) { + this.capacity = capacity; + this.basketList = new ArrayList<>(); + } + + public boolean addItem(BasketItem item) { + basketList.add(item); + return true; + } + + public boolean removeItem(BasketItem item) { + if(basketList.contains(item)){ + basketList.remove(item); + return true; + } + return false; + } + + public boolean isFull() { + int total = 0; + for(BasketItem item: basketList){ + total+= item.getQuantity(); + if(total>=capacity) + return true; + } + return false; + } + + public boolean itemInList(BasketItem item) { + if(basketList.contains(item)){ + return true; + } + return false; + } + + public float getTotalCost() { + float total = 0.0f; + for(BasketItem item : basketList){ + total+= item.getTotalCost(); + } + return total; + } + + public List getBasketList() { + return basketList; + } + + public int getCapacity() { + return capacity; + } + + public boolean setCapacity(int capacity, String role) { + if (role == "Manager" && capacity>=0){ + this.capacity = capacity; + return true; + } + return false; + } +} diff --git a/src/main/java/com/booleanuk/core/BasketItem.java b/src/main/java/com/booleanuk/core/BasketItem.java new file mode 100644 index 000000000..084bc67a6 --- /dev/null +++ b/src/main/java/com/booleanuk/core/BasketItem.java @@ -0,0 +1,46 @@ +package com.booleanuk.core; + +public class BasketItem { + private Bagel bagel; + private Filling filling; + private int quantity; + + public BasketItem(Bagel bagel, int quantity) { + this.bagel = bagel; + this.quantity = quantity; + } + + public Bagel getBagel() { + return bagel; + } + + public boolean setBagel(Bagel bagel) { + this.bagel = bagel; + return false; + } + + public Filling getFilling() { + return filling; + } + + public boolean setFilling(Filling filling) { + this.filling = filling; + return true; + } + + public int getQuantity() { + return quantity; + } + + public boolean setQuantity(int quantity) { + this.quantity = quantity; + return false; + } + + public float getTotalCost() { + if(filling!=null){ + return (bagel.getPrice()+filling.getPrice())*quantity; + } + return bagel.getPrice()*quantity; + } +} 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..bfdc42c2e --- /dev/null +++ b/src/main/java/com/booleanuk/core/Filling.java @@ -0,0 +1,29 @@ +package com.booleanuk.core; + +public class Filling { + private String type; + private float price; + + public Filling(String type, float price) { + this.type = type; + this.price = price; + } + + public String getType() { + return type; + } + + public boolean setType(String type) { + this.type = type; + return false; + } + + public float getPrice() { + return price; + } + + public boolean setPrice(float price) { + this.price = price; + return false; + } +} 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..a0566063b --- /dev/null +++ b/src/main/java/com/booleanuk/core/Inventory.java @@ -0,0 +1,38 @@ +package com.booleanuk.core; + +import java.util.ArrayList; +import java.util.List; + +public class Inventory { + private List bagelList; + private List fillingList; + + public Inventory() { + this.bagelList = new ArrayList<>(); + this.fillingList = new ArrayList<>(); + } + + public List getBagelList() { + return bagelList; + } + + public List getFillingList() { + return fillingList; + } + + public boolean addBagel(Bagel bagel) { + return false; + } + + public boolean addFilling(Filling filling) { + return false; + } + + public boolean removeBagel(Bagel bagel) { + return false; + } + + public boolean removeFilling(Filling filling) { + return false; + } +} 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..f67cb8557 --- /dev/null +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -0,0 +1,101 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class BasketTest { + @Test + public void ShouldAddBagelToBasket() { + Bagel bagel = new Bagel("Onion", 0.49f); + BasketItem basketItem = new BasketItem(bagel, 1); + Basket basket = new Basket(2); + + Bagel bagel2 = new Bagel("Plain", 0.39f); + BasketItem basketItem2 = new BasketItem(bagel2, 1); + + Assertions.assertTrue(basket.addItem(basketItem)); + Assertions.assertEquals(1, basket.getBasketList().size()); + Assertions.assertTrue(basket.addItem(basketItem2)); + Assertions.assertEquals(2, basket.getBasketList().size()); + } + + @Test + public void shouldRemoveExistingBagel() { + Bagel bagel = new Bagel("Onion", 0.49f); + BasketItem basketItem = new BasketItem(bagel, 1); + Basket basket = new Basket(2); + basket.addItem(basketItem); + + Bagel bagel2 = new Bagel("Plain", 0.39f); + BasketItem basketItem2 = new BasketItem(bagel2, 1); + + Assertions.assertFalse(basket.removeItem(basketItem2)); + Assertions.assertTrue(basket.removeItem(basketItem)); + Assertions.assertEquals(0, basket.getBasketList().size()); + Assertions.assertFalse(basket.removeItem(basketItem)); + } + + @Test + public void ShouldWarnWhenBasketIsFull() { + Bagel bagel = new Bagel("Onion", 0.49f); + BasketItem basketItem = new BasketItem(bagel, 1); + + Bagel bagel2 = new Bagel("Plain", 0.39f); + BasketItem basketItem2 = new BasketItem(bagel2, 1); + + Basket basket = new Basket(2); + basket.addItem(basketItem); + basket.addItem(basketItem2); + + Assertions.assertTrue(basket.isFull()); + + basket.removeItem(basketItem2); + basket.removeItem(basketItem); + + basketItem.setQuantity(2); + basket.addItem(basketItem); + + Assertions.assertTrue(basket.isFull()); + } + + @Test + public void ShouldChangeCapacity() { + Basket basket = new Basket(2); + + Assertions.assertTrue(basket.setCapacity(4, "Manager")); + Assertions.assertFalse(basket.setCapacity(4, "Customer")); + Assertions.assertFalse(basket.setCapacity(-2, "Manager")); + } + + @Test + public void ShouldCalculateTotalCost() { + Basket basket = new Basket(2); + + Assertions.assertEquals(0, basket.getTotalCost()); + + Bagel bagel = new Bagel("Onion", 0.49f); + BasketItem basketItem = new BasketItem(bagel, 1); + + Bagel bagel2 = new Bagel("Plain", 0.39f); + BasketItem basketItem2 = new BasketItem(bagel2, 1); + + basket.addItem(basketItem); + basket.addItem(basketItem2); + + Assertions.assertEquals(0.88f, basket.getTotalCost()); + } + + @Test + public void ShouldAddFilling() { + Bagel bagel = new Bagel("Onion", 0.49f); + BasketItem basketItem = new BasketItem(bagel, 1); + Filling filling = new Filling("Bacon", 0.12f); + + Assertions.assertTrue(basketItem.setFilling(filling)); + } + + @Test + public void ShouldCheckIfItemIsInInventory() { + Inventory inventory = new Inventory(); + } +} \ No newline at end of file From be1cb392796327d13826c77b9ee3b0bc82c9f0e4 Mon Sep 17 00:00:00 2001 From: Roderick Leito Date: Mon, 11 Aug 2025 20:13:44 +0200 Subject: [PATCH 2/3] Improved entire program, but not everything is implemented yet. --- src/main/java/com/booleanuk/core/Bagel.java | 45 ++++++++++++------- src/main/java/com/booleanuk/core/Basket.java | 28 ++++++------ .../java/com/booleanuk/core/BasketItem.java | 41 ++++++----------- src/main/java/com/booleanuk/core/Coffee.java | 23 ++++++++++ src/main/java/com/booleanuk/core/Filling.java | 30 +++++-------- .../java/com/booleanuk/core/Inventory.java | 30 ++++--------- src/main/java/com/booleanuk/core/Item.java | 8 ++++ .../java/com/booleanuk/core/PriceList.java | 16 +++++++ .../java/com/booleanuk/core/BasketTest.java | 18 ++++---- 9 files changed, 134 insertions(+), 105 deletions(-) create mode 100644 src/main/java/com/booleanuk/core/Coffee.java create mode 100644 src/main/java/com/booleanuk/core/Item.java create mode 100644 src/main/java/com/booleanuk/core/PriceList.java diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java index a750628e4..f4f5dd09f 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -1,29 +1,42 @@ package com.booleanuk.core; -public class Bagel { - private String type; - private float price; +public class Bagel implements Item{ + private String name; + private String variant; + private String sku; + private Filling filling; - public Bagel(String type, float price){ - this.type = type; - this.price = price; + public Bagel(String variant, String sku){ + name = "Bagel"; + this.variant = variant; + this.sku = sku; } - public String getType() { - return type; + public String getName() { + return name; } - public boolean setType(String type) { - this.type = type; - return false; + public String getVariant(){ + return variant; } - public float getPrice() { - return price; + public String getCombiSku(){ + if (filling != null){ + return sku + "-" + filling.getSku(); + } + return sku; } - public boolean setPrice(float price) { - this.price = price; - return false; + public String getSku(){ + return sku; + } + + public boolean setFilling(Filling filling){ + this.filling = filling; + return true; + } + + public float getPrice(){ + } } diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 7b1939f37..a092e3e26 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -1,25 +1,27 @@ package com.booleanuk.core; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class Basket { - private List basketList; + private Map basketList; private int capacity; public Basket(int capacity) { this.capacity = capacity; - this.basketList = new ArrayList<>(); + this.basketList = new HashMap(); } - public boolean addItem(BasketItem item) { - basketList.add(item); + public boolean addItem(BasketItem basketItem) { + basketList.put(basketItem.getSku(), basketItem); return true; } - public boolean removeItem(BasketItem item) { - if(basketList.contains(item)){ - basketList.remove(item); + public boolean removeItem(BasketItem basketItem) { + if(basketList.containsKey(basketItem.getSku())){ + basketList.remove(basketItem.getSku()); return true; } return false; @@ -27,16 +29,16 @@ public boolean removeItem(BasketItem item) { public boolean isFull() { int total = 0; - for(BasketItem item: basketList){ - total+= item.getQuantity(); + for(BasketItem basketItem: basketList.values()){ + total+= basketItem.getQuantity(); if(total>=capacity) return true; } return false; } - public boolean itemInList(BasketItem item) { - if(basketList.contains(item)){ + public boolean itemInList(Item item) { + if(basketList.containsKey(item.getSku())){ return true; } return false; @@ -44,13 +46,13 @@ public boolean itemInList(BasketItem item) { public float getTotalCost() { float total = 0.0f; - for(BasketItem item : basketList){ + for(Item item : basketList){ total+= item.getTotalCost(); } return total; } - public List getBasketList() { + public List getBasketList() { return basketList; } diff --git a/src/main/java/com/booleanuk/core/BasketItem.java b/src/main/java/com/booleanuk/core/BasketItem.java index 084bc67a6..b07387e38 100644 --- a/src/main/java/com/booleanuk/core/BasketItem.java +++ b/src/main/java/com/booleanuk/core/BasketItem.java @@ -1,46 +1,33 @@ package com.booleanuk.core; public class BasketItem { - private Bagel bagel; - private Filling filling; + private Item item; private int quantity; + private String sku; - public BasketItem(Bagel bagel, int quantity) { - this.bagel = bagel; + public BasketItem(Item item, int quantity){ + this.item = item; this.quantity = quantity; } - public Bagel getBagel() { - return bagel; + public Item getItem(){ + return item; } - public boolean setBagel(Bagel bagel) { - this.bagel = bagel; - return false; - } - - public Filling getFilling() { - return filling; - } - - public boolean setFilling(Filling filling) { - this.filling = filling; - return true; - } - - public int getQuantity() { + public int getQuantity(){ return quantity; } - public boolean setQuantity(int quantity) { + public boolean setQuantity(int quantity){ this.quantity = quantity; return false; } - public float getTotalCost() { - if(filling!=null){ - return (bagel.getPrice()+filling.getPrice())*quantity; - } - return bagel.getPrice()*quantity; + public String getSku(){ + return item.getSku(); + } + + public float getTotalCost(PriceList priceList){ + return priceList.getPrice(item.getSku())*quantity; } } diff --git a/src/main/java/com/booleanuk/core/Coffee.java b/src/main/java/com/booleanuk/core/Coffee.java new file mode 100644 index 000000000..b665b09f8 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Coffee.java @@ -0,0 +1,23 @@ +package com.booleanuk.core; + +public class Coffee implements Item{ + private String name; + private String variant; + private String sku; + + public Coffee(String name){ + this.name = name; + } + + public String getName() { + return name; + } + + public String getVariant(){ + return variant; + } + + public String getSku(){ + return sku; + } +} diff --git a/src/main/java/com/booleanuk/core/Filling.java b/src/main/java/com/booleanuk/core/Filling.java index bfdc42c2e..d72aae332 100644 --- a/src/main/java/com/booleanuk/core/Filling.java +++ b/src/main/java/com/booleanuk/core/Filling.java @@ -1,29 +1,23 @@ package com.booleanuk.core; -public class Filling { - private String type; - private float price; +public class Filling implements Item{ + private String name; + private String variant; + private String sku; - public Filling(String type, float price) { - this.type = type; - this.price = price; + public Filling(String name){ + this.name = name; } - public String getType() { - return type; + public String getName() { + return name; } - public boolean setType(String type) { - this.type = type; - return false; + public String getVariant(){ + return variant; } - public float getPrice() { - return price; - } - - public boolean setPrice(float price) { - this.price = price; - return false; + public String getSku(){ + return sku; } } diff --git a/src/main/java/com/booleanuk/core/Inventory.java b/src/main/java/com/booleanuk/core/Inventory.java index a0566063b..26892a6a4 100644 --- a/src/main/java/com/booleanuk/core/Inventory.java +++ b/src/main/java/com/booleanuk/core/Inventory.java @@ -1,38 +1,24 @@ package com.booleanuk.core; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class Inventory { - private List bagelList; - private List fillingList; + private Map items; public Inventory() { - this.bagelList = new ArrayList<>(); - this.fillingList = new ArrayList<>(); + this.items = new HashMap(); } - public List getBagelList() { - return bagelList; - } - - public List getFillingList() { - return fillingList; - } - - public boolean addBagel(Bagel bagel) { - return false; - } - - public boolean addFilling(Filling filling) { - return false; - } - - public boolean removeBagel(Bagel bagel) { + public boolean addItem(Item item){ + items.put(item.getSku(), item); return false; } - public boolean removeFilling(Filling filling) { + public boolean removeItem(Item item){ + items.remove(item.getSku()); return false; } } diff --git a/src/main/java/com/booleanuk/core/Item.java b/src/main/java/com/booleanuk/core/Item.java new file mode 100644 index 000000000..70567571c --- /dev/null +++ b/src/main/java/com/booleanuk/core/Item.java @@ -0,0 +1,8 @@ +package com.booleanuk.core; + +public interface Item { + public String getSku(); + public String getName(); + public String getVariant(); + public float getTotalCost(); +} diff --git a/src/main/java/com/booleanuk/core/PriceList.java b/src/main/java/com/booleanuk/core/PriceList.java new file mode 100644 index 000000000..56ceac628 --- /dev/null +++ b/src/main/java/com/booleanuk/core/PriceList.java @@ -0,0 +1,16 @@ +package com.booleanuk.core; + +import java.util.HashMap; +import java.util.Map; + +public class PriceList { + private Map priceList; + + public PriceList(){ + priceList = new HashMap(); + } + + public float getPrice(String sku){ + return priceList.get(sku); + } +} diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index f67cb8557..c9cf3845a 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -7,11 +7,11 @@ public class BasketTest { @Test public void ShouldAddBagelToBasket() { Bagel bagel = new Bagel("Onion", 0.49f); - BasketItem basketItem = new BasketItem(bagel, 1); + Item basketItem = new Item(bagel, 1); Basket basket = new Basket(2); Bagel bagel2 = new Bagel("Plain", 0.39f); - BasketItem basketItem2 = new BasketItem(bagel2, 1); + Item basketItem2 = new Item(bagel2, 1); Assertions.assertTrue(basket.addItem(basketItem)); Assertions.assertEquals(1, basket.getBasketList().size()); @@ -22,12 +22,12 @@ public void ShouldAddBagelToBasket() { @Test public void shouldRemoveExistingBagel() { Bagel bagel = new Bagel("Onion", 0.49f); - BasketItem basketItem = new BasketItem(bagel, 1); + Item basketItem = new Item(bagel, 1); Basket basket = new Basket(2); basket.addItem(basketItem); Bagel bagel2 = new Bagel("Plain", 0.39f); - BasketItem basketItem2 = new BasketItem(bagel2, 1); + Item basketItem2 = new Item(bagel2, 1); Assertions.assertFalse(basket.removeItem(basketItem2)); Assertions.assertTrue(basket.removeItem(basketItem)); @@ -38,10 +38,10 @@ public void shouldRemoveExistingBagel() { @Test public void ShouldWarnWhenBasketIsFull() { Bagel bagel = new Bagel("Onion", 0.49f); - BasketItem basketItem = new BasketItem(bagel, 1); + Item basketItem = new Item(bagel, 1); Bagel bagel2 = new Bagel("Plain", 0.39f); - BasketItem basketItem2 = new BasketItem(bagel2, 1); + Item basketItem2 = new Item(bagel2, 1); Basket basket = new Basket(2); basket.addItem(basketItem); @@ -74,10 +74,10 @@ public void ShouldCalculateTotalCost() { Assertions.assertEquals(0, basket.getTotalCost()); Bagel bagel = new Bagel("Onion", 0.49f); - BasketItem basketItem = new BasketItem(bagel, 1); + Item basketItem = new Item(bagel, 1); Bagel bagel2 = new Bagel("Plain", 0.39f); - BasketItem basketItem2 = new BasketItem(bagel2, 1); + Item basketItem2 = new Item(bagel2, 1); basket.addItem(basketItem); basket.addItem(basketItem2); @@ -88,7 +88,7 @@ public void ShouldCalculateTotalCost() { @Test public void ShouldAddFilling() { Bagel bagel = new Bagel("Onion", 0.49f); - BasketItem basketItem = new BasketItem(bagel, 1); + Item basketItem = new Item(bagel, 1); Filling filling = new Filling("Bacon", 0.12f); Assertions.assertTrue(basketItem.setFilling(filling)); From d460cc1d7166265371d6b4e3c692b0229ec12bc0 Mon Sep 17 00:00:00 2001 From: Roderick Leito Date: Tue, 12 Aug 2025 23:27:53 +0200 Subject: [PATCH 3/3] Fixed entire program. --- src/main/java/com/booleanuk/core/Bagel.java | 35 ++-- src/main/java/com/booleanuk/core/Basket.java | 55 ++++-- .../java/com/booleanuk/core/BasketItem.java | 5 +- src/main/java/com/booleanuk/core/Coffee.java | 22 +-- src/main/java/com/booleanuk/core/Filling.java | 21 +- .../java/com/booleanuk/core/Inventory.java | 4 + src/main/java/com/booleanuk/core/Item.java | 31 ++- .../java/com/booleanuk/core/PriceList.java | 4 + .../java/com/booleanuk/core/BasketTest.java | 187 +++++++++++++----- 9 files changed, 235 insertions(+), 129 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java index f4f5dd09f..3679a692c 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -1,34 +1,28 @@ package com.booleanuk.core; -public class Bagel implements Item{ - private String name; - private String variant; - private String sku; +public class Bagel extends Item{ private Filling filling; public Bagel(String variant, String sku){ - name = "Bagel"; - this.variant = variant; - this.sku = sku; + super("Bagel", variant, sku); } - public String getName() { - return name; + public String getFillingSku(){ + return filling.getSku(); } - public String getVariant(){ - return variant; + public boolean gotFilling(){ + if (filling != null){ + return true; + } + return false; } public String getCombiSku(){ if (filling != null){ - return sku + "-" + filling.getSku(); + return super.getSku() + "-" + filling.getSku(); } - return sku; - } - - public String getSku(){ - return sku; + return getSku(); } public boolean setFilling(Filling filling){ @@ -36,7 +30,10 @@ public boolean setFilling(Filling filling){ return true; } - public float getPrice(){ - + @Override + public float getTotalCost(PriceList priceList){ + if(this.gotFilling()) + return priceList.getPrice(super.getSku()) + priceList.getPrice(filling.getSku()); + return priceList.getPrice(super.getSku()); } } diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index a092e3e26..bffd7143d 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -7,24 +7,44 @@ public class Basket { private Map basketList; + private PriceList priceList; + private Inventory inventory; private int capacity; - public Basket(int capacity) { + public Basket(int capacity, PriceList priceList, Inventory inventory) { this.capacity = capacity; + this.priceList = priceList; + this.inventory = inventory; this.basketList = new HashMap(); } - public boolean addItem(BasketItem basketItem) { - basketList.put(basketItem.getSku(), basketItem); + public boolean addItem(Item item, int quantity) { + String key = getBasketKey(item); + if (basketList.containsKey(key)) { + BasketItem DupItem = basketList.get(key); + DupItem.setQuantity(DupItem.getQuantity() + quantity); + } else { + BasketItem basketItem = new BasketItem(item, quantity); + basketList.put(key, basketItem); + } return true; } - public boolean removeItem(BasketItem basketItem) { - if(basketList.containsKey(basketItem.getSku())){ - basketList.remove(basketItem.getSku()); - return true; + public boolean removeItem(Item item) { + String key = getBasketKey(item); + + if(!basketList.containsKey(key)){ + return false; } - return false; + + int currQuantity = basketList.get(key).getQuantity(); + + if(currQuantity > 1){ + basketList.get(key).setQuantity(currQuantity - 1); + }else{ + basketList.remove(key); + } + return true; } public boolean isFull() { @@ -38,7 +58,7 @@ public boolean isFull() { } public boolean itemInList(Item item) { - if(basketList.containsKey(item.getSku())){ + if(basketList.containsKey(getBasketKey(item))){ return true; } return false; @@ -46,16 +66,23 @@ public boolean itemInList(Item item) { public float getTotalCost() { float total = 0.0f; - for(Item item : basketList){ - total+= item.getTotalCost(); + for(BasketItem item : basketList.values()){ + total+= item.getTotalCost(priceList); } return total; } - public List getBasketList() { + public Map getBasketList() { return basketList; } + private String getBasketKey(Item item) { + if (item instanceof Bagel) { + return ((Bagel) item).getCombiSku(); + } + return item.getSku(); + } + public int getCapacity() { return capacity; } @@ -67,4 +94,8 @@ public boolean setCapacity(int capacity, String role) { } return false; } + + public boolean isInInventory(Item item){ + return inventory.getItems().containsKey(item.getSku()); + } } diff --git a/src/main/java/com/booleanuk/core/BasketItem.java b/src/main/java/com/booleanuk/core/BasketItem.java index b07387e38..03774647e 100644 --- a/src/main/java/com/booleanuk/core/BasketItem.java +++ b/src/main/java/com/booleanuk/core/BasketItem.java @@ -3,7 +3,6 @@ public class BasketItem { private Item item; private int quantity; - private String sku; public BasketItem(Item item, int quantity){ this.item = item; @@ -24,10 +23,12 @@ public boolean setQuantity(int quantity){ } public String getSku(){ + if (item instanceof Bagel) + return ((Bagel) item).getCombiSku(); return item.getSku(); } public float getTotalCost(PriceList priceList){ - return priceList.getPrice(item.getSku())*quantity; + return item.getTotalCost(priceList)*quantity; } } diff --git a/src/main/java/com/booleanuk/core/Coffee.java b/src/main/java/com/booleanuk/core/Coffee.java index b665b09f8..520cfe390 100644 --- a/src/main/java/com/booleanuk/core/Coffee.java +++ b/src/main/java/com/booleanuk/core/Coffee.java @@ -1,23 +1,7 @@ package com.booleanuk.core; -public class Coffee implements Item{ - private String name; - private String variant; - private String sku; - - public Coffee(String name){ - this.name = name; - } - - public String getName() { - return name; - } - - public String getVariant(){ - return variant; - } - - public String getSku(){ - return sku; +public class Coffee extends Item{ + public Coffee(String variant, String sku){ + super("Coffee", variant, sku); } } diff --git a/src/main/java/com/booleanuk/core/Filling.java b/src/main/java/com/booleanuk/core/Filling.java index d72aae332..d5cbfd66a 100644 --- a/src/main/java/com/booleanuk/core/Filling.java +++ b/src/main/java/com/booleanuk/core/Filling.java @@ -1,23 +1,8 @@ package com.booleanuk.core; -public class Filling implements Item{ - private String name; - private String variant; - private String sku; - - public Filling(String name){ - this.name = name; - } - - public String getName() { - return name; +public class Filling extends Item{ + public Filling(String variant, String sku){ + super("Filling", variant, sku); } - public String getVariant(){ - return variant; - } - - public String getSku(){ - return sku; - } } diff --git a/src/main/java/com/booleanuk/core/Inventory.java b/src/main/java/com/booleanuk/core/Inventory.java index 26892a6a4..7ed7f8b4a 100644 --- a/src/main/java/com/booleanuk/core/Inventory.java +++ b/src/main/java/com/booleanuk/core/Inventory.java @@ -21,4 +21,8 @@ public boolean removeItem(Item item){ items.remove(item.getSku()); return false; } + + public Map getItems(){ + return items; + } } diff --git a/src/main/java/com/booleanuk/core/Item.java b/src/main/java/com/booleanuk/core/Item.java index 70567571c..1aac83c13 100644 --- a/src/main/java/com/booleanuk/core/Item.java +++ b/src/main/java/com/booleanuk/core/Item.java @@ -1,8 +1,29 @@ package com.booleanuk.core; -public interface Item { - public String getSku(); - public String getName(); - public String getVariant(); - public float getTotalCost(); +public class Item { + private String name; + private String variant; + private String sku; + + public Item(String name, String variant, String sku){ + this.name = name; + this.variant = variant; + this.sku = sku; + } + + public String getName() { + return name; + } + + public String getVariant(){ + return variant; + } + + public String getSku(){ + return sku; + } + + public float getTotalCost(PriceList priceList){ + return priceList.getPrice(sku); + } } diff --git a/src/main/java/com/booleanuk/core/PriceList.java b/src/main/java/com/booleanuk/core/PriceList.java index 56ceac628..3ba33971f 100644 --- a/src/main/java/com/booleanuk/core/PriceList.java +++ b/src/main/java/com/booleanuk/core/PriceList.java @@ -13,4 +13,8 @@ public PriceList(){ public float getPrice(String sku){ return priceList.get(sku); } + + public void setPrice(String sku, float price){ + priceList.put(sku, price); + } } diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index c9cf3845a..8be577421 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -3,64 +3,121 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -public class BasketTest { +public class BasketTest{ @Test - public void ShouldAddBagelToBasket() { - Bagel bagel = new Bagel("Onion", 0.49f); - Item basketItem = new Item(bagel, 1); - Basket basket = new Basket(2); + public void ShouldAddDifferentItemsToBasket() { + PriceList prices = new PriceList(); + Inventory inventory = new Inventory(); + Basket basket = new Basket(5, prices, inventory); - Bagel bagel2 = new Bagel("Plain", 0.39f); - Item basketItem2 = new Item(bagel2, 1); + Item bagel = new Bagel("Onion", "BGLO"); + Item coffee = new Coffee("Black", "COFB"); - Assertions.assertTrue(basket.addItem(basketItem)); - Assertions.assertEquals(1, basket.getBasketList().size()); - Assertions.assertTrue(basket.addItem(basketItem2)); + Assertions.assertTrue(basket.addItem(bagel, 1)); + Assertions.assertTrue(basket.addItem(coffee, 2)); Assertions.assertEquals(2, basket.getBasketList().size()); + Assertions.assertTrue(basket.itemInList(bagel)); + Assertions.assertTrue(basket.itemInList(coffee)); + Assertions.assertTrue(basket.getBasketList().containsKey(bagel.getSku())); + Assertions.assertTrue(basket.getBasketList().containsKey(coffee.getSku())); + } @Test - public void shouldRemoveExistingBagel() { - Bagel bagel = new Bagel("Onion", 0.49f); - Item basketItem = new Item(bagel, 1); - Basket basket = new Basket(2); - basket.addItem(basketItem); - - Bagel bagel2 = new Bagel("Plain", 0.39f); - Item basketItem2 = new Item(bagel2, 1); - - Assertions.assertFalse(basket.removeItem(basketItem2)); - Assertions.assertTrue(basket.removeItem(basketItem)); - Assertions.assertEquals(0, basket.getBasketList().size()); - Assertions.assertFalse(basket.removeItem(basketItem)); + public void shouldRemoveExistingItem() { + PriceList prices = new PriceList(); + Inventory inventory = new Inventory(); + Basket basket = new Basket(5, prices, inventory); + Item bagel = new Bagel("Onion", "BGLO"); + Item bagel2 = new Bagel("Plain", "BGLP"); + basket.addItem(bagel, 1); + + Assertions.assertFalse(basket.removeItem(bagel2)); + Assertions.assertTrue(basket.removeItem(bagel)); + Assertions.assertTrue(basket.getBasketList().isEmpty()); + + basket.addItem(bagel, 2); + + Assertions.assertTrue(basket.removeItem(bagel)); + Assertions.assertEquals(1, basket.getBasketList().get("BGLO").getQuantity()); + } @Test - public void ShouldWarnWhenBasketIsFull() { - Bagel bagel = new Bagel("Onion", 0.49f); - Item basketItem = new Item(bagel, 1); + public void ShouldAddFilling() { + Bagel bagel = new Bagel("Onion", "BGLO"); + Filling filling = new Filling("Bacon", "FILB"); - Bagel bagel2 = new Bagel("Plain", 0.39f); - Item basketItem2 = new Item(bagel2, 1); + Assertions.assertTrue(bagel.setFilling(filling)); + Assertions.assertTrue(bagel.gotFilling()); + Assertions.assertEquals("FILB", bagel.getFillingSku()); + } - Basket basket = new Basket(2); - basket.addItem(basketItem); - basket.addItem(basketItem2); + @Test + public void ShouldAddSameItemToBasket(){ + PriceList prices = new PriceList(); + Inventory inventory = new Inventory(); + Basket basket = new Basket(5, prices, inventory); - Assertions.assertTrue(basket.isFull()); + Bagel bagel = new Bagel("Onion", "BGLO"); + Filling filling = new Filling("Bacon", "FILB"); + bagel.setFilling(filling); - basket.removeItem(basketItem2); - basket.removeItem(basketItem); + basket.addItem(bagel,1); + Assertions.assertTrue(basket.addItem(bagel,1)); + Assertions.assertEquals(2, basket.getBasketList().get("BGLO-FILB").getQuantity()); + } + + @Test + public void ShouldTellIfItemIsInList(){ + PriceList prices = new PriceList(); + Inventory inventory = new Inventory(); + Basket basket = new Basket(5, prices, inventory); + + Item bagel = new Bagel("Onion", "BGLO"); + Bagel bagel2 = new Bagel("Onion", "BGLO"); + Coffee coffee = new Coffee("Black", "COFB"); + Filling filling = new Filling("Bacon", "FILB"); + + bagel2.setFilling(filling); - basketItem.setQuantity(2); - basket.addItem(basketItem); + basket.addItem(bagel, 1); + basket.addItem(coffee, 1); + + Assertions.assertTrue(basket.itemInList(bagel)); + Assertions.assertTrue(basket.itemInList(coffee)); + Assertions.assertFalse(basket.itemInList(bagel2)); + + basket.addItem(bagel2, 1); + + Assertions.assertTrue(basket.itemInList(bagel2)); + } + + @Test + public void ShouldWarnWhenBasketIsFull() { + PriceList prices = new PriceList(); + Inventory inventory = new Inventory(); + Basket basket = new Basket(2, prices, inventory); + Item bagel = new Bagel("Onion", "BGLO"); + Item bagel2 = new Bagel("Plain", "BGLP"); + + Assertions.assertFalse(basket.isFull()); + + basket.addItem(bagel, 1); + + Assertions.assertFalse(basket.isFull()); + + basket.addItem(bagel2, 1); Assertions.assertTrue(basket.isFull()); + } @Test public void ShouldChangeCapacity() { - Basket basket = new Basket(2); + PriceList prices = new PriceList(); + Inventory inventory = new Inventory(); + Basket basket = new Basket(2, prices, inventory); Assertions.assertTrue(basket.setCapacity(4, "Manager")); Assertions.assertFalse(basket.setCapacity(4, "Customer")); @@ -68,34 +125,56 @@ public void ShouldChangeCapacity() { } @Test - public void ShouldCalculateTotalCost() { - Basket basket = new Basket(2); - - Assertions.assertEquals(0, basket.getTotalCost()); - - Bagel bagel = new Bagel("Onion", 0.49f); - Item basketItem = new Item(bagel, 1); + public void ShouldGetPriceOfItem(){ + PriceList prices = new PriceList(); + prices.setPrice("BGLO", 0.49f); + prices.setPrice("FILB", 0.12f); - Bagel bagel2 = new Bagel("Plain", 0.39f); - Item basketItem2 = new Item(bagel2, 1); + Bagel bagel = new Bagel("Onion", "BGLO"); + Filling filling = new Filling("Bacon", "FILB"); - basket.addItem(basketItem); - basket.addItem(basketItem2); + Assertions.assertEquals(0.49f, bagel.getTotalCost(prices)); - Assertions.assertEquals(0.88f, basket.getTotalCost()); + bagel.setFilling(filling); + Assertions.assertEquals(0.61f, bagel.getTotalCost(prices)); } @Test - public void ShouldAddFilling() { - Bagel bagel = new Bagel("Onion", 0.49f); - Item basketItem = new Item(bagel, 1); - Filling filling = new Filling("Bacon", 0.12f); + public void ShouldCalculateTotalCost() { + PriceList prices = new PriceList(); + Inventory inventory = new Inventory(); + Basket basket = new Basket(5, prices, inventory); + + Item bagel = new Bagel("Onion", "BGLO"); + Bagel bagel2 = new Bagel("Plain", "BGLP"); + Filling filling = new Filling("Bacon", "FILB"); + + prices.setPrice("BGLO", 0.49f); + prices.setPrice("BGLP", 0.39f); + prices.setPrice("FILB", 0.12f); + + bagel2.setFilling(filling); - Assertions.assertTrue(basketItem.setFilling(filling)); + Assertions.assertEquals(0, basket.getTotalCost()); + + basket.addItem(bagel, 1); + basket.addItem(bagel2, 2); + + Assertions.assertEquals(1.51f, basket.getTotalCost()); } @Test public void ShouldCheckIfItemIsInInventory() { + PriceList prices = new PriceList(); Inventory inventory = new Inventory(); + Basket basket = new Basket(2, prices, inventory); + + Item bagel = new Bagel("Onion", "BGLO"); + Item bagel2 = new Bagel("Plain", "BGLP"); + + inventory.addItem(bagel); + + Assertions.assertFalse(basket.isInInventory(bagel2)); + Assertions.assertTrue(basket.isInInventory(bagel)); } } \ No newline at end of file