From e25892adf5c1d899786c5a44e24fec95ff5e118c Mon Sep 17 00:00:00 2001 From: Miadog7Extra Date: Tue, 14 Jan 2025 14:13:45 +0100 Subject: [PATCH 1/5] Domain model and inventory --- exercise.main/domain-model.md | 18 ++++++++++++++++++ exercise.main/inventory.csv | 16 ++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 exercise.main/domain-model.md create mode 100644 exercise.main/inventory.csv diff --git a/exercise.main/domain-model.md b/exercise.main/domain-model.md new file mode 100644 index 00000000..d4de75c0 --- /dev/null +++ b/exercise.main/domain-model.md @@ -0,0 +1,18 @@ +| Class | Method | Member | Scenario | Return | +|----------------------|------------------------------------------|-------------------------------------------------------|------------------------------|----------------| +| Basket | addItem(Inventory, item, quantity) | Class Inventory, String item, Integer quantity | full basket | false | +| | | | add item | true | +| | | | Item not found | false | +| | removeItem(Inventory, sku, quantity) | Class Inventory, String item, Integer quantity | remove item | true | +| | | | Item not found | false | +| | changeCapacity(capacity) | Integer capacity | Changed capacity | true | +| | | | Unable to change capacity | false | +| | getTotalCost() | ArrayList | Get total cost | Return cost | +| Inventory | printInventory(inventory, inventoryName) | Dictonary inventory,String inventoryName | Show all added products | String[] | +| | getProductsBySku(sku) | String sku | Get all products of one type | String[] | +| | getAllProducts() | | Show all products | String[] | +| Item | getType() | | get type | String type | +| | getVariant() | | get variant | String variant | +| | getSku() | | get sku | String sku | +| | getPrice() | | get price | double price | +| | getQuantity() | | get quantity | int quantity | \ No newline at end of file diff --git a/exercise.main/inventory.csv b/exercise.main/inventory.csv new file mode 100644 index 00000000..663dba3d --- /dev/null +++ b/exercise.main/inventory.csv @@ -0,0 +1,16 @@ +SKU,Price,Name,Variant +BGLO,0.49,Bagel,Onion +BGLP,0.39,Bagel,Plain +BGLE,0.49,Bagel,Everything +BGLS,0.49,Bagel,Sesame +COFB,0.99,Coffee,Black +COFW,1.19,Coffee,White +COFC,1.29,Coffee,Capuccino +COFL,1.29,Coffee,Latte +COFD,1.25,Coffee,& Bagel +FILB,0.12,Filling,Bacon +FILE,0.12,Filling,Egg +FILC,0.12,Filling,Cheese +FILX,0.12,Filling,Cream Cheese +FILS,0.12,Filling,Smoked Salmon +FILH,0.12,Filling,Ham \ No newline at end of file From f1b89cf63d7df26b6ae7a44fa32a9492ba275fb5 Mon Sep 17 00:00:00 2001 From: Miadog7Extra Date: Tue, 14 Jan 2025 17:06:53 +0100 Subject: [PATCH 2/5] inventory tested and fixed --- exercise.main/Inventory.cs | 58 ++++++++++++++++++++++++++++ exercise.main/Item.cs | 31 +++++++++++++++ exercise.main/Program.cs | 15 ++++++- exercise.main/domain-model.md | 3 +- exercise.tests/InventoryTest.cs | 33 ++++++++++++++++ exercise.tests/UnitTest1.cs | 3 ++ exercise.tests/exercise.tests.csproj | 4 ++ 7 files changed, 143 insertions(+), 4 deletions(-) create mode 100644 exercise.main/Inventory.cs create mode 100644 exercise.main/Item.cs create mode 100644 exercise.tests/InventoryTest.cs diff --git a/exercise.main/Inventory.cs b/exercise.main/Inventory.cs new file mode 100644 index 00000000..b2c081cd --- /dev/null +++ b/exercise.main/Inventory.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; + +namespace exercise.main +{ + public class Inventory + { + private Dictionary bagelInventory = new Dictionary(); + private Dictionary coffeeInventory = new Dictionary(); + private Dictionary fillingInventory = new Dictionary(); + + public Inventory() + { + bagelInventory["BGLO"] = new Item("BGLO", "Bagel", 0.49, "Onion"); + bagelInventory["BGLP"] = new Item("BGLP", "Bagel", 0.39, "Plain"); + bagelInventory["BGLE"] = new Item("BGLE", "Bagel", 0.49, "Everything"); + bagelInventory["BGLS"] = new Item("BGLS", "Bagel", 0.49, "Sesame"); + + coffeeInventory["COFB"] = new Item("COFB", "Coffee", 0.99, "Black"); + coffeeInventory["COFW"] = new Item("COFW", "Coffee", 1.19, "White"); + coffeeInventory["COFC"] = new Item("COFC", "Coffee", 1.29, "Capuccino"); + coffeeInventory["COFL"] = new Item("COFL", "Coffee", 1.29, "Latte"); + coffeeInventory["COFD"] = new Item("COFD", "Coffee", 1.25, "& Bagel"); + + fillingInventory["FILB"] = new Item("FILB", "Filling", 0.12, "Bacon"); + fillingInventory["FILE"] = new Item("FILE", "Filling", 0.12, "Egg"); + fillingInventory["FILC"] = new Item("FILC", "Filling", 0.12, "Cheese"); + fillingInventory["FILX"] = new Item("FILX", "Filling", 0.12, "Cream Cheese"); + fillingInventory["FILS"] = new Item("FILS", "Filling", 0.12, "Smoked Salmon"); + fillingInventory["FILH"] = new Item("FILH", "Filling", 0.12, "Ham"); + } + + public Dictionary GetBagelInventory() => bagelInventory; + public Dictionary GetFillingInventory() => fillingInventory; + public Dictionary GetCoffeeInventory() => coffeeInventory; + + public void PrintInventories() + { + Console.WriteLine("Bagel Inventory:"); + foreach (var kvp in bagelInventory) + { + Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}"); + } + + Console.WriteLine("\nCoffee Inventory:"); + foreach (var kvp in coffeeInventory) + { + Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}"); + } + + Console.WriteLine("\nFilling Inventory:"); + foreach (var kvp in fillingInventory) + { + Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}"); + } + } + } +} diff --git a/exercise.main/Item.cs b/exercise.main/Item.cs new file mode 100644 index 00000000..86a44512 --- /dev/null +++ b/exercise.main/Item.cs @@ -0,0 +1,31 @@ +using System; + +namespace exercise.main +{ + public class Item + { + public string Sku { get; } + public string Name { get; } + public double Price { get; } + public string Variant { get; } + public int Quantity { get; private set; } + + public Item(string sku, string name, double price, string variant) + { + Sku = sku; + Name = name; + Price = price; + Variant = variant; + Quantity = 1; + } + public void SetQuantity(int quantity) + { + Quantity = quantity; + } + + public override string ToString() + { + return $"SKU: {Sku}, Name: {Name}, Price: {Price}, Variant: {Variant}, Quantity: {Quantity}"; + } + } +} diff --git a/exercise.main/Program.cs b/exercise.main/Program.cs index 3751555c..94da7cda 100644 --- a/exercise.main/Program.cs +++ b/exercise.main/Program.cs @@ -1,2 +1,13 @@ -// See https://aka.ms/new-console-template for more information -Console.WriteLine("Hello, World!"); +using System; +using exercise.main; + +class Program +{ + static void Main(string[] args) + { + + var inventory = new Inventory(); + + inventory.PrintInventories(); + } +} diff --git a/exercise.main/domain-model.md b/exercise.main/domain-model.md index d4de75c0..9b613013 100644 --- a/exercise.main/domain-model.md +++ b/exercise.main/domain-model.md @@ -8,8 +8,7 @@ | | changeCapacity(capacity) | Integer capacity | Changed capacity | true | | | | | Unable to change capacity | false | | | getTotalCost() | ArrayList | Get total cost | Return cost | -| Inventory | printInventory(inventory, inventoryName) | Dictonary inventory,String inventoryName | Show all added products | String[] | -| | getProductsBySku(sku) | String sku | Get all products of one type | String[] | +| Inventory | printInventory() | Dictonary inventory,String inventoryName | Show all added products | String[] | | | getAllProducts() | | Show all products | String[] | | Item | getType() | | get type | String type | | | getVariant() | | get variant | String variant | diff --git a/exercise.tests/InventoryTest.cs b/exercise.tests/InventoryTest.cs new file mode 100644 index 00000000..abef01fe --- /dev/null +++ b/exercise.tests/InventoryTest.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using exercise.main; + +namespace exercise.tests +{ + internal class InventoryTest + { + [Test] + public void TestGetAllProducts() + { + var inventory = new Inventory(); + + Dictionary bagelInventory = inventory.GetBagelInventory(); + Dictionary coffeeInventory = inventory.GetCoffeeInventory(); + Dictionary fillingInventory = inventory.GetFillingInventory(); + + Assert.IsNotNull(bagelInventory); + Assert.IsNotNull(coffeeInventory); + Assert.IsNotNull(fillingInventory); + + + Assert.IsTrue(bagelInventory.ContainsKey("BGLO")); + Assert.AreEqual("Bagel", bagelInventory["BGLO"].Name); + Assert.AreEqual(0.49, bagelInventory["BGLO"].Price); + } + + } +} diff --git a/exercise.tests/UnitTest1.cs b/exercise.tests/UnitTest1.cs index 7bdb8968..92201551 100644 --- a/exercise.tests/UnitTest1.cs +++ b/exercise.tests/UnitTest1.cs @@ -1,3 +1,6 @@ +using System; +using exercise.main; + namespace exercise.tests; public class Tests diff --git a/exercise.tests/exercise.tests.csproj b/exercise.tests/exercise.tests.csproj index 9fed8e17..9b7caea7 100644 --- a/exercise.tests/exercise.tests.csproj +++ b/exercise.tests/exercise.tests.csproj @@ -16,5 +16,9 @@ + + + + From 130f30f3922ef340db402cf57c4bbd40b8e06277 Mon Sep 17 00:00:00 2001 From: Miadog7Extra Date: Tue, 14 Jan 2025 17:23:51 +0100 Subject: [PATCH 3/5] failed tests --- exercise.main/Basket.cs | 85 +++++++++++++++++++++++++++ exercise.main/Inventory.cs | 18 ++++++ exercise.main/Program.cs | 9 +++ exercise.tests/BasketTest.cs | 109 +++++++++++++++++++++++++++++++++++ 4 files changed, 221 insertions(+) create mode 100644 exercise.main/Basket.cs create mode 100644 exercise.tests/BasketTest.cs diff --git a/exercise.main/Basket.cs b/exercise.main/Basket.cs new file mode 100644 index 00000000..90685393 --- /dev/null +++ b/exercise.main/Basket.cs @@ -0,0 +1,85 @@ +using exercise.main; +using System; +using System.Collections.Generic; + +namespace exercise.main +{ + public class Basket + { + private int capacity; + private List items; + private int quantity; + + public Basket(int capacity) + { + this.capacity = capacity; + this.items = new List(); + } + + public void ClearItems() + { + items.Clear(); + } + + public bool ChangeCapacity(int newCapacity) + { + if (newCapacity >= items.Count) + { + this.capacity = newCapacity; + return true; + } + return false; + } + + public bool AddItems(Inventory inventory, string sku, int quantity) + { + Item itemToAdd = inventory.GetItemBySKU(sku); + if (itemToAdd == null) + { + Console.WriteLine("Item not found"); + return false; + } + if (items.Count + quantity > capacity) + { + Console.WriteLine($"Basket capacity is reached. Current basket: {items.Count}. Capacity: {capacity}"); + return false; + } + + for (int i = 0; i < quantity; i++) + { + items.Add(itemToAdd); + } + return true; + } + + public bool RemoveItems(Inventory inventory, string skuToRemove, int quantityToRemove) + { + Item itemToRemove = inventory.GetItemBySKU(skuToRemove); + if (itemToRemove != null && items.Contains(itemToRemove)) + { + for (int i = 0; i < quantityToRemove; i++) + { + items.Remove(itemToRemove); + } + return true; + } + Console.WriteLine("Item was not found"); + return false; + } + + public string ShowBasket() + { + return string.Join(", ", items); + } + + public double GetTotalCost() + { + double totalCost = 0; + foreach (Item item in items) + { + totalCost += item.Price; // Assuming `Item.Price` is accessible + } + return totalCost; + } + } +} diff --git a/exercise.main/Inventory.cs b/exercise.main/Inventory.cs index b2c081cd..c369072c 100644 --- a/exercise.main/Inventory.cs +++ b/exercise.main/Inventory.cs @@ -54,5 +54,23 @@ public void PrintInventories() Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}"); } } + public Item GetItemBySKU(string sku) + { + if (sku.Length >= 3) + { + string inventoryType = sku.Substring(0, 3); + switch (inventoryType) + { + case "BGL": + return bagelInventory.ContainsKey(sku) ? bagelInventory[sku] : null; + case "COF": + return coffeeInventory.ContainsKey(sku) ? coffeeInventory[sku] : null; + case "FIL": + return fillingInventory.ContainsKey(sku) ? fillingInventory[sku] : null; + } + } + return null; + } + } } diff --git a/exercise.main/Program.cs b/exercise.main/Program.cs index 94da7cda..b912f1a5 100644 --- a/exercise.main/Program.cs +++ b/exercise.main/Program.cs @@ -9,5 +9,14 @@ static void Main(string[] args) var inventory = new Inventory(); inventory.PrintInventories(); + Basket basket = new Basket(100); + + //basket.AddItems(inventory, "BGLO", 3); + //basket.AddItems(inventory, "COFB", 2); + Console.WriteLine($"Basket: {basket.ShowBasket()}"); + Console.WriteLine($"Total Cost: {basket.GetTotalCost()}"); + + basket.RemoveItems(inventory, "BGLO", 1); + Console.WriteLine($"Basket after removal: {basket.ShowBasket()}"); } } diff --git a/exercise.tests/BasketTest.cs b/exercise.tests/BasketTest.cs new file mode 100644 index 00000000..7b8d0978 --- /dev/null +++ b/exercise.tests/BasketTest.cs @@ -0,0 +1,109 @@ +using exercise.main; + +namespace exercise.tests +{ + [TestFixture] + internal class BasketTest + { + [Test] + public void TestAddItemsToBasket() + { + var inventory = new Inventory(); + var basket = new Basket(5); + + bool result = basket.AddItems(inventory, "BGLO", 2); + + + Assert.IsTrue(result, "Items should be added successfully to the basket."); + Assert.AreEqual(2, basket.ShowBasket().Split(',').Length, "Basket should contain 2 items."); + } + + [Test] + public void TestAddItemsExceedingCapacity() + { + + var inventory = new Inventory(); + var basket = new Basket(2); + + + bool result = basket.AddItems(inventory, "BGLO", 3); + + + Assert.IsFalse(result, "Items exceeding basket capacity should not be added."); + } + + [Test] + public void TestRemoveItemsFromBasket() + { + + var inventory = new Inventory(); + var basket = new Basket(5); + basket.AddItems(inventory, "BGLO", 2); + + + bool result = basket.RemoveItems(inventory, "BGLO", 1); + + + Assert.IsTrue(result, "Item should be removed successfully from the basket."); + Assert.AreEqual(1, basket.ShowBasket().Split(',').Length, "Basket should contain 1 item after removal."); + } + + [Test] + public void TestRemoveItemsNotInBasket() + { + + var inventory = new Inventory(); + var basket = new Basket(5); + + + bool result = basket.RemoveItems(inventory, "BGLO", 1); + + + Assert.IsFalse(result, "Removing items not in the basket should return false."); + } + + [Test] + public void TestChangeCapacity() + { + + var basket = new Basket(2); + basket.AddItems(new Inventory(), "BGLO", 2); + + + bool result = basket.ChangeCapacity(3); + + + Assert.IsTrue(result, "Changing capacity should succeed when new capacity is sufficient."); + } + + [Test] + public void TestChangeCapacityToLowerThanCurrentItems() + { + + var basket = new Basket(3); + basket.AddItems(new Inventory(), "BGLO", 3); + + + bool result = basket.ChangeCapacity(2); + + + Assert.IsFalse(result, "Changing capacity should fail when new capacity is less than current item count."); + } + + [Test] + public void TestGetTotalCost() + { + + var inventory = new Inventory(); + var basket = new Basket(5); + basket.AddItems(inventory, "BGLO", 2); + basket.AddItems(inventory, "COFB", 1); + + + double totalCost = basket.GetTotalCost(); + + + Assert.AreEqual(1.97, totalCost, 0.01, "Total cost should match the sum of item prices."); + } + } +} From eacf18a2b042a62b81fce052937ec19e98b431b2 Mon Sep 17 00:00:00 2001 From: Miadog7Extra Date: Wed, 15 Jan 2025 09:24:15 +0100 Subject: [PATCH 4/5] core finished --- exercise.main/Basket.cs | 10 ++++++++-- exercise.main/Program.cs | 14 ++++++++------ exercise.main/domain-model.md | 21 ++++++++++++++------- exercise.tests/BasketTest.cs | 18 +++++++++--------- 4 files changed, 39 insertions(+), 24 deletions(-) diff --git a/exercise.main/Basket.cs b/exercise.main/Basket.cs index 90685393..4f488be7 100644 --- a/exercise.main/Basket.cs +++ b/exercise.main/Basket.cs @@ -13,7 +13,7 @@ public class Basket public Basket(int capacity) { this.capacity = capacity; - this.items = new List(); + items = new List(); } public void ClearItems() @@ -72,12 +72,18 @@ public string ShowBasket() return string.Join(", ", items); } + public int ItemsCount() + { + return items.Count; + } + + public double GetTotalCost() { double totalCost = 0; foreach (Item item in items) { - totalCost += item.Price; // Assuming `Item.Price` is accessible + totalCost += item.Price; } return totalCost; } diff --git a/exercise.main/Program.cs b/exercise.main/Program.cs index b912f1a5..64225ff9 100644 --- a/exercise.main/Program.cs +++ b/exercise.main/Program.cs @@ -8,15 +8,17 @@ static void Main(string[] args) var inventory = new Inventory(); - inventory.PrintInventories(); - Basket basket = new Basket(100); + Basket basket = new Basket(5); - //basket.AddItems(inventory, "BGLO", 3); - //basket.AddItems(inventory, "COFB", 2); + basket.AddItems(inventory, "BGLO", 3); + basket.AddItems(inventory, "COFB", 2); Console.WriteLine($"Basket: {basket.ShowBasket()}"); Console.WriteLine($"Total Cost: {basket.GetTotalCost()}"); + Console.WriteLine(basket.AddItems(inventory, "COFB", 2)); - basket.RemoveItems(inventory, "BGLO", 1); - Console.WriteLine($"Basket after removal: {basket.ShowBasket()}"); + basket.ChangeCapacity(10); + Console.WriteLine(basket.AddItems(inventory, "COFB", 2)); + Console.WriteLine(basket.AddItems(inventory, "COFB", 10)); + //Console.WriteLine($"Total Cost: {basket.GetTotalCost()}"); } } diff --git a/exercise.main/domain-model.md b/exercise.main/domain-model.md index 9b613013..745105ad 100644 --- a/exercise.main/domain-model.md +++ b/exercise.main/domain-model.md @@ -7,11 +7,18 @@ | | | | Item not found | false | | | changeCapacity(capacity) | Integer capacity | Changed capacity | true | | | | | Unable to change capacity | false | -| | getTotalCost() | ArrayList | Get total cost | Return cost | +| | getTotalCost() | List | Get total cost | Return cost | +| | ItemcsCount() | List | Get item list length | Return Length | +| | ShowBasket() | List | Show Basket List | String Items | | Inventory | printInventory() | Dictonary inventory,String inventoryName | Show all added products | String[] | -| | getAllProducts() | | Show all products | String[] | -| Item | getType() | | get type | String type | -| | getVariant() | | get variant | String variant | -| | getSku() | | get sku | String sku | -| | getPrice() | | get price | double price | -| | getQuantity() | | get quantity | int quantity | \ No newline at end of file +| | GetBagelInventory() | Dictonary | Get all Bagels | Dictonary | +| | GetFillingInventory() | Dictonary | Get all Fillings | Dictonary | +| | GetCoffeeInventory() | Dictonary | Get all Coffees | Dictonary | +| | GetItemBySKU() | Dictonary | Get Item by SKU | Dictonary | +| Item | Name() | | get name | String type | +| | Variant() | | get variant | String variant | +| | Sku() | | get sku | String sku | +| | Price() | | get price | double price | +| | Quantity() | | get quantity | int quantity | +| | setQuantity() | Integer quantity | set quantity | | +| | ToString() | Item | Items as string | string Item | \ No newline at end of file diff --git a/exercise.tests/BasketTest.cs b/exercise.tests/BasketTest.cs index 7b8d0978..ec2e210c 100644 --- a/exercise.tests/BasketTest.cs +++ b/exercise.tests/BasketTest.cs @@ -14,8 +14,8 @@ public void TestAddItemsToBasket() bool result = basket.AddItems(inventory, "BGLO", 2); - Assert.IsTrue(result, "Items should be added successfully to the basket."); - Assert.AreEqual(2, basket.ShowBasket().Split(',').Length, "Basket should contain 2 items."); + Assert.IsTrue(result); + Assert.AreEqual(2, basket.ItemsCount()); } [Test] @@ -29,7 +29,7 @@ public void TestAddItemsExceedingCapacity() bool result = basket.AddItems(inventory, "BGLO", 3); - Assert.IsFalse(result, "Items exceeding basket capacity should not be added."); + Assert.IsFalse(result); } [Test] @@ -44,8 +44,8 @@ public void TestRemoveItemsFromBasket() bool result = basket.RemoveItems(inventory, "BGLO", 1); - Assert.IsTrue(result, "Item should be removed successfully from the basket."); - Assert.AreEqual(1, basket.ShowBasket().Split(',').Length, "Basket should contain 1 item after removal."); + Assert.IsTrue(result); + Assert.AreEqual(1, basket.ItemsCount()); } [Test] @@ -59,7 +59,7 @@ public void TestRemoveItemsNotInBasket() bool result = basket.RemoveItems(inventory, "BGLO", 1); - Assert.IsFalse(result, "Removing items not in the basket should return false."); + Assert.IsFalse(result); } [Test] @@ -73,7 +73,7 @@ public void TestChangeCapacity() bool result = basket.ChangeCapacity(3); - Assert.IsTrue(result, "Changing capacity should succeed when new capacity is sufficient."); + Assert.IsTrue(result); } [Test] @@ -87,7 +87,7 @@ public void TestChangeCapacityToLowerThanCurrentItems() bool result = basket.ChangeCapacity(2); - Assert.IsFalse(result, "Changing capacity should fail when new capacity is less than current item count."); + Assert.IsFalse(result); } [Test] @@ -103,7 +103,7 @@ public void TestGetTotalCost() double totalCost = basket.GetTotalCost(); - Assert.AreEqual(1.97, totalCost, 0.01, "Total cost should match the sum of item prices."); + Assert.AreEqual(1.97, totalCost); } } } From ab8e423309035e06a5c0e12e48a00add9ee67586 Mon Sep 17 00:00:00 2001 From: Miadog7Extra Date: Thu, 16 Jan 2025 14:20:18 +0100 Subject: [PATCH 5/5] Extension --- exercise.main/Basket.cs | 94 +++++++++++++++++++++++++++++++----- exercise.main/Program.cs | 15 ++---- exercise.tests/BasketTest.cs | 28 +++-------- 3 files changed, 92 insertions(+), 45 deletions(-) diff --git a/exercise.main/Basket.cs b/exercise.main/Basket.cs index 4f488be7..b965a5f7 100644 --- a/exercise.main/Basket.cs +++ b/exercise.main/Basket.cs @@ -1,6 +1,7 @@ -using exercise.main; -using System; +using System; using System.Collections.Generic; +using System.Linq; +using System.Text; namespace exercise.main { @@ -8,7 +9,7 @@ public class Basket { private int capacity; private List items; - private int quantity; + private double totalPrice; public Basket(int capacity) { @@ -25,7 +26,7 @@ public bool ChangeCapacity(int newCapacity) { if (newCapacity >= items.Count) { - this.capacity = newCapacity; + capacity = newCapacity; return true; } return false; @@ -69,23 +70,90 @@ public bool RemoveItems(Inventory inventory, string skuToRemove, int quantityToR public string ShowBasket() { - return string.Join(", ", items); + StringBuilder result = new StringBuilder(); + result.Append(string.Format("{0,3} {1,-1}", "", "~~~ Bob's Bagels ~~~\n")); + result.Append(string.Format("{0,3} {1,-1}", "", DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss"))); + result.Append("\n--------------------------------\n"); + GetProductPrice(result); + result.Append("--------------------------------\n"); + result.Append(string.Format("{0,-26}", "Total Price ") + GetTotalCost()); + result.Append("\n--------------------------------\n"); + result.Append(string.Format("{0,5} {1,-1}", "", "Have a good day!")); + return result.ToString(); } - public int ItemsCount() + public string GetTotalCost() { - return items.Count; + return string.Format("£{0:F2}", totalPrice); } - - public double GetTotalCost() + private StringBuilder GetProductPrice(StringBuilder result) { - double totalCost = 0; - foreach (Item item in items) + double discountedPrice; + double discounted; + totalPrice = 0; + var uniqueItems = items.Distinct(); + + foreach (var uniqueItem in uniqueItems) { - totalCost += item.Price; + string itemName = $"{uniqueItem.Name} {uniqueItem.Variant}"; + int quantity = items.Count(item => item.Equals(uniqueItem)); + + if (uniqueItem.Name.Equals("Bagel")) + { + discountedPrice = CalculateBagelOffer(uniqueItem, quantity); + discounted = uniqueItem.Price * quantity - discountedPrice; + totalPrice += discountedPrice; + + if (discounted > 0) + { + result.Append(string.Format("{0,-20} {1,-4} £{2:F2}\n", itemName, quantity, discountedPrice)); + string discountedString = string.Format("(£{0:F2})\n", discounted); + result.Append(string.Format("{0,-26}", " ") + discountedString); + } + else + { + result.Append(string.Format("{0,-20} {1,-4} £{2:F2}\n", itemName, quantity, discountedPrice)); + } + } + else if (uniqueItem.Sku.Equals("COFD")) + { + discountedPrice = 1.25 * quantity; + discounted = 0.23 * quantity; + result.Append(string.Format("{0,-20} {1,-4} £{2:F2}\n", itemName, quantity, discountedPrice)); + string discountedString = string.Format("(£{0:F2})\n", discounted); + result.Append(string.Format("{0,-26}", " ") + discountedString); + } + else + { + discountedPrice = CalculateItemPrice(uniqueItem, quantity); + totalPrice += discountedPrice; + result.Append(string.Format("{0,-20} {1,-4} £{2:F2}\n", itemName, quantity, discountedPrice)); + } } - return totalCost; + return result; + } + + private double CalculateBagelOffer(Item item, int quantity) + { + double discountedPrice = 0.0; + int remainingBagels; + + int deal12Quantity = quantity / 12; + discountedPrice += deal12Quantity * 3.99; + remainingBagels = quantity % 12; + + int deal6Quantity = remainingBagels / 6; + discountedPrice += deal6Quantity * 2.49; + remainingBagels %= 6; + + discountedPrice += remainingBagels * item.Price; + return discountedPrice; + } + + private double CalculateItemPrice(Item item, int quantity) + { + return item.Price * quantity; } } } diff --git a/exercise.main/Program.cs b/exercise.main/Program.cs index 64225ff9..eb2b164e 100644 --- a/exercise.main/Program.cs +++ b/exercise.main/Program.cs @@ -8,17 +8,12 @@ static void Main(string[] args) var inventory = new Inventory(); - Basket basket = new Basket(5); + Basket basket = new Basket(30); - basket.AddItems(inventory, "BGLO", 3); - basket.AddItems(inventory, "COFB", 2); + basket.AddItems(inventory, "BGLO", 6); + basket.AddItems(inventory, "BGLP", 12); + basket.AddItems(inventory, "BGLE", 6); + basket.AddItems(inventory, "COFB", 1); Console.WriteLine($"Basket: {basket.ShowBasket()}"); - Console.WriteLine($"Total Cost: {basket.GetTotalCost()}"); - Console.WriteLine(basket.AddItems(inventory, "COFB", 2)); - - basket.ChangeCapacity(10); - Console.WriteLine(basket.AddItems(inventory, "COFB", 2)); - Console.WriteLine(basket.AddItems(inventory, "COFB", 10)); - //Console.WriteLine($"Total Cost: {basket.GetTotalCost()}"); } } diff --git a/exercise.tests/BasketTest.cs b/exercise.tests/BasketTest.cs index ec2e210c..d9801546 100644 --- a/exercise.tests/BasketTest.cs +++ b/exercise.tests/BasketTest.cs @@ -12,10 +12,12 @@ public void TestAddItemsToBasket() var basket = new Basket(5); bool result = basket.AddItems(inventory, "BGLO", 2); + Assert.IsTrue(result); + + Assert.IsTrue(basket.AddItems(inventory, "BGLE", 3)); + Assert.IsFalse(basket.AddItems(inventory, "BGLE", 3)); - Assert.IsTrue(result); - Assert.AreEqual(2, basket.ItemsCount()); } [Test] @@ -27,8 +29,6 @@ public void TestAddItemsExceedingCapacity() bool result = basket.AddItems(inventory, "BGLO", 3); - - Assert.IsFalse(result); } @@ -42,10 +42,10 @@ public void TestRemoveItemsFromBasket() bool result = basket.RemoveItems(inventory, "BGLO", 1); - Assert.IsTrue(result); - Assert.AreEqual(1, basket.ItemsCount()); + + Assert.IsFalse(basket.RemoveItems(inventory, "BGLE", 1)); } [Test] @@ -89,21 +89,5 @@ public void TestChangeCapacityToLowerThanCurrentItems() Assert.IsFalse(result); } - - [Test] - public void TestGetTotalCost() - { - - var inventory = new Inventory(); - var basket = new Basket(5); - basket.AddItems(inventory, "BGLO", 2); - basket.AddItems(inventory, "COFB", 1); - - - double totalCost = basket.GetTotalCost(); - - - Assert.AreEqual(1.97, totalCost); - } } }