diff --git a/Domain model.md b/Domain model.md new file mode 100644 index 00000000..dde97b87 --- /dev/null +++ b/Domain model.md @@ -0,0 +1,14 @@ +omain Model + +| Classes | Methods/Properties | Scenario | Outputs | +|-----------|-----------------------------------|---------------------------------------------|-------------------------| +| | AddToBasket(string Id) | Adds an order to basket | | +| | RemoveFromBasket(string Id) | Removes an order form basket | | +| Basket.cs | CheckFull() | Checks if basket is at max capacity | "Basket is full" | +| | SetBasketSize(int size) | Sets a new max capacity to baskets | | +| | RemoveFromBasket(string Id) | Tries to remove nonexsistent item | "No such item" | +| | GetTotal() | See the total cost of items in basket | Total cost | +| | Property to expose price of bagel | See price of bagel before adding to basket | Bagel cost | +| | AddFillig(string Id) | Adds filling to bagel | | +| | Property to expose price filling | See price of filling before adding to bagel | Filling cost | +| | AddToBasket(string Id) | Tries to add nonexsistent item | "No such ware in stock" | \ No newline at end of file diff --git a/exercise.main/Bagel.cs b/exercise.main/Bagel.cs new file mode 100644 index 00000000..c7ac6206 --- /dev/null +++ b/exercise.main/Bagel.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.Metadata.Ecma335; +using System.Text; +using System.Threading.Tasks; + +namespace exercise.main +{ + public class Bagel : Item + { + + private List fillings_list; + + public List Fillings_list { get { return fillings_list; } set { fillings_list = value; } } + + public static List StockItems = new List() + { + new Filling("FILB", "Filling", "Bacon", 0.12), + new Filling("FILE", "Filling", "Egg", 0.12), + new Filling("FILC", "Filling", "Cheese", 0.12), + new Filling("FILX", "Filling", "Cream Cheese", 0.12), + new Filling("FILS", "Filling", "Smoked Salmon", 0.12), + new Filling("FILH", "Filling", "Ham", 0.12) + }; + + public struct Filling + { + public string Id { get; } + public string Variant { get; } + public string Name { get; } + public double Price { get; } + + public Filling(string id, string variant, string name, double price) + { + Id = id; + Variant = variant; + Name = name; + Price = price; + } + + public string getFillingToString() + { + return $"{Id}, {Name}, {Variant}, {Price}"; + } + } + + public Bagel(string id, string name, string variant, double price) : base(id, name, variant, price) { } + + public Bagel(string id, string name, string variant, double price, List fillings) : base(id, name, variant, price) + { + fillings_list = fillings; + } + + + public override List getFillings() + { + return fillings_list; + } + + public override void addFilling(string order) + { + var fillingOrder = StockItems.FirstOrDefault(x => x.Id == order); + + if (fillingOrder.Id == null) { throw new Exception("Order not in stock"); } + else { fillings_list.Add(fillingOrder); } + } + + + public override void removeFilling(string order) + { + var fillingOrder = fillings_list.FirstOrDefault(x => x.Id == order); + + if (fillingOrder.Id == null) { throw new Exception("No such item in basket"); } + else { fillings_list.Remove(fillingOrder); } + } + + + public override double getPrice() + { + if (fillings_list != null && fillings_list.Count > 0) + { + return base.Price + fillings_list.Sum(f => f.Price); + } + return base.Price; + } + + + } +} diff --git a/exercise.main/Basket.cs b/exercise.main/Basket.cs new file mode 100644 index 00000000..d9a72947 --- /dev/null +++ b/exercise.main/Basket.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.Design; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace exercise.main +{ + public class Basket + { + private static int maxSize; + private List items; + + public static List StockItems = new List() + { + new Bagel("BGLO", "Bagel", "Onion", 0.49, new List()), + new Bagel("BGLP", "Bagel", "Plain", 0.39), + new Bagel("BGLE", "Bagel", "Everything", 0.49), + new Bagel("BGLS", "Bagel", "Sesame", 0.49), + new Coffee("COFB", "Coffee", "Black", 0.99), + new Coffee("COFW", "Coffee", "White", 1.19), + new Coffee("COFC", "Coffee", "Cappucino", 1.29), + new Coffee("COFL", "Coffee", "Latte", 1.29) + }; + + + public int MaxSize { get { return maxSize; } set { maxSize = value; } } + + public List Items { get { return items; } set { items = value; } } + + + //public void addToBasket(Item order) + //{ + // if (checkFull()){ throw new Exception("Basket is full"); } + // else if (!StockItems.Contains(order)) { throw new Exception("Order not in stock"); } + // else { items.Add(order); } + //} + + public void addToBasket(string order) + { + var item = StockItems.FirstOrDefault(i => i.Id == order); + + if (items.Count >= maxSize) { throw new Exception("Basket is full"); } + else if (item == null) { throw new Exception("Order not in stock"); } + else { items.Add(item); } + } + + + public void removeFromBasket(string order) + { + var item = items.FirstOrDefault(i => i.Id == order); + + if (item == null) { throw new Exception("No such item in basket"); } + else { items.Remove(item); } + } + + public void setBasketSize(bool manager, int newSize) + { + if (!manager) { throw new Exception("No persmission to alter size"); } + else { maxSize = newSize; } + } + + public double getTotalCost() + { + if(items != null && items.Count > 0) + { + return Math.Round(items.Sum(i => i.getPrice()), 2); + } + return 0; + } + + } +} diff --git a/exercise.main/Coffee.cs b/exercise.main/Coffee.cs new file mode 100644 index 00000000..164a2096 --- /dev/null +++ b/exercise.main/Coffee.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static exercise.main.Bagel; + +namespace exercise.main +{ + public class Coffee : Item + { + public Coffee(string id, string name, string variant, double price) : base(id, name, variant, price) { } + + public override double getPrice() + { + return base.Price; + } + + public override void addFilling(string order) + { + throw new Exception("Currently no filling for coffee"); + } + public override void removeFilling(string order) + { + throw new Exception("Currently no filling for coffee"); + } + + public override List getFillings() + { + throw new Exception("Currently no filling for coffee"); + } + } +} diff --git a/exercise.main/Item.cs b/exercise.main/Item.cs new file mode 100644 index 00000000..7cb26ebe --- /dev/null +++ b/exercise.main/Item.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static exercise.main.Bagel; + +namespace exercise.main +{ + public abstract class Item + { + public string Id { get; set; } + public string Name { get; set; } + public double Price { get; set; } + public string Variant { get; set; } + + public Item(string id, string name, string variant, double price) + { + Id = id; + Name = name; + Variant = variant; + Price = price; + + } + + public abstract double getPrice(); + public abstract void addFilling(string order); + public abstract void removeFilling(string order); + public abstract List getFillings(); + + public string getItemToString() + { + return $"{Id}, {Name}, {Variant}, {Price}"; + } + } + + + +} diff --git a/exercise.main/Program.cs b/exercise.main/Program.cs index 3751555c..bcca080c 100644 --- a/exercise.main/Program.cs +++ b/exercise.main/Program.cs @@ -1,2 +1,148 @@ // See https://aka.ms/new-console-template for more information -Console.WriteLine("Hello, World!"); +using System.ComponentModel; +using exercise.main; + +Console.WriteLine("- - - Welcome to Bob's Bagels! - - -"); +Console.WriteLine("Actions:\n v: View basket \n m: See menu\n a: Add [ID] to basket\n r: Remove from basket\n f: Add filling\n rf: remove filling\n ms: Set new basket size\n e: Exit\n"); + +Basket basket = new Basket() { Items = new List(), MaxSize = 10 }; + +string action = Console.ReadLine(); + +while (action != "e") +{ + Console.WriteLine("Actions:\n v: View basket \n m: See menu\n a: Add [ID] to basket\n r: Remove from basket\n f: Add filling\n rf: remove filling\n ms: Set new basket size\n e: Exit\n"); + + switch (action) + { + case "m": + Console.WriteLine("\nID NAME VARIANT PRICE"); + Basket.StockItems.ForEach(i => Console.WriteLine(i.getItemToString())); + break; + + case "v": + Console.WriteLine("\nID NAME VARIANT PRICE"); + basket.Items.ForEach(i => Console.WriteLine(i.getItemToString())); + Console.WriteLine("Fillings: "); + try { basket.Items.ForEach(i => i.getFillings().ForEach(j => Console.WriteLine(j.getFillingToString()))); } + catch(Exception ex) { } + + Console.WriteLine($"_______________________\nTotal cost: £{basket.getTotalCost()}"); + break; + + case "a": + Console.WriteLine("What [ID] would you like to add to basket? (eg. BGLO)\n b: Back\n"); + string addItemId = Console.ReadLine(); + while (addItemId != "b") + { + try + { + basket.addToBasket(addItemId); + Console.WriteLine("Added to basket!\n"); + } + catch (Exception ex) { Console.WriteLine(ex.Message); } + + addItemId = Console.ReadLine(); + } + break; + + case "r": + Console.WriteLine("What [ID] would you like to remove from basket? (eg. BGLO)\n b: Back\n"); + string removeItemId = Console.ReadLine(); + while (removeItemId != "b") + { + try + { + basket.removeFromBasket(removeItemId); + Console.WriteLine("Removed from basket!\n"); + } + catch (Exception ex) { Console.WriteLine(ex.Message); } + + removeItemId = Console.ReadLine(); + } + break; + + case "f": + if (!basket.Items.Any(i => i.Name == "Bagel")) + { + Console.WriteLine("No bagel in basket"); + break; + } + Console.WriteLine("What bagel [ORDER] would you like yo add filling to? (eg. 1)\n"); + Console.WriteLine("\nORDER ID NAME VARIANT PRICE"); + basket.Items.ForEach(i => Console.WriteLine($"{basket.Items.IndexOf(i)}: {i.getItemToString()}")); + + string order = Console.ReadLine(); + int orderNr = 0; + if (Int32.TryParse(order, out orderNr) && (basket.Items.Count >= orderNr || orderNr >= 0)) + { + Console.WriteLine("What filling would you like to add? (eg. FILE)\n b: Back\n"); + string fill = Console.ReadLine(); + while (fill != "b") + { + try + { + basket.Items[orderNr].addFilling(fill); + Console.WriteLine("Added to filling to bagel!\n"); + } + catch (Exception ex) { Console.WriteLine(ex.Message); } + + fill = Console.ReadLine(); + } + break; + } + else { Console.WriteLine("Invalid order. ") ; } + break; + + + case "rf": + if (!basket.Items.Any(i => i.getFillings().Count > 0)) + { + Console.WriteLine("No fillings to remove"); + break; + } + Console.WriteLine("What bagel [ORDER] would you like remove filling from? (eg. 1)\n"); + Console.WriteLine("\nORDER ID NAME VARIANT PRICE"); + basket.Items.ForEach(i => Console.WriteLine($"{basket.Items.IndexOf(i)}: {i.getItemToString()}")); + + string orderF = Console.ReadLine(); + int orderNrF = 0; + if (Int32.TryParse(orderF, out orderNrF) && (basket.Items.Count >= orderNrF || orderNrF >= 0)) + { + Console.WriteLine("What filling would you like to remove? (eg. FILE)\n b: Back\n"); + string fill = Console.ReadLine(); + while (fill != "b") + { + try + { + basket.Items[orderNrF].removeFilling(fill); + Console.WriteLine("Removed filling from bagel!\n"); + } + catch (Exception ex) { Console.WriteLine(ex.Message); } + + fill = Console.ReadLine(); + } + break; + } + else { Console.WriteLine("Invalid order."); } + break; + + case "ms": + Console.WriteLine("Manager mode activated\n Set new size of basket: "); + string newStr = Console.ReadLine(); + + int newSize = 0; + if (Int32.TryParse(newStr, out newSize)) + { + basket.MaxSize = newSize; + Console.WriteLine($"New basket size set to {newStr}"); + } + else { Console.WriteLine("Invalid size."); } + break; + + default: + break; + } + action = Console.ReadLine(); +} +Console.WriteLine("Goodbye!"); diff --git a/exercise.sln b/exercise.sln index 0efb5453..71950fe4 100644 --- a/exercise.sln +++ b/exercise.sln @@ -9,6 +9,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "exercise.tests", "exercise. EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{825CCFE7-4F2E-4770-8393-FEB732F66EE4}" ProjectSection(SolutionItems) = preProject + Domain model.md = Domain model.md extension1.md = extension1.md extension2.md = extension2.md extension3.md = extension3.md diff --git a/exercise.tests/UnitTest1.cs b/exercise.tests/UnitTest1.cs index 7bdb8968..936b478b 100644 --- a/exercise.tests/UnitTest1.cs +++ b/exercise.tests/UnitTest1.cs @@ -1,15 +1,145 @@ +using System; +using System.Linq; +using exercise.main; +using static exercise.main.Bagel; + namespace exercise.tests; public class Tests { - [SetUp] - public void Setup() + Bagel bagelO = (Bagel)Basket.StockItems[0]; + Bagel bagelP = (Bagel)Basket.StockItems[1]; + + Coffee coffee = (Coffee)Basket.StockItems[4]; + + Filling egg = Bagel.StockItems[1]; + + + [Test] + public void TestAddToBasket() { + Basket basket = new Basket + { + Items = new List() { bagelO }, + MaxSize = 2 + }; + Basket expBasket = new Basket { Items = new List() { bagelO, bagelP } }; + + basket.addToBasket("BGLP"); + Assert.That(basket.Items.Contains(bagelP)); + Assert.That(basket.Items, Is.EqualTo(expBasket.Items)); + try + { + basket.addToBasket("BGLO"); + Assert.Fail(); + } + catch (Exception e) { Console.WriteLine(e); } } + [Test] - public void Test1() + public void TestRemoveBasket() { - Assert.Pass(); + Basket basket = new Basket { Items = new List() { bagelO, bagelP } }; + Basket expBasket = new Basket { Items = new List() { bagelO } }; + + basket.removeFromBasket("BGLP"); + + Assert.That(basket.Items, Does.Not.Contain(bagelP)); + Assert.That(basket.Items, Is.EqualTo(expBasket.Items)); + + try + { + basket.removeFromBasket("BGLP"); + Assert.Fail(); + } + catch (Exception e) { Console.WriteLine(e); } } -} \ No newline at end of file + + + [Test] + public void TestSetBasketSize() + { + Basket basket = new Basket + { + Items = new List() { bagelO }, + MaxSize = 2 + }; + + basket.setBasketSize(true, 1); + + Assert.That(basket.MaxSize, Is.EqualTo(1)); + + try + { + basket.setBasketSize(false, 3); + Assert.Fail(); + } + catch (Exception e) { Console.WriteLine(e); } + + } + + + [Test] + public void TestGetTotalCost() + { + Basket basket = new Basket { Items = new List() }; + + Assert.That(basket.getTotalCost(), Is.EqualTo(0)); + + Filling fillings = new Filling("FILE", "Filling", "Egg", 0.12); + bagelO.Fillings_list = new List() { fillings }; + double onionWFilling = 0.49 + 0.12; + + Assert.That(bagelO.Fillings_list[0].Price, Is.EqualTo(0.12)); + Assert.That(bagelP.getPrice(), Is.EqualTo(0.39)); + Assert.That(bagelO.getPrice(), Is.EqualTo(onionWFilling)); + + basket.Items = new List() { bagelO, bagelP }; + double totalCost = 0.39 + 0.49 + 0.12; + + Assert.That(basket.getTotalCost(), Is.EqualTo(totalCost)); + + } + + + [Test] + public void TestAddFilling() + { + bagelO.Fillings_list = new List(); + + Assert.That(bagelO.Fillings_list, Does.Not.Contain(egg)); + + bagelO.addFilling("FILE"); + + Assert.That(bagelO.Fillings_list, Does.Contain(egg)); + + Filling notInStock = new Filling("FILP", "Filling", "Pepperoni", 0.12); + + try + { + bagelO.addFilling("FILP"); + Assert.Fail(); + } + catch (Exception e) { Console.WriteLine(e); } + } + + [Test] + public void TestRemoveFilling() + { + bagelO.Fillings_list = new List() { egg }; + + bagelO.removeFilling("FILE"); + + Assert.That(bagelO.Fillings_list, Does.Not.Contain(egg)); + + try + { + bagelO.removeFilling("FILE"); + Assert.Fail(); + } + catch (Exception e) { Console.WriteLine(e); } + } +} + + diff --git a/exercise.tests/exercise.tests.csproj b/exercise.tests/exercise.tests.csproj index 9fed8e17..a3a97d4f 100644 --- a/exercise.tests/exercise.tests.csproj +++ b/exercise.tests/exercise.tests.csproj @@ -17,4 +17,8 @@ + + + +