Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions exercise.main/Basket.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@

namespace exercise;

public class Basket
{
public List<Item> Items { get; set; } = new List<Item>();
public int MaxSize { get; set; } = 10;

public void AddItem(Item item)
{
if (!IsBasketFull())
{
Items.Add(item);
}
else
{
Console.WriteLine("Basket is full!");
}
}

public void RemoveItem(Item item)
{
Items.Remove(item);
}

public bool IsBasketFull()
{
if (Items.Count >= MaxSize)
{
return true;
}
else
return false;
}

public bool IsItemInBasket(Item item)
{
return Items.Contains(item);
}

public decimal PriceInBasket()
{
decimal total = 0;

// This part might not make it any cleaner, but ill keep it, not great since it only checks for one type of discount
var (fullSetsOfSix, singleBGLEPrice, remainingBGLE) = CheckforBGLE();

// Total for all bagels
total += fullSetsOfSix * 2.49m + remainingBGLE * singleBGLEPrice;

// Total for all non-bagel items
total += Items.Where(item => !item.SKU.StartsWith("BGLE"))
.Sum(item => item.Price);

return total;
}

private (int fullSetsOfSix, decimal singleBGLEPrice, int remainingBGLE) CheckforBGLE()
{
int BGLECount = Items.Count(item => item.SKU.StartsWith("BGLE"));
int fullSetsOfSix = BGLECount / 6;
int remainingBGLE = BGLECount % 6;

decimal singleBGLEPrice = Items.FirstOrDefault(item => item.SKU.StartsWith("BGLE")).Price;

return (fullSetsOfSix, singleBGLEPrice, remainingBGLE);
}

public override string ToString()
{
if (Items.Count == 0) return "Basket is empty";

string result = "Basket contains:\n";
foreach (var item in Items)
{
result += "- " + item + "\n";
}
return result;
}
}
7 changes: 7 additions & 0 deletions exercise.main/Filling.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace exercise;

public class Filling
{
public string Name { get; set; }
public decimal Price { get; set; }
}
22 changes: 22 additions & 0 deletions exercise.main/Item.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
namespace exercise;

public class Item
{
public string SKU { get; set; }
public decimal Price { get; set; }
public string Name { get; set; }
public string Variant { get; set; }

public Item(string sku, decimal price, string name, string variant)
{
SKU = sku;
Price = price;
Name = name;
Variant = variant;
}

public override string ToString()
{
return $" {SKU} {Name} {Price:C} {Variant}";
}
}
5 changes: 3 additions & 2 deletions exercise.main/Program.cs
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
using exercise;

Receipt receipt = new Receipt();
22 changes: 22 additions & 0 deletions exercise.main/Receipt.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
namespace exercise;

public class Receipt
{
public Receipt()
{
Store store = new Store();
Basket basket = new Basket();
DateTime utcNow = DateTime.UtcNow;

for (int i = 0; i < 8; i++)
{
basket.AddItem(store.AvailableItems[i]);
}
Console.WriteLine("~~~ Bobs Bagels ~~~");
Console.WriteLine(utcNow);
Console.WriteLine("----------------");
Console.WriteLine(basket);
Console.WriteLine("----------------");
Console.WriteLine("Total " + basket.PriceInBasket() + " kr");
}
}
37 changes: 37 additions & 0 deletions exercise.main/Store.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
namespace exercise;

public class Store
{
public List<Item> AvailableItems { get; private set; }

public Store()
{
AvailableItems = CreateFakeItems();
}

private List<Item> CreateFakeItems()
{
return new List<Item>
{
// Bagels
new Item("BGLO", 0.49m, "Bagel", "Onion"),
new Item("BGLP", 0.39m, "Bagel", "Plain"),
new Item("BGLE", 0.49m, "Bagel", "Everything"),
new Item("BGLS", 0.49m, "Bagel", "Sesame"),

// Coffee
new Item("COFB", 0.99m, "Coffee", "Black"),
new Item("COFW", 1.19m, "Coffee", "White"),
new Item("COFC", 1.29m, "Coffee", "Cappuccino"),
new Item("COFL", 1.29m, "Coffee", "Latte"),

// Fillings
new Item("FILB", 0.12m, "Filling", "Bacon"),
new Item("FILE", 0.12m, "Filling", "Egg"),
new Item("FILC", 0.12m, "Filling", "Cheese"),
new Item("FILX", 0.12m, "Filling", "Cream Cheese"),
new Item("FILS", 0.12m, "Filling", "Smoked Salmon"),
new Item("FILH", 0.12m, "Filling", "Ham")
};
}
}
17 changes: 17 additions & 0 deletions exercise.main/domainModel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
| Class | Method/Property | Scenario | Output |
Basket AddItem(Store item) Add a bagel to the basket void
Basket RemoveItem(Store item) Remove a bagel from the basekt void
Basket IsBasketFull(Inventory inventory) Check if basket is full bool
Basket IsItemInBasket() Check if given item is in basket bool
Basket PriceInBasket() Give total price of items in basket decimal

Store SetBasketSize(int i) Change the basket size int
Store PriceOfBagel(Store item) Return the price of the given bagel decimal
Store priceOfFilling(Filling filling) Returns the price for the selected filling decimal
Store addFilling(Store item) Add filling to bagel void
Store isInStock(Store item) Is selected item in stock bool





59 changes: 59 additions & 0 deletions exercise.main/userStories.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@

1.
As a member of the public,
So I can order a bagel before work,
I'd like to add a specific type of bagel to my basket.


2.
As a member of the public,
So I can change my order,
I'd like to remove a bagel from my basket.


3.
As a member of the public,
So that I can not overfill my small bagel basket
I'd like to know when my basket is full when I try adding an item beyond my basket capacity.


4.
As a Bob's Bagels manager,
So that I can expand my business,
I’d like to change the capacity of baskets.


5.
As a member of the public
So that I can maintain my sanity
I'd like to know if I try to remove an item that doesn't exist in my basket.


6.
As a customer,
So I know how much money I need,
I'd like to know the total cost of items in my basket.


7.
As a customer,
So I know what the damage will be,
I'd like to know the cost of a bagel before I add it to my basket.


8.
As a customer,
So I can shake things up a bit,
I'd like to be able to choose fillings for my bagel.


9.
As a customer,
So I don't over-spend,
I'd like to know the cost of each filling before I add it to my bagel order.


10.
As the manager,
So we don't get any weird requests,
I want customers to only be able to order things that we stock in our inventory.