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 +![](./class_diagram.jpg) + + + +### 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)); + } +}