diff --git a/.gitignore b/.gitignore index e9dc70983..f7556bd60 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,7 @@ gradle-app.setting # JDT-specific (Eclipse Java Development Tools) .classpath -.idea \ No newline at end of file +.idea + +bin/ +.settings/ diff --git a/class-diagrams.png b/class-diagrams.png new file mode 100644 index 000000000..c37b828be Binary files /dev/null and b/class-diagrams.png differ diff --git a/domain-model.md b/domain-model.md new file mode 100644 index 000000000..cc7e8432f --- /dev/null +++ b/domain-model.md @@ -0,0 +1,68 @@ +# Domain model + +## Item + +| Method | Variable | Scenario | Output | +| ------------ | -------------- | -------- | ------------ | +| | SKU sku | | | +| | float price | | | +| | String type | | | +| | String variant | | | +| getSku() | | | return sku | +| getPrice() | | | return price | +| getType() | | | return type | +| getVariant() | | | return price | + +## Basket + +| Method | Variable | Scenario | Output | +| ------------------- | ---------------------- | ------------------------------------------- | ----------------------------------- | +| | Inventory inventory | | | +| | int capacity | | | +| | ArrayList\ items | | | +| addItem(Item item) | | basket is not full and item is in inventory | add item to items, return true | +| addItem(Item item) | | item is not in inventory | return false | +| addItem(Item item) | | basket is full | return false | +| removeItem(SKU sku) | | item exists in basket | remove item from items, return true | +| removeItem(SKU sku) | | item doesn't exist in basket | return false | +| getTotalCost() | | | return total cost of items | +| getItems() | | | return items | + +## Inventory + +| Method | Variable | Scenario | Output | +| -------------------------------- | ---------------------------- | ----------------- | ----------------------------------- | +| | HashMap invMap | | | +| checkStock(SKU sku) | | in stock | return true | +| checkStock(SKU sku) | | not in stock | return false | +| addStock(SKU sku, int amount) | | amount > 0 | add item to invMap, return true | +| addStock(SKU sku, int amount) | | amount <= 0 | return false | +| removeStock(SKU sku, int amount) | | item in stock | remove item from stock, return true | +| removeStock(SKU sku, int amount) | | item not in stock | return false | + +## Receipt + +### User stories + +As a member of the public, +So I can assess the damage after paying, +I'd like to see the total cost of my order on the receipt. + +As a member of the public, +So I can check if my order was handled correctly, +I'd like to see all items in my order listed on the receipt. + +As a member of the public, +So I can double check the total cost, +I'd like to see the individual price of every item listed on the receipt. + +As a member of the public, +So I can keep my finances in order, +I'd like to see the time of my purchase listed on the receipt. + +| Method | Variable | Scenario | Output | +| -------------- | ---------------- | -------- | ------------------------- | +| | Basket basket | | | +| | String time | | | +| printReceipt() | | | print receipt to terminal | +| getReceipt() | | | return receipt String | 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..82de5d9c0 --- /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(SKU sku) { + super(sku); + } +} 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..cff75fd56 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -0,0 +1,47 @@ +package com.booleanuk.core; + +import java.util.ArrayList; + +public class Basket { + private Inventory inventory; + private int capacity; + private ArrayList items = new ArrayList<>(); + + public Basket(Inventory inventory, int capacity) { + this.inventory = inventory; + this.capacity = capacity; + } + + boolean addItem(Item item) { + // if basket is not full and item is in stock + if (items.size() < capacity && inventory.checkStock(item.getSku())) { + items.add(item); + inventory.removeStock(item.getSku(), 1); // remove item from stock + return true; + } + return false; + } + + boolean removeItem(SKU sku) { + for (int i = 0; i < items.size(); i++) { + if (items.get(i).getSku() == sku) { + items.remove(i); + inventory.addStock(sku, 1); + return true; + } + } + return false; + } + + float getTotalCost() { + float total = 0f; + for (Item i : items) { + total += i.getPrice(); + } + return total; + } + + ArrayList getItems() { + return items; + } +} 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..917f0707e --- /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(SKU sku) { + super(sku); + } +} 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..b5032c430 --- /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(SKU sku) { + super(sku); + } +} 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..cd3f36c23 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Inventory.java @@ -0,0 +1,40 @@ +package com.booleanuk.core; + +import java.util.HashMap; + +public class Inventory { + private HashMap invMap = new HashMap<>(); + + boolean checkStock(SKU sku) { + if (invMap.containsKey(sku) && invMap.get(sku) > 0) { + return true; + } + return false; + } + + boolean addStock(SKU sku, int amount) { + if (amount <= 0) { + return false; + } + // if sku already in stock + if(invMap.containsKey(sku)) { + invMap.put(sku, invMap.get(sku) + amount); + } + // if sku not in stock + else { + invMap.put(sku, amount); + } + return true; + } + + boolean removeStock(SKU sku, int amount) { + // if amount is more than in stock return false + if (!checkStock(sku) || amount > invMap.get(sku)) { + return false; + } + + invMap.put(sku, invMap.get(sku) - amount); + return true; + } + +} 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..8c2d3a14e --- /dev/null +++ b/src/main/java/com/booleanuk/core/Item.java @@ -0,0 +1,89 @@ +package com.booleanuk.core; + +public abstract class Item { + private SKU sku; + private float price; + private String type; + private String variant; + + public Item(SKU sku) { + this.sku = sku; + + // Set price, type, and variant based on SKU + if (sku == SKU.BGLO) { + price = 0.49f; + type = "Bagel"; + variant = "Onion"; + } else if (sku == SKU.BGLP) { + price = 0.39f; + type = "Bagel"; + variant = "Plain"; + } else if (sku == SKU.BGLE) { + price = 0.49f; + type = "Bagel"; + variant = "Everything"; + } else if (sku == SKU.BGLS) { + price = 0.49f; + type = "Bagel"; + variant = "Sesame"; + } else if (sku == SKU.COFB) { + price = 0.99f; + type = "Coffee"; + variant = "Black"; + } else if (sku == SKU.COFW) { + price = 1.19f; + type = "Coffee"; + variant = "White"; + } else if (sku == SKU.COFC) { + price = 1.29f; + type = "Coffee"; + variant = "Capuccino"; + } else if (sku == SKU.COFL) { + price = 1.29f; + type = "Coffee"; + variant = "Latte"; + } else if (sku == SKU.FILB) { + price = 0.12f; + type = "Filling"; + variant = "Bacon"; + } else if (sku == SKU.FILE) { + price = 0.12f; + type = "Filling"; + variant = "Egg"; + } else if (sku == SKU.FILC) { + price = 0.12f; + type = "Filling"; + variant = "Cheese"; + } else if (sku == SKU.FILX) { + price = 0.12f; + type = "Filling"; + variant = "Cream Cheese"; + } else if (sku == SKU.FILS) { + price = 0.12f; + type = "Filling"; + variant = "Smoked Salmon"; + } else if (sku == SKU.FILH) { + price = 0.12f; + type = "Filling"; + variant = "Ham"; + } else { + throw new IllegalArgumentException("Invalid SKU: " + sku); + } + } + + SKU getSku() { + return sku; + } + + float getPrice() { + return price; + } + + String getType() { + return type; + } + + String getVariant() { + return variant; + } +} diff --git a/src/main/java/com/booleanuk/core/SKU.java b/src/main/java/com/booleanuk/core/SKU.java new file mode 100644 index 000000000..8a0935f3d --- /dev/null +++ b/src/main/java/com/booleanuk/core/SKU.java @@ -0,0 +1,18 @@ +package com.booleanuk.core; + +public enum SKU { + BGLO, + BGLP, + BGLE, + BGLS, + COFB, + COFW, + COFC, + COFL, + FILB, + FILE, + FILC, + FILX, + FILS, + FILH, +} diff --git a/src/main/java/com/booleanuk/extension/Bagel.java b/src/main/java/com/booleanuk/extension/Bagel.java new file mode 100644 index 000000000..504c2a929 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Bagel.java @@ -0,0 +1,7 @@ +package com.booleanuk.extension; + +public class Bagel extends Item { + public Bagel(SKU sku) { + super(sku); + } +} diff --git a/src/main/java/com/booleanuk/extension/Basket.java b/src/main/java/com/booleanuk/extension/Basket.java new file mode 100644 index 000000000..4c7fdec3c --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Basket.java @@ -0,0 +1,109 @@ +package com.booleanuk.extension; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public class Basket { + private Inventory inventory; + private int capacity; + private ArrayList items = new ArrayList<>(); + + public Basket(Inventory inventory, int capacity) { + this.inventory = inventory; + this.capacity = capacity; + } + + boolean addItem(Item item) { + // if basket is not full and item is in stock + if (items.size() < capacity && inventory.checkStock(item.getSku())) { + items.add(item); + inventory.removeStock(item.getSku(), 1); // remove item from stock + return true; + } + return false; + } + + boolean removeItem(SKU sku) { + for (int i = 0; i < items.size(); i++) { + if (items.get(i).getSku() == sku) { + items.remove(i); + return true; + } + } + return false; + } + + float getTotalCost() { + float total = 0f; + HashMap itemCounts = getItemCounts(); + + // count how many black coffees in basket + int nrOfBlackCoffees = 0; + for (Item i : items) { + if (i.getSku() == SKU.COFB) { + nrOfBlackCoffees++; + } + } + + for (Map.Entry entry : itemCounts.entrySet()) { + Item item = entry.getKey(); + Integer count = entry.getValue(); + + // check for bagel discount + if (item instanceof Bagel) { + if (count >= 12) { + count -= 12; + total += 3.99f + (item.getPrice() * count); + } else if (count >= 6) { + count -= 6; + total += 2.49f + (item.getPrice() * count); + } else { + // check for black coffee + while (nrOfBlackCoffees > 0 && count > 0) { + nrOfBlackCoffees--; + count--; + total += 1.25f; + } + // add remaining bagels + total += item.getPrice() * count; + } + } else { + if (item.getSku() != SKU.COFB) + total += item.getPrice() * count; + } + } + + // add remaining black coffees + total += 0.99f * nrOfBlackCoffees; + + total = Math.round(total * 100) / 100.0f; // round to 2 decimals + return total; + } + + ArrayList getItems() { + return items; + } + + // count occurences for each item + HashMap getItemCounts() { + HashMap itemMap = new HashMap<>(); + for (Item item : items) { + boolean itemExists = false; + + // check if this item exists in map + for (Item key : itemMap.keySet()) { + if (key.getSku() == item.getSku()) { + itemExists = true; + itemMap.put(key, itemMap.get(key) + 1); + } + } + + // if this is a new item + if (!itemExists) { + itemMap.put(item, 1); + } + } + return itemMap; + } +} diff --git a/src/main/java/com/booleanuk/extension/Coffee.java b/src/main/java/com/booleanuk/extension/Coffee.java new file mode 100644 index 000000000..c4b1b3778 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Coffee.java @@ -0,0 +1,7 @@ +package com.booleanuk.extension; + +public class Coffee extends Item { + public Coffee(SKU sku) { + super(sku); + } +} diff --git a/src/main/java/com/booleanuk/extension/Filling.java b/src/main/java/com/booleanuk/extension/Filling.java new file mode 100644 index 000000000..4ffb12d6f --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Filling.java @@ -0,0 +1,7 @@ +package com.booleanuk.extension; + +public class Filling extends Item { + public Filling(SKU sku) { + super(sku); + } +} diff --git a/src/main/java/com/booleanuk/extension/Inventory.java b/src/main/java/com/booleanuk/extension/Inventory.java new file mode 100644 index 000000000..60ee039f2 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Inventory.java @@ -0,0 +1,40 @@ +package com.booleanuk.extension; + +import java.util.HashMap; + +public class Inventory { + private HashMap invMap = new HashMap<>(); + + boolean checkStock(SKU sku) { + if (invMap.containsKey(sku) && invMap.get(sku) > 0) { + return true; + } + return false; + } + + boolean addStock(SKU sku, int amount) { + if (amount <= 0) { + return false; + } + // if sku already in stock + if(invMap.containsKey(sku)) { + invMap.put(sku, invMap.get(sku) + amount); + } + // if sku not in stock + else { + invMap.put(sku, amount); + } + return true; + } + + boolean removeStock(SKU sku, int amount) { + // if amount is more than in stock return false + if (!checkStock(sku) || amount > invMap.get(sku)) { + return false; + } + + invMap.put(sku, invMap.get(sku) - amount); + return true; + } + +} diff --git a/src/main/java/com/booleanuk/extension/Item.java b/src/main/java/com/booleanuk/extension/Item.java new file mode 100644 index 000000000..9a1b735bb --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Item.java @@ -0,0 +1,95 @@ +package com.booleanuk.extension; + +public abstract class Item { + private SKU sku; + private float price; + private String type; + private String variant; + + public Item(SKU sku) { + this.sku = sku; + + // Set price, type, and variant based on SKU + if (sku == SKU.BGLO) { + price = 0.49f; + type = "Bagel"; + variant = "Onion"; + } else if (sku == SKU.BGLP) { + price = 0.39f; + type = "Bagel"; + variant = "Plain"; + } else if (sku == SKU.BGLE) { + price = 0.49f; + type = "Bagel"; + variant = "Everything"; + } else if (sku == SKU.BGLS) { + price = 0.49f; + type = "Bagel"; + variant = "Sesame"; + } else if (sku == SKU.COFB) { + price = 0.99f; + type = "Coffee"; + variant = "Black"; + } else if (sku == SKU.COFW) { + price = 1.19f; + type = "Coffee"; + variant = "White"; + } else if (sku == SKU.COFC) { + price = 1.29f; + type = "Coffee"; + variant = "Capuccino"; + } else if (sku == SKU.COFL) { + price = 1.29f; + type = "Coffee"; + variant = "Latte"; + } else if (sku == SKU.FILB) { + price = 0.12f; + type = "Filling"; + variant = "Bacon"; + } else if (sku == SKU.FILE) { + price = 0.12f; + type = "Filling"; + variant = "Egg"; + } else if (sku == SKU.FILC) { + price = 0.12f; + type = "Filling"; + variant = "Cheese"; + } else if (sku == SKU.FILX) { + price = 0.12f; + type = "Filling"; + variant = "Cream Cheese"; + } else if (sku == SKU.FILS) { + price = 0.12f; + type = "Filling"; + variant = "Smoked Salmon"; + } else if (sku == SKU.FILH) { + price = 0.12f; + type = "Filling"; + variant = "Ham"; + } else { + throw new IllegalArgumentException("Invalid SKU: " + sku); + } + + } + + SKU getSku() { + return sku; + } + + float getPrice() { + return price; + } + + String getType() { + return type; + } + + String getVariant() { + return variant; + } + + @Override + public String toString() { + return variant + " " + type; + } +} diff --git a/src/main/java/com/booleanuk/extension/Receipt.java b/src/main/java/com/booleanuk/extension/Receipt.java new file mode 100644 index 000000000..b779b827c --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Receipt.java @@ -0,0 +1,66 @@ +package com.booleanuk.extension; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public class Receipt { + private Basket basket; + private String time; + + public Receipt(Basket basket, LocalDateTime dateTime) { + this.basket = basket; + + // format time + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + time = dateTime.format(formatter); + } + + String getReceipt() { + StringBuilder sb = new StringBuilder(); + sb.append(" ~~~ Bob's Bagels ~~~\n"); + sb.append("\n"); + sb.append(" " + time + "\n"); + sb.append("\n"); + sb.append("----------------------------\n"); + + HashMap itemMap = basket.getItemCounts(); + ArrayList itemLines = new ArrayList<>(); + + // add items to itemLines + for (Map.Entry entry : itemMap.entrySet()) { + Item item = entry.getKey(); + Integer count = entry.getValue(); + + // add string to receipt + itemLines.add( + item.toString() + "\t" + Integer.toString(count) + "\t$" + + String.valueOf(item.getPrice() * itemMap.get(item)) + + "\n"); + + } + + // sort itemLines + itemLines.sort(String::compareTo); + + // add itemLines to receipt + for (String s : itemLines) { + sb.append(s); + } + + sb.append("\n"); + sb.append("----------------------------\n"); + sb.append("Total " + "$" + basket.getTotalCost() + "\n"); + sb.append("\n"); + sb.append(" Thank you\n"); + sb.append(" for your order!"); + + return sb.toString(); + } + + void printReceipt() { + System.out.println(getReceipt()); + } +} diff --git a/src/main/java/com/booleanuk/extension/SKU.java b/src/main/java/com/booleanuk/extension/SKU.java new file mode 100644 index 000000000..a521360cc --- /dev/null +++ b/src/main/java/com/booleanuk/extension/SKU.java @@ -0,0 +1,18 @@ +package com.booleanuk.extension; + +public enum SKU { + BGLO, + BGLP, + BGLE, + BGLS, + COFB, + COFW, + COFC, + COFL, + FILB, + FILE, + FILC, + FILX, + FILS, + FILH, +} diff --git a/src/test/java/com/booleanuk/core/TestBasket.java b/src/test/java/com/booleanuk/core/TestBasket.java new file mode 100644 index 000000000..1dfd0d726 --- /dev/null +++ b/src/test/java/com/booleanuk/core/TestBasket.java @@ -0,0 +1,69 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TestBasket { + @Test + void testAddItemBasketNotFullInStock() { + // add onion bagle to stock + Inventory inventory = new Inventory(); + inventory.addStock(SKU.BGLO, 1); + + Basket basket = new Basket(inventory, 3); + + Item item = new Bagel(SKU.BGLO); + + Assertions.assertTrue(basket.addItem(item)); + Assertions.assertEquals(SKU.BGLO, basket.getItems().get(0).getSku()); + } + + @Test + void testAddItemNotInStock() { + Inventory inventory = new Inventory(); + Basket basket = new Basket(inventory, 3); + + Item item = new Bagel(SKU.BGLO); + + Assertions.assertFalse(basket.addItem(item)); + } + + @Test + void testAddItemFullBasket() { + Inventory inventory = new Inventory(); + Basket basket = new Basket(inventory, 0); + + Item item = new Bagel(SKU.BGLO); + + Assertions.assertFalse(basket.addItem(item)); + } + + @Test + void testRemoveItemThatExists() { + // add onion bagle to stock + Inventory inventory = new Inventory(); + inventory.addStock(SKU.BGLO, 1); + + Basket basket = new Basket(inventory, 5); + basket.addItem(new Bagel(SKU.BGLO)); + + Assertions.assertTrue(basket.removeItem(SKU.BGLO)); + Assertions.assertTrue(inventory.checkStock(SKU.BGLO)); // check if item is added back to stock + } + + @Test + void testGetTotalCost() { + Inventory inventory = new Inventory(); + + inventory.addStock(SKU.BGLO, 2); + inventory.addStock(SKU.COFB, 1); + + Basket basket = new Basket(inventory, 5); + basket.addItem(new Bagel(SKU.BGLO)); + basket.addItem(new Bagel(SKU.BGLO)); + basket.addItem(new Bagel(SKU.COFB)); + + Assertions.assertEquals(1.97f, basket.getTotalCost()); + + } +} diff --git a/src/test/java/com/booleanuk/core/TestInventory.java b/src/test/java/com/booleanuk/core/TestInventory.java new file mode 100644 index 000000000..5b6fc7362 --- /dev/null +++ b/src/test/java/com/booleanuk/core/TestInventory.java @@ -0,0 +1,52 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TestInventory { + @Test + void testCheckStock() { + Inventory inventory = new Inventory(); + inventory.addStock(SKU.FILB, 1); + + Assertions.assertTrue(inventory.checkStock(SKU.FILB)); + } + + @Test + void addStockValidAmount() { + Inventory inventory = new Inventory(); + + Assertions.assertTrue(inventory.addStock(SKU.FILB, 1)); + Assertions.assertTrue(inventory.checkStock(SKU.FILB)); + } + + @Test + void addStockInvalidAmount() { + Inventory inventory = new Inventory(); + + Assertions.assertFalse(inventory.addStock(SKU.FILB, 0)); + Assertions.assertFalse(inventory.addStock(SKU.FILB, -1)); + Assertions.assertFalse(inventory.checkStock(SKU.FILB)); + } + + @Test + void removeStockItemInStock() { + Inventory inventory = new Inventory(); + + inventory.addStock(SKU.COFB, 10); + inventory.addStock(SKU.BGLE, 5); + + Assertions.assertTrue(inventory.removeStock(SKU.COFB, 5)); + Assertions.assertTrue(inventory.removeStock(SKU.BGLE, 5)); + Assertions.assertFalse(inventory.checkStock(SKU.BGLE)); + } + + @Test + void removeStockItemNotInStock() { + Inventory inventory = new Inventory(); + + Assertions.assertFalse(inventory.removeStock(SKU.COFB, 5)); + Assertions.assertFalse(inventory.removeStock(SKU.COFB, 8)); + Assertions.assertFalse(inventory.checkStock(SKU.COFB)); + } +} diff --git a/src/test/java/com/booleanuk/core/TestItem.java b/src/test/java/com/booleanuk/core/TestItem.java new file mode 100644 index 000000000..d802de3bc --- /dev/null +++ b/src/test/java/com/booleanuk/core/TestItem.java @@ -0,0 +1,16 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TestItem { + @Test + void testCorrectVariableSetFromSku() { + Item item = new Bagel(SKU.BGLO); + + Assertions.assertEquals(SKU.BGLO, item.getSku()); + Assertions.assertEquals("Bagel", item.getType()); + Assertions.assertEquals(0.49f, item.getPrice()); + Assertions.assertEquals("Onion", item.getVariant()); + } +} diff --git a/src/test/java/com/booleanuk/extension/TestBasketExtension.java b/src/test/java/com/booleanuk/extension/TestBasketExtension.java new file mode 100644 index 000000000..ef65fad06 --- /dev/null +++ b/src/test/java/com/booleanuk/extension/TestBasketExtension.java @@ -0,0 +1,132 @@ +package com.booleanuk.extension; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TestBasketExtension { + @Test + void testAddItemBasketNotFullInStock() { + // add onion bagle to stock + Inventory inventory = new Inventory(); + inventory.addStock(SKU.BGLO, 1); + + Basket basket = new Basket(inventory, 3); + + Item item = new Bagel(SKU.BGLO); + + Assertions.assertTrue(basket.addItem(item)); + Assertions.assertEquals(SKU.BGLO, basket.getItems().get(0).getSku()); + } + + @Test + void testAddItemNotInStock() { + Inventory inventory = new Inventory(); + Basket basket = new Basket(inventory, 3); + + Item item = new Bagel(SKU.BGLO); + + Assertions.assertFalse(basket.addItem(item)); + } + + @Test + void testAddItemFullBasket() { + Inventory inventory = new Inventory(); + Basket basket = new Basket(inventory, 0); + + Item item = new Bagel(SKU.BGLO); + + Assertions.assertFalse(basket.addItem(item)); + } + + @Test + void testRemoveItemThatExists() { + // add onion bagle to stock + Inventory inventory = new Inventory(); + inventory.addStock(SKU.BGLO, 1); + + Basket basket = new Basket(inventory, 5); + basket.addItem(new Bagel(SKU.BGLO)); + + Assertions.assertTrue(basket.removeItem(SKU.BGLO)); + Assertions.assertFalse(inventory.checkStock(SKU.BGLO)); + } + + @Test + void testGetTotalCost() { + Inventory inventory = new Inventory(); + + inventory.addStock(SKU.BGLO, 2); + inventory.addStock(SKU.COFB, 1); + + Basket basket = new Basket(inventory, 5); + basket.addItem(new Bagel(SKU.BGLO)); + basket.addItem(new Bagel(SKU.BGLO)); + basket.addItem(new Coffee(SKU.COFB)); + + Assertions.assertEquals(1.74f, basket.getTotalCost()); + + } + + @Test + void testGetTotalCost12bagels() { + Inventory inventory = new Inventory(); + + inventory.addStock(SKU.BGLO, 12); + + Basket basket = new Basket(inventory, 12); + // add 12 onion bagels + for (int i = 0; i < 12; i++) { + basket.addItem(new Bagel(SKU.BGLO)); + } + + Assertions.assertEquals(3.99f, basket.getTotalCost()); + + } + + @Test + void testGetTotalCost6bagels() { + Inventory inventory = new Inventory(); + + inventory.addStock(SKU.BGLO, 12); + + Basket basket = new Basket(inventory, 12); + // add 12 onion bagels + for (int i = 0; i < 6; i++) { + basket.addItem(new Bagel(SKU.BGLO)); + } + + Assertions.assertEquals(2.49f, basket.getTotalCost()); + + } + + @Test + void testGetTotalCost18bagels() { + Inventory inventory = new Inventory(); + + inventory.addStock(SKU.BGLO, 18); + + Basket basket = new Basket(inventory, 18); + // add 12 onion bagels + for (int i = 0; i < 18; i++) { + basket.addItem(new Bagel(SKU.BGLO)); + } + + Assertions.assertEquals(6.93f, basket.getTotalCost()); + + } + + @Test + void testGetTotalCostCoffeAndBagel() { + Inventory inventory = new Inventory(); + + inventory.addStock(SKU.BGLP, 1); + inventory.addStock(SKU.COFB, 1); + + Basket basket = new Basket(inventory, 2); + basket.addItem(new Bagel(SKU.BGLP)); + basket.addItem(new Coffee(SKU.COFB)); + + Assertions.assertEquals(1.25f, basket.getTotalCost()); + + } +} diff --git a/src/test/java/com/booleanuk/extension/TestInventoryExtension.java b/src/test/java/com/booleanuk/extension/TestInventoryExtension.java new file mode 100644 index 000000000..c53ab6a44 --- /dev/null +++ b/src/test/java/com/booleanuk/extension/TestInventoryExtension.java @@ -0,0 +1,52 @@ +package com.booleanuk.extension; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TestInventoryExtension { + @Test + void testCheckStock() { + Inventory inventory = new Inventory(); + inventory.addStock(SKU.FILB, 1); + + Assertions.assertTrue(inventory.checkStock(SKU.FILB)); + } + + @Test + void addStockValidAmount() { + Inventory inventory = new Inventory(); + + Assertions.assertTrue(inventory.addStock(SKU.FILB, 1)); + Assertions.assertTrue(inventory.checkStock(SKU.FILB)); + } + + @Test + void addStockInvalidAmount() { + Inventory inventory = new Inventory(); + + Assertions.assertFalse(inventory.addStock(SKU.FILB, 0)); + Assertions.assertFalse(inventory.addStock(SKU.FILB, -1)); + Assertions.assertFalse(inventory.checkStock(SKU.FILB)); + } + + @Test + void removeStockItemInStock() { + Inventory inventory = new Inventory(); + + inventory.addStock(SKU.COFB, 10); + inventory.addStock(SKU.BGLE, 5); + + Assertions.assertTrue(inventory.removeStock(SKU.COFB, 5)); + Assertions.assertTrue(inventory.removeStock(SKU.BGLE, 5)); + Assertions.assertFalse(inventory.checkStock(SKU.BGLE)); + } + + @Test + void removeStockItemNotInStock() { + Inventory inventory = new Inventory(); + + Assertions.assertFalse(inventory.removeStock(SKU.COFB, 5)); + Assertions.assertFalse(inventory.removeStock(SKU.COFB, 8)); + Assertions.assertFalse(inventory.checkStock(SKU.COFB)); + } +} diff --git a/src/test/java/com/booleanuk/extension/TestItemExtension.java b/src/test/java/com/booleanuk/extension/TestItemExtension.java new file mode 100644 index 000000000..aeb6033dd --- /dev/null +++ b/src/test/java/com/booleanuk/extension/TestItemExtension.java @@ -0,0 +1,16 @@ +package com.booleanuk.extension; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TestItemExtension { + @Test + void testCorrectVariableSetFromSku() { + Item item = new Bagel(SKU.BGLO); + + Assertions.assertEquals(SKU.BGLO, item.getSku()); + Assertions.assertEquals("Bagel", item.getType()); + Assertions.assertEquals(0.49f, item.getPrice()); + Assertions.assertEquals("Onion", item.getVariant()); + } +} diff --git a/src/test/java/com/booleanuk/extension/TestReceipt.java b/src/test/java/com/booleanuk/extension/TestReceipt.java new file mode 100644 index 000000000..a80ab005a --- /dev/null +++ b/src/test/java/com/booleanuk/extension/TestReceipt.java @@ -0,0 +1,46 @@ +package com.booleanuk.extension; + +import java.time.Month; +import java.time.LocalDateTime; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TestReceipt { + @Test + void TestGetRecipet() { + Inventory inventory = new Inventory(); + + inventory.addStock(SKU.BGLO, 2); + inventory.addStock(SKU.COFB, 1); + + Basket basket = new Basket(inventory, 5); + basket.addItem(new Bagel(SKU.BGLO)); + basket.addItem(new Bagel(SKU.BGLO)); + basket.addItem(new Coffee(SKU.COFB)); + + LocalDateTime time = LocalDateTime.of(2021, Month.MARCH, 16, 21, 38, 44); + Receipt receipt = new Receipt(basket, time); + + String expected = " ~~~ Bob's Bagels ~~~\n" + + "\n" + + " 2021-03-16 21:38:44\n" + + "\n" + + "----------------------------\n" + + "Black Coffee 1 $0.99\n" + + "Onion Bagel 2 $0.98\n" + + "\n" + + "----------------------------\n" + + "Total $1.74\n" + + "\n" + + " Thank you\n" + + " for your order!"; + + expected = expected.replaceAll("\\s", ""); + + String result = receipt.getReceipt().replaceAll("\\s", ""); + + Assertions.assertEquals(expected, result); + + } +}