From 6c8fe9eca5fbb59b7a3fec16f66150843c53c9fe Mon Sep 17 00:00:00 2001 From: Thomas Kristiansen Date: Fri, 10 Jan 2025 13:54:18 +0100 Subject: [PATCH 01/17] First draft of domain model --- domain-model.md | 29 +++++++++++++++++++ src/main/java/com/booleanuk/core/Basket.java | 13 +++++++++ .../java/com/booleanuk/core/Inventory.java | 12 ++++++++ src/main/java/com/booleanuk/core/Item.java | 17 +++++++++++ 4 files changed, 71 insertions(+) create mode 100644 domain-model.md create mode 100644 src/main/java/com/booleanuk/core/Basket.java create mode 100644 src/main/java/com/booleanuk/core/Inventory.java create mode 100644 src/main/java/com/booleanuk/core/Item.java diff --git a/domain-model.md b/domain-model.md new file mode 100644 index 000000000..eea3cef50 --- /dev/null +++ b/domain-model.md @@ -0,0 +1,29 @@ +# Basket + +| Member | Method | Scenario | Output | +|--------|------------------------------|---------------------|---------------| +| | addItem(Item item) | Item does not exist | False | +| | | Item exist | True | +| | removeItem(Item item) | Item does not exist | False | +| | | Item exist | True | +| | listOfItems() | | List of items | +| | getTotalCost() | | double | +| | isFull() | Basket is full | True | +| | | Basket is not full | False | +| | changeCapasity(int capasity) | | int | + + +# Item + +| Member | Method | Scenario | Output | +|--------|---------------------|----------|--------| +| | GetPrice(Item item) | | double | + +# Inventory + +| Member | Method | Scenario | Output | +|--------|--------------|----------------------|--------| +| | checkStock() | Item is in stock | True | +| | | Item is not in stock | 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..65a0461bd --- /dev/null +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -0,0 +1,13 @@ +package com.booleanuk.core; + +import java.util.ArrayList; +import java.util.HashMap; + +public class Basket { + + private int capasity; + private double totalCost; + private HashMap basketList; + + +} 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..e686e887f --- /dev/null +++ b/src/main/java/com/booleanuk/core/Inventory.java @@ -0,0 +1,12 @@ +package com.booleanuk.core; + +import java.util.HashMap; + +public class Inventory { + + private HashMap stockList; + + public Inventory() { + stockList.put() + } +} 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..50f7304d2 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Item.java @@ -0,0 +1,17 @@ +package com.booleanuk.core; + +public class Item { + private String id; + private double price; + private String type; + private String description; + + public Item(String id, double price, String type, String description) { + this.id = id; + this.price = price; + this.type = type; + this.description = description; + } + + +} From 854c641fb309e7df3ed74bd4cf0d3f72b6f243b4 Mon Sep 17 00:00:00 2001 From: Thomas Kristiansen Date: Fri, 10 Jan 2025 14:53:38 +0100 Subject: [PATCH 02/17] Made stock list that contains the items --- src/main/java/com/booleanuk/core/Basket.java | 35 +++++++++++++++++-- .../java/com/booleanuk/core/Inventory.java | 1 - src/main/java/com/booleanuk/core/Item.java | 2 ++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 65a0461bd..a7da66b0e 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -5,9 +5,40 @@ public class Basket { - private int capasity; + private int capasity = 10; private double totalCost; private HashMap basketList; + public HashMap stockList = new HashMap<>() {{ + Item bagelOnion = new Item("BGLO", 0.49, "Bagel", "Onion"); + put("BGLO", bagelOnion); + Item bagelPlain = new Item("BGLP", 0.39, "Bagel", "Plain"); + put("BGLP", bagelPlain); + Item bagelEvery = new Item("BGLE", 0.49, "Bagel", "Everything"); + put("BGLE", bagelEvery); + Item bagelSesame = new Item("BGLS", 0.49, "Bagel", "Sesame"); + put("BGLS", bagelSesame); + Item coffeeBlack = new Item("COFB", 0.99, "Coffee", "Black"); + put("COFB", coffeeBlack); + Item coffeeWhite = new Item("COFW", 1.19, "Coffee", "White"); + put("CFOW", coffeeWhite); + Item coffeeCapuccino = new Item("COFC", 1.29, "Coffee", "Capuccino"); + put("COFC", coffeeCapuccino); + Item coffeeLatte = new Item("COFL", 1.29, "Coffee", "Latte"); + put("BGLO", coffeeLatte); + Item fillBacon = new Item("FILB", 0.12, "Filling", "Bacon"); + put("BGLO", fillBacon); + Item fillEgg = new Item("FILE", 0.12, "Filling", "Egg"); + put("BGLO", fillEgg); + Item fillCheese = new Item("FILC", 0.12, "Filling", "Egg"); + put("BGLO", fillCheese); + Item fillCream = new Item("FILX", 0.12, "Filling", "Cream Cheese"); + put("BGLO", fillCream); + Item fillSal = new Item("FILS", 0.12, "Filling", "Smoked Salmon"); + put("BGLO", fillSal); + Item fillHam = new Item("FILH", 0.12, "Filling", "Ham"); + put("BGLO", fillHam); + }}; - + public Basket() { + } } diff --git a/src/main/java/com/booleanuk/core/Inventory.java b/src/main/java/com/booleanuk/core/Inventory.java index e686e887f..f85993fbf 100644 --- a/src/main/java/com/booleanuk/core/Inventory.java +++ b/src/main/java/com/booleanuk/core/Inventory.java @@ -7,6 +7,5 @@ public class Inventory { private HashMap stockList; public Inventory() { - stockList.put() } } diff --git a/src/main/java/com/booleanuk/core/Item.java b/src/main/java/com/booleanuk/core/Item.java index 50f7304d2..38af494ad 100644 --- a/src/main/java/com/booleanuk/core/Item.java +++ b/src/main/java/com/booleanuk/core/Item.java @@ -1,5 +1,7 @@ package com.booleanuk.core; +import java.util.HashMap; + public class Item { private String id; private double price; From a65ec18ce718a6e94f858288c399697edb15c968 Mon Sep 17 00:00:00 2001 From: Thomas Kristiansen Date: Fri, 10 Jan 2025 14:59:41 +0100 Subject: [PATCH 03/17] test for adding items to basket --- domain-model.md | 32 ++++++++----------- .../java/com/booleanuk/core/Inventory.java | 11 ------- .../java/com/booleanuk/core/BasketTest.java | 14 ++++++++ 3 files changed, 27 insertions(+), 30 deletions(-) delete mode 100644 src/main/java/com/booleanuk/core/Inventory.java create mode 100644 src/test/java/com/booleanuk/core/BasketTest.java diff --git a/domain-model.md b/domain-model.md index eea3cef50..580f21632 100644 --- a/domain-model.md +++ b/domain-model.md @@ -1,16 +1,18 @@ # Basket -| Member | Method | Scenario | Output | -|--------|------------------------------|---------------------|---------------| -| | addItem(Item item) | Item does not exist | False | -| | | Item exist | True | -| | removeItem(Item item) | Item does not exist | False | -| | | Item exist | True | -| | listOfItems() | | List of items | -| | getTotalCost() | | double | -| | isFull() | Basket is full | True | -| | | Basket is not full | False | -| | changeCapasity(int capasity) | | int | +| Member | Method | Scenario | Output | +|---------------------------------|------------------------------|----------------------------|---------------| +| Hashmap stockList | addItem(Item item) | Item does not exist | False | +| | | Item exist | True | +| | removeItem(Item item) | Item does not exist | False | +| | | Item exist | True | +| | listOfItems() | | List of items | +| | getTotalCost() | | double | +| | isFull() | Basket is full | True | +| | | Basket is not full | False | +| | changeCapasity(int capasity) | | int | +| | checkStock() | Item is in stock | True | +| | | Item is not in stock | False | # Item @@ -19,11 +21,3 @@ |--------|---------------------|----------|--------| | | GetPrice(Item item) | | double | -# Inventory - -| Member | Method | Scenario | Output | -|--------|--------------|----------------------|--------| -| | checkStock() | Item is in stock | True | -| | | Item is not in stock | False | - - diff --git a/src/main/java/com/booleanuk/core/Inventory.java b/src/main/java/com/booleanuk/core/Inventory.java deleted file mode 100644 index f85993fbf..000000000 --- a/src/main/java/com/booleanuk/core/Inventory.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.booleanuk.core; - -import java.util.HashMap; - -public class Inventory { - - private HashMap stockList; - - public Inventory() { - } -} 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..3acb00a73 --- /dev/null +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -0,0 +1,14 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class BasketTest { + + @Test + public void addingItemsToBasket() { + Basket basket = new Basket(); + + Assertions.assertTrue(basket.add(basket.stockList.get("BGLP"))); + } +} From 28435d838afb04b3fb0d58bc9b93dcca3de43077 Mon Sep 17 00:00:00 2001 From: Thomas Kristiansen Date: Fri, 10 Jan 2025 15:58:59 +0100 Subject: [PATCH 04/17] adding to the basket --- src/main/java/com/booleanuk/core/Basket.java | 50 +++++++++++++++---- src/main/java/com/booleanuk/core/Item.java | 30 +++++++++++ .../java/com/booleanuk/core/BasketTest.java | 4 +- 3 files changed, 74 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index a7da66b0e..e00a18ed5 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -1,13 +1,17 @@ package com.booleanuk.core; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.regex.Pattern; public class Basket { private int capasity = 10; private double totalCost; - private HashMap basketList; + private String bagel = "BGLO"; + + private ArrayList basketList = new ArrayList<>(); public HashMap stockList = new HashMap<>() {{ Item bagelOnion = new Item("BGLO", 0.49, "Bagel", "Onion"); put("BGLO", bagelOnion); @@ -20,25 +24,53 @@ public class Basket { Item coffeeBlack = new Item("COFB", 0.99, "Coffee", "Black"); put("COFB", coffeeBlack); Item coffeeWhite = new Item("COFW", 1.19, "Coffee", "White"); - put("CFOW", coffeeWhite); + put("COFW", coffeeWhite); Item coffeeCapuccino = new Item("COFC", 1.29, "Coffee", "Capuccino"); put("COFC", coffeeCapuccino); Item coffeeLatte = new Item("COFL", 1.29, "Coffee", "Latte"); - put("BGLO", coffeeLatte); + put("COFL", coffeeLatte); Item fillBacon = new Item("FILB", 0.12, "Filling", "Bacon"); - put("BGLO", fillBacon); + put("FILB", fillBacon); Item fillEgg = new Item("FILE", 0.12, "Filling", "Egg"); - put("BGLO", fillEgg); + put("FILE", fillEgg); Item fillCheese = new Item("FILC", 0.12, "Filling", "Egg"); - put("BGLO", fillCheese); + put("FILC", fillCheese); Item fillCream = new Item("FILX", 0.12, "Filling", "Cream Cheese"); - put("BGLO", fillCream); + put("FILX", fillCream); Item fillSal = new Item("FILS", 0.12, "Filling", "Smoked Salmon"); - put("BGLO", fillSal); + put("FILS", fillSal); Item fillHam = new Item("FILH", 0.12, "Filling", "Ham"); - put("BGLO", fillHam); + put("FILH", fillHam); }}; public Basket() { } + + public boolean addToBasket(String id) { + if (basketList.size() != capasity) { + if (stockList.containsKey(id)) { + if(id.substring(0,2).equals("FI")) { + if(basketList.size() != 0) { + for (int i = 0; i <= basketList.size(); i++) { + if (basketList.get(i).getId().substring(0,2).equals("BG")) { + basketList.add(stockList.get(id)); + return true; + } else { + System.out.println("You need a bagel to buy filling!"); + return false; + } + } + } else { + System.out.println("You can't just buy fillings!"); + return false; + } + } + basketList.add(stockList.get(id)); + return true; + } else { + return false; + } + } + return false; + } } diff --git a/src/main/java/com/booleanuk/core/Item.java b/src/main/java/com/booleanuk/core/Item.java index 38af494ad..af536f491 100644 --- a/src/main/java/com/booleanuk/core/Item.java +++ b/src/main/java/com/booleanuk/core/Item.java @@ -15,5 +15,35 @@ public Item(String id, double price, String type, String description) { this.description = description; } + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } } diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 3acb00a73..7af4d48f7 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -9,6 +9,8 @@ public class BasketTest { public void addingItemsToBasket() { Basket basket = new Basket(); - Assertions.assertTrue(basket.add(basket.stockList.get("BGLP"))); + Assertions.assertFalse(basket.addToBasket("FILE")); + + Assertions.assertTrue(basket.addToBasket("BGLO")); } } From d2e2eb32e6bdaeef7c9d77fdb9f09ec6bfa72a57 Mon Sep 17 00:00:00 2001 From: Thomas Kristiansen Date: Fri, 10 Jan 2025 16:01:51 +0100 Subject: [PATCH 05/17] gleek --- gleek | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 gleek diff --git a/gleek b/gleek new file mode 100644 index 000000000..6f90a4302 --- /dev/null +++ b/gleek @@ -0,0 +1,20 @@ +Basket + - capasity: Integer + - totalCost: Double + - basketList: Hashmap + - stockList: Hashmap + + checkStock(): boolean + + removeItem(item: Item): boolean + + listOfItems(): Hashmap + + getTotalCost(): Double + + addItem(item: Item): boolean + + isFull(): String + + changeCapasity(capasity: Integer): Integer + +Item + - id: String + - price: Double + - Type: String + - Description: String + + getPrice(item: Item): Double + From a3545920f67f7f5653ea963fb288f5be470d312d Mon Sep 17 00:00:00 2001 From: Thomas Kristiansen Date: Mon, 13 Jan 2025 10:04:17 +0100 Subject: [PATCH 06/17] test for removing item --- src/main/java/com/booleanuk/core/Basket.java | 4 ++++ src/test/java/com/booleanuk/core/BasketTest.java | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index e00a18ed5..53a3d59bc 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -73,4 +73,8 @@ public boolean addToBasket(String id) { } return false; } + + public boolean removeItem(String id) { + + } } diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 7af4d48f7..01fc2d18b 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -13,4 +13,12 @@ public void addingItemsToBasket() { Assertions.assertTrue(basket.addToBasket("BGLO")); } + + @Test + public void removingItemFromBasket() { + Basket basket = new Basket(); + basket.addToBasket("BGLO"); + + Assertions.assertTrue(basket.removeItem("BGLO")); + } } From fcc912564435cc6b971b56c346f0a5f5d777590e Mon Sep 17 00:00:00 2001 From: Thomas Kristiansen Date: Mon, 13 Jan 2025 11:47:41 +0100 Subject: [PATCH 07/17] test and implemented listOfItems --- src/main/java/com/booleanuk/core/Basket.java | 26 ++++++++++++++++--- .../java/com/booleanuk/core/BasketTest.java | 12 +++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 53a3d59bc..27f3ce215 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -1,9 +1,7 @@ package com.booleanuk.core; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; -import java.util.regex.Pattern; public class Basket { @@ -11,7 +9,7 @@ public class Basket { private double totalCost; private String bagel = "BGLO"; - private ArrayList basketList = new ArrayList<>(); + public ArrayList basketList = new ArrayList<>(); public HashMap stockList = new HashMap<>() {{ Item bagelOnion = new Item("BGLO", 0.49, "Bagel", "Onion"); put("BGLO", bagelOnion); @@ -75,6 +73,26 @@ public boolean addToBasket(String id) { } public boolean removeItem(String id) { - + if(basketList.size() != 0) { + for (int i = 0; i < basketList.size(); i++) { + if (basketList.get(i).getId().equals(id)) { + basketList.remove(i); + return true; + } else { + System.out.println("Item not in basket!"); + return false; + } + } + } + System.out.println("No items in basket!"); + return false; + } + + public ArrayList listOfItems() { + return basketList; + } + + public double getTotalCost() { + } } diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 01fc2d18b..945f6ed35 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -18,7 +18,19 @@ public void addingItemsToBasket() { public void removingItemFromBasket() { Basket basket = new Basket(); basket.addToBasket("BGLO"); + basket.addToBasket("COFB"); Assertions.assertTrue(basket.removeItem("BGLO")); + Assertions.assertFalse(basket.removeItem("BGLO")); + Assertions.assertEquals(1, basket.listOfItems().size()); + } + + @Test + public void getListOfItems() { + Basket basket = new Basket(); + basket.addToBasket("BGLO"); + basket.addToBasket("COFB"); + + Assertions.assertEquals(basket.basketList, basket.listOfItems()); } } From 44196bb24b8ad5271af284cb806da9e15d0ba1b5 Mon Sep 17 00:00:00 2001 From: Thomas Kristiansen Date: Mon, 13 Jan 2025 11:56:53 +0100 Subject: [PATCH 08/17] test and implemented method to get total cost --- domain-model.md | 23 +++++++++---------- src/main/java/com/booleanuk/core/Basket.java | 6 ++++- .../java/com/booleanuk/core/BasketTest.java | 11 +++++++++ 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/domain-model.md b/domain-model.md index 580f21632..ba1c2e7df 100644 --- a/domain-model.md +++ b/domain-model.md @@ -1,18 +1,17 @@ # Basket -| Member | Method | Scenario | Output | -|---------------------------------|------------------------------|----------------------------|---------------| -| Hashmap stockList | addItem(Item item) | Item does not exist | False | -| | | Item exist | True | -| | removeItem(Item item) | Item does not exist | False | -| | | Item exist | True | -| | listOfItems() | | List of items | -| | getTotalCost() | | double | -| | isFull() | Basket is full | True | -| | | Basket is not full | False | +| Member | Method | Scenario | Output | +|---------------------------------|----------------------|----------------------------|---------------| +| Hashmap stockList | addItem(Item item) | Item does not exist | False | +| | | Item exist | True | +| | removeItem(Item item) | Item does not exist | False | +| | | Item exist | True | +| | listOfItems() | | List of items | +| | getTotalCost() | | double | +| | | Basket is not full | False | | | changeCapasity(int capasity) | | int | -| | checkStock() | Item is in stock | True | -| | | Item is not in stock | False | +| | checkStock() | Item is in stock | True | +| | | Item is not in stock | False | # Item diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 27f3ce215..d5f92bfcc 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -69,6 +69,7 @@ public boolean addToBasket(String id) { return false; } } + System.out.println("Cannot add more items!"); return false; } @@ -93,6 +94,9 @@ public ArrayList listOfItems() { } public double getTotalCost() { - + for (int i = 0; i < basketList.size(); i++) { + totalCost += basketList.get(i).getPrice(); + } + return totalCost; } } diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 945f6ed35..a8337e9ee 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -33,4 +33,15 @@ public void getListOfItems() { Assertions.assertEquals(basket.basketList, basket.listOfItems()); } + + @Test + public void getTotalPriceOfBasket() { + Basket basket = new Basket(); + basket.addToBasket("BGLO"); + basket.addToBasket("COFB"); + + Assertions.assertEquals(1.48, basket.getTotalCost()); + } + + } From 17ac615cb7126d862427e94a01c7d5494ea1f442 Mon Sep 17 00:00:00 2001 From: Thomas Kristiansen Date: Mon, 13 Jan 2025 12:01:32 +0100 Subject: [PATCH 09/17] Test for changing capasity --- src/main/java/com/booleanuk/core/Basket.java | 13 ++++++++++++- src/test/java/com/booleanuk/core/BasketTest.java | 6 ++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index d5f92bfcc..d0eb7bca9 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -7,7 +7,6 @@ public class Basket { private int capasity = 10; private double totalCost; - private String bagel = "BGLO"; public ArrayList basketList = new ArrayList<>(); public HashMap stockList = new HashMap<>() {{ @@ -44,6 +43,14 @@ public class Basket { public Basket() { } + public int getCapasity() { + return capasity; + } + + public void setCapasity(int capasity) { + this.capasity = capasity; + } + public boolean addToBasket(String id) { if (basketList.size() != capasity) { if (stockList.containsKey(id)) { @@ -99,4 +106,8 @@ public double getTotalCost() { } return totalCost; } + + public int changeCapasity(int c) { + + } } diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index a8337e9ee..3f9208b31 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -43,5 +43,11 @@ public void getTotalPriceOfBasket() { Assertions.assertEquals(1.48, basket.getTotalCost()); } + @Test + public void changeCapasityOfBasket() { + Basket basket = new Basket(); + basket.changeCapasity(200); + Assertions.assertEquals(200, basket.getCapasity()); + } } From df572fba3fe42ef326c02a30e4f704e44e3ae163 Mon Sep 17 00:00:00 2001 From: Thomas Kristiansen Date: Mon, 13 Jan 2025 12:58:11 +0100 Subject: [PATCH 10/17] implemented change capasity --- src/main/java/com/booleanuk/core/Basket.java | 25 ++++++++++++++++--- .../java/com/booleanuk/core/BasketTest.java | 5 +++- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index d0eb7bca9..36a1141ff 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -8,8 +8,9 @@ public class Basket { private int capasity = 10; private double totalCost; - public ArrayList basketList = new ArrayList<>(); - public HashMap stockList = new HashMap<>() {{ + private ArrayList basketList = new ArrayList<>(); + + private HashMap stockList = new HashMap<>() {{ Item bagelOnion = new Item("BGLO", 0.49, "Bagel", "Onion"); put("BGLO", bagelOnion); Item bagelPlain = new Item("BGLP", 0.39, "Bagel", "Plain"); @@ -51,6 +52,22 @@ public void setCapasity(int capasity) { this.capasity = capasity; } + public ArrayList getBasketList() { + return basketList; + } + + public void setBasketList(ArrayList basketList) { + this.basketList = basketList; + } + + public HashMap getStockList() { + return stockList; + } + + public void setStockList(HashMap stockList) { + this.stockList = stockList; + } + public boolean addToBasket(String id) { if (basketList.size() != capasity) { if (stockList.containsKey(id)) { @@ -73,6 +90,7 @@ public boolean addToBasket(String id) { basketList.add(stockList.get(id)); return true; } else { + System.out.println("Item does not exist in our inventory."); return false; } } @@ -108,6 +126,7 @@ public double getTotalCost() { } public int changeCapasity(int c) { - + this.capasity = c; + return c; } } diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 3f9208b31..13d77977c 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -16,6 +16,7 @@ public void addingItemsToBasket() { @Test public void removingItemFromBasket() { + // Testing removing items that exist and does not exist Basket basket = new Basket(); basket.addToBasket("BGLO"); basket.addToBasket("COFB"); @@ -25,13 +26,15 @@ public void removingItemFromBasket() { Assertions.assertEquals(1, basket.listOfItems().size()); } + + @Test public void getListOfItems() { Basket basket = new Basket(); basket.addToBasket("BGLO"); basket.addToBasket("COFB"); - Assertions.assertEquals(basket.basketList, basket.listOfItems()); + Assertions.assertEquals(basket.getBasketList(), basket.listOfItems()); } @Test From e61e9027d94478f2da37cd00bccf9cffe03340b5 Mon Sep 17 00:00:00 2001 From: Thomas Kristiansen Date: Tue, 14 Jan 2025 11:02:18 +0100 Subject: [PATCH 11/17] Refactor to inheritance and implement receipt --- domain-model.md | 24 ++--- src/main/java/com/booleanuk/core/Bagel.java | 7 ++ src/main/java/com/booleanuk/core/Basket.java | 100 +++++++++++++++--- src/main/java/com/booleanuk/core/Coffee.java | 7 ++ src/main/java/com/booleanuk/core/Filling.java | 7 ++ .../java/com/booleanuk/core/BasketTest.java | 16 +++ 6 files changed, 135 insertions(+), 26 deletions(-) create mode 100644 src/main/java/com/booleanuk/core/Bagel.java create mode 100644 src/main/java/com/booleanuk/core/Coffee.java create mode 100644 src/main/java/com/booleanuk/core/Filling.java diff --git a/domain-model.md b/domain-model.md index ba1c2e7df..7aaf418d0 100644 --- a/domain-model.md +++ b/domain-model.md @@ -1,17 +1,17 @@ # Basket -| Member | Method | Scenario | Output | -|---------------------------------|----------------------|----------------------------|---------------| -| Hashmap stockList | addItem(Item item) | Item does not exist | False | -| | | Item exist | True | -| | removeItem(Item item) | Item does not exist | False | -| | | Item exist | True | -| | listOfItems() | | List of items | -| | getTotalCost() | | double | -| | | Basket is not full | False | -| | changeCapasity(int capasity) | | int | -| | checkStock() | Item is in stock | True | -| | | Item is not in stock | False | +| Member | Method | Scenario | Output | +|---------------------------------|------------------------------|----------------------|---------------| +| Hashmap stockList | addItem(Item item) | Item does not exist | False | +| | | Item exist | True | +| | removeItem(Item item) | Item does not exist | False | +| | | Item exist | True | +| | listOfItems() | | List of items | +| | getTotalCost() | | double | +| | | Basket is not full | False | +| | changeCapasity(int capasity) | | int | +| | checkStock() | Item is in stock | True | +| | | Item is not in stock | False | # Item 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..c9000502f --- /dev/null +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -0,0 +1,7 @@ +package com.booleanuk.core; + +public class Bagel extends Item { + public Bagel(String id, double price, String type, String description) { + super(id, price, type, description); + } +} diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 36a1141ff..4b869dc07 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 java.text.DecimalFormat; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; @@ -11,33 +13,33 @@ public class Basket { private ArrayList basketList = new ArrayList<>(); private HashMap stockList = new HashMap<>() {{ - Item bagelOnion = new Item("BGLO", 0.49, "Bagel", "Onion"); + Item bagelOnion = new Bagel("BGLO", 0.49, "Bagel", "Onion"); put("BGLO", bagelOnion); - Item bagelPlain = new Item("BGLP", 0.39, "Bagel", "Plain"); + Item bagelPlain = new Bagel("BGLP", 0.39, "Bagel", "Plain"); put("BGLP", bagelPlain); - Item bagelEvery = new Item("BGLE", 0.49, "Bagel", "Everything"); + Item bagelEvery = new Bagel("BGLE", 0.49, "Bagel", "Everything"); put("BGLE", bagelEvery); - Item bagelSesame = new Item("BGLS", 0.49, "Bagel", "Sesame"); + Item bagelSesame = new Bagel("BGLS", 0.49, "Bagel", "Sesame"); put("BGLS", bagelSesame); - Item coffeeBlack = new Item("COFB", 0.99, "Coffee", "Black"); + Item coffeeBlack = new Coffee("COFB", 0.99, "Coffee", "Black"); put("COFB", coffeeBlack); - Item coffeeWhite = new Item("COFW", 1.19, "Coffee", "White"); + Item coffeeWhite = new Coffee("COFW", 1.19, "Coffee", "White"); put("COFW", coffeeWhite); - Item coffeeCapuccino = new Item("COFC", 1.29, "Coffee", "Capuccino"); + Item coffeeCapuccino = new Coffee("COFC", 1.29, "Coffee", "Capuccino"); put("COFC", coffeeCapuccino); - Item coffeeLatte = new Item("COFL", 1.29, "Coffee", "Latte"); + Item coffeeLatte = new Coffee("COFL", 1.29, "Coffee", "Latte"); put("COFL", coffeeLatte); - Item fillBacon = new Item("FILB", 0.12, "Filling", "Bacon"); + Item fillBacon = new Filling("FILB", 0.12, "Filling", "Bacon"); put("FILB", fillBacon); - Item fillEgg = new Item("FILE", 0.12, "Filling", "Egg"); + Item fillEgg = new Filling("FILE", 0.12, "Filling", "Egg"); put("FILE", fillEgg); - Item fillCheese = new Item("FILC", 0.12, "Filling", "Egg"); + Item fillCheese = new Filling("FILC", 0.12, "Filling", "Egg"); put("FILC", fillCheese); - Item fillCream = new Item("FILX", 0.12, "Filling", "Cream Cheese"); + Item fillCream = new Filling("FILX", 0.12, "Filling", "Cream Cheese"); put("FILX", fillCream); - Item fillSal = new Item("FILS", 0.12, "Filling", "Smoked Salmon"); + Item fillSal = new Filling("FILS", 0.12, "Filling", "Smoked Salmon"); put("FILS", fillSal); - Item fillHam = new Item("FILH", 0.12, "Filling", "Ham"); + Item fillHam = new Filling("FILH", 0.12, "Filling", "Ham"); put("FILH", fillHam); }}; @@ -129,4 +131,74 @@ public int changeCapasity(int c) { this.capasity = c; return c; } + + public HashMap receiptBuilder() { + HashMap boughtItems = new HashMap<>(); + + int quantityBagel = 0; + int quantityFilling = 0; + int quantityCoffee = 0; + + for (int i = 0; i < basketList.size(); i++) { + if (basketList.get(i).getId().substring(0,1).equals("B")) { + if (!boughtItems.containsKey(basketList.get(i).getDescription())) { + quantityBagel++; + boughtItems.put(basketList.get(i).getId(),quantityBagel); + } else { + boughtItems.remove(basketList.get(i).getId(),quantityBagel); + quantityBagel++; + boughtItems.put(basketList.get(i).getId(), quantityBagel); + } + } + + if (basketList.get(i).getId().substring(0,1).equals("F")) { + if (!boughtItems.containsKey(basketList.get(i).getDescription())) { + quantityFilling++; + boughtItems.put(basketList.get(i).getId(),quantityFilling); + } else { + boughtItems.remove(basketList.get(i).getId(),quantityFilling); + quantityFilling++; + boughtItems.put(basketList.get(i).getId(), quantityFilling); + } + } + + if (basketList.get(i).getId().substring(0,1).equals("C")) { + if (!boughtItems.containsKey(basketList.get(i).getDescription())) { + quantityCoffee++; + boughtItems.put(basketList.get(i).getId(),quantityCoffee); + } else { + boughtItems.remove(basketList.get(i).getId(),quantityCoffee); + quantityCoffee++; + boughtItems.put(basketList.get(i).getId(), quantityCoffee); + } + } + } + return boughtItems; + } + + public void printReceipt() { + StringBuilder sb = new StringBuilder(); + HashMap list = receiptBuilder(); + DecimalFormat df = new DecimalFormat(); + String desc = ""; + String type = ""; + double price = 0; + + sb.append("~~~ Bob's Bagels ~~~\n"); + sb.append(java.time.ZonedDateTime.now().format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm\n"))); + sb.append("\n----------------------------\n"); + + for ( String name : list.keySet()) { + for (int i = 0; i < stockList.size(); i++) { + Item item = stockList.get(name); + price = item.getPrice(); + desc = item.getDescription(); + type = item.getType(); + } + sb.append(desc + " " + type + " " +list.get(name).toString()+ " " + df.format(price*list.get(name)) + "£\n"); + } + sb.append("\n----------------------------\n"); + sb.append("Total cost: " + df.format(getTotalCost())+"£\n"); + System.out.println(sb); + } } 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..e9ba37099 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Coffee.java @@ -0,0 +1,7 @@ +package com.booleanuk.core; + +public class Coffee extends Item { + public Coffee(String id, double price, String type, String description) { + super(id, price, type, description); + } +} 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..5862d1dd8 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Filling.java @@ -0,0 +1,7 @@ +package com.booleanuk.core; + +public class Filling extends Item { + public Filling(String id, double price, String type, String description) { + super(id, price, type, description); + } +} diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 13d77977c..97664e9aa 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -53,4 +53,20 @@ public void changeCapasityOfBasket() { basket.changeCapasity(200); Assertions.assertEquals(200, basket.getCapasity()); } + + @Test + public void testGetReceipt() { + Basket basket = new Basket(); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("COFB"); + basket.addToBasket("COFB"); + basket.addToBasket("COFB"); + basket.addToBasket("FILE"); + basket.addToBasket("FILE"); + basket.addToBasket("FILE"); + basket.addToBasket("FILE"); + + basket.printReceipt(); + } } From 4ca1dd895a322ec5b0bc535d73f40a1c19c1f277 Mon Sep 17 00:00:00 2001 From: Thomas Kristiansen Date: Tue, 14 Jan 2025 11:28:03 +0100 Subject: [PATCH 12/17] test for discount --- src/main/java/com/booleanuk/core/Basket.java | 3 +- .../java/com/booleanuk/core/BasketTest.java | 39 ++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 4b869dc07..51533e919 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -176,7 +176,7 @@ public HashMap receiptBuilder() { return boughtItems; } - public void printReceipt() { + public StringBuilder printReceipt() { StringBuilder sb = new StringBuilder(); HashMap list = receiptBuilder(); DecimalFormat df = new DecimalFormat(); @@ -200,5 +200,6 @@ public void printReceipt() { sb.append("\n----------------------------\n"); sb.append("Total cost: " + df.format(getTotalCost())+"£\n"); System.out.println(sb); + return sb; } } diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 97664e9aa..fb2975b0e 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -3,6 +3,8 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.time.format.DateTimeFormatter; + public class BasketTest { @Test @@ -56,6 +58,16 @@ public void changeCapasityOfBasket() { @Test public void testGetReceipt() { + StringBuilder sb = new StringBuilder(); + sb.append("~~~ Bob's Bagels ~~~\n"); + sb.append(java.time.ZonedDateTime.now().format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm\n"))); + sb.append("\n----------------------------\n"); + sb.append("Onion Bagel " + 2+ " 0.98£\n"); + sb.append("Black Coffee " + 3+ " 2.97£\n"); + sb.append("Egg Filling " + 4+ " 0.48£\n"); + sb.append("\n----------------------------\n"); + sb.append("Total cost: " + 4.43+"£\n"); + Basket basket = new Basket(); basket.addToBasket("BGLO"); basket.addToBasket("BGLO"); @@ -67,6 +79,31 @@ public void testGetReceipt() { basket.addToBasket("FILE"); basket.addToBasket("FILE"); - basket.printReceipt(); + //sb.compare return 0 if the stringbuilder contains same character sequence + Assertions.assertEquals(0, sb.compareTo(basket.printReceipt())); + } + + @Test + public void testDiscountOnBasketList() { + Basket basket = new Basket(); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("COFB"); + + Assertions.assertEquals(5.73,basket.getTotalCost()); + + } } From 57893cdbf59822432c13160b5412093924d85937 Mon Sep 17 00:00:00 2001 From: Thomas Kristiansen Date: Tue, 14 Jan 2025 11:45:47 +0100 Subject: [PATCH 13/17] moved receipt to an own class --- src/main/java/com/booleanuk/core/Basket.java | 75 +++-------------- src/main/java/com/booleanuk/core/Receipt.java | 80 +++++++++++++++++++ .../java/com/booleanuk/core/BasketTest.java | 6 +- 3 files changed, 93 insertions(+), 68 deletions(-) create mode 100644 src/main/java/com/booleanuk/core/Receipt.java diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 51533e919..4d1467372 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -132,74 +132,17 @@ public int changeCapasity(int c) { return c; } - public HashMap receiptBuilder() { - HashMap boughtItems = new HashMap<>(); - - int quantityBagel = 0; - int quantityFilling = 0; - int quantityCoffee = 0; - - for (int i = 0; i < basketList.size(); i++) { - if (basketList.get(i).getId().substring(0,1).equals("B")) { - if (!boughtItems.containsKey(basketList.get(i).getDescription())) { - quantityBagel++; - boughtItems.put(basketList.get(i).getId(),quantityBagel); - } else { - boughtItems.remove(basketList.get(i).getId(),quantityBagel); - quantityBagel++; - boughtItems.put(basketList.get(i).getId(), quantityBagel); - } - } - - if (basketList.get(i).getId().substring(0,1).equals("F")) { - if (!boughtItems.containsKey(basketList.get(i).getDescription())) { - quantityFilling++; - boughtItems.put(basketList.get(i).getId(),quantityFilling); - } else { - boughtItems.remove(basketList.get(i).getId(),quantityFilling); - quantityFilling++; - boughtItems.put(basketList.get(i).getId(), quantityFilling); - } - } - - if (basketList.get(i).getId().substring(0,1).equals("C")) { - if (!boughtItems.containsKey(basketList.get(i).getDescription())) { - quantityCoffee++; - boughtItems.put(basketList.get(i).getId(),quantityCoffee); - } else { - boughtItems.remove(basketList.get(i).getId(),quantityCoffee); - quantityCoffee++; - boughtItems.put(basketList.get(i).getId(), quantityCoffee); - } + public double discountPrice(ArrayList basketTempList) { + int bagelCount = 0; + int coffeeCount = 0; + for (int i = 0; i < basketTempList.size(); i++) { + if (basketTempList.get(i).getId().substring(0,1).equals("B")) { + bagelCount++; + } else if (basketTempList.get(i).getId().substring(0,1).equals("C")) { + coffeeCount++; } } - return boughtItems; + return 0; } - public StringBuilder printReceipt() { - StringBuilder sb = new StringBuilder(); - HashMap list = receiptBuilder(); - DecimalFormat df = new DecimalFormat(); - String desc = ""; - String type = ""; - double price = 0; - - sb.append("~~~ Bob's Bagels ~~~\n"); - sb.append(java.time.ZonedDateTime.now().format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm\n"))); - sb.append("\n----------------------------\n"); - - for ( String name : list.keySet()) { - for (int i = 0; i < stockList.size(); i++) { - Item item = stockList.get(name); - price = item.getPrice(); - desc = item.getDescription(); - type = item.getType(); - } - sb.append(desc + " " + type + " " +list.get(name).toString()+ " " + df.format(price*list.get(name)) + "£\n"); - } - sb.append("\n----------------------------\n"); - sb.append("Total cost: " + df.format(getTotalCost())+"£\n"); - System.out.println(sb); - return sb; - } } diff --git a/src/main/java/com/booleanuk/core/Receipt.java b/src/main/java/com/booleanuk/core/Receipt.java new file mode 100644 index 000000000..b6fdfb5e4 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Receipt.java @@ -0,0 +1,80 @@ +package com.booleanuk.core; + +import java.text.DecimalFormat; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; + +public class Receipt { + + public HashMap receiptBuilder(Basket basket) { + HashMap boughtItems = new HashMap<>(); + + int quantityBagel = 0; + int quantityFilling = 0; + int quantityCoffee = 0; + + for (int i = 0; i < basket.getBasketList().size(); i++) { + if (basket.getBasketList().get(i).getId().substring(0, 1).equals("B")) { + if (!boughtItems.containsKey(basket.getBasketList().get(i).getDescription())) { + quantityBagel++; + boughtItems.put(basket.getBasketList().get(i).getId(), quantityBagel); + } else { + boughtItems.remove(basket.getBasketList().get(i).getId(), quantityBagel); + quantityBagel++; + boughtItems.put(basket.getBasketList().get(i).getId(), quantityBagel); + } + } + + if (basket.getBasketList().get(i).getId().substring(0, 1).equals("F")) { + if (!boughtItems.containsKey(basket.getBasketList().get(i).getDescription())) { + quantityFilling++; + boughtItems.put(basket.getBasketList().get(i).getId(), quantityFilling); + } else { + boughtItems.remove(basket.getBasketList().get(i).getId(), quantityFilling); + quantityFilling++; + boughtItems.put(basket.getBasketList().get(i).getId(), quantityFilling); + } + } + + if (basket.getBasketList().get(i).getId().substring(0, 1).equals("C")) { + if (!boughtItems.containsKey(basket.getBasketList().get(i).getDescription())) { + quantityCoffee++; + boughtItems.put(basket.getBasketList().get(i).getId(), quantityCoffee); + } else { + boughtItems.remove(basket.getBasketList().get(i).getId(), quantityCoffee); + quantityCoffee++; + boughtItems.put(basket.getBasketList().get(i).getId(), quantityCoffee); + } + } + } + return boughtItems; + } + + public StringBuilder printReceipt(Basket basket) { + StringBuilder sb = new StringBuilder(); + HashMap list = receiptBuilder(basket); + DecimalFormat df = new DecimalFormat(); + String desc = ""; + String type = ""; + double price = 0; + + sb.append("~~~ Bob's Bagels ~~~\n"); + sb.append(java.time.ZonedDateTime.now().format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm\n"))); + sb.append("\n----------------------------\n"); + + for (String name : list.keySet()) { + for (int i = 0; i < basket.getStockList().size(); i++) { + Item item = basket.getStockList().get(name); + price = item.getPrice(); + desc = item.getDescription(); + type = item.getType(); + } + sb.append(desc + " " + type + " " + list.get(name).toString() + " " + df.format(price * list.get(name)) + "£\n"); + } + sb.append("\n----------------------------\n"); + sb.append("Total cost: " + df.format(basket.getTotalCost()) + "£\n"); + System.out.println(sb); + return sb; + } +} + diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index fb2975b0e..9ce0b4b7d 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -59,6 +59,9 @@ public void changeCapasityOfBasket() { @Test public void testGetReceipt() { StringBuilder sb = new StringBuilder(); + Basket basket = new Basket(); + Receipt receipt = new Receipt(); + sb.append("~~~ Bob's Bagels ~~~\n"); sb.append(java.time.ZonedDateTime.now().format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm\n"))); sb.append("\n----------------------------\n"); @@ -68,7 +71,6 @@ public void testGetReceipt() { sb.append("\n----------------------------\n"); sb.append("Total cost: " + 4.43+"£\n"); - Basket basket = new Basket(); basket.addToBasket("BGLO"); basket.addToBasket("BGLO"); basket.addToBasket("COFB"); @@ -80,7 +82,7 @@ public void testGetReceipt() { basket.addToBasket("FILE"); //sb.compare return 0 if the stringbuilder contains same character sequence - Assertions.assertEquals(0, sb.compareTo(basket.printReceipt())); + Assertions.assertEquals(0, sb.compareTo(receipt.printReceipt(basket))); } @Test From b618c81f328c8175344cedd33e35c7a797c38b7e Mon Sep 17 00:00:00 2001 From: Thomas Kristiansen Date: Tue, 14 Jan 2025 14:14:35 +0100 Subject: [PATCH 14/17] implemented discount --- src/main/java/com/booleanuk/core/Basket.java | 65 +++++++++++++------ src/main/java/com/booleanuk/core/Item.java | 15 ----- .../java/com/booleanuk/core/BasketTest.java | 37 ++--------- .../java/com/booleanuk/core/ReceiptTest.java | 37 +++++++++++ 4 files changed, 88 insertions(+), 66 deletions(-) create mode 100644 src/test/java/com/booleanuk/core/ReceiptTest.java diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 4d1467372..42aba4911 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -1,13 +1,12 @@ package com.booleanuk.core; import java.text.DecimalFormat; -import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; public class Basket { - private int capasity = 10; + private int capasity = 20; private double totalCost; private ArrayList basketList = new ArrayList<>(); @@ -50,26 +49,14 @@ public int getCapasity() { return capasity; } - public void setCapasity(int capasity) { - this.capasity = capasity; - } - public ArrayList getBasketList() { return basketList; } - public void setBasketList(ArrayList basketList) { - this.basketList = basketList; - } - public HashMap getStockList() { return stockList; } - public void setStockList(HashMap stockList) { - this.stockList = stockList; - } - public boolean addToBasket(String id) { if (basketList.size() != capasity) { if (stockList.containsKey(id)) { @@ -132,17 +119,55 @@ public int changeCapasity(int c) { return c; } - public double discountPrice(ArrayList basketTempList) { + public double discountPrice() { int bagelCount = 0; int coffeeCount = 0; - for (int i = 0; i < basketTempList.size(); i++) { - if (basketTempList.get(i).getId().substring(0,1).equals("B")) { + for (int i = 0; i < basketList.size(); i++) { + if (basketList.get(i).getId().substring(0, 1).equals("B")) { bagelCount++; - } else if (basketTempList.get(i).getId().substring(0,1).equals("C")) { + } else if (basketList.get(i).getId().substring(0, 1).equals("C")) { coffeeCount++; } } - return 0; - } + int remain; + double totalDiscount = 0; + + remain = bagelCount / 12; // 18 = 1,5; + + if (remain >= 1) { + totalDiscount += 3.99; + bagelCount = bagelCount - 12; + } + + remain = bagelCount / 6; + + if(remain >= 1) { + totalDiscount += 2.49; + bagelCount = bagelCount - 6; + } + + if (bagelCount >= 1 && coffeeCount >= 1) { + totalDiscount += 1.25; + bagelCount--; + coffeeCount--; + } + + if(bagelCount != 0) { + for (int i = 0; i < basketList.size(); i++) { + if (basketList.get(i).getId().substring(0,1).equals("B")) { + totalDiscount += basketList.get(i).getPrice(); + } + } + } + + if(coffeeCount != 0) { + for (int i = 0; i < basketList.size(); i++) { + if (basketList.get(i).getId().substring(0,1).equals("C")) { + totalDiscount += basketList.get(i).getPrice(); + } + } + } + return totalDiscount; + } } diff --git a/src/main/java/com/booleanuk/core/Item.java b/src/main/java/com/booleanuk/core/Item.java index af536f491..07c9c1c5e 100644 --- a/src/main/java/com/booleanuk/core/Item.java +++ b/src/main/java/com/booleanuk/core/Item.java @@ -19,31 +19,16 @@ public String getId() { return id; } - public void setId(String id) { - this.id = id; - } - public double getPrice() { return price; } - public void setPrice(double price) { - this.price = price; - } - public String getType() { return type; } - public void setType(String type) { - this.type = type; - } - public String getDescription() { return description; } - public void setDescription(String description) { - this.description = description; - } } diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 9ce0b4b7d..04aa8a1ae 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -56,35 +56,6 @@ public void changeCapasityOfBasket() { Assertions.assertEquals(200, basket.getCapasity()); } - @Test - public void testGetReceipt() { - StringBuilder sb = new StringBuilder(); - Basket basket = new Basket(); - Receipt receipt = new Receipt(); - - sb.append("~~~ Bob's Bagels ~~~\n"); - sb.append(java.time.ZonedDateTime.now().format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm\n"))); - sb.append("\n----------------------------\n"); - sb.append("Onion Bagel " + 2+ " 0.98£\n"); - sb.append("Black Coffee " + 3+ " 2.97£\n"); - sb.append("Egg Filling " + 4+ " 0.48£\n"); - sb.append("\n----------------------------\n"); - sb.append("Total cost: " + 4.43+"£\n"); - - basket.addToBasket("BGLO"); - basket.addToBasket("BGLO"); - basket.addToBasket("COFB"); - basket.addToBasket("COFB"); - basket.addToBasket("COFB"); - basket.addToBasket("FILE"); - basket.addToBasket("FILE"); - basket.addToBasket("FILE"); - basket.addToBasket("FILE"); - - //sb.compare return 0 if the stringbuilder contains same character sequence - Assertions.assertEquals(0, sb.compareTo(receipt.printReceipt(basket))); - } - @Test public void testDiscountOnBasketList() { Basket basket = new Basket(); @@ -103,9 +74,13 @@ public void testDiscountOnBasketList() { basket.addToBasket("BGLO"); basket.addToBasket("BGLO"); basket.addToBasket("COFB"); - - Assertions.assertEquals(5.73,basket.getTotalCost()); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + Assertions.assertEquals(7.73,basket.discountPrice()); } } diff --git a/src/test/java/com/booleanuk/core/ReceiptTest.java b/src/test/java/com/booleanuk/core/ReceiptTest.java new file mode 100644 index 000000000..d20484b62 --- /dev/null +++ b/src/test/java/com/booleanuk/core/ReceiptTest.java @@ -0,0 +1,37 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.time.format.DateTimeFormatter; + +public class ReceiptTest { + @Test + public void testGetReceipt() { + StringBuilder sb = new StringBuilder(); + Basket basket = new Basket(); + Receipt receipt = new Receipt(); + + sb.append("~~~ Bob's Bagels ~~~\n"); + sb.append(java.time.ZonedDateTime.now().format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm\n"))); + sb.append("\n----------------------------\n"); + sb.append("Onion Bagel " + 2+ " 0.98£\n"); + sb.append("Black Coffee " + 3+ " 2.97£\n"); + sb.append("Egg Filling " + 4+ " 0.48£\n"); + sb.append("\n----------------------------\n"); + sb.append("Total cost: " + 4.43+"£\n"); + + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("COFB"); + basket.addToBasket("COFB"); + basket.addToBasket("COFB"); + basket.addToBasket("FILE"); + basket.addToBasket("FILE"); + basket.addToBasket("FILE"); + basket.addToBasket("FILE"); + + //sb.compare return 0 if the stringbuilder contains same character sequence + Assertions.assertEquals(0, sb.compareTo(receipt.printReceipt(basket))); + } +} From 263a970b067348a40999b2f98f21b0e557a38808 Mon Sep 17 00:00:00 2001 From: Thomas Kristiansen Date: Tue, 14 Jan 2025 14:33:37 +0100 Subject: [PATCH 15/17] Fixed minor issue with discount price --- src/main/java/com/booleanuk/core/Basket.java | 10 ++++++++-- src/test/java/com/booleanuk/core/BasketTest.java | 9 +++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 42aba4911..24b1738f4 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -156,7 +156,10 @@ public double discountPrice() { if(bagelCount != 0) { for (int i = 0; i < basketList.size(); i++) { if (basketList.get(i).getId().substring(0,1).equals("B")) { - totalDiscount += basketList.get(i).getPrice(); + for (int j = 0; j < bagelCount; i++) { + totalDiscount += basketList.get(i).getPrice(); + bagelCount--; + } } } } @@ -164,7 +167,10 @@ public double discountPrice() { if(coffeeCount != 0) { for (int i = 0; i < basketList.size(); i++) { if (basketList.get(i).getId().substring(0,1).equals("C")) { - totalDiscount += basketList.get(i).getPrice(); + for (int j = 0; j < coffeeCount; i++) { + totalDiscount += basketList.get(i).getPrice(); + coffeeCount--; + } } } } diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 04aa8a1ae..a7996f12d 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -59,6 +59,9 @@ public void changeCapasityOfBasket() { @Test public void testDiscountOnBasketList() { Basket basket = new Basket(); + + basket.changeCapasity(30); + basket.addToBasket("BGLO"); basket.addToBasket("BGLO"); basket.addToBasket("BGLO"); @@ -73,14 +76,16 @@ public void testDiscountOnBasketList() { basket.addToBasket("BGLO"); basket.addToBasket("BGLO"); basket.addToBasket("BGLO"); - basket.addToBasket("COFB"); basket.addToBasket("BGLO"); basket.addToBasket("BGLO"); basket.addToBasket("BGLO"); basket.addToBasket("BGLO"); basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("COFB"); - Assertions.assertEquals(7.73,basket.discountPrice()); + //discount on 12 bagel, discount on 6 bagels, discount on bagel with coffee and one bagel + Assertions.assertEquals(8.22,basket.discountPrice()); } } From fd15d492cf1597d5eaabb72910828b2cb343803e Mon Sep 17 00:00:00 2001 From: Thomas Kristiansen Date: Tue, 14 Jan 2025 15:00:35 +0100 Subject: [PATCH 16/17] made changes to domain model and class diagram --- classDiagram.png | Bin 0 -> 58956 bytes domain-model.md | 40 +++++++++++------- .../java/com/booleanuk/core/BasketTest.java | 33 --------------- .../{core => extension}/ReceiptTest.java | 4 +- .../com/booleanuk/extension/discountTest.java | 40 ++++++++++++++++++ 5 files changed, 68 insertions(+), 49 deletions(-) create mode 100644 classDiagram.png rename src/test/java/com/booleanuk/{core => extension}/ReceiptTest.java (92%) create mode 100644 src/test/java/com/booleanuk/extension/discountTest.java diff --git a/classDiagram.png b/classDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..11127d8bc55466645dc491b7e7c88990b4462435 GIT binary patch literal 58956 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 literal 0 HcmV?d00001 diff --git a/domain-model.md b/domain-model.md index 7aaf418d0..6d0108c1a 100644 --- a/domain-model.md +++ b/domain-model.md @@ -1,22 +1,32 @@ # Basket -| Member | Method | Scenario | Output | -|---------------------------------|------------------------------|----------------------|---------------| -| Hashmap stockList | addItem(Item item) | Item does not exist | False | -| | | Item exist | True | -| | removeItem(Item item) | Item does not exist | False | -| | | Item exist | True | -| | listOfItems() | | List of items | -| | getTotalCost() | | double | -| | | Basket is not full | False | -| | changeCapasity(int capasity) | | int | -| | checkStock() | Item is in stock | True | -| | | Item is not in stock | False | +| Member | Method | Scenario | Output | +|---------------------------------|-------------------------------|----------------------|---------------| +| Hashmap stockList | addItem(Item item) | Item does not exist | False | +| | | Item exist | True | +| | removeItem(Item item) | Item does not exist | False | +| | | Item exist | True | +| | listOfItems() | | List of items | +| | getTotalCost() | | double | +| | | Basket is not full | False | +| | changeCapasity(int capasity) | | int | +| | discountPrice() | | Double | # Item -| Member | Method | Scenario | Output | -|--------|---------------------|----------|--------| -| | GetPrice(Item item) | | double | +| Member | Method | Scenario | Output | +|--------|------------------|----------|--------| +| | GetPrice() | | double | +| | GetId() | | String | +| | GetType() | | String | +| | GetDescription() | | String | + + +# Receipt + +| Member | Method | Scenario | Output | +|---------------|-------------------------------|----------|--------------------------| +| Basket basket | receiptBuilder(Basket basket) | | Hashmap | +| | printReceipt(Basket basket) | | Stringbuilder | diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index a7996f12d..f4b8df745 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -55,37 +55,4 @@ public void changeCapasityOfBasket() { basket.changeCapasity(200); Assertions.assertEquals(200, basket.getCapasity()); } - - @Test - public void testDiscountOnBasketList() { - Basket basket = new Basket(); - - basket.changeCapasity(30); - - basket.addToBasket("BGLO"); - basket.addToBasket("BGLO"); - basket.addToBasket("BGLO"); - basket.addToBasket("BGLO"); - basket.addToBasket("BGLO"); - basket.addToBasket("BGLO"); - basket.addToBasket("BGLO"); - basket.addToBasket("BGLO"); - basket.addToBasket("BGLO"); - basket.addToBasket("BGLO"); - basket.addToBasket("BGLO"); - basket.addToBasket("BGLO"); - basket.addToBasket("BGLO"); - basket.addToBasket("BGLO"); - basket.addToBasket("BGLO"); - basket.addToBasket("BGLO"); - basket.addToBasket("BGLO"); - basket.addToBasket("BGLO"); - basket.addToBasket("BGLO"); - basket.addToBasket("BGLO"); - basket.addToBasket("COFB"); - - - //discount on 12 bagel, discount on 6 bagels, discount on bagel with coffee and one bagel - Assertions.assertEquals(8.22,basket.discountPrice()); - } } diff --git a/src/test/java/com/booleanuk/core/ReceiptTest.java b/src/test/java/com/booleanuk/extension/ReceiptTest.java similarity index 92% rename from src/test/java/com/booleanuk/core/ReceiptTest.java rename to src/test/java/com/booleanuk/extension/ReceiptTest.java index d20484b62..cb66643cd 100644 --- a/src/test/java/com/booleanuk/core/ReceiptTest.java +++ b/src/test/java/com/booleanuk/extension/ReceiptTest.java @@ -1,5 +1,7 @@ -package com.booleanuk.core; +package com.booleanuk.extension; +import com.booleanuk.core.Basket; +import com.booleanuk.core.Receipt; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/booleanuk/extension/discountTest.java b/src/test/java/com/booleanuk/extension/discountTest.java new file mode 100644 index 000000000..b9617112d --- /dev/null +++ b/src/test/java/com/booleanuk/extension/discountTest.java @@ -0,0 +1,40 @@ +package com.booleanuk.extension; + +import com.booleanuk.core.Basket; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class discountTest { + + @Test + public void testDiscountOnBasketList() { + Basket basket = new Basket(); + + basket.changeCapasity(30); + + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("BGLO"); + basket.addToBasket("COFB"); + + //discount on 12 bagel, discount on 6 bagels, discount on bagel with coffee and one bagel + Assertions.assertEquals(8.22,basket.discountPrice()); + } +} From 8798e558f56045f290d7808244b49779ba3240e4 Mon Sep 17 00:00:00 2001 From: Thomas Kristiansen Date: Tue, 14 Jan 2025 15:04:52 +0100 Subject: [PATCH 17/17] Refactor file paths --- src/main/java/com/booleanuk/core/Basket.java | 58 ----------------- .../com/booleanuk/extension/Discount.java | 64 +++++++++++++++++++ .../{core => extension}/Receipt.java | 5 +- .../com/booleanuk/extension/ReceiptTest.java | 1 - .../com/booleanuk/extension/discountTest.java | 3 +- 5 files changed, 70 insertions(+), 61 deletions(-) create mode 100644 src/main/java/com/booleanuk/extension/Discount.java rename src/main/java/com/booleanuk/{core => extension}/Receipt.java (97%) diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 24b1738f4..617553a36 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -118,62 +118,4 @@ public int changeCapasity(int c) { this.capasity = c; return c; } - - public double discountPrice() { - int bagelCount = 0; - int coffeeCount = 0; - for (int i = 0; i < basketList.size(); i++) { - if (basketList.get(i).getId().substring(0, 1).equals("B")) { - bagelCount++; - } else if (basketList.get(i).getId().substring(0, 1).equals("C")) { - coffeeCount++; - } - } - - int remain; - double totalDiscount = 0; - - remain = bagelCount / 12; // 18 = 1,5; - - if (remain >= 1) { - totalDiscount += 3.99; - bagelCount = bagelCount - 12; - } - - remain = bagelCount / 6; - - if(remain >= 1) { - totalDiscount += 2.49; - bagelCount = bagelCount - 6; - } - - if (bagelCount >= 1 && coffeeCount >= 1) { - totalDiscount += 1.25; - bagelCount--; - coffeeCount--; - } - - if(bagelCount != 0) { - for (int i = 0; i < basketList.size(); i++) { - if (basketList.get(i).getId().substring(0,1).equals("B")) { - for (int j = 0; j < bagelCount; i++) { - totalDiscount += basketList.get(i).getPrice(); - bagelCount--; - } - } - } - } - - if(coffeeCount != 0) { - for (int i = 0; i < basketList.size(); i++) { - if (basketList.get(i).getId().substring(0,1).equals("C")) { - for (int j = 0; j < coffeeCount; i++) { - totalDiscount += basketList.get(i).getPrice(); - coffeeCount--; - } - } - } - } - return totalDiscount; - } } diff --git a/src/main/java/com/booleanuk/extension/Discount.java b/src/main/java/com/booleanuk/extension/Discount.java new file mode 100644 index 000000000..271979053 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Discount.java @@ -0,0 +1,64 @@ +package com.booleanuk.extension; + +import com.booleanuk.core.Basket; + +public class Discount { + + public double discountPrice(Basket basket) { + int bagelCount = 0; + int coffeeCount = 0; + for (int i = 0; i < basket.getBasketList().size(); i++) { + if (basket.getBasketList().get(i).getId().substring(0, 1).equals("B")) { + bagelCount++; + } else if (basket.getBasketList().get(i).getId().substring(0, 1).equals("C")) { + coffeeCount++; + } + } + + int remain; + double totalDiscount = 0; + + remain = bagelCount / 12; // 18 = 1,5; + + if (remain >= 1) { + totalDiscount += 3.99; + bagelCount = bagelCount - 12; + } + + remain = bagelCount / 6; + + if(remain >= 1) { + totalDiscount += 2.49; + bagelCount = bagelCount - 6; + } + + if (bagelCount >= 1 && coffeeCount >= 1) { + totalDiscount += 1.25; + bagelCount--; + coffeeCount--; + } + + if(bagelCount != 0) { + for (int i = 0; i < basket.getBasketList().size(); i++) { + if (basket.getBasketList().get(i).getId().substring(0,1).equals("B")) { + for (int j = 0; j < bagelCount; i++) { + totalDiscount += basket.getBasketList().get(i).getPrice(); + bagelCount--; + } + } + } + } + + if(coffeeCount != 0) { + for (int i = 0; i < basket.getBasketList().size(); i++) { + if (basket.getBasketList().get(i).getId().substring(0,1).equals("C")) { + for (int j = 0; j < coffeeCount; i++) { + totalDiscount += basket.getBasketList().get(i).getPrice(); + coffeeCount--; + } + } + } + } + return totalDiscount; + } +} diff --git a/src/main/java/com/booleanuk/core/Receipt.java b/src/main/java/com/booleanuk/extension/Receipt.java similarity index 97% rename from src/main/java/com/booleanuk/core/Receipt.java rename to src/main/java/com/booleanuk/extension/Receipt.java index b6fdfb5e4..7775baa46 100644 --- a/src/main/java/com/booleanuk/core/Receipt.java +++ b/src/main/java/com/booleanuk/extension/Receipt.java @@ -1,4 +1,7 @@ -package com.booleanuk.core; +package com.booleanuk.extension; + +import com.booleanuk.core.Basket; +import com.booleanuk.core.Item; import java.text.DecimalFormat; import java.time.format.DateTimeFormatter; diff --git a/src/test/java/com/booleanuk/extension/ReceiptTest.java b/src/test/java/com/booleanuk/extension/ReceiptTest.java index cb66643cd..497e7dd7c 100644 --- a/src/test/java/com/booleanuk/extension/ReceiptTest.java +++ b/src/test/java/com/booleanuk/extension/ReceiptTest.java @@ -1,7 +1,6 @@ package com.booleanuk.extension; import com.booleanuk.core.Basket; -import com.booleanuk.core.Receipt; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/booleanuk/extension/discountTest.java b/src/test/java/com/booleanuk/extension/discountTest.java index b9617112d..ed67a58b4 100644 --- a/src/test/java/com/booleanuk/extension/discountTest.java +++ b/src/test/java/com/booleanuk/extension/discountTest.java @@ -9,6 +9,7 @@ public class discountTest { @Test public void testDiscountOnBasketList() { Basket basket = new Basket(); + Discount discount = new Discount(); basket.changeCapasity(30); @@ -35,6 +36,6 @@ public void testDiscountOnBasketList() { basket.addToBasket("COFB"); //discount on 12 bagel, discount on 6 bagels, discount on bagel with coffee and one bagel - Assertions.assertEquals(8.22,basket.discountPrice()); + Assertions.assertEquals(8.22,discount.discountPrice(basket)); } }