From f08fc0cb050f3180d1feefb3bc3afe35f03d961a Mon Sep 17 00:00:00 2001 From: Reduan Azouaghe Date: Mon, 11 Aug 2025 09:58:44 +0200 Subject: [PATCH 1/6] Added .DS_Store --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9491a2fd..987c2c10 100644 --- a/.gitignore +++ b/.gitignore @@ -360,4 +360,4 @@ MigrationBackup/ .ionide/ # Fody - auto-generated XML schema -FodyWeavers.xsd \ No newline at end of file +FodyWeavers.xsd.DS_Store From 69557a2a79d93892edd81d678ff04eddb00dfa42 Mon Sep 17 00:00:00 2001 From: Reduan Azouaghe Date: Mon, 11 Aug 2025 09:59:52 +0200 Subject: [PATCH 2/6] Added .DS_Store --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 987c2c10..aac900ea 100644 --- a/.gitignore +++ b/.gitignore @@ -360,4 +360,6 @@ MigrationBackup/ .ionide/ # Fody - auto-generated XML schema -FodyWeavers.xsd.DS_Store +FodyWeavers.xsd + +.DS_Store From 452099b6d42be97eaebfd527d6e02ac58ef92d4a Mon Sep 17 00:00:00 2001 From: Reduan Azouaghe Date: Mon, 11 Aug 2025 10:31:16 +0200 Subject: [PATCH 3/6] Skeleton, empty classes, no tests. Created domain model. --- domain-model.md | 22 ++++++++++++++++++++++ exercise.main/Basket.cs | 8 ++++++++ exercise.main/Interfaces/IProduct.cs | 8 ++++++++ exercise.main/Inventory.cs | 8 ++++++++ exercise.main/Products/Bagel.cs | 9 +++++++++ exercise.main/Products/Coffee.cs | 9 +++++++++ exercise.main/Products/Filling.cs | 9 +++++++++ 7 files changed, 73 insertions(+) create mode 100644 domain-model.md create mode 100644 exercise.main/Basket.cs create mode 100644 exercise.main/Interfaces/IProduct.cs create mode 100644 exercise.main/Inventory.cs create mode 100644 exercise.main/Products/Bagel.cs create mode 100644 exercise.main/Products/Coffee.cs create mode 100644 exercise.main/Products/Filling.cs diff --git a/domain-model.md b/domain-model.md new file mode 100644 index 00000000..75cae480 --- /dev/null +++ b/domain-model.md @@ -0,0 +1,22 @@ +| Classes | Methods | Scenarios | Outputs/Action | +| ----------- | ----------------------------------------- | ----------------------------------------------------------------------- | ------------------- | +| `Basket` | `addItem(Item item)` | Add a bagel to basket when space is available | Item added | +| | | Add a bagel when basket is full | Error: basket full | +| | `removeItem(Item item)` | Remove existing bagel from basket | Item removed | +| | | Remove bagel not in basket | Error: not found | +| | `isFull()` | Basket is at capacity | true | +| | | Basket has free space | false | +| | `changeCapacity(int newCapacity)` | Manager changes basket capacity | Updated capacity | +| | `getTotalCost()` | Basket has items | Total price | +| | `getItemCost(String sku)` | Item exists in inventory | Item price | +| | `addFilling(Item bagel, Filling filling)` | Filling exists in inventory | Filling added | +| | | Filling not in inventory | Error: invalid | +| | `getFillingCost(Filling filling)` | Filling exists in inventory | Filling price | +| | `validateItemExists(Item item)` | Item exists in inventory | true | +| | | Item not in inventory | false | +| `Inventory` | `hasItem(String sku)` | SKU exists | true | +| | | SKU does not exist | false | +| | `getItemPrice(String sku)` | SKU exists | price (num) | +| | | SKU not found | Error | +| | `getFillingPrice(String sku)` | SKU exists and is filling | price (num) | +| `IProducts` | — | Represents bagels, coffees, and fillings with SKU, name, variant, price | — | diff --git a/exercise.main/Basket.cs b/exercise.main/Basket.cs new file mode 100644 index 00000000..45b825c9 --- /dev/null +++ b/exercise.main/Basket.cs @@ -0,0 +1,8 @@ +using System; + +namespace exercise.main; + +public class Basket +{ + +} diff --git a/exercise.main/Interfaces/IProduct.cs b/exercise.main/Interfaces/IProduct.cs new file mode 100644 index 00000000..26373246 --- /dev/null +++ b/exercise.main/Interfaces/IProduct.cs @@ -0,0 +1,8 @@ +using System; + +namespace exercise.main.Interfaces; + +public interface IProduct +{ + +} diff --git a/exercise.main/Inventory.cs b/exercise.main/Inventory.cs new file mode 100644 index 00000000..823ba9c6 --- /dev/null +++ b/exercise.main/Inventory.cs @@ -0,0 +1,8 @@ +using System; + +namespace exercise.main; + +public class Inventory +{ + +} diff --git a/exercise.main/Products/Bagel.cs b/exercise.main/Products/Bagel.cs new file mode 100644 index 00000000..e0edc8b8 --- /dev/null +++ b/exercise.main/Products/Bagel.cs @@ -0,0 +1,9 @@ +using System; +using exercise.main.Interfaces; + +namespace exercise.main.Products; + +public class Bagel : IProduct +{ + +} diff --git a/exercise.main/Products/Coffee.cs b/exercise.main/Products/Coffee.cs new file mode 100644 index 00000000..bad9bd99 --- /dev/null +++ b/exercise.main/Products/Coffee.cs @@ -0,0 +1,9 @@ +using System; +using exercise.main.Interfaces; + +namespace exercise.main.Products; + +public class Coffee : IProduct +{ + +} diff --git a/exercise.main/Products/Filling.cs b/exercise.main/Products/Filling.cs new file mode 100644 index 00000000..b4a1b6a2 --- /dev/null +++ b/exercise.main/Products/Filling.cs @@ -0,0 +1,9 @@ +using System; +using exercise.main.Interfaces; + +namespace exercise.main.Products; + +public class Filling : IProduct +{ + +} From 953f32d732b5572d51c5e6e43c22cd11c99df111 Mon Sep 17 00:00:00 2001 From: Reduan Azouaghe Date: Mon, 11 Aug 2025 11:54:23 +0200 Subject: [PATCH 4/6] Finished UML and setup first test. --- bobs_bagels.drawio.png | Bin 0 -> 159024 bytes domain-model.md | 44 +++++++++++++-------------- exercise.tests/CoreTests.cs | 23 ++++++++++++++ exercise.tests/ExtensionTests.cs | 18 +++++++++++ exercise.tests/UnitTest1.cs | 15 --------- exercise.tests/exercise.tests.csproj | 1 + 6 files changed, 64 insertions(+), 37 deletions(-) create mode 100644 bobs_bagels.drawio.png create mode 100644 exercise.tests/CoreTests.cs create mode 100644 exercise.tests/ExtensionTests.cs delete mode 100644 exercise.tests/UnitTest1.cs diff --git a/bobs_bagels.drawio.png b/bobs_bagels.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..da9233e986c23cd7c1ef8bb7e2a1effcd214bd34 GIT binary patch literal 159024 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 literal 0 HcmV?d00001 diff --git a/domain-model.md b/domain-model.md index 75cae480..92b5af1a 100644 --- a/domain-model.md +++ b/domain-model.md @@ -1,22 +1,22 @@ -| Classes | Methods | Scenarios | Outputs/Action | -| ----------- | ----------------------------------------- | ----------------------------------------------------------------------- | ------------------- | -| `Basket` | `addItem(Item item)` | Add a bagel to basket when space is available | Item added | -| | | Add a bagel when basket is full | Error: basket full | -| | `removeItem(Item item)` | Remove existing bagel from basket | Item removed | -| | | Remove bagel not in basket | Error: not found | -| | `isFull()` | Basket is at capacity | true | -| | | Basket has free space | false | -| | `changeCapacity(int newCapacity)` | Manager changes basket capacity | Updated capacity | -| | `getTotalCost()` | Basket has items | Total price | -| | `getItemCost(String sku)` | Item exists in inventory | Item price | -| | `addFilling(Item bagel, Filling filling)` | Filling exists in inventory | Filling added | -| | | Filling not in inventory | Error: invalid | -| | `getFillingCost(Filling filling)` | Filling exists in inventory | Filling price | -| | `validateItemExists(Item item)` | Item exists in inventory | true | -| | | Item not in inventory | false | -| `Inventory` | `hasItem(String sku)` | SKU exists | true | -| | | SKU does not exist | false | -| | `getItemPrice(String sku)` | SKU exists | price (num) | -| | | SKU not found | Error | -| | `getFillingPrice(String sku)` | SKU exists and is filling | price (num) | -| `IProducts` | — | Represents bagels, coffees, and fillings with SKU, name, variant, price | — | +| Class | Method | Scenario | Output / Action | +| --------------- | --------------------------------------------- | -------------------------------------------------------------------- | ------------------ | +| `Basket` | `addProduct(IProduct product)` | Add product when basket has space | Product added | +| | | Add product when basket is full | Error: basket full | +| | `removeProduct(IProduct product)` | Remove product that exists in basket | Product removed | +| | | Remove product not in basket | Error: not found | +| | `isFull()` | Basket is at capacity | `true` | +| | | Basket has free space | `false` | +| | `changeCapacity(int newCapacity)` | Manager changes basket capacity | Capacity updated | +| | `getTotalCost()` | Basket has products | Total price | +| | `getProductCost(String sku)` | Product exists in inventory | Product price | +| | `addFilling(IProduct bagel, Filling filling)` | Filling exists in inventory | Filling added | +| | | Filling not in inventory | Error: invalid | +| | `getFillingCost(Filling filling)` | Filling exists in inventory | Filling price | +| | `validateProductExists(IProduct product)` | Product exists in inventory | `true` | +| | | Product not in inventory | `false` | +| `Inventory` | `hasProduct(String sku)` | SKU exists | `true` | +| | | SKU does not exist | `false` | +| | `getProductPrice(String sku)` | SKU exists | Price (num) | +| | | SKU not found | Error | +| | `getFillingPrice(String sku)` | SKU exists and is filling | Price (num) | +| `IProducts` | — | Represents bagels, coffees, and fillings (SKU, name, variant, price) | — | diff --git a/exercise.tests/CoreTests.cs b/exercise.tests/CoreTests.cs new file mode 100644 index 00000000..c79ce0d0 --- /dev/null +++ b/exercise.tests/CoreTests.cs @@ -0,0 +1,23 @@ +using exercise.main; +using exercise.main.Products; +namespace exercise.tests +{ + [TestFixture] + public class CoreTests + { + private Basket _basket; + + [SetUp] + public void Setup() + { + _basket = new(); + } + + [Test] + public void Test1() + { + Assert.Pass(_basket.addProduct(new Bagel())); + } + } +} + diff --git a/exercise.tests/ExtensionTests.cs b/exercise.tests/ExtensionTests.cs new file mode 100644 index 00000000..17bb86b6 --- /dev/null +++ b/exercise.tests/ExtensionTests.cs @@ -0,0 +1,18 @@ +namespace exercise.tests +{ + [TestFixture] + public class ExtensionTests + { + [SetUp] + public void Setup() + { + } + + [Test] + public void Test1() + { + Assert.Pass(); + } + } +} + diff --git a/exercise.tests/UnitTest1.cs b/exercise.tests/UnitTest1.cs deleted file mode 100644 index 7bdb8968..00000000 --- a/exercise.tests/UnitTest1.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace exercise.tests; - -public class Tests -{ - [SetUp] - public void Setup() - { - } - - [Test] - public void Test1() - { - Assert.Pass(); - } -} \ No newline at end of file diff --git a/exercise.tests/exercise.tests.csproj b/exercise.tests/exercise.tests.csproj index 9fed8e17..4be8063d 100644 --- a/exercise.tests/exercise.tests.csproj +++ b/exercise.tests/exercise.tests.csproj @@ -15,6 +15,7 @@ + From ffa631acbd92c47266b1c6c864766c5175424231 Mon Sep 17 00:00:00 2001 From: Reduan Azouaghe Date: Tue, 12 Aug 2025 10:56:58 +0200 Subject: [PATCH 5/6] Finished core requirements --- exercise.main/Basket.cs | 78 ++++++++++++++++- exercise.main/Interfaces/IDiscount.cs | 8 ++ exercise.main/Interfaces/IProduct.cs | 8 +- exercise.main/Inventory.cs | 28 ++++++ exercise.main/Objects/Bagel.cs | 43 +++++++++ exercise.main/Objects/Coffee.cs | 29 +++++++ exercise.main/Objects/Filling.cs | 29 +++++++ exercise.main/Products/Bagel.cs | 9 -- exercise.main/Products/Coffee.cs | 9 -- exercise.main/Products/Filling.cs | 9 -- exercise.main/Program.cs | 25 +++++- exercise.tests/CoreTests.cs | 120 +++++++++++++++++++++++++- 12 files changed, 358 insertions(+), 37 deletions(-) create mode 100644 exercise.main/Interfaces/IDiscount.cs create mode 100644 exercise.main/Objects/Bagel.cs create mode 100644 exercise.main/Objects/Coffee.cs create mode 100644 exercise.main/Objects/Filling.cs delete mode 100644 exercise.main/Products/Bagel.cs delete mode 100644 exercise.main/Products/Coffee.cs delete mode 100644 exercise.main/Products/Filling.cs diff --git a/exercise.main/Basket.cs b/exercise.main/Basket.cs index 45b825c9..ca3c1ef9 100644 --- a/exercise.main/Basket.cs +++ b/exercise.main/Basket.cs @@ -1,8 +1,84 @@ using System; +using System.Dynamic; +using exercise.main.Interfaces; +using exercise.main.Products; namespace exercise.main; -public class Basket +public class Basket(int MaxSize, Inventory ProductSelection) { + private List _basket = []; + private Inventory _inventory = ProductSelection; + private int _basketMaxSize = MaxSize; + public bool AddProduct(IProduct Product) + { + if (!_inventory.HasProduct(Product)) + return false; + if (_basket.Count >= _basketMaxSize) + throw new OverflowException($"Basket is full!"); + else + _basket.Add(Product); + + return true; + } + + public int Count() + { + return _basket.Count; + } + + public bool AddFillingToBagel(Bagel Bagel, Filling Filling) + { + IProduct? b = _basket.Find(p => p.Id == Bagel.Id); + + if (b is Bagel bagelItem && b != null) + { + bagelItem.AddFilling(Filling); + return true; + } + + return false; + } + + public decimal GetTotalCost() + { + return _basket.Sum(p => p.GetPrice()); + } + + public decimal GetCostOfSku(string sku) + { + return _basket.Where(p => p.Sku == sku).Sum(p => p.GetPrice()); + } + + public void ChangeCapacity(int NewCapacity) + { + _basketMaxSize = NewCapacity; + } + + public bool RemoveProduct(IProduct Product) + { + if (_basket.IndexOf(Product) == -1) throw new KeyNotFoundException("Product does not exist in basket!"); + else _basket.Remove(Product); + + return true; + } + + public bool RemoveAllProduct(string Sku) + { + if (_basket.Find(p => p.Sku == Sku) == null) throw new KeyNotFoundException("Product does not exist in basket!"); + else _basket.RemoveAll(p => p.Sku == Sku); + + return true; + } + + public bool IsFull() + { + return _basket.Count >= _basketMaxSize; + } + + public bool ValidateProductExists(IProduct product) + { + return _basket.Contains(product); + } } diff --git a/exercise.main/Interfaces/IDiscount.cs b/exercise.main/Interfaces/IDiscount.cs new file mode 100644 index 00000000..68754417 --- /dev/null +++ b/exercise.main/Interfaces/IDiscount.cs @@ -0,0 +1,8 @@ +using System; + +namespace exercise.main.Interfaces; + +public interface IDiscount +{ + +} diff --git a/exercise.main/Interfaces/IProduct.cs b/exercise.main/Interfaces/IProduct.cs index 26373246..a9097098 100644 --- a/exercise.main/Interfaces/IProduct.cs +++ b/exercise.main/Interfaces/IProduct.cs @@ -1,8 +1,10 @@ -using System; - namespace exercise.main.Interfaces; public interface IProduct { - + string Sku { get; set; } + string Name { get; set; } + string Variant { get; set; } + int Id { get; } + decimal GetPrice(); } diff --git a/exercise.main/Inventory.cs b/exercise.main/Inventory.cs index 823ba9c6..ac238502 100644 --- a/exercise.main/Inventory.cs +++ b/exercise.main/Inventory.cs @@ -1,8 +1,36 @@ using System; +using exercise.main.Interfaces; namespace exercise.main; public class Inventory { + private List _products = []; + public void AddToInventory(IProduct product) + { + _products.Add(product); + } + + public decimal GetProductPrice(string sku) + { + IProduct p = (IProduct)_products.Where(p => p.Sku.Equals(sku)); + + if (p == null) throw new KeyNotFoundException($"SKU '{sku}', does not exist in inventory!"); + + return p.GetPrice(); + } + + public bool HasSku(string sku) + { + IProduct? p = _products.FirstOrDefault(p => p.Sku.Equals(sku)); + return p != null; + } + + public bool HasProduct(IProduct product) + { + IProduct? p = _products.FirstOrDefault(p => p.Sku.Equals(product.Sku)); + if (p == null || !p.Name.Equals(product.Name) || !p.Variant.Equals(product.Variant)) return false; + return true; + } } diff --git a/exercise.main/Objects/Bagel.cs b/exercise.main/Objects/Bagel.cs new file mode 100644 index 00000000..9d7d8194 --- /dev/null +++ b/exercise.main/Objects/Bagel.cs @@ -0,0 +1,43 @@ +using System; +using exercise.main.Interfaces; + +namespace exercise.main.Products; + +public class Bagel : IProduct +{ + private List _fillings = []; + private decimal _basePrice; + + private static int GLOBALID = 0; + public int Id { get; } + + public Bagel(string ProductSku, string ProductName, string ProductVariant, decimal ProductBasePrice) + { + this.Sku = ProductSku; + this.Name = ProductName; + this.Variant = ProductVariant; + this._basePrice = ProductBasePrice; + this.Id = GLOBALID; + GLOBALID++; + } + + public string Sku { get; set; } + public string Name { get; set; } + public string Variant { get; set; } + public decimal GetPrice() + { + if (_fillings.Count == 0) return _basePrice; + + return _basePrice + _fillings.Sum(f => f.GetPrice()); + } + + public List GetFillings() + { + return _fillings; + } + + public void AddFilling(IProduct BagelFilling) + { + _fillings.Add((Filling)BagelFilling); + } +} diff --git a/exercise.main/Objects/Coffee.cs b/exercise.main/Objects/Coffee.cs new file mode 100644 index 00000000..34bc20cc --- /dev/null +++ b/exercise.main/Objects/Coffee.cs @@ -0,0 +1,29 @@ +using System; +using exercise.main.Interfaces; + +namespace exercise.main.Products; + +public class Coffee : IProduct +{ + private static int GLOBALID = 0; + private decimal _basePrice; + public string Sku { get; set; } + public string Name { get; set; } + public string Variant { get; set; } + public int Id { get; } + + public Coffee(string ProductSku, string ProductName, string ProductVariant, decimal ProductBasePrice) + { + this.Sku = ProductSku; + this.Name = ProductName; + this.Variant = ProductVariant; + this._basePrice = ProductBasePrice; + this.Id = GLOBALID; + GLOBALID++; + } + + public decimal GetPrice() + { + return _basePrice; + } +} diff --git a/exercise.main/Objects/Filling.cs b/exercise.main/Objects/Filling.cs new file mode 100644 index 00000000..04d67692 --- /dev/null +++ b/exercise.main/Objects/Filling.cs @@ -0,0 +1,29 @@ +using System; +using exercise.main.Interfaces; + +namespace exercise.main.Products; + +public class Filling : IProduct +{ + private static int GLOBALID = 0; + private decimal _basePrice; + public string Sku { get; set; } + public string Name { get; set; } + public string Variant { get; set; } + public int Id { get; } + + public Filling(string ProductSku, string ProductName, string ProductVariant, decimal ProductBasePrice) + { + this.Sku = ProductSku; + this.Name = ProductName; + this.Variant = ProductVariant; + this._basePrice = ProductBasePrice; + this.Id = GLOBALID; + GLOBALID++; + } + + public decimal GetPrice() + { + return _basePrice; + } +} diff --git a/exercise.main/Products/Bagel.cs b/exercise.main/Products/Bagel.cs deleted file mode 100644 index e0edc8b8..00000000 --- a/exercise.main/Products/Bagel.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; -using exercise.main.Interfaces; - -namespace exercise.main.Products; - -public class Bagel : IProduct -{ - -} diff --git a/exercise.main/Products/Coffee.cs b/exercise.main/Products/Coffee.cs deleted file mode 100644 index bad9bd99..00000000 --- a/exercise.main/Products/Coffee.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; -using exercise.main.Interfaces; - -namespace exercise.main.Products; - -public class Coffee : IProduct -{ - -} diff --git a/exercise.main/Products/Filling.cs b/exercise.main/Products/Filling.cs deleted file mode 100644 index b4a1b6a2..00000000 --- a/exercise.main/Products/Filling.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; -using exercise.main.Interfaces; - -namespace exercise.main.Products; - -public class Filling : IProduct -{ - -} diff --git a/exercise.main/Program.cs b/exercise.main/Program.cs index 3751555c..53c65ef1 100644 --- a/exercise.main/Program.cs +++ b/exercise.main/Program.cs @@ -1,2 +1,23 @@ -// See https://aka.ms/new-console-template for more information -Console.WriteLine("Hello, World!"); +using exercise.main; +using exercise.main.Products; + +Inventory TestInventory = new(); +TestInventory.AddToInventory(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); +TestInventory.AddToInventory(new Bagel("BGLP", "Bagel", "Plain", 0.39m)); +TestInventory.AddToInventory(new Bagel("BGLE", "Bagel", "Everything", 0.49m)); +TestInventory.AddToInventory(new Bagel("BGLS", "Bagel", "Sesame", 0.49m)); +TestInventory.AddToInventory(new Coffee("COFB", "Coffee", "Black", 0.99m)); +TestInventory.AddToInventory(new Coffee("COFW", "Coffee", "White", 1.19m)); +TestInventory.AddToInventory(new Coffee("COFC", "Coffee", "Capuccino", 1.29m)); +TestInventory.AddToInventory(new Coffee("COFL", "Coffee", "Latte", 1.29m)); +TestInventory.AddToInventory(new Filling("FILB", "Filling", "Bacon", 0.12m)); +TestInventory.AddToInventory(new Filling("FILE", "Filling", "Egg", 0.12m)); +TestInventory.AddToInventory(new Filling("FILC", "Filling", "Cheese", 0.12m)); +TestInventory.AddToInventory(new Filling("FILX", "Filling", "Cream Cheese", 0.12m)); +TestInventory.AddToInventory(new Filling("FILS", "Filling", "Smoked Salmon", 0.12m)); +TestInventory.AddToInventory(new Filling("FILH", "Filling", "Ham", 0.12m)); + +Basket TestBasket = new(99, TestInventory); + +TestBasket.ChangeCapacity(0); +TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); \ No newline at end of file diff --git a/exercise.tests/CoreTests.cs b/exercise.tests/CoreTests.cs index c79ce0d0..786414f3 100644 --- a/exercise.tests/CoreTests.cs +++ b/exercise.tests/CoreTests.cs @@ -1,22 +1,134 @@ using exercise.main; using exercise.main.Products; + namespace exercise.tests { [TestFixture] public class CoreTests { - private Basket _basket; + private Basket TestBasket; + private Inventory TestInventory; [SetUp] public void Setup() { - _basket = new(); + + + TestInventory = new(); + TestInventory.AddToInventory(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestInventory.AddToInventory(new Bagel("BGLP", "Bagel", "Plain", 0.39m)); + TestInventory.AddToInventory(new Bagel("BGLE", "Bagel", "Everything", 0.49m)); + TestInventory.AddToInventory(new Bagel("BGLS", "Bagel", "Sesame", 0.49m)); + TestInventory.AddToInventory(new Coffee("COFB", "Coffee", "Black", 0.99m)); + TestInventory.AddToInventory(new Coffee("COFW", "Coffee", "White", 1.19m)); + TestInventory.AddToInventory(new Coffee("COFC", "Coffee", "Capuccino", 1.29m)); + TestInventory.AddToInventory(new Coffee("COFL", "Coffee", "Latte", 1.29m)); + TestInventory.AddToInventory(new Filling("FILB", "Filling", "Bacon", 0.12m)); + TestInventory.AddToInventory(new Filling("FILE", "Filling", "Egg", 0.12m)); + TestInventory.AddToInventory(new Filling("FILC", "Filling", "Cheese", 0.12m)); + TestInventory.AddToInventory(new Filling("FILX", "Filling", "Cream Cheese", 0.12m)); + TestInventory.AddToInventory(new Filling("FILS", "Filling", "Smoked Salmon", 0.12m)); + TestInventory.AddToInventory(new Filling("FILH", "Filling", "Ham", 0.12m)); + TestBasket = new(99, TestInventory); + } + + [Test] + public void AddProductEdgeCases_ProductInBasket() + { + TestBasket.ChangeCapacity(1); + Assert.That(TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)), Is.True); + } + + [Test] + public void AddProductEdgeCases_Overflow() + { + TestBasket.ChangeCapacity(0); + Assert.Catch(() => TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m))); + } + + [Test] + public void RemoveFromBasket_ProductIsRemoved() + { + TestBasket.ChangeCapacity(1); + Coffee c = new("COFB", "Coffee", "Black", 0.99m); + + Assert.That(TestBasket.AddProduct(c), Is.True); + Assert.That(TestBasket.Count(), Is.EqualTo(1)); + + Assert.That(TestBasket.RemoveProduct(c), Is.True); + Assert.That(TestBasket.Count(), Is.EqualTo(0)); + } + + [Test] + public void RemoveFromBasket_ThrowsError() + { + Assert.Catch(() => TestBasket.RemoveProduct(new Coffee("COFB", "Coffee", "Black", 0.99m))); + } + + [Test] + public void ExpandBasket_BasketIsLarger() + { + TestBasket.ChangeCapacity(1); + Assert.That(TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)), Is.True); + Assert.Catch(() => TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m))); + + TestBasket.ChangeCapacity(2); + Assert.That(TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)), Is.True); + + Assert.That(TestBasket.Count(), Is.EqualTo(2)); + } + + [Test] + public void GetTotalCostOfBasket_CalculatesValue() + { + TestBasket.ChangeCapacity(2); + + Coffee c = new("COFW", "Coffee", "White", 1.19m); + Bagel b = new("BGLO", "Bagel", "Onion", 0.49m); + b.AddFilling(new Filling("FILX", "Filling", "Cream Cheese", 0.12m)); + b.AddFilling(new Filling("FILS", "Filling", "Smoked Salmon", 0.12m)); + + TestBasket.AddProduct(c); + TestBasket.AddProduct(b); + + Assert.That(TestBasket.GetTotalCost(), Is.EqualTo(1.92m)); + } + + [Test] + public void GetPriceOfBagel_PriceOfBAgel() + { + Bagel b = new("BGLO", "Bagel", "Onion", 0.49m); + b.AddFilling(new Filling("FILX", "Filling", "Cream Cheese", 0.12m)); + b.AddFilling(new Filling("FILS", "Filling", "Smoked Salmon", 0.12m)); + b.AddFilling(new Filling("FILB", "Filling", "Bacon", 0.12m)); + + Assert.That(b.GetPrice(), Is.EqualTo(0.85m)); + } + + [Test] + public void AddFillingToBagel_BagleHasFilling() + { + Filling f = new Filling("FILX", "Filling", "Cream Cheese", 0.12m); + Bagel b = new("BGLO", "Bagel", "Onion", 0.49m); + + b.AddFilling(f); + + Assert.That(b.GetFillings()[0], Is.EqualTo(f)); + } + + [Test] + public void FillingGetPrice_PriceOfFilling() + { + Filling f = new Filling("FILX", "Filling", "Cream Cheese", 0.12m); + + Assert.That(f.GetPrice, Is.EqualTo(0.12m)); } [Test] - public void Test1() + public void CanOnlyAddProductsFromInventory_FakeProductsNotAdded() { - Assert.Pass(_basket.addProduct(new Bagel())); + TestBasket.ChangeCapacity(1); + Assert.That(TestBasket.AddProduct(new Filling("MSFT", "Microsoft", "Windows", 0.01m)), Is.EqualTo(false)); } } } From a9a0ca001bd09ddbcebf5db7980add83d223cd9f Mon Sep 17 00:00:00 2001 From: Reduan Azouaghe Date: Wed, 13 Aug 2025 10:21:43 +0200 Subject: [PATCH 6/6] Extension --- exercise.main/Basket.cs | 100 +++++++++--------- exercise.main/Interfaces/IDiscount.cs | 4 + exercise.main/Interfaces/IProduct.cs | 4 +- .../Objects/Discounts/CoffeeBagelDiscount.cs | 46 ++++++++ .../Objects/Discounts/SixBagelsDiscount.cs | 39 +++++++ .../Objects/Discounts/TwelveBagelsDiscount.cs | 39 +++++++ exercise.main/Objects/{ => Products}/Bagel.cs | 28 +++-- .../Objects/{ => Products}/Coffee.cs | 21 +++- .../Objects/{ => Products}/Filling.cs | 23 +++- exercise.main/Program.cs | 12 ++- exercise.tests/CoreTests.cs | 5 +- exercise.tests/ExtensionTests.cs | 92 +++++++++++++++- extension1.md | 4 +- 13 files changed, 342 insertions(+), 75 deletions(-) create mode 100644 exercise.main/Objects/Discounts/CoffeeBagelDiscount.cs create mode 100644 exercise.main/Objects/Discounts/SixBagelsDiscount.cs create mode 100644 exercise.main/Objects/Discounts/TwelveBagelsDiscount.cs rename exercise.main/Objects/{ => Products}/Bagel.cs (64%) rename exercise.main/Objects/{ => Products}/Coffee.cs (61%) rename exercise.main/Objects/{ => Products}/Filling.cs (61%) diff --git a/exercise.main/Basket.cs b/exercise.main/Basket.cs index ca3c1ef9..1577db81 100644 --- a/exercise.main/Basket.cs +++ b/exercise.main/Basket.cs @@ -1,84 +1,84 @@ -using System; -using System.Dynamic; +using System.Text; using exercise.main.Interfaces; using exercise.main.Products; namespace exercise.main; -public class Basket(int MaxSize, Inventory ProductSelection) +public class Basket(int maxSize, Inventory productSelection) { - private List _basket = []; - private Inventory _inventory = ProductSelection; - private int _basketMaxSize = MaxSize; + private readonly Inventory _inventory = productSelection; + private readonly List _basket = []; + private int _basketMaxSize = maxSize; - public bool AddProduct(IProduct Product) + public bool AddProduct(IProduct product) { - if (!_inventory.HasProduct(Product)) - return false; - if (_basket.Count >= _basketMaxSize) - throw new OverflowException($"Basket is full!"); - else - _basket.Add(Product); - + if (!_inventory.HasProduct(product)) return false; + if (_basket.Count >= _basketMaxSize) throw new OverflowException("Basket is full!"); + _basket.Add(product); return true; } - public int Count() - { - return _basket.Count; - } + public bool ApplyDiscount(IDiscount discount) => discount.ApplyDiscount(this); - public bool AddFillingToBagel(Bagel Bagel, Filling Filling) - { - IProduct? b = _basket.Find(p => p.Id == Bagel.Id); + public int Count() => _basket.Count; - if (b is Bagel bagelItem && b != null) + public bool AddFillingToBagel(Bagel bagel, Filling filling) + { + var b = _basket.Find(p => p.Id == bagel.Id); + if (b is Bagel bagelItem) { - bagelItem.AddFilling(Filling); + bagelItem.AddFilling(filling); return true; } - return false; } - public decimal GetTotalCost() - { - return _basket.Sum(p => p.GetPrice()); - } + public decimal GetTotalCost() => _basket.Sum(p => p.GetPrice()); - public decimal GetCostOfSku(string sku) - { - return _basket.Where(p => p.Sku == sku).Sum(p => p.GetPrice()); - } + public decimal GetCostOfSku(string sku) => + _basket.Where(p => p.Sku == sku).Sum(p => p.GetPrice()); - public void ChangeCapacity(int NewCapacity) - { - _basketMaxSize = NewCapacity; - } + public void ChangeCapacity(int newCapacity) => _basketMaxSize = newCapacity; - public bool RemoveProduct(IProduct Product) + public bool RemoveProduct(IProduct product) { - if (_basket.IndexOf(Product) == -1) throw new KeyNotFoundException("Product does not exist in basket!"); - else _basket.Remove(Product); - + if (!_basket.Remove(product)) throw new KeyNotFoundException("Product does not exist in basket!"); return true; } - public bool RemoveAllProduct(string Sku) + public bool RemoveAllProduct(string sku) { - if (_basket.Find(p => p.Sku == Sku) == null) throw new KeyNotFoundException("Product does not exist in basket!"); - else _basket.RemoveAll(p => p.Sku == Sku); - + if (!_basket.Any(p => p.Sku == sku)) throw new KeyNotFoundException("Product does not exist in basket!"); + _basket.RemoveAll(p => p.Sku == sku); return true; } - public bool IsFull() - { - return _basket.Count >= _basketMaxSize; - } + public bool IsFull() => _basket.Count >= _basketMaxSize; + + public bool ValidateProductExists(IProduct product) => _basket.Contains(product); - public bool ValidateProductExists(IProduct product) + public List GetBasket() => _basket; + + public override string ToString() { - return _basket.Contains(product); + StringBuilder s = new(); + + s.Append("\n~~~ Bob's Bagels ~~~"); + s.Append($"\n{DateTime.Now}"); + s.Append("\n------"); + + _basket + .GroupBy(p => p.Sku) + .ToList() + .ForEach(g => + s.Append($"\n{g.First().Name} {g.Count()} {g.Sum(p => p.GetPrice()):C}") + ); + + s.Append("\n------"); + s.Append($"\nTotal: {this.GetTotalCost()}"); + s.Append("\nThank you"); + s.Append("\nfor your order!"); + + return s.ToString(); } } diff --git a/exercise.main/Interfaces/IDiscount.cs b/exercise.main/Interfaces/IDiscount.cs index 68754417..d6c9b29d 100644 --- a/exercise.main/Interfaces/IDiscount.cs +++ b/exercise.main/Interfaces/IDiscount.cs @@ -4,5 +4,9 @@ namespace exercise.main.Interfaces; public interface IDiscount { + Guid Id { get; } + string Name { get; set; } + string Description { get; set; } + bool ApplyDiscount(Basket basket); } diff --git a/exercise.main/Interfaces/IProduct.cs b/exercise.main/Interfaces/IProduct.cs index a9097098..290d088e 100644 --- a/exercise.main/Interfaces/IProduct.cs +++ b/exercise.main/Interfaces/IProduct.cs @@ -5,6 +5,8 @@ public interface IProduct string Sku { get; set; } string Name { get; set; } string Variant { get; set; } - int Id { get; } + Guid Id { get; } decimal GetPrice(); + bool ApplyDiscount(decimal discount); + bool IsDiscounted(); } diff --git a/exercise.main/Objects/Discounts/CoffeeBagelDiscount.cs b/exercise.main/Objects/Discounts/CoffeeBagelDiscount.cs new file mode 100644 index 00000000..1799e58d --- /dev/null +++ b/exercise.main/Objects/Discounts/CoffeeBagelDiscount.cs @@ -0,0 +1,46 @@ +using System; +using exercise.main.Interfaces; +using exercise.main.Products; + +namespace exercise.main.Objects.Discounts; + +public class CoffeeBagelsDiscount : IDiscount +{ + public Guid Id { get; } = Guid.NewGuid(); + public string Name { get; set; } = "The Coffe & Bagel Discount!"; + public string Description { get; set; } = "Buy a coffee and a bagle for just 1.25!"; + + public bool ApplyDiscount(Basket basket) + { + bool isSuccess = false; + + var availableItems = basket + .GetBasket() + .Where(p => !p.IsDiscounted()) + .ToList(); + + var bagel = availableItems.OfType().FirstOrDefault(); + var coffee = availableItems.OfType().FirstOrDefault(); + + if (bagel != null && coffee != null) + { + decimal totalComboPrice = Math.Max(bagel.GetPrice() + coffee.GetPrice() - 1.25m, 0); + decimal bagelDiscount = bagel.GetPrice(); + decimal coffeeDiscount = coffee.GetPrice(); + + if (totalComboPrice != 0) + { + bagelDiscount = bagel.GetPrice() - (totalComboPrice / 2); + coffeeDiscount = coffee.GetPrice() - (totalComboPrice / 2); + } + + bagel.ApplyDiscount(bagel.GetPrice()-bagelDiscount); + coffee.ApplyDiscount(coffee.GetPrice()-coffeeDiscount); + + isSuccess = true; + } + + return isSuccess; + } + +} diff --git a/exercise.main/Objects/Discounts/SixBagelsDiscount.cs b/exercise.main/Objects/Discounts/SixBagelsDiscount.cs new file mode 100644 index 00000000..78fa8cbc --- /dev/null +++ b/exercise.main/Objects/Discounts/SixBagelsDiscount.cs @@ -0,0 +1,39 @@ +using System; +using exercise.main.Interfaces; +using exercise.main.Products; + +namespace exercise.main.Objects.Discounts; + +public class SixBagelsDiscount : IDiscount +{ + public Guid Id { get; } = Guid.NewGuid(); + public string Name { get; set; } = "The Six Bagel Discount!"; + public string Description { get; set; } = "Get a discount when you buy 6 bagels. 6 of the same bagel for 2.49! What a deal!"; + + public bool ApplyDiscount(Basket basket) + { + bool isSuccess = false; + decimal _discount = 2.49m / 6; + + var groupedBySku = basket + .GetBasket() + .Where(p => !p.IsDiscounted()) + .GroupBy(p => p.Sku) + .Where(g => g.Count() >= 6) + .ToList(); + + foreach (var group in groupedBySku) + { + if (group.First() is Bagel) + { + isSuccess = true; + foreach (var b in group.Take(6)) + { + b.ApplyDiscount(b.GetPrice() - _discount); + } + } + } + + return isSuccess; + } +} diff --git a/exercise.main/Objects/Discounts/TwelveBagelsDiscount.cs b/exercise.main/Objects/Discounts/TwelveBagelsDiscount.cs new file mode 100644 index 00000000..c3fb8e9e --- /dev/null +++ b/exercise.main/Objects/Discounts/TwelveBagelsDiscount.cs @@ -0,0 +1,39 @@ +using System; +using exercise.main.Interfaces; +using exercise.main.Products; + +namespace exercise.main.Objects.Discounts; + +public class TwelveBagelsDiscount : IDiscount +{ + public Guid Id { get; } = Guid.NewGuid(); + public string Name { get; set; } = "The Twelve Bagel Discount!"; + public string Description { get; set; } = "Get a discount when you buy 12 bagels. 12 of the same bagel for 3.99! What a deal!"; + + public bool ApplyDiscount(Basket basket) + { + bool isSuccess = false; + decimal _discount = 3.99m / 12; + + var groupedBySku = basket + .GetBasket() + .Where(p => !p.IsDiscounted()) + .GroupBy(p => p.Sku) + .Where(g => g.Count() >= 12) + .ToList(); + + foreach (var group in groupedBySku) + { + if (group.First() is Bagel) + { + isSuccess = true; + foreach (var b in group.Take(12)) + { + b.ApplyDiscount(b.GetPrice() - _discount); + } + } + } + + return isSuccess; + } +} diff --git a/exercise.main/Objects/Bagel.cs b/exercise.main/Objects/Products/Bagel.cs similarity index 64% rename from exercise.main/Objects/Bagel.cs rename to exercise.main/Objects/Products/Bagel.cs index 9d7d8194..50ac0a07 100644 --- a/exercise.main/Objects/Bagel.cs +++ b/exercise.main/Objects/Products/Bagel.cs @@ -7,9 +7,8 @@ public class Bagel : IProduct { private List _fillings = []; private decimal _basePrice; - - private static int GLOBALID = 0; - public int Id { get; } + private bool _isDiscounted = false; + public Guid Id { get; } = Guid.NewGuid(); public Bagel(string ProductSku, string ProductName, string ProductVariant, decimal ProductBasePrice) { @@ -17,13 +16,12 @@ public Bagel(string ProductSku, string ProductName, string ProductVariant, decim this.Name = ProductName; this.Variant = ProductVariant; this._basePrice = ProductBasePrice; - this.Id = GLOBALID; - GLOBALID++; } public string Sku { get; set; } public string Name { get; set; } public string Variant { get; set; } + public decimal GetPrice() { if (_fillings.Count == 0) return _basePrice; @@ -31,13 +29,29 @@ public decimal GetPrice() return _basePrice + _fillings.Sum(f => f.GetPrice()); } + public bool ApplyDiscount(decimal discount) + { + if (_isDiscounted) return false; + + _basePrice = Math.Max(_basePrice - discount, 0); + + _isDiscounted = true; + + return true; + } + + public bool IsDiscounted() + { + return _isDiscounted; + } + public List GetFillings() { return _fillings; } - public void AddFilling(IProduct BagelFilling) + public void AddFilling(Filling BagelFilling) { - _fillings.Add((Filling)BagelFilling); + _fillings.Add(BagelFilling); } } diff --git a/exercise.main/Objects/Coffee.cs b/exercise.main/Objects/Products/Coffee.cs similarity index 61% rename from exercise.main/Objects/Coffee.cs rename to exercise.main/Objects/Products/Coffee.cs index 34bc20cc..3cdec026 100644 --- a/exercise.main/Objects/Coffee.cs +++ b/exercise.main/Objects/Products/Coffee.cs @@ -5,12 +5,12 @@ namespace exercise.main.Products; public class Coffee : IProduct { - private static int GLOBALID = 0; private decimal _basePrice; + private bool _isDiscounted = false; public string Sku { get; set; } public string Name { get; set; } public string Variant { get; set; } - public int Id { get; } + public Guid Id { get; } = Guid.NewGuid(); public Coffee(string ProductSku, string ProductName, string ProductVariant, decimal ProductBasePrice) { @@ -18,12 +18,25 @@ public Coffee(string ProductSku, string ProductName, string ProductVariant, deci this.Name = ProductName; this.Variant = ProductVariant; this._basePrice = ProductBasePrice; - this.Id = GLOBALID; - GLOBALID++; } public decimal GetPrice() { return _basePrice; } + public bool ApplyDiscount(decimal discount) + { + if (_isDiscounted) return false; + + _basePrice = Math.Max(_basePrice - discount, 0); + + _isDiscounted = true; + + return true; + } + + public bool IsDiscounted() + { + return _isDiscounted; + } } diff --git a/exercise.main/Objects/Filling.cs b/exercise.main/Objects/Products/Filling.cs similarity index 61% rename from exercise.main/Objects/Filling.cs rename to exercise.main/Objects/Products/Filling.cs index 04d67692..977f863c 100644 --- a/exercise.main/Objects/Filling.cs +++ b/exercise.main/Objects/Products/Filling.cs @@ -5,12 +5,12 @@ namespace exercise.main.Products; public class Filling : IProduct { - private static int GLOBALID = 0; private decimal _basePrice; + private bool _isDiscounted = false; public string Sku { get; set; } public string Name { get; set; } public string Variant { get; set; } - public int Id { get; } + public Guid Id { get; } = Guid.NewGuid(); public Filling(string ProductSku, string ProductName, string ProductVariant, decimal ProductBasePrice) { @@ -18,12 +18,27 @@ public Filling(string ProductSku, string ProductName, string ProductVariant, dec this.Name = ProductName; this.Variant = ProductVariant; this._basePrice = ProductBasePrice; - this.Id = GLOBALID; - GLOBALID++; } public decimal GetPrice() { return _basePrice; } + + public bool ApplyDiscount(decimal discount) + { + if (_isDiscounted) return false; + + _basePrice = Math.Max(_basePrice - discount, 0); + + _isDiscounted = true; + + return true; + } + + public bool IsDiscounted() + { + return _isDiscounted; + } + } diff --git a/exercise.main/Program.cs b/exercise.main/Program.cs index 53c65ef1..c311c8f8 100644 --- a/exercise.main/Program.cs +++ b/exercise.main/Program.cs @@ -1,4 +1,5 @@ using exercise.main; +using exercise.main.Objects.Discounts; using exercise.main.Products; Inventory TestInventory = new(); @@ -18,6 +19,13 @@ TestInventory.AddToInventory(new Filling("FILH", "Filling", "Ham", 0.12m)); Basket TestBasket = new(99, TestInventory); +CoffeeBagelsDiscount d = new CoffeeBagelsDiscount(); + +TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); +TestBasket.AddProduct(new Coffee("COFB", "Coffee", "Black", 0.99m)); + + +TestBasket.ApplyDiscount(d); + +Console.WriteLine(TestBasket); -TestBasket.ChangeCapacity(0); -TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); \ No newline at end of file diff --git a/exercise.tests/CoreTests.cs b/exercise.tests/CoreTests.cs index 786414f3..2c84fcf0 100644 --- a/exercise.tests/CoreTests.cs +++ b/exercise.tests/CoreTests.cs @@ -12,8 +12,6 @@ public class CoreTests [SetUp] public void Setup() { - - TestInventory = new(); TestInventory.AddToInventory(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); TestInventory.AddToInventory(new Bagel("BGLP", "Bagel", "Plain", 0.39m)); @@ -109,8 +107,8 @@ public void GetPriceOfBagel_PriceOfBAgel() public void AddFillingToBagel_BagleHasFilling() { Filling f = new Filling("FILX", "Filling", "Cream Cheese", 0.12m); - Bagel b = new("BGLO", "Bagel", "Onion", 0.49m); + Bagel b = new("BGLO", "Bagel", "Onion", 0.49m); b.AddFilling(f); Assert.That(b.GetFillings()[0], Is.EqualTo(f)); @@ -120,7 +118,6 @@ public void AddFillingToBagel_BagleHasFilling() public void FillingGetPrice_PriceOfFilling() { Filling f = new Filling("FILX", "Filling", "Cream Cheese", 0.12m); - Assert.That(f.GetPrice, Is.EqualTo(0.12m)); } diff --git a/exercise.tests/ExtensionTests.cs b/exercise.tests/ExtensionTests.cs index 17bb86b6..59d65b7e 100644 --- a/exercise.tests/ExtensionTests.cs +++ b/exercise.tests/ExtensionTests.cs @@ -1,17 +1,105 @@ +using exercise.main; +using exercise.main.Objects.Discounts; +using exercise.main.Products; + namespace exercise.tests { [TestFixture] public class ExtensionTests { + private Basket TestBasket; + private Inventory TestInventory; + [SetUp] public void Setup() { + TestInventory = new(); + TestBasket = new(99, TestInventory); + TestInventory.AddToInventory(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestInventory.AddToInventory(new Bagel("BGLP", "Bagel", "Plain", 0.39m)); + TestInventory.AddToInventory(new Bagel("BGLE", "Bagel", "Everything", 0.49m)); + TestInventory.AddToInventory(new Bagel("BGLS", "Bagel", "Sesame", 0.49m)); + TestInventory.AddToInventory(new Coffee("COFB", "Coffee", "Black", 0.99m)); + TestInventory.AddToInventory(new Coffee("COFW", "Coffee", "White", 1.19m)); + TestInventory.AddToInventory(new Coffee("COFC", "Coffee", "Capuccino", 1.29m)); + TestInventory.AddToInventory(new Coffee("COFL", "Coffee", "Latte", 1.29m)); + TestInventory.AddToInventory(new Filling("FILB", "Filling", "Bacon", 0.12m)); + TestInventory.AddToInventory(new Filling("FILE", "Filling", "Egg", 0.12m)); + TestInventory.AddToInventory(new Filling("FILC", "Filling", "Cheese", 0.12m)); + TestInventory.AddToInventory(new Filling("FILX", "Filling", "Cream Cheese", 0.12m)); + TestInventory.AddToInventory(new Filling("FILS", "Filling", "Smoked Salmon", 0.12m)); + TestInventory.AddToInventory(new Filling("FILH", "Filling", "Ham", 0.12m)); + } + + [Test] + public void Reciept() + { + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Coffee("COFC", "Coffee", "Capuccino", 1.29m)); + TestBasket.AddProduct(new Coffee("COFC", "Coffee", "Capuccino", 1.29m)); + TestBasket.AddProduct(new Coffee("COFC", "Coffee", "Capuccino", 1.29m)); + + Assert.That(TestBasket.ToString(), Is.Not.Null); } [Test] - public void Test1() + public void SixDiscount() { - Assert.Pass(); + SixBagelsDiscount _sixDisc = new SixBagelsDiscount(); + + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.ApplyDiscount(_sixDisc); + + Assert.That(TestBasket.GetTotalCost(), Is.EqualTo(2.49m)); + } + + [Test] + public void TwelveDiscount() + { + TwelveBagelsDiscount _twelveDisc = new TwelveBagelsDiscount(); + + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + + TestBasket.ApplyDiscount(_twelveDisc); + + Assert.That(TestBasket.GetTotalCost(), Is.EqualTo(3.99m)); + } + + [Test] + public void CoffeBagelDisc() + { + CoffeeBagelsDiscount _cbdisc = new CoffeeBagelsDiscount(); + + TestBasket.AddProduct(new Bagel("BGLO", "Bagel", "Onion", 0.49m)); + TestBasket.AddProduct(new Coffee("COFB", "Coffee", "Black", 0.99m)); + + TestBasket.ApplyDiscount(_cbdisc); + + Assert.That(TestBasket.GetTotalCost(), Is.EqualTo(1.25m)); } } } diff --git a/extension1.md b/extension1.md index 9e2c3cfd..9206c430 100644 --- a/extension1.md +++ b/extension1.md @@ -37,4 +37,6 @@ Every Bagel is available for the `6 for 2.49` and `12 for 3.99` offer, but filli Update and extend your program to handle these orders at Bob's Bagels. -Start with extracting useful stories and a functional domain model that represents these requirements. \ No newline at end of file +Start with extracting useful stories and a functional domain model that represents these requirements. + +## User stories \ No newline at end of file