diff --git a/class_diagram.jpg b/class_diagram.jpg
new file mode 100644
index 000000000..d22eff4da
Binary files /dev/null and b/class_diagram.jpg differ
diff --git a/domain-model.md b/domain-model.md
new file mode 100644
index 000000000..f046ad0b9
--- /dev/null
+++ b/domain-model.md
@@ -0,0 +1,62 @@
+## Class diagram
+
+
+
+
+### Item class
+| Method | Scenario | Output |
+|----------|-------------------|--------|
+| `Item()` | Class constructor | - |
+
+
+### Menu class
+| Method | Scenario | Output |
+|-------------------------------|-----------------------------------------------------|----------------|
+| `getMenu()` | - | List of menu |
+| `itemExists(itemId: String)` | Item exists in menu
Item does not exist in menu | true
false |
+| `getItemMenu(itemId: String)` | Item exists in menu
Item does not exist in menu | Item
null |
+
+
+### Basket class
+| Method | Scenario | Outcome | Output |
+|---------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `addItem(itemId: String, quantity: int)` | Item exists in menu but not in basketItems
Item exists in menu and in basketItems
Item does not exist in menu
Basket is full | Item is added to basketItems with the correct quantity
The quantity of the item in basketItems is changed
-
- | "'quantity' 'itemVariant' 'itemName' added to basket."
"'quantity' 'itemVariant' 'itemName' added to basket."
"This item is not on the menu."
"Basket is full." |
+| `removeItem(itemId: String, removeDuplicates: Boolean)` | Item exists in basketItems and removeDuplicates=true
Item exists in basketItems and removeDuplicates=false
Item does not exist in basket | Entry is removed from basketItems
The quantity of the item in basketItems is subtracted 1.
- | "'quantity' 'itemVariant' 'itemName's removed from basket."
"'itemVariant' 'itemName' removed from basket."
"This item does not exist in your basket." |
+| `setBasketSize(int)` | Basket capacity is changed to a positive integer by a "manager"
Basket capacity value is not positive | | Return true
Return false |
+
+
+### CashRegister class
+| Method | Scenario | Output |
+|----------------------------|------------------------------------------------------------------|---------------------------------------------------------------|
+| `sumOrder()` | basketItems is not empty
basketItems is empty | "The sum of your order is: 'sum'"
"Your basket is empty." |
+| `getDiscountBagel()` | 12 or more bagels of same type
6 or more bagels of same type | Discounted price is 3.99
Discounted price is 2.49 |
+| `getDiscountCoffeeBagel()` | Minimum one coffee and one bagel remaining in basket | Discounted price is 1.25 |
+| `getRemainingSum()` | Remaining items in basket | Calculate price |
+
+
+### Receipt interface
+| Method | Scenario | Output |
+|-----------------------------------------------------------------|------------------------------------------------------|--------------------------|
+| `getReceiptLine(itemName: String, quantity: int, price: float)` | Minimum one coffee and one bagel remaining in basket | Discounted price is 1.25 |
+| `getDiscountedSum()` | Remaining items in basket | Calculate price |
+| `createFinalReceipt()` | | |
+| `printReceipt()` | | |
+| `getFinalReceipt()` | | |
+
+
+### NormalReceipt class (implements Receipt)
+| Method | Scenario | Output |
+|-----------------------------------------------------------------|------------------------------------------------------------------|---------------------------------------------------------------|
+
+
+### DiscountReceipt class (implements Receipt)
+| Method | Scenario | Output |
+|-----------------------------------------------------------------|------------------------------------------------------------------|---------------------------------------------------------------|
+
+
+
+### Assumptions:
+
+- Fillings can be added regardless of the presence of a bagel in the basket.
+- Fillings, coffee, and bagels count toward the maximum basket size.
+- The "manager" role is purely fictional and not actually implemented
\ No newline at end of file
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..f73dd34c6
--- /dev/null
+++ b/src/main/java/com/booleanuk/core/Basket.java
@@ -0,0 +1,94 @@
+package com.booleanuk.core;
+
+import java.util.HashMap;
+
+import static com.booleanuk.core.Menu.*;
+
+public class Basket {
+ private int maxBasketSize;
+ private HashMap basketItems;
+
+
+ public Basket(){
+ this.maxBasketSize = 15;
+ this.basketItems = new HashMap<>();
+ }
+
+ public HashMap getBasketItems(){
+ return this.basketItems;
+ }
+
+ public void setBasketItems(HashMap basketItems) {
+ this.basketItems = basketItems;
+ }
+
+ public Boolean setMaxBasketSize(int size){
+ if (size<0){
+ return false;
+ }
+ this.maxBasketSize = size;
+ return true;
+ }
+
+ public int getMaxBasketSize(){
+ return this.maxBasketSize;
+ }
+
+ public int getBasketSize(){
+ if (basketItems.isEmpty()){
+ return 0;
+ }
+
+ int basketSize = 0;
+ for (HashMap.Entry entry : basketItems.entrySet()){
+ basketSize += entry.getValue();
+ }
+ return basketSize;
+ }
+
+ public boolean isEmpty(){
+ return getBasketSize() == 0;
+ }
+
+
+ public String addItem(String itemId, int quantity) {
+ if (getBasketSize() == maxBasketSize){
+ return "Basket is full.";
+ }
+
+ if (!itemExistsMenu(itemId)){
+ return "This item is not on the menu.";
+ }
+
+ basketItems.merge(itemId, quantity, Integer::sum);
+ Item item = getMenuItem(itemId);
+
+ return quantity + " " + item.getItemVariant()
+ + " " + item.getItemName() + " added to basket.";
+ }
+
+
+ public String removeItem(String itemId, Boolean removeDuplicates){
+
+ if (!basketItems.containsKey(itemId)){
+ return "This item does not exist in your basket.";
+ }
+
+ Item item = getMenuItem(itemId);
+ int quantity = basketItems.get(itemId);
+
+ if (quantity==0){
+ basketItems.remove(itemId);
+ return "This item does not exist in your basket.";
+ }
+
+ if (removeDuplicates){
+ basketItems.remove(itemId);
+ return quantity + " " + item.getItemVariant() + " " + item.getItemName() + " removed from basket.";
+ }
+
+ basketItems.merge(itemId, -1, Integer::sum);
+ return "1 " + item.getItemVariant() + " " + item.getItemName() + " removed from basket.";
+ }
+
+}
diff --git a/src/main/java/com/booleanuk/core/CashRegister.java b/src/main/java/com/booleanuk/core/CashRegister.java
new file mode 100644
index 000000000..6b1fbf715
--- /dev/null
+++ b/src/main/java/com/booleanuk/core/CashRegister.java
@@ -0,0 +1,162 @@
+package com.booleanuk.core;
+
+import java.util.HashMap;
+
+import static com.booleanuk.core.Menu.*;
+
+
+public class CashRegister {
+ Basket basket;
+ Receipt receipt;
+ private float discountedSum = 0;
+ private float totalDiscount = 0;
+
+ public CashRegister(Basket basket, Receipt receipt){
+ this.basket = basket;
+ this.receipt = receipt;
+ }
+
+ public void printReceipt(){
+ sumOrder();
+ receipt.createFinalReceipt();
+ receipt.printReceipt();
+
+ }
+
+ public String sumOrder() {
+ discountedSum = 0;
+ totalDiscount = 0;
+
+ if (basket.isEmpty()) {
+ return "Your basket is empty.";
+ }
+
+ if (!basket.isEmpty()){
+ getDiscountBagel();
+ }
+ if (!basket.isEmpty()) {
+ getDiscountCoffeeBagel();
+ }
+ if (!basket.isEmpty()) {
+ getRemainingSum();
+ }
+
+ receipt.getDiscountedSum(discountedSum);
+ receipt.setTotalSaved(totalDiscount);
+
+ return "The sum of your order is: " + String.format("%.2f", discountedSum);
+ }
+
+ public void getDiscountBagel(){
+ for (HashMap.Entry entry : basket.getBasketItems().entrySet()){
+ Item bagel = getMenuItem(entry.getKey());
+
+ if (bagel.getItemName().equals("Bagel")){
+ int bagelOfferCount = 0;
+ int twelveOfferCount = 0;
+ int sixOfferCount = 0;
+ while (entry.getValue() >= 12){
+ discountedSum += 3.99f;
+
+ for (int i = 0; i<12; i++){
+ basket.removeItem(bagel.getItemSKU(), false);
+ }
+ bagelOfferCount += 12;
+ twelveOfferCount++;
+ }
+
+ while (entry.getValue() >= 6){
+ discountedSum += 2.49f;
+
+ for (int i = 0; i<6; i++){
+ basket.removeItem(bagel.getItemSKU(), false);
+ }
+ bagelOfferCount += 6;
+ sixOfferCount++;
+ }
+ if (bagelOfferCount>0){
+ float totalDiscountPrice = sixOfferCount*2.49f + twelveOfferCount*3.99f;
+ float priceWithoutDiscount = bagelOfferCount*bagel.getItemPrice();
+ float saved = priceWithoutDiscount-totalDiscountPrice;
+ String fullName = bagel.getItemVariant() + " " + bagel.getItemName();
+ receipt.addReceiptLine(fullName, bagelOfferCount, totalDiscountPrice);
+ receipt.addReceiptLine("", 0, saved);
+ totalDiscount += saved;
+ }
+ }
+ }
+ }
+
+ public void getDiscountCoffeeBagel(){
+ int bagelCount = 0;
+ int coffeeCount = 0;
+
+ for (HashMap.Entry entry : basket.getBasketItems().entrySet()) {
+ Item item = getMenuItem(entry.getKey());
+
+ if (item.getItemName().equals("Bagel")){
+ bagelCount += entry.getValue();
+ }
+
+ if (item.getItemName().equals("Coffee")){
+ coffeeCount += entry.getValue();
+ }
+ }
+ int coffeeBagelOffer = 0;
+
+ float coffeePrice = 0;
+ float bagelPrice = 0;
+ while (bagelCount!=0 && coffeeCount!=0){
+ for (HashMap.Entry entry : basket.getBasketItems().entrySet()){
+ Item bagel = getMenuItem(entry.getKey());
+
+ if (bagel.getItemName().equals("Bagel") && entry.getValue()!= 0){
+ bagelPrice = bagel.getItemPrice();
+ basket.removeItem(bagel.getItemSKU(), false);
+ break;
+ }
+ }
+
+ for (HashMap.Entry entry2 : basket.getBasketItems().entrySet()){
+ Item coffee = getMenuItem(entry2.getKey());
+
+ if (coffee.getItemName().equals("Coffee") && entry2.getValue()!= 0){
+ coffeePrice = coffee.getItemPrice();
+ discountedSum += 1.25f;
+ basket.removeItem(coffee.getItemSKU(), false);
+ coffeeBagelOffer++;
+ break;
+ }
+ }
+ bagelCount--;
+ coffeeCount--;
+ }
+
+ if (coffeeBagelOffer>0){
+ String offerName = "Coffee & Bagel";
+ float originalSum = coffeePrice+bagelPrice;
+ float saved = originalSum - 1.25f;
+ receipt.addReceiptLine(offerName, coffeeBagelOffer, 1.25f*coffeeBagelOffer);
+ receipt.addReceiptLine("", 0, saved);
+ totalDiscount+=saved;
+ }
+ }
+
+ public void getRemainingSum(){
+ for (HashMap.Entry entry : basket.getBasketItems().entrySet()){
+ if (entry.getValue() != 0){
+ Item item = getMenuItem(entry.getKey());
+ int quantity = entry.getValue();
+ float price = item.getItemPrice();
+
+ discountedSum += quantity*price;
+ String fullName = item.getItemVariant() + " " + item.getItemName();
+ receipt.addReceiptLine(fullName, quantity, quantity*price);
+
+ for (int i = 0; i < quantity; i++){
+ basket.removeItem(entry.getKey(), false);
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/booleanuk/core/DiscountReceipt.java b/src/main/java/com/booleanuk/core/DiscountReceipt.java
new file mode 100644
index 000000000..be21dcf8c
--- /dev/null
+++ b/src/main/java/com/booleanuk/core/DiscountReceipt.java
@@ -0,0 +1,69 @@
+package com.booleanuk.core;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+
+public class DiscountReceipt implements Receipt{
+ private ArrayList receiptLines;
+ private LocalDateTime dateTime;
+ private float totalSum;
+ private ArrayList finalReceipt;
+ private float totalSaved;
+
+ public DiscountReceipt(){
+ this.receiptLines = new ArrayList<>();
+ this.finalReceipt = new ArrayList<>();
+ this.totalSum = 0;
+ this.totalSaved = 0;
+ }
+
+ public void setTotalSaved(float totalSaved) {
+ this.totalSaved = totalSaved;
+ }
+
+ public ArrayList getFinalReceipt() {
+ return finalReceipt;
+ }
+
+ public void addReceiptLine(String itemName, int quantity, float price) {
+ if (price != 0 && quantity != 0){
+ this.receiptLines.add(String.format("%-18s %3s %8s", itemName, quantity, "$"+price));
+ }
+ else if (quantity == 0 && price != 0){
+ this.receiptLines.add(String.format("%-18s %3s %8s", "", "", "(-$"+String.format("%.2f", price)+")"));
+ }
+
+ }
+
+
+ public void getDiscountedSum(float sum) {
+ this.totalSum = sum;
+ }
+
+
+ public void createFinalReceipt() {
+ dateTime = LocalDateTime.now();
+ this.finalReceipt.add(String.format("%-8s %10s", " ", "~Bob's Bagels~"));
+ this.finalReceipt.add(String.format("%-5s %10s", " ", dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
+ this.finalReceipt.add("-------------------------------");
+ this.finalReceipt.add(" ");
+ this.finalReceipt.addAll(receiptLines);
+ this.finalReceipt.add(" ");
+ this.finalReceipt.add("-------------------------------");
+ this.finalReceipt.add(String.format("%-15s %2s %12s", "Total", " ", "$"+totalSum));
+ this.finalReceipt.add(" ");
+ this.finalReceipt.add(String.format("%-10s %4s", " You saved a total of ", "$"+String.format("%.2f", totalSaved)));
+ this.finalReceipt.add(String.format("%-10s %10s", " ", "on this shop"));
+ this.finalReceipt.add(" ");
+ this.finalReceipt.add(String.format("%-10s %10s", " ", "Thank you"));
+ this.finalReceipt.add(String.format("%-7s %16s", " ", "for your order!"));
+ }
+
+
+ public void printReceipt() {
+ for (String s : finalReceipt){
+ System.out.println(s);
+ }
+ }
+}
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..135c5a424
--- /dev/null
+++ b/src/main/java/com/booleanuk/core/Item.java
@@ -0,0 +1,33 @@
+package com.booleanuk.core;
+
+public class Item {
+
+ private String itemSKU;
+ private float itemPrice;
+ private String itemName;
+ private String itemVariant;
+
+ public Item(String itemSKU, float itemPrice, String itemName, String itemVariant){
+ this.itemSKU = itemSKU;
+ this.itemPrice=itemPrice;
+ this.itemName=itemName;
+ this.itemVariant=itemVariant;
+ }
+
+ public String getItemSKU(){
+ return itemSKU;
+ }
+
+ public float getItemPrice(){
+ return itemPrice;
+ }
+
+ public String getItemName(){
+ return itemName;
+ }
+
+ public String getItemVariant(){
+ return itemVariant;
+ }
+
+}
diff --git a/src/main/java/com/booleanuk/core/Menu.java b/src/main/java/com/booleanuk/core/Menu.java
new file mode 100644
index 000000000..3efc25c33
--- /dev/null
+++ b/src/main/java/com/booleanuk/core/Menu.java
@@ -0,0 +1,63 @@
+package com.booleanuk.core;
+
+import java.util.ArrayList;
+
+public class Menu {
+
+ public final static ArrayList- menu = new ArrayList<>();
+
+ static {
+ populateMenu();
+ }
+
+ private static void populateMenu() {
+ {
+ menu.add(new Item("BGLO", 0.49f, "Bagel", "Onion"));
+ menu.add(new Item("BGLP", 0.39f, "Bagel", "Plain"));
+ menu.add(new Item("BGLE", 0.49f, "Bagel", "Everything"));
+ menu.add(new Item("BGLS", 0.49f, "Bagel", "Sesame"));
+ menu.add(new Item("COFB", 0.99f, "Coffee", "Black"));
+ menu.add(new Item("COFW", 1.19f, "Coffee", "White"));
+ menu.add(new Item("COFC", 1.29f, "Coffee", "Cappuccino"));
+ menu.add(new Item("COFL", 1.29f, "Coffee", "Latte"));
+ menu.add(new Item("FILB", 0.12f, "Filling", "Bacon"));
+ menu.add(new Item("FILE", 0.12f, "Filling", "Egg"));
+ menu.add(new Item("FILC", 0.12f, "Filling", "Cheese"));
+ menu.add(new Item("FILX", 0.12f, "Filling", "Cream cheese"));
+ menu.add(new Item("FILS", 0.12f, "Filling", "Smoked salmon"));
+ menu.add(new Item("FILH", 0.12f, "Filling", "Ham"));
+ }
+ };
+
+ public static boolean itemExistsMenu(String itemSKU){
+ for (Item item : menu){
+ if (item.getItemSKU().equals(itemSKU)){
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static Item getMenuItem(String itemSKU){
+ if (itemExistsMenu(itemSKU)){
+ for (Item item : menu){
+ if (item.getItemSKU().equals(itemSKU)){
+ return item;
+ }
+ }
+ }
+ return null;
+ }
+
+ public static String getItemCost(String itemSKU){
+ if (itemExistsMenu(itemSKU)){
+ for (Item item : menu){
+ if (item.getItemSKU().equals(itemSKU)){
+ return String.format("%.2f", item.getItemPrice());
+ }
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/src/main/java/com/booleanuk/core/NormalReceipt.java b/src/main/java/com/booleanuk/core/NormalReceipt.java
new file mode 100644
index 000000000..adc842081
--- /dev/null
+++ b/src/main/java/com/booleanuk/core/NormalReceipt.java
@@ -0,0 +1,63 @@
+package com.booleanuk.core;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+
+import static java.time.format.DateTimeFormatter.*;
+
+public class NormalReceipt implements Receipt{
+ private ArrayList receiptLines;
+ private LocalDateTime dateTime;
+ private float totalSum;
+ private ArrayList finalReceipt;
+
+
+ public NormalReceipt(){
+ this.receiptLines = new ArrayList<>();
+ this.finalReceipt = new ArrayList<>();
+ this.totalSum = 0;
+ }
+
+ public ArrayList getFinalReceipt() {
+ return finalReceipt;
+ }
+
+ public void setTotalSaved(float totalSaved) {
+
+ }
+
+
+ public void addReceiptLine(String itemName, int quantity, float price) {
+ if (price != 0 && quantity != 0){
+ this.receiptLines.add(String.format("%-18s %3s %8s", itemName, quantity, "$"+price));
+ }
+ }
+
+
+ public void getDiscountedSum(float sum) {
+ this.totalSum = sum;
+ }
+
+ public void createFinalReceipt() {
+ dateTime = LocalDateTime.now();
+ this.finalReceipt.add(String.format("%-8s %10s", " ", "~Bob's Bagels~"));
+ this.finalReceipt.add(String.format("%-5s %10s", " ", dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
+ this.finalReceipt.add("-------------------------------");
+ this.finalReceipt.add(" ");
+ this.finalReceipt.addAll(receiptLines);
+ this.finalReceipt.add(" ");
+ this.finalReceipt.add("-------------------------------");
+ this.finalReceipt.add(String.format("%-15s %2s %12s", "Total", " ", "$"+totalSum));
+ this.finalReceipt.add(" ");
+ this.finalReceipt.add(String.format("%-10s %10s", " ", "Thank you"));
+ this.finalReceipt.add(String.format("%-7s %16s", " ", "for your order!"));
+
+ }
+
+ public void printReceipt(){
+ for (String s : finalReceipt){
+ System.out.println(s);
+ }
+ }
+}
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..7ad329d7b
--- /dev/null
+++ b/src/main/java/com/booleanuk/core/Receipt.java
@@ -0,0 +1,12 @@
+package com.booleanuk.core;
+
+import java.util.ArrayList;
+
+public interface Receipt {
+ void addReceiptLine(String itemName, int quantity, float price);
+ void getDiscountedSum(float sum);
+ void createFinalReceipt();
+ void printReceipt();
+ ArrayList getFinalReceipt();
+ void setTotalSaved(float totalSaved);
+}
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..933684d42
--- /dev/null
+++ b/src/test/java/com/booleanuk/core/BasketTest.java
@@ -0,0 +1,114 @@
+package com.booleanuk.core;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class BasketTest {
+ // Core requirements tests
+
+ // User story 1
+ @Test
+ public void addBagelToBasket(){
+ Basket basket = new Basket();
+
+ Assertions.assertEquals("2 Onion Bagel added to basket.", basket.addItem("BGLO", 2));
+ Assertions.assertEquals("1 Plain Bagel added to basket.", basket.addItem("BGLP", 1));
+
+ Assertions.assertEquals(2, basket.getBasketItems().get("BGLO"));
+ Assertions.assertEquals(1, basket.getBasketItems().get("BGLP"));
+ Assertions.assertEquals(3, basket.getBasketSize());
+ }
+
+ // User story 2
+ @Test
+ public void removeBagelFromBasket(){
+ Basket basket = new Basket();
+
+ basket.addItem("BGLO", 2);
+ basket.addItem("BGLP", 1);
+ Assertions.assertEquals("1 Plain Bagel removed from basket.", basket.removeItem("BGLP", false));
+ Assertions.assertEquals(2, basket.getBasketSize());
+ Assertions.assertEquals("2 Onion Bagel removed from basket.", basket.removeItem("BGLO", true));
+ Assertions.assertEquals(0, basket.getBasketSize());
+ }
+
+ // User story 3
+ @Test
+ public void addBagelFullBasket(){
+ Basket basket = new Basket();
+ basket.addItem("BGLO", 15);
+ Assertions.assertEquals("Basket is full.", basket.addItem("BGLP", 1));
+
+ }
+
+ // User story 4
+ @Test
+ public void changeBasketCapacity(){
+ Basket basket = new Basket();
+
+ Assertions.assertTrue(basket.setMaxBasketSize(10));
+ Assertions.assertEquals(10, basket.getMaxBasketSize());
+ Assertions.assertFalse(basket.setMaxBasketSize(-2));
+ }
+
+ // User story 5
+ @Test
+ public void removeItemNotInBasket(){
+ Basket basket = new Basket();
+
+ Assertions.assertEquals("This item does not exist in your basket.", basket.removeItem("COFB", false));
+ }
+
+ // User story 6
+ @Test
+ public void totalCostItemsInBasket(){
+ Basket basket = new Basket();
+ Receipt receipt = new NormalReceipt();
+ CashRegister register = new CashRegister(basket, receipt);
+
+ Assertions.assertEquals("Your basket is empty.", register.sumOrder());
+
+ basket.addItem("BGLO", 2);
+ basket.addItem("BGLP", 1);
+ basket.addItem("FILE", 1);
+
+ Assertions.assertEquals("The sum of your order is: 1.49", register.sumOrder());
+
+ }
+
+ // User story 7
+ @Test
+ public void getBagelCost(){
+ Menu menu = new Menu();
+ Assertions.assertEquals("0.49", menu.getItemCost("BGLS"));
+ }
+
+ // User story 8
+ @Test
+ public void addFilling(){
+ Basket basket = new Basket();
+
+ Assertions.assertEquals("2 Cheese Filling added to basket.", basket.addItem("FILC", 2));
+ Assertions.assertEquals("1 Bacon Filling added to basket.", basket.addItem("FILB", 1));
+
+ Assertions.assertEquals(2, basket.getBasketItems().get("FILC"));
+ Assertions.assertEquals(1, basket.getBasketItems().get("FILB"));
+ Assertions.assertEquals(3, basket.getBasketSize());
+ }
+
+ // User story 9
+ @Test
+ public void getFillingCost(){
+ Menu menu = new Menu();
+ Assertions.assertEquals("0.12", menu.getItemCost("FILC"));
+ }
+
+ // User story 10
+ @Test
+ public void addItemNotInInventory(){
+ Basket basket = new Basket();
+
+ Assertions.assertEquals("This item is not on the menu.", basket.addItem("Not a bagel.", 2));
+ }
+
+}
diff --git a/src/test/java/com/booleanuk/extension/Extension1Test.java b/src/test/java/com/booleanuk/extension/Extension1Test.java
new file mode 100644
index 000000000..1a09d7225
--- /dev/null
+++ b/src/test/java/com/booleanuk/extension/Extension1Test.java
@@ -0,0 +1,53 @@
+package com.booleanuk.extension;
+
+import com.booleanuk.core.Basket;
+import com.booleanuk.core.CashRegister;
+import com.booleanuk.core.NormalReceipt;
+import com.booleanuk.core.Receipt;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class Extension1Test {
+
+ // Extension 1 requirements tests
+ @Test
+ public void bagelDiscount(){
+ Basket basket = new Basket();
+ Receipt receipt = new NormalReceipt();
+ CashRegister register = new CashRegister(basket, receipt);
+ basket.setMaxBasketSize(25);
+ basket.addItem("BGLO", 18);
+ basket.addItem("BGLP", 1);
+ basket.addItem("COFB",1);
+
+ Assertions.assertEquals("The sum of your order is: 7.73", register.sumOrder());
+
+ }
+
+ @Test
+ public void bagelAndCoffeeDiscount(){
+ Basket basket = new Basket();
+ Receipt receipt = new NormalReceipt();
+ CashRegister register = new CashRegister(basket, receipt);
+
+ basket.addItem("BGLO", 2);
+ basket.addItem("COFW", 1);
+
+ Assertions.assertEquals("The sum of your order is: 1.74", register.sumOrder());
+ }
+
+ @Test
+ public void allDiscounts(){
+ Basket basket = new Basket();
+ Receipt receipt = new NormalReceipt();
+ CashRegister register = new CashRegister(basket, receipt);
+ basket.setMaxBasketSize(25);
+
+ basket.addItem("BGLS", 6);
+ basket.addItem("BGLO", 13);
+ basket.addItem("FILC", 1);
+ basket.addItem("COFL", 1);
+
+ Assertions.assertEquals("The sum of your order is: 7.85", register.sumOrder());
+ }
+}
diff --git a/src/test/java/com/booleanuk/extension/Extension2Test.java b/src/test/java/com/booleanuk/extension/Extension2Test.java
new file mode 100644
index 000000000..32f373b61
--- /dev/null
+++ b/src/test/java/com/booleanuk/extension/Extension2Test.java
@@ -0,0 +1,43 @@
+package com.booleanuk.extension;
+
+import com.booleanuk.core.Basket;
+import com.booleanuk.core.CashRegister;
+import com.booleanuk.core.NormalReceipt;
+import com.booleanuk.core.Receipt;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class Extension2Test {
+
+ // Extension 2 requirements tests
+ @Test
+ public void printingNormalReceipt(){
+ Basket basket = new Basket();
+ Receipt receipt = new NormalReceipt();
+ CashRegister register = new CashRegister(basket, receipt);
+ basket.setMaxBasketSize(25);
+
+ basket.addItem("BGLS", 6);
+ basket.addItem("BGLO", 13);
+ basket.addItem("FILC", 1);
+ basket.addItem("COFL", 1);
+ register.printReceipt();
+ String receiptFinal = receipt.getFinalReceipt().toString();
+
+ String receiptExcerpt =
+ " -------------------------------," +
+ " ," +
+ " Sesame Bagel 6 $2.49," +
+ " Onion Bagel 12 $3.99," +
+ " Coffee & Bagel 1 $1.25," +
+ " Cheese Filling 1 $0.12," +
+ " ," +
+ " -------------------------------," +
+ " Total $7.85," +
+ " ," +
+ " Thank you," +
+ " for your order!";
+
+ Assertions.assertTrue(receiptFinal.contains(receiptExcerpt));
+ }
+}
diff --git a/src/test/java/com/booleanuk/extension/Extension3Test.java b/src/test/java/com/booleanuk/extension/Extension3Test.java
new file mode 100644
index 000000000..ec6624171
--- /dev/null
+++ b/src/test/java/com/booleanuk/extension/Extension3Test.java
@@ -0,0 +1,48 @@
+package com.booleanuk.extension;
+
+import com.booleanuk.core.Basket;
+import com.booleanuk.core.CashRegister;
+import com.booleanuk.core.DiscountReceipt;
+import com.booleanuk.core.Receipt;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class Extension3Test {
+
+ // Extension 3 requirements tests
+ @Test
+ public void printingDiscountReceipt(){
+ Basket basket = new Basket();
+ Receipt receipt = new DiscountReceipt();
+ CashRegister register = new CashRegister(basket, receipt);
+ basket.setMaxBasketSize(25);
+
+ basket.addItem("BGLS", 6);
+ basket.addItem("BGLO", 13);
+ basket.addItem("FILC", 1);
+ basket.addItem("COFL", 1);
+ register.printReceipt();
+ String receiptFinal = receipt.getFinalReceipt().toString();
+
+ String receiptExcerpt =
+ " -------------------------------," +
+ " ," +
+ " Sesame Bagel 6 $2.49," +
+ " (-$0.45)," +
+ " Onion Bagel 12 $3.99," +
+ " (-$1.89)," +
+ " Coffee & Bagel 1 $1.25," +
+ " (-$0.53)," +
+ " Cheese Filling 1 $0.12," +
+ " ," +
+ " -------------------------------," +
+ " Total $7.85," +
+ " ," +
+ " You saved a total of $2.87," +
+ " on this shop," +
+ " , Thank you," +
+ " for your order!]";
+
+ Assertions.assertTrue(receiptFinal.contains(receiptExcerpt));
+ }
+}