From a6432c3a89ae7b564a0bbd6c41818dff77052bb6 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Fri, 8 Aug 2025 15:57:44 +0200 Subject: [PATCH 01/27] =?UTF-8?q?f=C3=B8rste=20utkast?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/domain-model.md | 92 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 src/domain-model.md diff --git a/src/domain-model.md b/src/domain-model.md new file mode 100644 index 000000000..28019847e --- /dev/null +++ b/src/domain-model.md @@ -0,0 +1,92 @@ +# User stories + +As a member of the public: +- I'd like to add a specific type of bagel to my basket. +- I'd like to remove a bagel from my basket. +- I'd like to know when my basket is full when I try adding an item beyond my basket capacity. +- I'd like to know if I try to remove an item that doesn't exist in my basket. + +As a Bob's Bagel manager: +- I'd like to change the capacity of baskets. +- I want customers to only be able to order things that we stock in our inventory. + +As a customer: +- I'd like to know the total cost of items in my basket. +- I'd like to know the cost of a bagel before I add it to my basket. +- I'd like to be able to choose fillings for my bagel. +- I'd like to know the cost of each filling. + + +| Classes | Methods | Scenario | Output | +|-------------------|-----------------------------------------------------|--------------------------------------------------|------------------------------------------------| +| publicMember | void addBagel(String variant) | if basket is not full and Bagel in inventory | add Bagel to Basket | +| | | if basket is full | print "Basket is full" | +| | void changeOrder(String variant) | if Bagel in basket | remove Bagel from Basket | +| | | if Bagel not in basket | print "Bagel not in basket" | +| | void removeItem(String item) | if item in basket | remove item from Basket | +| | | if item not in basket | print "Item not in basket" | +| ----------------- | ---------------------------------------------- | --------------------------------------------- | -------------------------------------------- | +| Manager | boolean canOrder(String item) | if item in Inventory | customer can add to Basket | +| | | if item not in Inventory | return false | +| | boolean changeCapacity(Basket basket, int capacity) | if capacity not negative | change basket capacity | +| | | if capacity negative | return false | +| ----------------- | ----------------------------------------------- | ---------------------------------------------- | --------------------------------------------- | +| Customer | float getTotalCost(Basket) | if Basket contains at least 1 item | return total cost | +| | | if Basket is empty | return 0 | +| | float getBagelPrice(String variant) | if Bagel in inventory | return Bagel price | +| | | if Bagel not in inventory | return 0 | +| | String addFilling(String variant) | if Filling in inventory | add Filling to Bagel | +| | | if Filling not in inventory | return "We don't have this kind of filling" | +| | float getFillingPrice(String variant) | if Filling in inventory | return Filling price | +| | | if Filling not in inventory | return 0 | +| ----------------- | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Basket | List getItems() | if Basket contains at least one item | return List of items | +| | | if Basket is empty | return empty List | +| | String changeOrder(String typeOfBagel) | if Bagel in basket | remove Bagel from Basket | +| | | if Bagel not in basket | return "Bagel not in Basket" | +| | String removeItem(Basket) | if item in basket | remove item from Basket | +| | | if item not in basket | return "item not in Basket | +| | String checkBasket() | if Basket is full | return "Basket is full" | +| | | if Basket is empty | return "Basket is empty" | +| | | if Basket contains at least one item | return "Basket contains " + items | +| | void changeCapacity(List baskets) | if Basket list not empty | change capacity of all baskets and new baskets | +| | | if Basket list empty | change capacity of all new baskets | +| | float getTotalCost() | if Basket contains at least one item | return total cost of basket | +| | | if Basket is empty | return 0 | +| | boolean changeCapacity(int capacity) | if capacity not negative | change basket capacity | +| | | if capacity negative | return false | +| ----------------- | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Inventory | void inInventory(String SKU) | if item SKU in inventory | return true | +| | | if item SKU not in inventory | return false | +| ----------------- | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Item | float getPrice() | if item in inventory | return price | +| | | if item not in inventory | return 0 | +| | String getVariant() | if item in inventory | return variant | +| | | if item not in inventory | return "We don't have this filling!" | +| | String getSKU() | - | return SKU | | | | +| | | | | +| | | | | +| ----------------- | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Bagel | float getPrice() | if Bagel in inventory | return price | +| | | if Bagel not in inventory | return 0 | +| | String getVariant() | if Bagel in inventory | return variant | +| | | if Bagel not in inventory | return "We don't have this filling!" | +| | void addFilling(Filling variant) | if Filling in inventory | add Filling to Bagel | +| | | if Filling not in inventory | print "We don't have this filling!" | +| | String getSKU() | - | return SKU | +| | | | | +| ----------------- | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Coffee | float getPrice() | if Coffee in inventory | return price | +| | | if Coffee not in inventory | return 0 | +| | String getVariant() | if Coffee in inventory | return variant | +| | | if Coffee not in inventory | return "We don't have this coffee!" | +| | String getSKU() | - | return SKU | +| | | | | +| ----------------- | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Filling | float getPrice() | if Filling in inventory | return price | +| | | if Filling not in inventory | return 0 | +| | String getVariant() | if Filling in inventory | return variant | +| | | if Filling not in inventory | return "We don't have this filling!" | +| | String getSKU() | - | return SKU | +| | | | | +| | | | | \ No newline at end of file From 54dee1f14abe26579718012e2eba27d497a21180 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Fri, 8 Aug 2025 16:02:25 +0200 Subject: [PATCH 02/27] =?UTF-8?q?f=C3=B8rste=20utkast?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/domain-model.md | 1 - 1 file changed, 1 deletion(-) diff --git a/src/domain-model.md b/src/domain-model.md index 28019847e..3b70b5847 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -16,7 +16,6 @@ As a customer: - I'd like to be able to choose fillings for my bagel. - I'd like to know the cost of each filling. - | Classes | Methods | Scenario | Output | |-------------------|-----------------------------------------------------|--------------------------------------------------|------------------------------------------------| | publicMember | void addBagel(String variant) | if basket is not full and Bagel in inventory | add Bagel to Basket | From 2a891f49b0b981eb4b367015852ba731aa86b658 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Mon, 11 Aug 2025 09:00:39 +0200 Subject: [PATCH 03/27] updated --- src/domain-model.md | 131 ++++++++++++++++++++------------------------ 1 file changed, 58 insertions(+), 73 deletions(-) diff --git a/src/domain-model.md b/src/domain-model.md index 3b70b5847..bed94577f 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -16,76 +16,61 @@ As a customer: - I'd like to be able to choose fillings for my bagel. - I'd like to know the cost of each filling. -| Classes | Methods | Scenario | Output | -|-------------------|-----------------------------------------------------|--------------------------------------------------|------------------------------------------------| -| publicMember | void addBagel(String variant) | if basket is not full and Bagel in inventory | add Bagel to Basket | -| | | if basket is full | print "Basket is full" | -| | void changeOrder(String variant) | if Bagel in basket | remove Bagel from Basket | -| | | if Bagel not in basket | print "Bagel not in basket" | -| | void removeItem(String item) | if item in basket | remove item from Basket | -| | | if item not in basket | print "Item not in basket" | -| ----------------- | ---------------------------------------------- | --------------------------------------------- | -------------------------------------------- | -| Manager | boolean canOrder(String item) | if item in Inventory | customer can add to Basket | -| | | if item not in Inventory | return false | -| | boolean changeCapacity(Basket basket, int capacity) | if capacity not negative | change basket capacity | -| | | if capacity negative | return false | -| ----------------- | ----------------------------------------------- | ---------------------------------------------- | --------------------------------------------- | -| Customer | float getTotalCost(Basket) | if Basket contains at least 1 item | return total cost | -| | | if Basket is empty | return 0 | -| | float getBagelPrice(String variant) | if Bagel in inventory | return Bagel price | -| | | if Bagel not in inventory | return 0 | -| | String addFilling(String variant) | if Filling in inventory | add Filling to Bagel | -| | | if Filling not in inventory | return "We don't have this kind of filling" | -| | float getFillingPrice(String variant) | if Filling in inventory | return Filling price | -| | | if Filling not in inventory | return 0 | -| ----------------- | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Basket | List getItems() | if Basket contains at least one item | return List of items | -| | | if Basket is empty | return empty List | -| | String changeOrder(String typeOfBagel) | if Bagel in basket | remove Bagel from Basket | -| | | if Bagel not in basket | return "Bagel not in Basket" | -| | String removeItem(Basket) | if item in basket | remove item from Basket | -| | | if item not in basket | return "item not in Basket | -| | String checkBasket() | if Basket is full | return "Basket is full" | -| | | if Basket is empty | return "Basket is empty" | -| | | if Basket contains at least one item | return "Basket contains " + items | -| | void changeCapacity(List baskets) | if Basket list not empty | change capacity of all baskets and new baskets | -| | | if Basket list empty | change capacity of all new baskets | -| | float getTotalCost() | if Basket contains at least one item | return total cost of basket | -| | | if Basket is empty | return 0 | -| | boolean changeCapacity(int capacity) | if capacity not negative | change basket capacity | -| | | if capacity negative | return false | -| ----------------- | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Inventory | void inInventory(String SKU) | if item SKU in inventory | return true | -| | | if item SKU not in inventory | return false | -| ----------------- | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Item | float getPrice() | if item in inventory | return price | -| | | if item not in inventory | return 0 | -| | String getVariant() | if item in inventory | return variant | -| | | if item not in inventory | return "We don't have this filling!" | -| | String getSKU() | - | return SKU | | | | -| | | | | -| | | | | -| ----------------- | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Bagel | float getPrice() | if Bagel in inventory | return price | -| | | if Bagel not in inventory | return 0 | -| | String getVariant() | if Bagel in inventory | return variant | -| | | if Bagel not in inventory | return "We don't have this filling!" | -| | void addFilling(Filling variant) | if Filling in inventory | add Filling to Bagel | -| | | if Filling not in inventory | print "We don't have this filling!" | -| | String getSKU() | - | return SKU | -| | | | | -| ----------------- | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Coffee | float getPrice() | if Coffee in inventory | return price | -| | | if Coffee not in inventory | return 0 | -| | String getVariant() | if Coffee in inventory | return variant | -| | | if Coffee not in inventory | return "We don't have this coffee!" | -| | String getSKU() | - | return SKU | -| | | | | -| ----------------- | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Filling | float getPrice() | if Filling in inventory | return price | -| | | if Filling not in inventory | return 0 | -| | String getVariant() | if Filling in inventory | return variant | -| | | if Filling not in inventory | return "We don't have this filling!" | -| | String getSKU() | - | return SKU | -| | | | | -| | | | | \ No newline at end of file +| Classes | Instance variable | Methods | Scenario | Output | +|-------------------|--------------------------------|--------------------------------------------------|--------------------------------------------------|------------------------------------------------| +| publicMember | -Basket basket | boolean addBagelToBasket(Bagel bagel) | if basket is not full | add Bagel to Basket and return true | +| | -Inventory inventory | | if basket is full | return false | +| | | boolean changeOrder(Item item) | if item in basket | remove item from Basket and return true | +| | | | if item not in basket | return false | +| | | boolean isBasketFull() | if basket is full | return true | +| | | | if basket is not full | return false | +| ----------------- | ----------------------------- | ---------------------------------------------- | --------------------------------------------- | -------------------------------------------- | +| Manager | Inherits basket and inventory | boolean canOrder(Item item) | if item in Inventory | return true | +| | from public member | | if item not in Inventory | return false | +| | | boolean changeCapacity(int capacity) | if capacity not negative | change basket capacity and return true | +| | | | if capacity negative | return false | +| ----------------- | ----------------------------- | ----------------------------------------------- | ---------------------------------------------- | --------------------------------------------- | +| Customer | Inherits basket and inventory | float getTotalCost() | if Basket contains at least 1 item | return total cost | +| | from public member | | if Basket is empty | return 0 | +| | | float getBagelPrice(Bagel bagel) | always | return Bagel price | +| | | boolean addFilling(Bagel bagel, Filling filling) | if Filling is not null | add Filling to Bagel and return true | +| | | | if Filling is null | return false | +| | | float getFillingPrice(Filling filling) | always | return Filling price | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Basket | -int capacity | List getItems() | if Basket contains at least one item | return List of items | +| | -List items | | if Basket is empty | return empty List | +| | | boolean changeOrder(Item item) | if item in basket | remove item from Basket and return true | +| | | | if item not in basket | return false | +| | | boolean addItemToBasket(Item item) | if Basket is not full | add item to Basket and return true | +| | | | if Basket is full | return false | +| | | int getCurrentCapacity() | always | return capacity | +| | | | | | +| | | float getTotalCost() | if Basket contains at least one item | return sum of all item prices | +| | | | if Basket is empty | return 0 | +| | | boolean changeCapacity(int capacity) | if capacity not negative | change basket capacity and return true | +| | | | if capacity negative | return false | +| | | boolean isEmpty() | if Basket is empty | return true | +| | | | if Basket is not empty | return false | +| | | boolean isFull() | if items.size() >= capacity | return true | +| | | | if Basket is not full | return false | +| | | int getNumberOfItems() | always | return number of items | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Inventory | -Map items | boolean inInventory(Item item) | if item in inventory map | return true | +| | | | if item not in inventory map | return false | +| | | Item getItem(String sku) | if sku exist in inventory | return Item object | +| | | | if sky not in inventory | return null | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Item | -float price | float getPrice() | always | return price | +| | -String variant | String getVariant() | alwyas | return variant | +| | -String SKU | String getSKU() | always | return SKU | +| | -String name | String getNAme() | always | return name | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Bagel | -List fillings | boolean addFilling(Filling filling) | if Filling is not null | add Filling to Bagel ajd return true | +| | | | if Filling is null | return false | +| | | List getFillings() | always | return list of fillings | +| | | float getTotalPrice() | always | return bagel price + sum of filling price | +| | | Inherits all Item methods | | | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Coffee | | Inherits all Item methods | | | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Filling | | Inherits all Item methods | | | \ No newline at end of file From 995dce5441a7dc3bb83eadbd741facfe385b2a8b Mon Sep 17 00:00:00 2001 From: Linda Do Date: Mon, 11 Aug 2025 09:09:13 +0200 Subject: [PATCH 04/27] updated domain model --- src/domain-model.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/domain-model.md b/src/domain-model.md index bed94577f..54d756f31 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -55,13 +55,13 @@ As a customer: | | | | if Basket is not full | return false | | | | int getNumberOfItems() | always | return number of items | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Inventory | -Map items | boolean inInventory(Item item) | if item in inventory map | return true | +| Inventory | -Map items | boolean inInventory(String item) | if item in inventory map | return true | | | | | if item not in inventory map | return false | -| | | Item getItem(String sku) | if sku exist in inventory | return Item object | -| | | | if sky not in inventory | return null | +| | | Map getItemsInInventory() | always | return map of items | +| | | | | | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | | Item | -float price | float getPrice() | always | return price | -| | -String variant | String getVariant() | alwyas | return variant | +| | -String variant | String getVariant() | always | return variant | | | -String SKU | String getSKU() | always | return SKU | | | -String name | String getNAme() | always | return name | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | From 961decb7c36359c19d4e558d63b469392bc5c5e5 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Mon, 11 Aug 2025 09:13:09 +0200 Subject: [PATCH 05/27] class diagram --- src/img.png | Bin 0 -> 67352 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/img.png diff --git a/src/img.png b/src/img.png new file mode 100644 index 0000000000000000000000000000000000000000..674336ffcc3985202da911b5cb4c4cfd787e656f GIT binary patch literal 67352 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 CW=Sgm literal 0 HcmV?d00001 From f2b101a231b7fa40f3278c725d242d34eb1ddc34 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Mon, 11 Aug 2025 10:19:55 +0200 Subject: [PATCH 06/27] publicMemberTest --- src/domain-model.md | 6 +- src/img.png | Bin 67352 -> 61565 bytes src/main/java/com/booleanuk/core/Bagel.java | 4 + src/main/java/com/booleanuk/core/Basket.java | 4 + src/main/java/com/booleanuk/core/Coffee.java | 4 + .../java/com/booleanuk/core/Customer.java | 4 + src/main/java/com/booleanuk/core/Filling.java | 4 + .../java/com/booleanuk/core/Inventory.java | 4 + src/main/java/com/booleanuk/core/Item.java | 4 + src/main/java/com/booleanuk/core/Manager.java | 4 + .../java/com/booleanuk/core/publicMember.java | 21 +++++ .../com/booleanuk/core/publicMemberTest.java | 80 ++++++++++++++++++ 12 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/booleanuk/core/Bagel.java create mode 100644 src/main/java/com/booleanuk/core/Basket.java create mode 100644 src/main/java/com/booleanuk/core/Coffee.java create mode 100644 src/main/java/com/booleanuk/core/Customer.java create mode 100644 src/main/java/com/booleanuk/core/Filling.java create mode 100644 src/main/java/com/booleanuk/core/Inventory.java create mode 100644 src/main/java/com/booleanuk/core/Item.java create mode 100644 src/main/java/com/booleanuk/core/Manager.java create mode 100644 src/main/java/com/booleanuk/core/publicMember.java create mode 100644 src/test/java/com/booleanuk/core/publicMemberTest.java diff --git a/src/domain-model.md b/src/domain-model.md index 54d756f31..ddbe4231d 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -18,14 +18,14 @@ As a customer: | Classes | Instance variable | Methods | Scenario | Output | |-------------------|--------------------------------|--------------------------------------------------|--------------------------------------------------|------------------------------------------------| -| publicMember | -Basket basket | boolean addBagelToBasket(Bagel bagel) | if basket is not full | add Bagel to Basket and return true | +| publicMember | -Basket basket | boolean addBagelToBasket(String variant) | if basket is not full and variant in Inventory | add Bagel to Basket and return true | | | -Inventory inventory | | if basket is full | return false | -| | | boolean changeOrder(Item item) | if item in basket | remove item from Basket and return true | +| | | boolean changeOrder(String item) | if item in basket | remove item from Basket and return true | | | | | if item not in basket | return false | | | | boolean isBasketFull() | if basket is full | return true | | | | | if basket is not full | return false | | ----------------- | ----------------------------- | ---------------------------------------------- | --------------------------------------------- | -------------------------------------------- | -| Manager | Inherits basket and inventory | boolean canOrder(Item item) | if item in Inventory | return true | +| Manager | Inherits basket and inventory | boolean canOrder(String item) | if item in Inventory | return true | | | from public member | | if item not in Inventory | return false | | | | boolean changeCapacity(int capacity) | if capacity not negative | change basket capacity and return true | | | | | if capacity negative | return false | diff --git a/src/img.png b/src/img.png index 674336ffcc3985202da911b5cb4c4cfd787e656f..97c8f502cecdf92be5b0d9ed530c7ff1d52eed5e 100644 GIT binary patch literal 61565 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 CW=Sgm diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java new file mode 100644 index 000000000..e74f6c330 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class Bagel { +} diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java new file mode 100644 index 000000000..4aab45ed7 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class Basket { +} diff --git a/src/main/java/com/booleanuk/core/Coffee.java b/src/main/java/com/booleanuk/core/Coffee.java new file mode 100644 index 000000000..08b04e421 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Coffee.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class Coffee { +} diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java new file mode 100644 index 000000000..6f3a664d5 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class Customer { +} diff --git a/src/main/java/com/booleanuk/core/Filling.java b/src/main/java/com/booleanuk/core/Filling.java new file mode 100644 index 000000000..b25b3ff10 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Filling.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class Filling { +} diff --git a/src/main/java/com/booleanuk/core/Inventory.java b/src/main/java/com/booleanuk/core/Inventory.java new file mode 100644 index 000000000..375cdb479 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Inventory.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class Inventory { +} diff --git a/src/main/java/com/booleanuk/core/Item.java b/src/main/java/com/booleanuk/core/Item.java new file mode 100644 index 000000000..b85344c21 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Item.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class Item { +} diff --git a/src/main/java/com/booleanuk/core/Manager.java b/src/main/java/com/booleanuk/core/Manager.java new file mode 100644 index 000000000..690d54d8f --- /dev/null +++ b/src/main/java/com/booleanuk/core/Manager.java @@ -0,0 +1,4 @@ +package com.booleanuk.core; + +public class Manager { +} diff --git a/src/main/java/com/booleanuk/core/publicMember.java b/src/main/java/com/booleanuk/core/publicMember.java new file mode 100644 index 000000000..835b2f18a --- /dev/null +++ b/src/main/java/com/booleanuk/core/publicMember.java @@ -0,0 +1,21 @@ +package com.booleanuk.core; + +public class publicMember { + Basket basket; + + public publicMember(Basket basket){ + this.basket = basket; + } + + public Boolean addBagelToBasket(String variant){ + return null; + } + + public Boolean changeOrder(String sesame) { + return null; + } + + public Boolean isBasketFull() { + return null; + } +} diff --git a/src/test/java/com/booleanuk/core/publicMemberTest.java b/src/test/java/com/booleanuk/core/publicMemberTest.java new file mode 100644 index 000000000..ccdd176f9 --- /dev/null +++ b/src/test/java/com/booleanuk/core/publicMemberTest.java @@ -0,0 +1,80 @@ +package com.booleanuk.core; + + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class publicMemberTest { + + @Test + public void addBagelToBasketOk(){ + Basket basket = new Basket(); + publicMember member = new publicMember(basket); + + Assertions.assertEquals(true, member.addBagelToBasket("Onion")); + Assertions.assertEquals(true, member.addBagelToBasket("Plain")); + Assertions.assertEquals(true, member.addBagelToBasket("Everything")); + Assertions.assertEquals(true, member.addBagelToBasket("Sesame")); + Assertions.assertEquals(true,member.addBagelToBasket("OnIOn")); + Assertions.assertEquals(true,member.addBagelToBasket("SESAME")); + + + } + + @Test + public void addBagelToBasketNotOk(){ + Basket basket = new Basket(); + publicMember member = new publicMember(basket); + + Assertions.assertEquals(false, member.addBagelToBasket(" ")); + Assertions.assertEquals(false, member.addBagelToBasket("Sesamee")); + Assertions.assertEquals(false, member.addBagelToBasket("Cheese")); + Assertions.assertEquals(false, member.addBagelToBasket("Egg")); + } + + @Test + public void changeOrderOK(){ + Basket basket = new Basket(); + publicMember member = new publicMember(basket); + member.addBagelToBasket("Sesame"); + + Assertions.assertEquals(true, member.changeOrder("Sesame")); + + } + + @Test + public void changeOrderNotOK(){ + Basket basket = new Basket(); + publicMember member = new publicMember(basket); + member.addBagelToBasket("Sesame"); + + Assertions.assertEquals(false, member.changeOrder("Onion")); + + } + + @Test + public void isBasketFullTrue(){ + Basket basket = new Basket(); + publicMember member = new publicMember(basket); + member.addBagelToBasket("Sesame"); + member.addBagelToBasket("Sesame"); + member.addBagelToBasket("Sesame"); + member.addBagelToBasket("Sesame"); + member.addBagelToBasket("Sesame"); + + Assertions.assertEquals(true, member.isBasketFull()); + } + + @Test + public void isBasketFullFalse(){ + Basket basket = new Basket(); + publicMember member = new publicMember(basket); + member.addBagelToBasket("Sesame"); + member.addBagelToBasket("Sesame"); + member.addBagelToBasket("Sesame"); + + Assertions.assertEquals(false, member.isBasketFull()); + } + + +} From f9deeab062d46958dd3c4c348c4ad8778e61bcc5 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Mon, 11 Aug 2025 12:44:03 +0200 Subject: [PATCH 07/27] updated domain model and class diagram --- src/class_diagram.png | Bin 0 -> 66000 bytes src/domain-model.md | 28 ++++++++++++------ src/img.png | Bin 61565 -> 0 bytes .../com/booleanuk/core/publicMemberTest.java | 2 -- 4 files changed, 19 insertions(+), 11 deletions(-) create mode 100644 src/class_diagram.png delete mode 100644 src/img.png diff --git a/src/class_diagram.png b/src/class_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..60a085d09afa8e3cde9bbe750bfd71b402115e24 GIT binary patch literal 66000 zcmdqKdpy(q8$Vw6-Qn(_lS(<>9aWTs$@%VlcR(dZPDw@#Ntnav?!Ya{U2>emor)NS z#lmLEVUby3n6brb7&97%+4g;plvDTpxxbI!_n+TCJs#C#dmmoc;dwo;=XEXgtkDUH z<5{?f^;so}7pGaa;3y;kIiFr4B7$8d?w9wib8q)vx-$Jc^A`+wO57a@iFKVY|`g zg!1yZ(8z=Gj@NJg6)M>rw@KlOM6MpqmlsfnG(Mn^N08cl+-U_FlYB9M4DU?7D9FSW zXCPOTjK}Sot_!V{A;j@PM#80`4p|U-V=RsRm*bmlB&s;)e|rKrr2fA=K{VN4Fg7&i{8IIZzvpxlD~+Ws6GrX{ zFqYgS&%4Vp3?;lN@*8q?%-k+MupRCe^Bpsll9n7;4HCg-Qvxceeocp6ij0ZZbdxX<@FEsI^#Khc3V$*5R_EQC` zI-1<~m3=7P}bYapP1{1A;YYn4y~GYx(l(uX^iy;6PYLE1Jo^TMKNh9FV}>f zAf|5lXSZDdm`Sic)&o7tLZZA`-Hyp%^zP`NG!Vi6?Dh+>k+*N(9y9W2EAm2S!({KS z1SP#o$r*rUZZEE;y`lt+eg?1V`TVy{dQt#W#~D;{{v(12+s7Z3jfj$60hc}T&)ymB z!0$J@mbPVi%$sn+#&h<59(RrDP#SOGL^iiXAr&YWvJNGi>GA8}MyQn?(TEryBr1Sy`QfT)?4esv>e7zE0#zYCV zu(oYbH&d!2rk6u3fa>%K17!j~*OR@yD&5f*a)un^E;obVEJ=10+3RRBMSWHVxam7Y zR-E6CYES4}>y5vSL53JeUEuNvCF9|{aMG`W_d;p?+)RjC5dA8eq8{xf>?kNsR?xv& z)0gtvwBf04`#)??$!*oPb}!WSd{b$~=&oc@Z@Vh;(n{dP8B|k_n>2-y{de{{XOP6K zJah^0ocV92Q^mTrQPVs5ejV~qPu2^kTGnyb<7h2LNj)_Uv-k|+Xlqb$i+(7Rr1?j7 z+)L9lP3DzEW@c1FI$DUvZEXqE?Fo-JJTfcY#e#{cN2VpXudZN+E`0C`lTcKdgS$ux z&U<>yo3y??LiBb+H*hZ3Yg+gkn_n5 zLZ>SgWlO{&W6=Xv!(1(SC9REP2Oo4y#<|%kaxzr`QFFN66ur4szo)>$Vm%OOD)u~q z%r@<*v^tgEs7^pQ%H~s@D*T>cK1k033$L+bHS@juuirf@*ZjmJlbz(ILkk!H7Y2cw z+HJOMZlu~je^ezy@0lK+8xL!cbF&nX9H?%^S=vFu0Qfr8`Mv&j*_Ufm=RE_Rm$R*i z^XcQqze`N4#D_2)i+D%jeCTkWpE|rm+V*_iyTPubuee3~q z^Pa8>tBQp1&b(yOfO%E!dxFRMh^Q-K9Pu@SRar*MweWEqILhyH6j&Rxnhn6I@Bba% zo%qq{NJG9$leT@>3ssyWDJfjWZ%edv4P`O{&xdQo0kGfM0iCXo)zQ%zD8#NgEx`nU zlpx>%;nah>`VXE0q5U87?YlfUY$#4_+X^GEmv-1~iH>hgko(`vcH%UNiLX}VW`1J! z#uCmgpN%*vPjH&U{4UpdNHbqn3hiLkA>?_ZEgh2l&V>-W_C%7<; zT6L^ivkQzkgr|#p!Hz~ya7;)0BEEki+g>Kp`9N+<$tJqvlIQ%uE|pg?o8o@(Omod( z($5Ped8?jFScbfTcru5dy7nff7Z}y;l~%*Bcefg=Y8Pth{1;&0sn{p?J}0r+*=!>s zb)_NwM!pA98!Z)1mUyD!5o0u#dzxH;CxxnQXp|IG?=VwVNrVP^&Vzi2^ zO92Bx^rN>n3$KdI<4xFu5_IQ{Vy5WszoxzE*E*#^=Rf1e^=82^Amf{) z8C8%xq}A;MH9T6d6spk&?31h9AnELLt@>Bp;jV22cNZqhp6B|quOvix)x@v)bz^vn zNNoXCKNLcV2;mKcXPSY)i>FLj&_lMue#Z>d9_4gwbZWVO3vRM+RW?&>SZt1A(u-Bfd`;orqUe<?ltBM1^6&VqClSP)wRfJ5 z7TZ2tX|^L084cVMnsV{sF}r*`-$t2xS4&i6`Yl}k{CNw6nAm~~2scB=J<-zufp z9vJ@4TIupWmZR4oL^9ldgkm@@i*g#HB3#RQWJAfM2S=2ZesK1)OD=wYh8P+kbUZkJ zjnzPMGG2va(m@i|E)@r$9jpzN%&hFv>J)g=^+rb!75OCFLZWiOtnI3aOt!f;Du}wb zk3;Wsp{~$3X}Nm1BJbf3++$W@SFn1@e0{b=NBz*|c}yaL94@2Tfmq68&L|-#s)Mn9 zz`O36n_c(xu3_w2JiFHHeNXFY^3u5Y>+~we=lZp4XX(4MEirE74G~ZODy{UiSPzm1 z;vbk&j7Ccu5DqJA{9E=q;?LvpdLU{ga3}YD(_)tM8O|af>6B}`TVc?(8mYWq3VLRs z+jvfl0ViudjP*$TPwI$)5o`taNYo@kM05eAg9#iK1_n9W?DbxCi^J-@-B)qfFQrqk zo^V15k^MbFi)+fuHd)Z3N8gLf#VGxWP{kX?RJ<28g|DoK4&#$MMt&UiihlcR9*iOm zD}fGbBSn$@N=L?dkg?=4)W+@r!%$I?BtC1b=lC0x>eZ6KD`Q?t?wP{Q&^{l(ROxr! z&Fk1{T`@m6&e@Crd@{)bVcF*w1aXY7X8n{Y1LAG83?Mjgtz+sr$U)?-k$TO`LT^je zm#&KpmhSVHLHRtps)0C-{qZwRFYLtB0=ox!`k~Gcv!fX^lF<4sA+z2^E4jC3Y7{-8SK6Z)@1l3={G zhSMsFBPhnf;28c=ZKWrL)CtS{WZuO%c#m*ulCJoM#a6K^s^qedBZ~AeZTeUMTz;cA zfK2ZUx=nR#11W{w!n~qb{q)AP!U1AB>}h%q-95V$F-2d+kcwQ*rs`*BNt~aID}a1j zE!V|JV16nbmuj_$5?DF>@C^Xoi)tc5YTnbVroZU@sQ^PuKqwvn2-2)R6z-_NK!NfbXK{PgT34$ki2$T~~4j ztTx^aC)n?xm=5>#_Lh@!|1Z#z;;Z^KUhJ0q+UBi5V4|QM8J@mB0BP>U{l3H)8^3h5 zIi%AC1t7-UGd(gl_Rs_Z0l=mVuqWu0@6?yQ-y}{eB;l9+6W|(SNzTJ-0IBZq50lrA z7>)lI9}=^PJzzSTAk){7zv3fFes= z+7PqWO*@-J0)SqSevFWxIkY(Eo=?xmPDCdXR#d{U)62gj{zGx|(MdC3e&;|2MSTWy z`x;v$oi%TgnV$T)Ff?(eFyTzbG8P8EALlOMm9>;K!wh(c`rNE~em!x&$|lCZ^s;mn zdp3NWjPx^Ja<4AU3LQE?_fxO2$tW;RNVn1{v`y5?wbt|N3K%SCGIJbO?z6MmU&)wG zI0K~HzlRS>Ayx{5On#+vP*rEV*zyVXf*{(KqB}ryHn8f>bU|tlwLak$nt*6n!N#-h z8g-1UPeb1-`MH38s;T~YZ6NOVAHdjJ;&?4m8FX!^wm?usg& z8t`{qqxoaJ_+x;ffcVH47TL#Su)8krNLRWnFX59%#F}9hO!+RqUguRw+E6?< z^2x$Mk3yxJjnQG$KZ-a1?9Wehy=*X`vB6={s#D$ezpEM-82mV2AvE31G~HVNbeC^M z%mAa6gHssW0F+5tiHPdnpx)W;M1^X4oVZ%|n+2MDUA8ZRzd79dS4-`9XW$bVbs1b$SnVcu()FtAg~FH@>9wKJbz`()1^h#%!!&_kq%o zDQ&JTflHOr4NK~wNzlA>Q^KXpwoOHXEW#U9v{M%Cvgi$Dqk#|jdYV$!kk5AcKAofx z$n%YS%Ei#32v3%7fY4~nHC4K^VUv7Wz5wUt(d*Pr`+{9|cqT))18pzA~r6=-Yw-LOO+-D^h`yBtRxTr-QFkiLeKDG|D115$ZARv&mM zLvm?;%dC9E_X%7bO1JBBc3>VMrYgze(*<_?`-GwlA`{1>S;D(d+r~dwIDD~*&~xQG z6VXJT9dqU)z863?0C*gL>glXa3`^>eQj>V{!MXYUZ+F7e-S?cg_uy_&R|g7mjeB0( zB3(dFO>qz`F7K-03zz%j-iTBQ+O_0(rkhI(v;fRKyO)r;M9J-AM$Sn?jqH**s6qAx zv<{+w)VY8>7IJs9y*^@GZ+l?K6PHF$kE3$}&z!Qktwe zf2CWp7d2CPIn51C`OA{BlHiziIkmE*az8n?wpvjp+6uiH^k~?#^)D}(R}EC_rw}El zM<&S7swm>GjDCzFv$}C$_ouF1W&VSh4@;D8Dh@=Sr{B=9 z?^Q!&ZOH9s|9zqrqDOOUbiT-!bHiNSQAWmm8Zi@S{jLss^3E0Aw#i85<0XGDdvnxy zg(0-}f!PV;4mE@WF;$CU+Bm|EOIOtm);B{g6C|J?GXJ%5J+pP?<5d8~fPoMcg+?l$kub>Ec-4nf` zf2+m+hv+y9WiOz)2XYbQ^bJ2%b_;J;O{BHy{MHUr2pS(4 zQ$w7n8g38&UN|+8i}83{O~gDvcpeBox}zeVI4Yf4#!h&tRPBvFeVxXZi7|?XKe#SW z*QJ;)_5>PTf%*jduw7!t)TSh$Fngq6i%ShbCSsCTrS1zLFNi0?0%(_MPrf#d4aLM1 zK&?`uh`rSbaIfS1orjly;VW}=r;#l?>wR!sw1lS#4jYboQ@^gL*`|W z`iN1;0ccI6L_hSR#5G(NL6T(R3^jn+Q1NOQ1E>3fSPevD4l_B-Ayvmw?i+8s5bFdI z4H}DH{?G2I@9CiCR&X7oh`{x+5?t;TAlcXMqS0+f(Q#NhG^m*3tXbE_Uk^gG2damA z8eSI_-9d(32-wp>50pdnKPX_7b8AE@g8N1pS`wXVqS9n`2PVmI5JO zkvU8C8JnSLT-lwKEC`xJf*NJ69YV%a6&c4b5>wNFYUPJlo{CiB&d?EO`4=P2trMgy?efDUhuCW#OsAoFl9C zF0^?N~#CWDkp6 zJzoP1Aog_GD;C{tUVOD<1@-Y?bT@>+8DH|k@PUA1)R_CVvsAO_RS6R$R9B>B-@Xbn!Zju1sRtI1u+_jj(~%re&?68$8uj{EFM!G;|83VoN3%zk2!ox=Mjbb zC$U6gVq(|sz=r`F>&(_OQ2Z{ChrSFb*ie#e!7hWh?n!aUdlO{>b}GL}gj^m%J)_*0 zDTLvVT*N%r?~Ie<^5X+#(>u54b5d6P*LK}JrK23wK~2_K0}SewPVGk{Mzq{g#@VI! zx?jeHb7VkQLIqB3ZrQIWXE z%x%)SH_%r%Tkc@1$Jqx$(7wPkA0+~D2mt$l;D13twiTGpf_>iBfDWw(X?%08-Unb=T#Q-h z=*v6aP9q{0(AwJCiVmC40!OneiK!U){|RH-4?tY0eO6B4Xs811J0F^j6t`=Jj@`N( zJp4a4Yi>#rnL4zA2aN{-34q}b^#|E`|5gbl+fO4lXXt;H(^Pr zjdnvs9V9GaLCUyuDpX8%(I>W9f__CfRu%M8Yk3}yS^kaJRyjdghA zY@OS@{5QZ>f0|+*|97VJb#ZaACHR*aCjeAUWa#|V!YqtFlOUY^A){5RRDfIe?S1pf^$ zwcOs$8t0dHHK8B@3 zA2sSMc!C>KnebyO9$@*=xYK+`!~yX#7a)x zDWp4x{r?~AVtQLlth@c*%b#_nnO^En!&{Iy;yeE~HFcsSpD{uhyFAXL` zEcTp~VV0yWm``K<<962%TkW$c>5uT z8Tw_ajGKPMV(HuW&ijuAQB!$j>WWis^cl^S*%w&F24v?mg>-WjgKwT=fDqcd$Dfp_ zBlTms#d>VApx3d7GuIew5?b4xU#3$%sqC^@=75B#y@EHoqVskE;sT&)NlZl=4hAyS zlGAGwv^<{yc;&mu48U5>Aoj2YhFCqNdvi^hWCIcYr&DJ2miznq`WiR9nL($0tq%X6 zx2XFAh1_J+e_=D`o)S#K_tQg`fD;t-|H!1iI{g>0!ac&dx0e`&%FAUU0Fn&Z+eV>; z{urRm(hYpqc}@znSuOc4iMhubVrghcQf23tY3dxyqtiwwyxY0)D!9S(j`Oi%92h~T zV@C6P7Dglm4x|4s06wRwWH_Id$O&*1XdSeLA-0-D^gABx>jC5#UKNZT761{DrY&yb ze-XBz1Q&h9$856d5FjZo-HJ09 zdunh|@Nu>9($F}Uq|zX>^{Wv7em77OWGUU5!6#1``%KULIuT?3SW4-dc(ljXaAzc| zDM-*H#SDKqb7Du_buG>Y64D%jqqzH|T+L?y^t#v6(6M#}VLMC7cJ$O=`_EJUdg^Dt zaR_EVMH;{cKrQn|MSm`nIJWiB+_4OC3KYw7H?~(~FnMq~&k$kQAVcd9-u3xUwCah0 zRP%C%;nV=aYknLlAXPZ-HWSLuj#1fpKrtj9bh&j57WC;v;Ipwm6h{7F5dwP&ERw76 z{c6Ek0fiXE#{`8vYJ=9C!|vWV05h2yN}3L_r$XaYz6T8U2k1nc$1XZ@#I%B0@<_R2 z23^ob&k6)+`V!&j5Gn|+7+GEEwcb5Le5sj*#$3%bU#z12Y6L+eAwlK>powr@z}<@5 zGD`(5h6IG+B!i%mB6a~aqqwgKX^No-`a3FTPEMcf4;#bL`M6qFpH`0()&sEEaKf9* zG+0fHcqk>qPc=9CnVMcIxi!|8;oBQ;E=O8DSLm9>kon@6}$G3Gh*TmlNKYo0CI2gtALZXo)8U`?({PdbQ^;2o`+#Tayp4CSn3cN= zINFy^P)Mf@7hu3BU!u#!A)>pUHGF75F{OTN2qGFZ)6nwWE#DUrMkNndz|PjZOZ1^x zSOa}qHIfC zNsp7=r%%1`CE4^=~ zD?legQaUY%g5?QAknYyLc}3UF+mj>U1J{Qtg2p?YR`i5xAe>fWGO{Eiov%0lYGjm< zK5R+s2=rq17XX41A{@cj2zSOMN`{O=WaIplM|8}z1ay-^P2sA*U`!!OWO3uYBgl6n zH04{s0E%L7yV=O7?Seb(dI|TTF?e-Q-#fF2W>N%vROZ9RMuayoz;f5$aTNle#j3Hn z=C4;^P3Gx#BaE7E8p*s%)hcJB3pPIpDeTv0uG!rH{i57_6yQ)NhU&rwQz+vAK}4SA zSuh#)QiGAwS%gV%Gp+yAI5%dWV~LiSlBE0awn za+;LajmY?Hi!2F4waxhOrtsut!^fU|wdJn^cgl4@6|iDLz|ee@lcqnE&N`wnc6N?8 zy0bo6m51A zHC8O^7mIibR&y4CH+_*=KG6u|VeA-%)N}s+{!`O-J7IJ{m(U1)T0uHS>ohV&;n*K) z*>1&6873lzCh~+QrM%!=3`ZEs(liK3MwvDxDUswm2ZBupVQMoZjbEV)5GgsY7!PWz z3eAtVglGSL8>R2t5vr)|32&U`vt;O!Z(lHckmle70wg-cwp8^*2MR-%mUB!~))8~K~^ulnE<@$0mO?K;jp*js1gp?oq*@oZeLTvWV zZ^MQ!aSuyJgXymBrEw)u5UTZcL4VMJ@&2*CSNQp4f0UMrKC0c|UAw{4fg!+bsMu{7QWEeE{z@SreiI{{oq%HiYgN1M&B8AX76V%cNVN{eS;$$J7y7Ku4_iQI`k0yJV3cQkzTe zKhOirEu9cQeyoj^Y*(3r@Y)==}-I+^Inp=ChXyIOzbQX5o$#|*Yjjv5y9JA9bp*n`vv9_k2F@veO1*M3(@ z+um*?#sDD1s;CfG|3=qcOaM4go5iz5farrT9LT5Avr&t$J+@z{!2yPgVy=kAATt2H zc+&ZpUyz6wgdcluJN8^0=gKCT`{lHEF)B?P=%6d%qX63`o}NrM9TKy7HjCC=b~se# z`?)%*R@V{u>Km=VM<)0>u?YU+GoGuvKf(+Y5j#`-2%N5%cNi^NqqM?IE7^~gzD;h$ z3*U&RFzj~mTsEND1?D5gKs)DmRFKSG^JkhzzYg2O8Ft_iKmM%nr~5kKcF^f0 zXl*Sp)DEybU%w)rxNkxx4B&&28s-Uuu@7?sHh@zuC;mg+1q4hO}88R^#GMTJ5s%f!|TF2LU zM`TajoS|j~Y`@Vz3_%2vd}Fs@j3ChCb?*O&EZs?dCS>I-35YW1dR_7~3G#{+Rqq#V zxDwLae!8lqoPO2XXk-WyLTw9k+j#p4B+_xhVL>a~fu5DE|FhIz_eCEY`f$IzVgjz% z`v4lLzgc`ue$MUQ3Yv#N`f&SIzbT zV@_^}jsg!z%d=xat1<1EFt|=(+kFh8;r(YBN&yOv7u1JPOYL=``U>s|?Tj0SE*pB6 z%DZC?>CgfNgLpz?V3T2=T}hzPYQnx2kU*YalOrJ<`+M@ODUKLtjK}0xGD`Y!y8#aZ zqioo~L}gPIzo-fK020z4Ju#YRM&_q#;?n&9Zb=(Ms!m}JRRR?zP#ypvOU%n5dDu?9 zISpldf8#{$4aqUj2aq?b$iLC83Nf!Qnm8f--#*UzqCx#44^4CX368$%?vwby5WKIA zM2m8JACKuSh}ZU4wySkFkmV9{HL9F;c@iNx5k$r{nC)K@@<*JHq1|9*n2llENd_Wp zt>*6=^Fzh`>6PsO3X~GhjdKCobOIm)-370^Gwa$1Y<4EJ1gm4M1=Y~?0LG&129aK+ zjvLCDd!T0-8{Vuc&G^_3-?vyIIqODzlP03R@<6{g7_{x0Eq!n?F*T^w4&6<#irgHy zQw^_8bp}}`Zx{-9d!Ms3Vhe3)7Bu>H@X<~gv>2TOh$a{)*?PB%>lGWZPfb_(0>~|m zQnOYQVfR%1t_I>b<`B0T)N1)V)zC5)k-Z@0A)-A#TiOV5+BoM8>={I@HKM`NQ<4aA zai~`-rj#>!bT_I>0u=5F0I5RIcE11_aG$tbWe$lOF*%_$pxSMi#Tn@o@ZJ(3*BqL= ztJ`lpcLN||k-=yU1n$z`Sl6(;9i*SuE%Q+_kXq0Yn}Q?Rm30lLzXVW~wa>s-k(qgu z?D2>v+&E&Wb&k_<^zH`_zSS=K?*J(E>zfA>rx;4&GdyON!T?O{fOy88%z~^sbKQY^ z&7fiXgRp=4hM6&lse01N0(?JW@)KXhRy~bbmH^i=ePqGwi+GPl8sLu;vvn^_hiJZ? ziDVOFJ+EiV&NlA4HjifM(=||HfwR7f@Q@&DS z{+2mZ@_Da&dbU+z-DXD(6z|pd^%;|yLf=;EvV-qHg_KvxxwDf~RYza|k&m+$=Rg~v z!vj=jp)@?d7>}eM_kTQ-8H9>O$=ZM@Iq4Wc2?D8M(;J`^@qP#-i2W$w@8ZL?QAa3< zMhLU%aC`qIpgnq6y-V#M>|&mtEdgi}tnaz=!_$~HvfP^rK%;wJhlx8$lUWD2I|w>V zOlkN67B8+?cyI2mnCo@GJaZ#3&-`P16?aI+$`$oL%<5>!QN=w`$;t1Y+l$?GrbxV& z!N?|HXxY0}?RzIC5VA6Oz{(3$609S%79eC__~Hg&C&j}+06d5D+Q7Ek=hlawowXI6 z4u><9M_7`H?lraI5^##qeeoDD@Ud^`*iY=t)6A$i{aZ%;iinTEhCnS}{SiROx-&D6 z4KCa)Q_^YAjS^LzANp@Z;NVm8?bZ6t|MWh9+bUZlrX9qPvZlv$k{3`IeS0DUFXH3f zXSK;608|AcSKIqb(EWtKm+bsF#p07MCJh!K(~bbN_>>s~<}-bo!YzZ>MPw?&%Di+T8m|`1 zf?~7J>9iU(Uy^^|o>*zt*;*nVn6q|QA?ivnbSZ{k&F@DYULbvqHQ|${r7!=^L?1I_ zy`hGOGmT-C+u5T%v*DvtFc}X#&&cF%qQ^e*;40mTOkJA?ktBY&u{gKHz>S(w+dIlH zOjb!8r1oRHFgk6GC!t!ea6%n7gVrX={&5m3ydF}g^JdAx)}`B8OI&--48iI@dMTVX z)r__zvbu(=`aLMioyW)RbSxF)T@4Y`KE}y#Lj*Bh^HtF0d{7}tWm@~}W^79)Qgug%96{>R@>ugnmg+4~nOAyf*?Hl8aP@K|JM_o_O^36y2$950vo znv4uF+}3dMA(v?DTpXzEhj6Q36S6NkPWz&S>(P`g5||Aj1e;Jti@5M}Y>Jm9juW9M zZ|q!SP?>YiTLUiBf1@UzSj)vPbaIGvJO{*KU@K8@KTx}Wbr#_7zS9>z0YIHXf<|XT zz2gtpK^qO%(!8ZJuX#(CHh7O#r)t3ZvhpnJgZH-BxJ04(=GF1Ue${+>ybdxK0eVd& zHA7ef&nkO`1H<+1l16Oq&c8`hqzZtUok7Lo(l)jU3E-}o++J}rq+Y|g-SiS$4H3yi z-z{VtK>{FXT>PJSYNrAf`PY!^hdq~G3F;vA`a0eEAy=tatwK9dZXo`64Rib0nV$BN zkKCseIBmgnkUryr06Yfh?+|&v7qi;&It7|kX!id0>Py5y=a+(qR+Lr*T;rmu?lgcq zH@b|y56LiwvrOhz=RJ+kMy2OjnCe?y=p^`>?ES})MVEE|>AvQrNsHZxsm;(Ier)FZ zqxz%cin@%i-EHnamBA+MUb0=E)4UoOrqNBd?zIvOzoNd&y0s)3tapHWrD^G81`?0@ z-#vMIj(jqb=Y{f@BTh>rhVFhQL(TRPUT(=z$A~@Q-zZR^fd~frx|y?*_kQK@ z>_D+2ZZ8(ZmP@VEmJX5VsPb0RY#M%)%$d+27VGPZ#<|+`U&Uyn^CG33*WKz(bsb`z zv=Zyib?i&r@PgsmSd>oRtEbuGQt{$W4oT2T`p~O%tpn;Y$!ygWY|Y< zjDH5TCk!QbRr+0nxuFZSO$pV)E_EeFfqOX2m3?4Q>*)9u*j=*`1hTa;2!mQO0KS$O zxOc@c_gZf_-rn}y0k1{;-uRl~;ogj*_Thrn$j!xFJk{~|M{}t8>G&o!YV@C&tI-zE)kM9^S$LnITUua3-%SCyx?trSiw!sQDFo)981dS{%vs_& zHngR^33&$bq0h&&lJ2=#CzXoO*H5k(ju*UPL==GOXl~T@Q26g`7iVQ`kfZH7Ji5WN zc*$fAqZJ|yGo^p=xUk1uV}KB?RFgQJuH=JH&{DTC!Yf|4E}p7$r$qFV0~?b0Yvjk-XEpPJO|B`mU^ z3{h7I+=dP`+c=uO#K~=I4T0d#^W&wtlusqw10Ab6y@$jE98hN9G!WvcJ^e2qpHkLs zy|R{=%6#_AIrP=3uF*u1T?|YuBcD{=f0|n*9)8g+1$9+JQnqA(_Zqt`RZ19GZdd%U zM;(DSTOwGJvl@1~=l)JrTwZrO5#odA+fbmt3u+IL*cneJt44oUP;%h#D2oiXWj{9R zJyw$vZ%91Z4qWs#(7NJd$ahyr&6cp*`$x1w8zmmvZYgtI2QO>7KO~4FUN~|m8L^?J zpA+~woBYdVrIK_cSdckzgU1PE=ANWbFCEITTUp?k99hl?k8iqAaIxGGbQ>P0PZ0V< z`?`T;zk0LQ!GkY2>!pku&P^<(8Lv`IPDsL%gMyfatj{sF`kCO1L9B9{@=LV8RnLge z>!@8_r9HaylaDrcZIH8(n|ul7ey33twwhS=sHw^d*pnxvSmXqnrMY~-7I%|vQy2XL zUhPr@ewrADYXJ0>*uN>V9oT&_a{Li-cmNO}u-uE$7^MWx(BWXwNmn%8uovN6OXIJd zjsgrYRm)*S95uPFbrpvy89EF;MN;|GWhGOBX{?)O-oEY~P>CmM6&By~tP`Dn0Z*zV z5eM(a8R_`7(`#bY z1I*u&GR_MUMX-=DcvDkFA%_8RF3 z!d5eoNFd@zuoP4{-pp-6t3Iu(?!~#7@mF{r*MLeqs)R86I&uXpiSV0V!eB5Ys4!W? z6`4)+N3xWR&A{UIUo^hLgMyrZzYEVKzYR&2`z6o~ZuF#3+QP+D9ec`h&(HL@7wK;U zHh%2y+zWLHm!=#GfYg(!VEP@T&q9hf+Mkl6}gpTSKj_b2d?_F<3LGjtR{3gpKbZZTT}|7zPVAQ4X_ z49W;m7`;B!-+9YfDDJPEurvp?hI)_P(QbpLnyHrMUURsiZKJuYJ>;{%0f*o>VnT?w z;jggV=tmnI*AgLmijrK9(atMe9fP(2x926d+TzM(y||70qSshK^n@Xyp8~EM*dx4l zzREeu4mIP0-mO7%{()czfTz6|$#GbpN9Ie$j91g@Bi9lC! zz^{V*&4Ujvi6b~k>1u0puXuiqQ?z(uXHrn^*!c5zX136bQGTB1rzj%xsGil`myzQy ze1{CLv_e5DFY6@*W1sY4TavP4mw+8CB{zP6X7?owN^D_%Xcw(9>R8twb4zPOcKlL+ zbvSllL~C5Z|KQTwzAZ(!F!og{CTV6ha)2TI{Uog=x%NypE#T*lQ3+b zM<(UD7Q}0bn#VYrGQn3JD&}Ssu~X;c1&*7#}D}Q@_$Qv(9dfc*KMo3 z4}X2aaXdE2jlpi_ym9Dcx!3cRe_QGpLLko)Z_F~Xun{1%8?*+6rE z6C~o#BgU1Z`uDXKcA2s&8d(V%SL9vHTSOnjoz3KLQ>o#9YTVZldP6&NLgPS^RqUPd z#7_dq=+m9hQ`!uns2mgL%*<5fBJ)eMRtgsu?7mVa06YzvoVwZNH%p?qqo`T`4nFOD zy>}yTWiqLS3+wPnkmi;QmNaB{n-2zjY&?SwMd@#z8T0`P<>}uLPu+fl@NSV+ipV!h z%^8&SQGmdYBF65$oYP4I079_YZOKQ@FAiW7rO^$`V_cMHj#e4Cf*4WQu}%uL7vyOO zf)#gd%585L+IAGKWAHRhRq8WSOf2e=MADa0kfI0B!Mi)gi`vVaSoX*t<$*hZr3N_DEY` z&`RR%u}r5T$WwnjC9nl*)~DZo?_$qzImm=)g;Xsg)o;+@7t=W~d}{cG{)3Kvk*D(w z`qm4DsRo+JKZR@@1^yOjIXtOp1pWOS>9B%RXKV{pL}Z*Ec}#9eX+%;{~mq`c3n2CY};bW=nLG3Mk}m`}ds% zOO8%aSmI+dQI;0RUtpP>Df;BMRzGhVEtXhJ!2&`SR@L+Ka?i)HC&e&gQSYS>2^T&u z2isJ%{$9#7bu)^_8Zq<4dl2VupiHe`10@Vywy|l23ikbGF7U=H?Au*? zhhfUffYQR=U)6no(0RaF6wk%J1oq`6$npoKsP}aoG)dpG4dAm93r!B7u6yQv@;VSR zjh32XG5}_?ROB+ST6jWh<5{l!iSJz4A|Guxv8X~nRI=m6CE6unx#vCd#A-det48-M zE@`MFsqNr8f1PSMMSHrzCgP5{RIoNmM!Y?=RHvz$8ELF(Q@I z9oF?Z_3do{ELn<$uG;jx6;cd=G_DMI4}}DvHAJ(`d~jX;77krY|Z^vN=;`) zn`!^;;=l;Y3wik9+}7NG{2o9t7nB8wyfQVE#rZD}AXZ#QI{wo~Csq@mk-nhYw}OuN z0+hj~K+7cnYrSPxtY)l1y6=XFyIw;qa;oQ%woi{M&pt?L(^T_y$Smv|XV{SYC_;%LQt9-&RQ*3z00K@xU zCQgKkBe-2+OZ{Zj*Zd8=-|vRg`82RK7M44g@8AKqvF8AA8~b#I2LNfoMC_YM92r|Fd`%U%3#f(c*$bbmwGBk@!8eR}Zi zDFBO|mr?yM&oix(^PczOUwKe3pdSLP>sf!Gc?59EbV+{?<^AsOH>HXnC}sauhAQ#o zx$4?lBga1AjJ_7F!1iHMvVkpr9{0oouCQ;)6~sYjvM=J%Qyry54pS-FMADqJgMoz0 zcTX!5>?dMIf}VeYn&T-Z`7E%5F3G&nObo#Ql9ef2XcMm(UryU$ zLuo|~uhzr?i-6+K>||^E?k@5C%t>aR&xd!^wClwu-*$Dys8qhCP~8hW-&U}ldj=U| z7TVM~B2~P0k|hv^T{2j{4DM2XR`gRNDPd*jyR$Dl+phr2lC|ErF<$M8FD@OwDtG#4 zJ$)+5f?!XU)!~2gP^UWeQI`T^c8fW{a*+HyAo5SHj=+JHfDZX4){LrdAKMY6qxj_0 z9ki!tV~KCG0d!^A5=q7JXXl`6L0dwo+LZBt<}+@jW=$&ZDMZ;LqpBMTWs> z+m^=BRneWriq~Y_450fT8rymSL^5eM%)=+R8#fD z_OlN3OMx*6sa3CvckTwmZ;_K4t6({M8Vd0)y9CRPkX5(S(0f?mOC7FeeT(#(Yi~IG zg24{r3JO?4@={^`rjsF`}-lo)WbG;L7=Dojkl6C}TF7D-2Q1w}i)rswal!1{GK1&Vv z4r^$8k2AWmi;klfCNlP@9sh43)Eb7qs)#!ncf%k=@lAV`qnm@I;;Z&hI3ED^yj0@n zOi2C176@+r6@`}z-uSlG4D=1i z^c@MvEQs*YDao=(lD7}-{CIFy$f=+@saQK3q|F?Kw)gi$oj9Di^+;mV=RA7_{BCog zL5AT$(D{c|t)IuzTD04J6rPj&7BDK`` zLzTZ{(2)*^8hTHBn>)3xMf_Y?&$_j`91m_RUogVIi>F@7{EU)m=<<W(>b#@@gYss@ruVRl?65$tD8X>25qT`Y7j}63V{;2I(a-vu-%3=`O5X2J87m(J080Y!0=p=yj|A#SD8Z z_*bkkOZ7}Bf_UxNTam6OzA55~&Ep4}ie+?o{U)OGRug=3!=7h&Tb6=W2c3P!_&3ku zh`7GHJz`BAbw)#XctE6fTlpu zVtc=NiDiVp-nz>hHh=YNVCWOz&m^tv-n#En4jOs_Yo!N=1NtO-Z2hGg z-)*_!w&`ZNdUOy(4I2cL(f0|CZ0|4Ef7MppF#tgn#IJ{Y?{i!JhCr2ekA0AjFvYlv zHkt6{MjBVvAQY2eTeVQvxvTCN5MNbWTok$7@PvP)=RG^imNt$m5->cJOBtoA}c&s1o2n@En*63zeYXReA z(?WUMgRejG0JJ#)wel2Do5+`pfk)yN%+DGKU-1H$sz6{a_*jVe0Mr!ycjV_4UcVzc zSpReTawo%Uz3c0m$WCNv(X9yypn$A6r*sj+;_@k+CGM!Zruh7g`B3|-)pLs~$$^`G z4$nXOgN`i)IBJ@kN2V4HR`esreAjPc6_20R8C8_9Df=&iFMj` z?EGBW889AK%PQCwn`@j2}gl#L>nh}Oq-FzI?YMkUV!`N;DtT-RoAB> zI9i1!;_!u@Ht4<2$AGQq#MJM<^}(qS{mghHDg&DN=S7?8%oUv9{{-en%)Jgzj8J6w zxfinwSmUGI6H}s>hCTlF&AAJh;?3w2KQ1C3Xu5aqEHF>;n|S5=cQRyBjX?u`f#G(7 z`=>m617KeHTOSw}^NKP^?};h?t6Fyiv#gS8gl*#-bl;s&!bTPTb{fs@zje5tqnvR4 zsBx*~iZ-eiCc~gerzlTlM}CkX?>z+lv9S7pv6-@*Gcfb?{l`k=TEz1Vtjchi0pjgB zKQ!^&6=Vsfu0-V67zuAf(BzL5K?bY52PAca8#cID+IH_>idKog9zZ|G36cdWD%G>- z?wb=iyyQz1YVLXj@h@7idTd300o;$X*JOTOb-PdOR^s1J5Ppg@_BQTyfdmlC2Y)(5 z1$H?faP3Sv6j+fvx+n4lLW9cXO2a)Z}Y+{#$aQ)#|Lno0NG zFzWEtZpWvT85oz2$JPE(-aM$aDoH2EvPbFU8&uCP$;P>7dV71P(GOxCm}kxL0}p*x z2^yWV+G*MvUO-q=tHY7~6tE3ofu{~;BGi3fIs1!^uLhPWT5M(q7^ z#~v*YhWS70tKKQynB$wp^HFiiM-b|LSN?p{_x7kHX}8(LkGtHBN{FQ7fGvksa_dl8n}vw*p_gGuIft*7IJ( zaC+=}`;*5dUF?61iKA!u(+;?PNTc_rE_Fz46O~W5{0rJ6ZMEzf1-Z1uIxP^b{ z|8sxr`|en|^NzOp&g3BSMUknH2Qh*uJzb>fV6%dpVmiDi@gthO@;(;yF&$-Sk@itzI|}*q!=Gi4!NoU0mz(a0 z9PT`O9sxbhvF-F^U5!-PSd^T<;&Gen>k#7L>BV__u3f3$0Dt##aBovemu0FPHD((k z8_Rhbp|4#%aNI~|s3)9y`sJ>%=&Rk9*~dzKp1FWd9|x%#Yv*-;_}L=r&P{29`1MOv zv$BpY^JWcx?zb+j`lnf#EjlBYP>Ymh(0Pe}b z7OmCw7II`{6vNqD#ynN#0+Q>81B6-zz%t>xUs|?o3D8j93txPCMORPGO9bnk%p$EW zCG(5F*@irSj=FSpVL*&LsOM(G{gig?qOnUj*PaJ!@|!e*x1DPDiec}ncawSFvUZo% z3d*AUwJ$Cxz9+5$DM`s|_xxqyzIkDIqu$EzIOrn#G9n_@X|+nJ@&e;G3t4)3eA>XiC8t#5pNhw4E%P7gBz6h znm05VtUgd)ck37&xc9$NWp#DnoR^nQ(I38n$h%(g+<$%B&C{QAa5C&mS8TwdHYYIR zd9dMO=}qEi2iEvy;007Xd-k(Wd^6Zq-?6^&r!noxck;1#Fo&{PLUzl_RG*~8o3&lc z{o7G4iy|D}Mgwm$1oWA#`JJR}j9 zA=-56;yJz?!^F$u!_BydCj7U_aqqKxh^mZ&M!U7_5#U-M`M}}C?8Qb>in@r;gd+192rXt~JdiS~K2jY@N?ik<;Cuy)U%(tsohS@q!nyVFp&X!tO3{ zTmsBo>9B>ca4+t3riQVuN?Mdh&NEKDdljU2~@Ipl243^V(^MmkXU=kxhKe*cMFZe7n!V*6SU9e)>VR$ye1AchTz*COn)F?BSYh^o96ywjX%x6`rYXC z5O2$-_6XeXX2TC*N2#_>2!-SMEHblZGwMeU7}eAqY3Mqx#K<%)F+}VUl!dO_jq2E0 ziZOONc{U$foP!dH#N183)C`XeZK;m;tS+S-p7PZANK}`}4$3Gx(yDLNMi4)cHlINJ zD8h)Cch7T0v=w}$Wj ziZcZE5+TiK{}uSvZ4BG8?a#9DL-^*`duA7S@6@uaXMfV|Lusv1V`uVu_157w-@RjE z4dz0Zb+4b}UMNK<7ESFkiZZMZCG3Bnaz@D8JHfLWPtg~bbipP-yroJYI~G&H)x|O) z>jU8sGpYy~8nme-VIzjFZsvlp{^nQL8aTgj-{Q6TmZ4Rs&$=9G>8^i!^l^!aOq!kN zI!_51TWh>>u8Edxq&n&)GmeXa(D^1%={P%HvkNbi-Rh`w;(8l@s{amNxlcpU6df*9 z;#Rhi$=ENK!2=)mN>yK{1~sK3$am_!n*|~6&5O|grd6? z++y@jlV1;u8xTl)eI6Z>Sqc^YU^25Y5lk{_> z0BK9n1wyJlL3k^VRcqFE!mCmR!Yu)u+Ng3~E|_)S-{P#6mDCE+NsFyAU-9EOo2YP1 zk8Z<<`F4jI#rWmh*Pc^wI^g>&J3U>F)aPe{b%tQCh7>gBI&+=8@dm3WUzA}@_Nq;L z6^!jR7diWoMA{RQi^ambv(Qa$$n#M)9t~XfIzyH1?fPlhCvfdsy8tMd($lDQku{#{ za>vpaS*cRujOT){EdMn#2t$xfQ{C?`gf!YJlQyswGwMao8>%-mt!3-v$$n}^&)K!v z=kwlT{Qdo>+swKLZc%zOhPo(?T1BkG)|9Y8$@F>sIg9DW=c8eTSEFU78}lJ=j0@Ux z02X*{le>E}F*LPB_*HBVEM1im)iU*wtT^hXIb9`Loq42}@^S%G*rd>S(e=KUy?D&yPuZs?T zs$=T}o=ktF^jzO|8Rn<%PZncB;-m3OlcHq)Qt4t!wF^|gpeW?_JW#_)k2*+~c85bkg+{ zGcpr3aUX?hGMr>>{PNNYP>+Fd{STM)%=K+%;lmL4h*$E=bbXfy$Dw)mUlRQ~Ot&wV zu#kPcGoEL`ZLBk%FD?rL-x6|`Q9gG<{o(}cb{%Gra(6D-_9qTaVTM<0Qeb{~x9?Zc($4~+uIin2s@WcEVsYrOVJ z6LKUc?xDq}AzsPKp~h>alw>*z&@&}oEH;@vu-);n|E*Y11qz1~hFf z)a0Lq-ERhbqiq7+@%dSkM`n9@XR6PdO{s7HDkr9+hiv*{UbG z!B|c-Tz((niZ$|3i)L>^e8LpfM`_k)a3C=@MpfR|ruAwZ-DuAcCFt4tjnj0&P-@=8 zVChr^*8pCZcK3Jg3FA+lIsdU~U%18x5kD0$Bx&QF7BgB-h#r}MVP5K0^VoRba;o&v zen*>sLvfpQ)3>%ep4Ju+FHDp4wIK%<6?2|3n3({p-fPr=!R#0$%k2h z8}5PV0gpRJv=@7bG1i?Ax4alIAMS_E***O$kX9d%uQ1Q>(NA}~0ll9U|4alqw+DjT z4VUgU7u(uozHShrdUm5`ywfTh#R07L8wB=eNBZvkxD5H$6X~bzG}4FSo&M;YF7cax z$93R(!5Zded#ps8Tdwkkb1~^}-@ifmz1|G`dntjPAE-pD?!RLgc78oQrPL^rZ|Ln^ zW5N<}xqR`Ggp?m|`xpVFQ?3f-9<|DvdvosCUd0j-qGHgv|tX7^>H zV1IJ!wgcq!C-XXLofAHNhwe>QrJZ+cuZtWyT;o`ASEb@3`J2Z(y&k9O9SS%{7Id57 z9t*l*oi>aQB7|qFKX&S?ijpkP(n{0o$tr(LHPQ%pR!1KHB7lkklYCJirMslB=h@V_zp9d>4IAVY&2ZRgT?Kv3edf%TRaTFamB0XQ zIRso(&=swD43%Vq8heg)#Yal@fI2Pw;&NI5#V37t@zuiFfWpZ0Jn0FZ1$G39hnUK@ zR#SZDM(L&v*pMs|FM|YaxGIY^-uA-W_7mrEKAOA@8L{PNue_h?Yr%VLbN)Kx^51+V^{WOa70IkUB@|xg~r`FWYITXbB=F)Fo@$FWeEpo z+r4SjY1X?Yzo#L(Q&_0MswTlimi2y+J?ySOpeNFup#B^hmamgS&Y|Zn^E}z+*E(7k zz6JH|7+&z$=k;QXqIZtWY#-G?2ZReKm2ec*rD#pgZ(Bz=-n&t6&yg>BWZMsF3TY3f zSxYRbc}jY@=97jnrt(w8mcX>ffT(8$60TVBN6yJA_o^elz_OPLN$@&&It=W{+_9$f zB;O01Pd*4)cJ}M?K%REQZ$3s6*%sTJCl5Q@JmRIjVahIYD8DKC#yZjt)U6Sb{_A90 zoqz3`hXcJTB;;ecO7^!HfNE~#tLXmwWv0NcTY0*eS^QI&3K{z&=g_~q=n2NhU)_I4 z6}RvK!x+~FjXhBKV0$h)+)urqT4s`-oLFKo@IV=&a)bUOc_Eph*dw?9QILc`X7vLw z6ZTx0(o*AsLid4-M=kv^Ht65iX^9^@?3 z;8bYR8svP>uvu8^BYNQWD8N?Q+V_9QeE`WI_dsZ1QA)g*m&xiEt1;);kpt1D5oLAx z9?H&r`*g_L6~Y<+9C(hxe?jHT_>pfReivKwMY}w41?e8JeWnrYQ|<2Aaq})|3n3&+ z@3WO5=)@j1XU=ThuPTtJ5v`Vmd`$Y+dh$wIY#^Z+#D}SY`bHJ#M5vK&tTQ7qC*}0_ zJOIEEVsWkyoI%=iusq{Eq8kD`HQP1UVn>IyzXyp3r8L#EpF`CpSb19jBH|l$WzdY5 z`Yju;!_ZHU)+LRMIIoWLPBVI)=z$p80qG1THO0*kSACVQ$?75$w=j@1(yJo!jxt(r6Za%>G~M??foX%cy<1v zPL<(>1BOQ?nwk8@h0YewA-^~utIrErJX?~$eCAnc$S@y`_RX52pzhY7I@Z6T#354|T^M1MRl3}qx~hD`n=vx0GRi9e$_(|jx1`JDW!*yj=)96T7+^#PoQ zs%Iy^mHW^_M~9#+y5?S-iG_&o2irQnE2rl|r4-@HCm?$sX!+>yLQ1BYPQv1tR4yUP zh6B4^J_}W_Y7sN^nDnrpPhI3UTVE?wB+in%NPSLK433EPQ>P*{shP&F4f0MLX`okB z4~ms}vULc;dt)R`tAz;~<<3tD`_IjU$$}I?B!WdsD4T7^0#$`8)I@$x%iO65N=H54)WkME40HBSrX}CWY_3b~KV?v1jzZ+8pTf8s{4y2?}bH zmhvUeGF>NOn*Y;w@_YuyQJ4;>`y&LpY5VkpC3zyqbky-E0=Fr)LcD;$9%vms>?EE)gCH zQ=bdW-h5rR?)Ey>(sFsGGl-e?v zDxXvG2nNpn9XVx}7wdPg+g$)^a<^(@7SHqIL@VuF65BmNu53G`@ayMLgxoLegSrYZ zw5DuKrdM_Eq16;5Cxc54PYOgayLGRp19)*fGC_sk&1enA`USlooTc-@^!fw<*rilG z8D$#twjIb@YhJBRN^aa@QJdh>x1yCPb2Z)=eXnbbFW%%RKIhNAN9SQ*(G#7cd+Y9| zNDO_OC%p!@*RG<^SY{;W@R^rs`O`}PAk1Db4cLG4q6c7Ls zOwHD%jL6vsJ*D?9UcTHKT5&(95qyO0d{QA^BmGaG z{bn=?Mjdqao_?sEABWi@a1DP3k?3Bqf_u*osPGuM-PhrJ+~;o5LUl&%aL`dUhTU zR%oUJm7LTLKn#TBsa;g6m_BjDgoZUQg3NbK*3XzC2&K)0U4!)5W(g}eF$c>@C#KFI z-YZVbzJo1=qEjFcFW+DT4g{k4Q(w(ZD~GukJGAOT>=D}nTf7}~(LtC+W}n$~w z`l(-E`?mMQkJ)HnxO_8%1>)r^fu4E6J?XUG3(tbF;a&}+o)$( znvzRVl?4#!@Hm@25c)P_Dw#$phi^|S2LxqPi?jkdgbXu8^rq8bul5`9?tv_ah@Tb* z)S^Kpy_^`wT+klFJlzS3Uq?^{4h{48V_lW}ilM=VVTYK1Uh#L<=AO@S5Wtt|d4pzQ zhdZP#FHij-;jhMtwZu3qkpla`Q<&X2JWqq=Uq*nVXk=1toV~!^Qvc$Q%|ShxioYRn zI*5LQ8X)tfhLY_eoqa`|g`fi(z9mbQA2z*|+t@nue4=_&!0O|{!N#O-W6bV)6a*H#!{(`(iu>Ngek%F;}P|HHeq)JqKYeZ)r0`ufq9s+R&}qtEVo- zymNMOeix0_fbObksO&r?vQ^5zu|z}wx){N-`Q+A-!(8OhGnQ401Z_fpKuwLm`fxgW z^dZ@l)}1SUSyRbl@BCCY({Q53Wp>;xj@FPs)aQ` zdZ9N37JxrZv^ARarlL^V-jphbMu7ra(W}L&+QNrf+>g78dq-M&3vv9Z8W{{u#!vjP z?ihmWBN<^(G-g&~I?MLY=!|=@+(Wd&yyqQi6ARVPHh=Rn@{~z4U%4q`Qb=}%vE$Qs z*gXZof>n)uR&M|jzYGYb=^9t=K~Ty%eJ1T&dJbBYn|Ym5o0t3o06_Y2Te{JdPm+y& zGwkoE-CMmE1-utS&6tE=i@;;rp4Mu3+iGi)<6q?M`p1L^B7Z_^&(RbgvoUY}18iGR zEsn|Qz~0{1JS5+meSl~cS)B1!9<(Z^o6L?;)8IY@u9&y)uPX*pImq&oMV3FTF7HBf z6(CH+)qZOOS(c#ZLTIy^pzfY29~2Ux8cj@AdDFb(_C0zsbqvqJ{@LG%8o%{0e8lKE7-kfi*>a@r3M?hD=GjrZM)?Im!LtTm{vb(m-#P(|wYh1;BW7jcU zhHUh8WnKd=h`+yK{d@3S?jTHIyBmp$F5AF2iNOacQ8MrfOrT-<&YxZ)0f+n&fWhwr z`#v}!DH}7*KJ8#|nKsWJY0%}eWBlmohdp7~4DKe%*+BE=UBm^nK<$hq3o;j`XqG+c7##u-z84<@I_w};9r(_lJ_ET#GO}GdMRTRa z*03Mw8Fq9TG(Q9n^fBgX%2K@xAT~<6nj_+kVd!vkPOgrLkfGQdi~*QG3@I!fISrV}9|P>zck?m#!w89u zT-c49tWk;u+0T92qHecFdcqeg!=(lX9q)(tPyhgZ`(YGAd5pQVl(3}e>F**v0J6u% z&&-utbsn>%|7WJ2;XH_N4d#f-5u{%lkWkn@lTx&14gg(}(SSnKth{{93@_+eg1hyd z7jAfhk&iSF{9xasR+kkRH)>C(u+^v9h(r`kaL37a7B)8G1402!k<@Gy-Gl`8CT&{8 zbdAFE3v{K7l^!k=;zdBwq+YvB!iQtt&UAFVSlk`H?a~#~>gTHSYO3^{-4IEYPCNr3 z9aQP$Ri*{R=bnEj;WgkgobP+>{N6`Z9{|Fb-yX%RP#IeFe)mR!+2gI38-C5!_&yc7 zEgwX+4C9uhEvqAkE>Qh!5=&l6VViEv5TEac$D?NEwoB}zCuBMh^9ML>wQ>DpX88KI z?4DT@@<`P1J2sQ|6)!Q_xFVRE+LiC@RNQMgJ!X~Hs5Lu{?;NM8F*$NeiUq*sb+3sI zsN_N!ONR?(#hR62q)B8zdS2rL|J?)!UZ`UnzNO`@GmYF5;pA$SHCH}Z{2eZWzJ?!m z%Zij?;GipM&{sWVJHP48GUHII0Je_r(t2vvGoULJd*A=5vJW18jz;XM%DYK5nseJw#8f1*cp-r*osGeJ=glEq&NKDdn6q2pz<9mKaE?!=vktq1W7y7@_ntoXdNSl=P_>AxziTzs2vyo; zrF1WgfDUn>?B$&8qF&AsaHI%78je`NB&H`D2=tIu%P|*w$1C>_v3_q|0YvID7IJlQ z@B1Y}c%L=%P}k=G)t@~Jx@N9)N^wPu&Iz}`}kW}A{rM{hk0bva&>@lEmoHjEX&vW3~$SCc4Hxg+;ir<@+QQ` z;jet^=h>d{J7c6?aYeCVweM=zzHy_b$ZeUX3)QhAj z`S^%#=b1W#d)m^KXTh8Z&ah>tEiM zVG%auc$)pvH{ShgLY_eDYeViDDyDHi@7f)V z-Y>*jU?{1(d+(ODo}g7eoY;kq8cDoy;Yp}^A%H38%$pm+Uytx0Yqj*#bGeRu7ew(D zM;NBxp=;}w3n+bgt>#099X35Bwd+onDz9~he>aXMGM3YG6uq)p>r4Oot4rVgSZ`21 z@wIq4F0DKXi`dwT+Z550^DA{2s35CrYcDEl-H^6vPd;d^a>D0cU&et$3O^f;OA?hx z3=s zJqO{}f&&4R!bwTms8VkMrWUoCnVHAXG&5kd6bpK#u{}-gyICe((VB_RvErf&TRnks zfDYf1SZ)AmQKm#0 z4vVc^2=cqDBG0EEaK*tj?CBjL5FJ5#A0V-Oli%+>MGARNW^8~toGEJBeDvnQdV+sK z%?Zl24QaJzfVHRB3cmze^;0H=--;GR86yXxEz1)={zRFT=-+^n7&{VM6jpe}oA2A$ zFm~$dqKGXsErBFTi@e?YQ4NE&VN1pPBN@yXZeYYb-?&c-I#0jfM3SJMh=pnQ0l^(L z=Sf?)1-{x{K-OUDnNeF=>5H|oDQK)xh~^2;EWB5FD`F2^WoO%oD0#t?UoAJl z%8M>&HlJ4!$r}pm&zL6hF3dR<%T@HBoaOG?j-Br~40RRexwHGK+Wf^-_Pa+ZHX6)X zwc3=0V@9w}vU;cJj92V!gg;F}ZN{5AdCy8w2r0PO#gajRw#iR3&Acu03P@)AYk0RX zOsDo@96BERVXLJV7H^9(KAduWbl-N=~FgVSHVg=#z7yYy11bJuu zJDbGib)?gduFiX5HKRN=nRimt3&({5nmIR}K(&boQ^GsQ?Q89b?rw27iu)(1AL(E_ z<#obvE|2{)$%}h;3^KU5l>etfYpFGUo(N9r;)KqhW^)|euI~MUBXFBDdw2$#tD5MI zH8K5mbk9*%6=iwc9TWDnyBjmybH}BSMV13hNF#X}#C*nDNG)m&+c6Tqu(%EfE$uwa z;)$3n_j=VPZcfRul_f#nSZJoCpjs{$XvI3my7I@lu%O2RN$Dp}?qc_Zr+p6&YFXR($7`E-i+5qf(p6Rc~z=HH;T$>CkYjahv zO*}uRf_P{#bymcGJTi2Q>lsP?{?}kigR*ete&pZH>(8I4RTTZ!NB&cmOEsGhY=ry_ zgMN@#>bJfgaD(|k*0lSlOaJeXIv}t2K$y&B9D2{!X)n2M+!Cr=ipaY{^Bj`cpN@B{ zxfdrWbcsf~U&_@9@qWeOc&*(k=Y5Uc>{R85!i1>nCsj$gho*P;R|+3w2N3$N`Je&p z0(!jMy8>DhtGLm{MW_Jc;$kGlf>cL(V^9ixIK_xCLkH?dqV_^`P_}kb!m!G+PDOOq-Y8x4dvBsny3yV! zY#RvuLnLG%+^ahma$#n(l&>6@-f6+A=&i^(Z}C0RQ6 z0+<7!!2*5{M5Vvt;&2>%$3K5a3g#J|b@7{^Ob^CKA7W0q=yTORSA_em*HV;_*BrdN{w=0XNEumMZf{3+{E;2 zv=m4|zmMy3hPhg+fwt1;0M4+Vl6$(UHE4joG-Yt2r*eGJY}<#L`woT2(^ud#dwvJ4&WY%E!n*L^HXAMCHw1a3m_RZ*p_nJwwSC51ot%Nt)< zaj5!cZ`imCq+S2qS~%2G_L~twl+s!p1RK20dGk(r_N(zf8bL`FI~FFRQ*tG5^&!1B z6?Ypqxjay?mOltxv|GP85`6g8nW5$_N>*)|=mA2pyjH>x7e>GEJSXH#pMcia0?MoF zA#J@*BQZhY0kZiCvr!16^BJM6Nx(Q@;3&f zWhQ+u`=L|i6U8cQvl}y~1P^b0RKTt~%7lEFnjZ7u@U;j?hhHTbg}YblEQ?(qFBiv^ zuP?#3Hgam6@Mhi+KNN4TW=Ysh^2cLF3ZJOWd&W#vW*+BA*38qq*z`V6^U8)pI-?${U7I`!(=Tl=v-RT z0L~)TCY%_+p45is8sYG44#ZugTnb5s{0F?L52YnwJia~+hP%6$nC#ejXFKHj!o(Kt z78WEov4Nwk%yI`L)A-)#%N>xR3$c1IiOs6l-d3!FT9=2!arZQ-k!XXmc6{dAC3G*TZEQsSXY9H#mWbX@?Zhs-kE=qq6GJw z%rmc*%i^|bv-`*yd~y>*K(v!4PAgt<44$!g9G$nYh*rJIzLt=9dw{};>qAmGQ|kja zz_=lqP$FxJSWy~*daH4`9?kwQ3pgvCg`)3=ZTuw^$*ZWSOrN)F%Xdpp&Eeb3x;v&m z4n6i$4z<*FzBSL!%WJee7bQ_0-VO*lL;9rhMHu>$J&z;>j1Z{Dxi}A@*@IB=Vuon$PSjEI4#%mhX1*4 z>EmhG224f-(p>3^&KbnjuuF1K_WDl8~?!OuFRzmO9I`~0W9TYCj`cC?og6*nA@ zxzf^ZRz^!bg!9K%}83YA}Nxnm!7s@3#V#oEj(uvhCRANB|OySe$7@v!f?3g~3M)rv&d9yRt& zW;IcdWbT_53Xy1IXxg9Sq`X*cDY89q+u#DNz9+#@D;9+-=7y#ct-`GJDiFR-%Spom&*=NruM8(; zSVmgi-?0Wn5WUYiRZ_%7ra`o(*|QKb=A!SP6bq9h}{Ky3lqdB^a7 zNwQdfENgFaArI;JjiEvwF&%*n^fF)mWCkV%Z^Bfxtb?VL^zyt5IYkIAWq`TgkWYrz z&t}1n`x-isZ)KulcYCS6PX^!S`#>TSmj_ju;iW4+svcOhfw`4D|lGs9hiS2q1>RCrz1*T}fq8dY9taB_m+u*S{8A}5@j4m6ZmGLXK4=G zTQi2=h9M|#=g4B|)tY|vtD__0lz&Mor#OLTQEUG9;;dH%;!&()`%r(re-k+}MDCh} zmHKhG3PabI2;YzenU-1J?71(Yj>X0z@EHZjCo0N)_LTxgScmo^g~x9kdd#Za-CZ+3 zYs4&pqWFA7Mfe-7x_efTBgF0mL8oxRRo0r?We|ju?iaeUuuws%=fa9Ib`Dig+Q}IA zoy8%iJ49m61WX{lXsWyv=sdoIdVsfpvF`+pl{VUUr_}OR&}iXU5RPGU&?x0So6^$p z%Rnk(SzyZ@D{cm*&DG!vy$8<0Ec)gqA_{MCPK{x}q_7@sjGgwi+K2dZ(u%HU8vPSB%6nBr--BB6=GaYt74+~J<3nXQW`c}sReR3*vwun8elBp7pdpQO*Re?NR z>^3Kh$+XER@X7WkbuRwPX0=EIX>_PIB82iKU5z%eIGz@Uu*ypvfad6hd_6TlG#3~d z2`HNYV-zb?3hH-0zbm98*>G~~8E?ki_H$fV-^0X&Ah@5FS-wFo7)-3TkD0?6PS9nQz_Qp22ic!k+Ft1<&gKt~tmdld(4w$Cx5#Cgn z1@4n_^%m6h3d)Pjx#=cY*vz7@J`&7xe9r>QGM_=ro;lCY2lX!^YRI0N)9P5aiRSRi{*x~2Y(gxt(crpsCEeH79V!fv*b@fEi7n zKcd6`U&YEx-UItcvu%83W^^4iH)MKD;(9ZS&#MJ~fg7*)%3MS3Rw@|Zs;ou9N#4kw zy^XF2yb9*~CZ`NA*Wy7rh^!J2hk1Le;mq4qOVo6J%AVd)7VE^Rm!|6?Fd1x7v>6*3 z2P)AfGi_!epLCKpUPS` zvcOCTskLobp8k3h9qjzjb*+*J_@Cx^5E%jTx!OvS{iQE-FYuU#>>zH69JBpeTFlQh zx}=T^+O;d2QY`ivG!<d zQ)c78u(MRBA$)kKH%drQ`zJB~a<(ywCg6My-CbMxY}rU@thUtClUQ=g0voR@N ztrgsSr_hD$^A>fw10C7-Mh9*fvMLVh$%er^+7i# z7CQfFH0%|z(?#cMec^kQImIGf)7O-07S{paV)gB4%aKtPZn$OY9GJjsr%XiY` z-cQH;-;)u-hUw6Li^2hG%=U=4(LMs4AHN}8VKVmzSP`b%Ym0rj_Z@Oh;NgFU`GVWr zGjc*F=a6i3Kwkj+;_=?w$9OlZHoYEwakMbsi%;jtABhZDL{fD6#tYFMJN+&YzsLz8 z-i$HtQHy0Q=p3u2^7;eF@+k9yJUUg=)8A|nCi3vinUPJy_ z5*DXpBC_s-Eg?51L(wd#y=J&bxStuR$1ZV*7gPsCN2Bz;oM7uu!i`v^TEFwMyBbHC zyS#A28;f5Il8@%hNN%+=L=PcRZLv}mxrO$*$6}1d_z0WMi4v+F)qPA(0@yzTMP`_T z3(^O6Ec~VQj4U*f41uKOGCAHQtrHg7VCtX4BgVx+dRDlKyDiku2*qCM)*Waw^Y;-# zmi(e^TuaG1EAP=B?|^Igu^>rjPbOw^eIDjA-di8HwtE~f01AAVIbSuD|+m3;Jmu`L#7y~ zKI`D|Wc#ofM(@F~a`IFwtHh~(m8;xq*+*7oLI@JMd5))FSQ=;7F?Hj703pvMFS@f~ zz8dR&m-;l#TUDXl=x1PZVQ|?q!MwGSh&W(Pu1AlxI_`wbtVw&|D0e8Rp+2j!xdv{0 zXSB%HCXcD`949S`6@PWlPY$!s*7oLLd+OXq;a7ZdbZEgy4Qw7rnc0;j(321k$iv)$ zH&#=h`=r_GLWc6LW>dE2A{}#R6;yqWwkL0f6AWv;tVgKZbs)18cW^>^?%Gy@aWhK- zS$(K}WpDs6mUHO0ijU)87M%EMO_g~BxS~ZnL7;&`T00h-9FdEvLIv?2W4IE1aeauu z_MiwIC*_R`2TsWsq(h@jYa7e#U22@!<=WCp@+O^edEF{k`TeldGgv?DD^2FbEhj|A z4m_TD{|`o>vOBVv>em!YxWMJsQ__1VxfV^X8k@M2?oeR-U=;Gd%#Nfoi%F8M@kT?$iN+ZN6 zpaSCBg-y*q^dR}jDk_pVHJOLc#qhiy4f~hLZK!SkESn?Umu{Rr&JS8hweDAhNK^0hQ*V)vE&URpw9MA4qtut%!l*2GZnETO@YM_p*{HiSMCPf z{^|$t7pulHGF%HbDy2=VjXEghp?X#lw96G1uAly3CP%=9tc0=o0@H7#Fj%>fFoF&c z<<|DEvX=i~G!}$YTMjWJ2fth9pY>*Q=qOVM442X&K(e)LT_M?4rYP`zxBw8T&(qrt z&N2{FS^@vhr{U7q-~T2?^e}x*$$vI2s(2ywLxQ+S_hTjWO;BGTFHoQ~K^)I*Y?6!%&`eVsZO!eFV*wnP^j^^hgu$tD}`_Hp7zQ zpG|KZ!@(hxrZMg*M}aabcIV2R6A-85`9j_cpnS#KBP+W3cjXn59!r73rE_=REmg6_l!=CbvnhC+7XO5c^8V{0UK zNZ_!1+bsw4N}UT;Lr@+TDiR^=#ThCOdG(Xn2~TW#>@N7r=YD`FU5cvaboXPpwx|(G zpKNDl`?P>nx*J+C797-eQCmm3puNE5!Ke8cGt`}}qg%KDNrB}3SUMWJ_$<$*=v&dZ zu|L>qLLbX!B3a{k>y;5@uO19Il0-lpENdg1lg2jEfNs%A++&Q$3}s3I3)9G&ZrGQcCA|k$-|qUFQ44ZZqPCtvQ)uC#lP|CG$osYksT52cee-&WDgA>}H3BsF%cAm0lOgdSc5d$G7}l+aLy) zn-D^tlnimVty3&}h-yiu3GjCq#5fBJ&hOVpqWJid@jgOg3QY_bWr7aPmBPHFOA_Yi z6)NUShr+=ox{wG|feA@4ltqpE>gwLD#S`&Fi(;>xBiA2eUf;v2VO#??BAZOZ(4rLN zBbgf(ldhgQQ?Do)#pt*Hd0(SJJAV2+emYEE9Sz51+OX-$5oi4wlt>5GrCLrfoE(>W zg!k-}h`)W`=k?g-*0DLaiuJL(A@Y@GQh1NJ6q^s$z?7$6kH*eCd+Kvq;=roR1+?Bt z<@d1v_IvbyQIA!l#1Gfh9qGqUQ!jfr!%Hl3X#L4acHjUX9mrZ}O+X)g z{;4t_Wm~M>%5(5vYx2FmgiqghV*J>1^IdjIpT|24!|;xV>=#y$;l6Eq`h73D-#TM2 z)g^u(@)H<1dh7)nAYEB#0I0yQ9(`cIX8%?D)8fr4dZ0r>GD!YLL34et9{v|HXFx+I z-u#Ge3FP*T-zGK4c*0Mocb{blMB?fy#hK}LqMP%+H)Q#JH7&fsPdx=7ATIx%p-9zl z7B-Swn@E7b|F7QsThHRB1pQL^W$y=_Gp;2MqnKiJ5-++w)A7=? z+Fkp2`t(}z=)a_FlfGDm5PxJ zjk{%$Y4B~(xQ~U!8R`gy6MeNCyf$g;s}K?}>_&~Ue-yASON#$rir;^kkOL*9_4Q_L zWrBF0K5fW}Dy2vHY~~j~hFv_vgzjAEynpKhKiJzD#_+b1&w@Iti=2@oOy}*tSf|Ne zFyHhb`S5DF0He;nG4d{N({57ZJ5kET)}@)0tzd2x{_y)2qbc=Fe3^-_T1mD}O>aj@8i_gmK(*W<(TAF3q@y||Zdksf1S89*zI^u>(}+q0UVKQKWG_3-a)7X8FSSLODyfB(mfyRZ|G3)KTNij#3&;@rc~9qA(b}s>1PdYoIVE;ARVh(MLsB< zOxW~aBHP}Q1ZqDA*>#8X-4-B02HO^ePCQ1-_H>_LSST85X|Y?3EVR|ge|%zR zo6pDYzlIFG=XZ*MB z1r&{J9!8R8=DnH4`+Mt4O!BKR2AshVwQK4sM>Df-ka**(&b8hNr)y#80D2uR!uRJdV%x&Z8BLm7J*%I~hD|LG zIK83E^aFlj>&2b=TGk9tx-duvUDQs!p^9Hw5x1<7l2n>E;;jJfhq7zKV4n@bs20p) z&NR|z*M*Fp{?EExkaI=(&A$vH(WI~_h)$& zxjuH$ar)y%_J-JaanC!qw`(r25D?K&#D`S+W>q=5aPw-Mo-xs-U`Vf#N+!mhR|y&b zV=PULoCKl&9<<{XF8yWFjy_$tdMDdCPZ(&oHR4c~5!V92r~cS+kX5@HsarQI(ANy+ z@k~Eyx5|pGQon!xLx?<+jodeDN5_1q_wLrfetah{zv9lAe|U*cvje=9%C8-P*GYe> z+fYfKpB`#7g-%8-ZHY?hp@4n-x$dBSL>{;s68uT)($jZuzM* zX<+pXeIDhsq6hApNDt3{eA_nX%pU^v%bmOEy=~tqunv;A?HuzVq7ySxXfB-*WXg7hE14OCZiDzRm^PB{;$_%^&e>iOg>HF7(xdHZ>nPSV?sxkxD7B4qbl zg2qTzrYW#*=sfw=(5oPLufDc3 zbtlU8behd&>8XC^UivD70iK)YcY5+P3@5?f6=S|5+ht0&sz`qs%lx_M#R^P7Dd~0^ zY@_$k9JBybJ*=M}nek(*?)RAuhra475#q3s;Xt`~3sRY`d?v?9y={Z~>;o!ub!eT& zJJms364w7~#awWATT7~@Bwr;9E}Jc?$Wv_{U^AMA>YCV5B{i{I#&sJxxa(h}7Kj@i zvh6F+i3KJLwoL&CUtV8vivk7bY&U9y6D*AI%@{i*3QCNfeGvP`x?s9#(8|W+`gDoX zLP?{1`*`qRULhqfNz-d0jHGaDR`*A)0oDu_mi{`y{uwOu58;0^_*S?16K#Rj?Xkhz z%+H3^+$~d|UOHkdArx3dme=|s^W4cmxCH#LK=6_wgT)Vsu_A_~h=O6`@o&$LA{=yo z?3014o^b}^RC~Ve2ZN_Mw#nllBgcwT`RzVU9k|~(St_S<)jP7J27HgpH|{SQvqQm` zW?-jUs(4`OEwj_9Fw;fXTv?@;;_!-J%>~(Ci58`MF?|=vk=LuHUg=sz&{=&IQgUKM z`CO^LVHjp_IM{IkHj@6hM*7a1-)@6jae}k|)teV)pQ}rVu^^{d-)DTB_J)O&;jeg{kd(mn8oe)s7sH0fX>t9B{Y=j^gxMyEd~ zrc?C`xCI30D+Pq;Xy>Qr+efm5u~CDfgM20;X7>b0tT1;qe#C$i%HTc@3$MV_fAEktudCFg~}kh=;xk z=eKD^dV%;oOau4_jz8&oS)vOzFlXF>z`dq|iWvXD=B@*(sq^i3{ab5AtqT;9T8j%u z5lCdKxKJosM+AXXBSA)p$_Qa3t&1uM76pU|R8dfY1PBB|La3#XGA_t6hLNbzL}tW5 zAV9+RUWS0iR?q+Y&iOo1j~?#Ld++;<-!tCdb4Rz^_x_yJO3+RzyOuHB`J2DamXX(^ zB@3yV!sRpNtS=xS_;%FQ01egA^YY)0u-N{{%OqXUEh4zEQ&Ts^-ZwUu-rYq`g;*tOv@hA@hEOc+xU1ly<*9A+2IUvs0rP`;3l(g*tg%n`k zyiMU#I$0qnPlU2+JnDQZ0Q*?#+V0*+%L}Q=r9F_{juE~Az#R*F!!sj%597=|IH1;} zTO|UJ`s(wFOouKCC1RYR9WekpGAEx`U;9I{a!6u@mj3*-AXss#R{Yh+#@=70I@Ey< ziIILlQ$R^j@v6|b^~aFQI+KVMVABD#54dl?N8t;b;03NVxrD$@14sAAO%b5!nPOI^ z<)Vk4YBr4UlbzqP3Fa*zm)7lpCuZtTB9cDProFE*@>F;W*=H1*00yS3{o=`vXet%J z_<`fmfda4*%)G~;1fKc*8eo5Ww;>)GvN46C2|f-I1L%jQj~-x-Spf4pPd*zmF%jU= zR`m7Lg9W@oYG9`)no?h_>Zo3hyTfCPjT@?mhpKs2BKMWH*5iyZ?azWL*5>Vpc^uJ& z&-B*cbpdaJXT`lE9pp&UNH0Q3D;?I?Z$RS@0k)2qe$GGxjVb^=eWfgVyg?rzfgC-l z@*YRv#w7vB$l<3!Cr<2X0ZnOTzV+7t2`4O9ey_lA(jD!8N-KIa0M|t00r_*)E+9#O zj9JU?d3p4$(NoI65{{B5ZxcS5j?^lURheD!2R8`;rtRwUuy*4jz)`K&DXR~)?730! zlJ(r|Ah3JJDeL=CKQ_In_zg;VG0L?+#`roCF9JvP+b63A{By_I_hsNmm@8S9a-GAPh#-ty_F*EEik{kE4qtz z7WW1h$&_2o5_~pb%8r4j!rZStZ4kmNn)4>Eog_;aIOYL!U$nmjN65Z_*(6GPz#9W3 z5mT5SCOGx)FCTdI*beNMC%!pbb8;Q+?)! znEd$71KyKd&_noPFII5r;fG!Dp*yi~bb^mo9e9KzZ^RIjsNjHno!>GpXZ#S`wvJG716gQ|;BtJ<4VL6zd9x@1H8P@^Q3v1o+OaBAY;)Cvyx; z=pi6109yp}1(<^@oo&l_zFzn+W|=5=JB1R@vrzSmy0P3&=BB{` zUJ+;A5XV-SxuCbi?Iqxq+^Y;7hDfvZ?+)lth zrW)={un+srCQvM*RJzP2;mHn%$!-DfiN<40_ z^LTJ`n_<-U9}oI@&$6y@9^Uit^z5FF?-N2^+?q)|@q8|g$X*~8cON>KPdv-AvI;QE zhD6;-I|}yB$2;V6XS*0vJ|^nK{0B^8)Tb3^Z*n=~Drv(BuZz~7i1xVSA0jK_$g@o1Z3TPA ziJ2)6=RJ#XSggtP*&j#(UG1}FtG}q2`Q!k7;bq2vtOBliI2vI{HcO|$b|Z_ z;>xf}vrupAD((X>4@=#MRfzv|8>IT^QPC>puwCuZH7Ofur@(#GuG>y{o!m`9wNnyq z-9}2Df+48%yNX~fu=-mN*3@m!HG2=lEbiC?unGzbovl`7$h)jtH%?#J!CoKsXH{KR zR66^)!&SEH$Y??^l^Y&+Tp2_pGKoGUAD_PAB2~6RDJ2V66`E-F-M}I0h^Zq_`k-G@ zRbwg1TW|Ikdlv=rt@{1@BvQA&F(vfqMcHZ{{j!-)oS)bjw?PzSLYBcU!O7R3i^TQo z*2U{8U+icv`kPjyWGEV}NHxLIpkXnUlSdo^!8ZXStMJ463QzJ(bI%`8Y1sL^Vz<^S zmY;O=-69UH(?QP+sEc6jPLbh+@q%DMA|^HIc2gcv{veU?s9SVxaIe*Jn*WR_ zt29$^yh>qELX3`xJ{J12Egt%rJ+tByqDD;gnB@5Mmh$r94))!$9!b&hb%|(%re^Hn zNb(R`WyCLD{HVr@^{I9$ zT#@mWZgw{@$3yj4I8aTQpPpe7qiePxB>?9fTzO5G2_{GO$chFIL@hZJOpiNU(xJl| zG)z;<(pv0UfdcQ{ePl1&lP=GH;xA=;AU+)v>Vqz!uD`H9uc&I!E;1QTB@d9HBo!Zx zZ6C5%?Z^%_d7wP**taZ9bsncIU6ZbrPTo#mh@5wP4^QJxJcK!pm}Qy78~*7xJVL}g zc4?Ctz7aW8Q_VDq(e@;eKC{hQ^=srp*|G#foQ1NY$gUQ1S>@m=;pAmiUOH!z9T(JX zMLkE}xsT3-{#ol3X(&9!iYyPaQn;tCaW!qOb+?~ zN{l|^8v61cf5zYK@NnCo9LB7t8A{q+Xkz6uAjrJ1&I1t(&7+)dHmIib>z1T+&pP&o z0d#(1#SHB0YALAgX1pw1)q2QjJ(|-I9)0Zj+UlFn)>f1sPTW>@I3^mX-BAHJhl#Kn zdNQl7C~a#5D0OoKzIcH71V4@Z@{F#p__|oO;SZBPn13fE`>t8%PpZpeoWF*;Msr_g zNO;=Ny=q9r2e01rU=*;~(Q1^)LvLsOCVff;_M-kCCT0P5Ti4>~MB(B!z>byQ&$b4m zdq00RYT(ny6fgk@Ow~4xdard9V4nZKU89MwDjHTwX~UnO?w-Gwr0j5OCq~~?u){s7 zH+L=W^dSvqTUY8YHWcFq9QSkg?YoWw+d56!CYSpwZ{=79_h(Xl!8l%jLF~38lGZ~u z2L-Rz>=I;8b_-%0>bjoDde(*IbYoQPK;-crbDKprA|cyM~JCRf&;B z?xZ1+E&VPU=Kr(0$~e7=Jlr}J=pb=^l(&HP0X z7WO^b$&VY#u`7ucbntt`p}mR$UcQjcb{ek8nr-bvA_?LM@zoXJa$WbTgyfJaJQ_&) zImPM-%Brd~-}LXy&Z2l~4Qr+lAc-rioJe%ZN!T&GQxQW1*U=$?wdn`b#67|! z#EK*rW5~@S^316QbJB@M^JGj_151TDjxJ7FV$Nx5qKkbc$^BZV@PbHp%dkLTSpSAl zC!PMuo(Cl%CDlt3jUq*<2XPw?`y*p?vbm>2nvKhn9OxIg=0S)!=@R4$-7Az;Or(@+ zl(fy_jRzIX@A|&JYb6zi9|0^4Gig)ApEf(eU~L$1fc=?d2n^P9^3q?VecKhk@vsKl zbEtN?q3lIkC@wjG_eaL?FqI#qwaC)Qty8w-yxVOJ9E0DJc^tWyv7Q&DK1#%;5v z5HYZ@aDR49Q(X zVJq@9Kkg}e7g!c-2(~v7a81$UhG`5B_@xU5*(O4x({W-jqKd+0FlEbWzR_8(D0-a3 zFU{#*H#gh*v_#f;$JgdCZFQSMZp8iN=?VU3K;qAj)s_++?(m(~?em&m@3q7VXd_TL z|7kSK?b>f6#AfbHWZF5KWrQRwUAfY;X-}zsjNsUI{qyd1`A1N6W{WwsZz1ywXTDb? z4YvVfUms9lXd!<7+u)(6OT~08-Ro!WhBOG@tcsk?kz+ph1}6VgJ$R^w=BXV zc((r9yD*v9xp$%IFKu$NS2=#j?adxid>Gj#Ca3f%M}fZdF)Q7&MoctN{a`1xNt9%^WAM6=1LA<`;I_!|?Uqirzqc0< zg|~)Z+WRVE-|J6h(8-fGXcuQ6*l1?fUYQrNTSi>;c=2PWTawWEW<|NvT`Ey0n}MF* z#$e{L9r-i#@Wcgrc!x2Q4FVF!FX!ZLtS=X%&>_)FE@~|V5|FXU-Bs3KQ@*_V=Hmu+ z(NBZ1_ss=N&&Q?Ls*{3Wl{M<{uB@r<7MG2;-no!F{B&t&#h6TuprX(obuft*Z?_kKuinCtap(jGo{ujJ=Buux$+tZ6 zWv>m!?*g8(B6dAk?BqCX%q)Uoln)-KXl$9G(RDn&irFYL(eX@U^!2v$pjb4C&p+5i ziO8KK3T>A`2%`qX=!1>f?a1$#vgqCawCGo*6PWM6{6YLBtc+iLMSL>5!oQ=f?g}>7 zk!TUn>||UWUzZTs_v9XN=yA_FV(cXgg5N-#f?yF-V>-YTsu=tgLAGGi*-WN8l}4+B z8s2=7YC~g-t#rO{XJ_59&n?X~28D%@k)9it2`s#Sua>Qw9)${uEV%(a}7ai;Iigh+=k7+O^0OZ7`#n z>B;%w;V`-Oy7@E+i(Mn!dD{*vHgLG%l)40j8Rq7N`ir*(S1PcExD7s$O=(oS9@DNx ze7j{j%r27d3LDV{JWaTAT2G; zj~?eu>jdIAftyWl5zeh>SlK)s2>{SDoz&N#Ykg0j-Xspnag8gCSn*IAK~R;WAH#{i z;57W`ASTB{n``S6XIW~ub`eefbr9DQR2MYF{%0ByN0_jO)8=-07F&iiAo5N(&5@?I zAmc^(d%Lt{l0g-c8>?uML@2bz%vBg9aV%l?f1zzeY3=8fuyaRaevb=kL+a*oY~yTy zRK?TnGa<+y4MGUF<52e&3+Uv~uRbaPI5;STGz3%!ui zLJVr@S9srGvj*3fPX*f3S zms=ndrE_%GLK$8&YrVwi9c+s)HMv$o#@PhroPKOFaJe(mF() z)0p#j_*aqVN5Xa3hP~rUQ=7d2sJ4MpsC=WzQBeRYzjzNTIe)}4b|O01c(dtvEr8!A zz5j9WT{#Gv{1R!F3s0wsJzBV>ggq@B)d`-6bhd$8*?YA;W8n^OuVPkORd13ugEKhi z+<|KUUb^(8%AEM>J2UBkxP7*ax&Cld7!u58!g&V?Nue)+FPR7&b!x$8G;%zfsBZ)= zcQCyVy%2@O3SoMx>!am{vz=Lrjw5+YR+2t>sGZV#3te1$M7VtJr2+1ahffake7A4Nj`~hB27_nJNQ-+U5T-vrXe8o79!G+ajrBSiYaHuh7Z0W^ z?CAyquyD6L&m`j6x_rv#hD}~6cG#{Ol(mRvW58>b^YXn&v00*ghg$A&VG+5=8?nzL zXmC7L2>YY^OAFPdSq2TD6k)=AyUWVO7(zV*J|3=en~9ruRE7iapVeVJS8 z6%@VBp_6#YFF`*N>YNXB8pS#fQ?Yb<(RWrr%?BO-ROLmO`7?@yIbT|O z$JBeZeZKkpr1aKDGRgVt=orcG!xjcnBDSi40oiR<++jvZc4`lUEQl_G0}`&bMr1 zssdIq`jDQm>HDnZfGuIL50|2QM5D)v&d-}e5u#b;aYr(-hNjdn0zz7Z{HuHDtMD^k z=jk%HjtAE72^n4O>HO-hhLVDLtg@Elkyo0_#l9w1R?AO7O;tR3*R>J zPgUrUT4u`0truI4JpZ267Qp^XpW4a|PAwgam%S``tHmX~@o2Kr&n;MZRN$y5-3UIp zTWJRo)@2i(1Oz%DyTeWQn!fkXsDlU^mHLp7Y?sHAzo~VeYBGOKWGH3!VAd^9gs_N* zO8RJ0vi&2qo;st+%f%QaEkKG|ho_}mSlRn>A09)uL{h}~ojF%}xwzq!;gp?gJGlY6 zs?b3*fpd#gF?YxNA~is7kwBZXlxOdsShP*tzL`-v0yQ4sD}4$?T1w+)UXV~?ud4>1 zsa@jxWcFRzjnqb{B8Y=WE{b4o-j+A$lIl}REr zW{%5l$wtbv{F}TM_Xy=ROen3nlu+Jcse*j6^$TRjY#=cNK?BP-ugZNdWTU)>tt%pZ z2B8L>V+H%goE1KH_3Rs8_RyARB`Fm(T=$yA4CqBwWX(}?g`m8@-TE}^*+!AXcP9#g z;ff{B+@i%m0Y||&sA9l6a#}A?UDgW;92PaJ*&~WU+2dKsK)rg}zy`@+qwFK*B-KL$ zP-9@YhjELm6Qaw8PNqPvl6*`pmhN^SXShH1OuQWtGg2lQ`vO$IJ@uugh? zl&I3e&AQPmB_ikJ&c(y00(xHTb*lm}srAs|sdGm5i%8yiKl((V;t>21MX z6%XZY@pe;CNeSf%hQ1vP$c>8LedaoqOJ zOUBYUdF#ikS8zyxcu>2jOT$HD0Qk+3MUP z5Kxn@J`A0u3kQXl?^g|Guk0`f6`o1pb1XMf!j6rNz2c6Lq06EK8&`&~XLUlq+|(Z0 zik!2nDAq7!4TgIu_LIIQA!6`YsCa0IZ7B7qmH;{!DPS|=1AxzEy)S{D8da_PVeC1TJu zRNT>#ZYY$mMI?Dfk6&NEv`}62tkkC{^-rLZ5)mu<7tJy{7DxF{hIV3T|Dw6t#eK)0 zO5~nfP0{nS73<1hNH|LWMR(yG({lZ*?fZjl3ET@(VKb@lO?02Z>X(xXr_0aKuJRl0 zhfEPj*R}|N?c;<=A-T4LtnbP4YhN6-(Wij$aN?u%qDp|7rsr7ZktSjUe$q=*v=&G33nolMM)qj4JS-L9ZO1VFDcRS8{QHaV@x#$On)cxF)mbX%8Tr}ne@Xs~)FV_{XWhce zltC?*7EA`!>Wd#7Nc=GOm$c6FZb7<&KaK>k3l>P-JWH|&MFubw(ULEWuaw6_4WAk@ zwJLNyM^X74F6%wuOM*1Y-d6AStPj)gk97 zXFho&dPV6bYfOIaph6E&$hTJ8^|v3f(M_J3YEd8PjHO!s7qb@d9m9aBMk0|=Z?9hg zv*5ifuLok=S{UV~+0U4ae*_I++VOymdoDqD7kBU9KS@Fy=J_XrdheuQ=5-aUqGC75 zq)nGdBnd=RkY%5%XAq3Ufafb@fJIECBicYJ36xCU0SmXFL%zLt!r%X49DZ;Cr8@T_ zv3nNcIHImQB#by_5bNitwT6zsAv`D_$%svqgn;ENQ0Hq3K>F;c4e$McJ?v@@{rFx6 zW+a>Ffp~stqI*KUCHk-*gi}9I%D)HnV;jjK50gTWjaM7rG(*zq!)5bTf9|*~!aWJv zSDTgZ!U^VsRH-`GXrE+>b14jrRyphaB`^={xnn2+&d)bJqfxM)(|@$ZE2YUJ2vjql zO^IyPmM~pGu2TQ)l%iV5dVs#l3eof0ly1BU}C>Z!Gg;N^Hs(O-?y}X3?(}Y8{<>H2hh5_%KR{4k+yzZKLSDpz7 z*qxFnD!(3;q&2BQ;$yW96aS~_=P?V`PWkM1JsiYMl($b?t402(k)^*CK})9-v^)s& zP(gh+eAzAM6Z&vFo@iKuQafC?pJv{4fmTdT0k&>(5$)aO2{oBt zwU`|)IJ|FWw;8hkB6(_)u|m~KD{2m{=6?_1+fwEpznt!M{GFQ8@#u7e0zJluaDn* zS7ShhpuXj}#$<2%K`&ly00mn^b74~7&EaW z!20B7zujHvlI}%PDI}Dl=ElH5c_-+*2>{&~nu{Kdlrly-GqM7U2HMiZSL`iqQk{Dh z%~Rk$+@d&5U7RRafnLw9`Y_G)a5T6%ycqiEqmRipTQ~22@H>de(sk=_xFaP-W8t9= z3+WoJxIQ^L20cV-o5m(r(k69hzAL_+5)PybC=`l#V8HZsMQ}W9nc4a_jGj{9J4ox= z?l~EEzNC8N@jUxo?Zu(9+W!rvjT=3wzr3x@19st_aN>5Nr2)jxpbHX=Rj}iht|W3- zP5s=(^gdn3{&zGsDXR{0+8(ZTyCx9XJofN(>ki#h#s&D}AAw&s+kV(e-SX4v{{hdh BiiiLJ literal 0 HcmV?d00001 diff --git a/src/domain-model.md b/src/domain-model.md index ddbe4231d..b7b112037 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -20,26 +20,27 @@ As a customer: |-------------------|--------------------------------|--------------------------------------------------|--------------------------------------------------|------------------------------------------------| | publicMember | -Basket basket | boolean addBagelToBasket(String variant) | if basket is not full and variant in Inventory | add Bagel to Basket and return true | | | -Inventory inventory | | if basket is full | return false | -| | | boolean changeOrder(String item) | if item in basket | remove item from Basket and return true | +| | | boolean removeItem(String item) | if item in basket | remove item from Basket and return true | | | | | if item not in basket | return false | | | | boolean isBasketFull() | if basket is full | return true | | | | | if basket is not full | return false | | ----------------- | ----------------------------- | ---------------------------------------------- | --------------------------------------------- | -------------------------------------------- | | Manager | Inherits basket and inventory | boolean canOrder(String item) | if item in Inventory | return true | | | from public member | | if item not in Inventory | return false | -| | | boolean changeCapacity(int capacity) | if capacity not negative | change basket capacity and return true | +| | | boolean changeBasketCapacity(int capacity) | if capacity not negative | change basket capacity and return true | | | | | if capacity negative | return false | | ----------------- | ----------------------------- | ----------------------------------------------- | ---------------------------------------------- | --------------------------------------------- | | Customer | Inherits basket and inventory | float getTotalCost() | if Basket contains at least 1 item | return total cost | | | from public member | | if Basket is empty | return 0 | -| | | float getBagelPrice(Bagel bagel) | always | return Bagel price | +| | | float getBagelPrice(String variant) | always | return Bagel price | | | | boolean addFilling(Bagel bagel, Filling filling) | if Filling is not null | add Filling to Bagel and return true | | | | | if Filling is null | return false | | | | float getFillingPrice(Filling filling) | always | return Filling price | +| | | float getTotalBagelPrice() | always | return Bagel price with Filling | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | | Basket | -int capacity | List getItems() | if Basket contains at least one item | return List of items | | | -List items | | if Basket is empty | return empty List | -| | | boolean changeOrder(Item item) | if item in basket | remove item from Basket and return true | +| | | boolean removeItem(String item) | if item in basket | remove item from Basket and return true | | | | | if item not in basket | return false | | | | boolean addItemToBasket(Item item) | if Basket is not full | add item to Basket and return true | | | | | if Basket is full | return false | @@ -47,8 +48,8 @@ As a customer: | | | | | | | | | float getTotalCost() | if Basket contains at least one item | return sum of all item prices | | | | | if Basket is empty | return 0 | -| | | boolean changeCapacity(int capacity) | if capacity not negative | change basket capacity and return true | -| | | | if capacity negative | return false | +| | | boolean setCapacity(int capacity) | if called by Manager | change basket capacity and return true | +| | | | if not called by Manager | return false | | | | boolean isEmpty() | if Basket is empty | return true | | | | | if Basket is not empty | return false | | | | boolean isFull() | if items.size() >= capacity | return true | @@ -57,8 +58,9 @@ As a customer: | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | | Inventory | -Map items | boolean inInventory(String item) | if item in inventory map | return true | | | | | if item not in inventory map | return false | -| | | Map getItemsInInventory() | always | return map of items | -| | | | | | +| | | boolean addToInventory(Item item) | always | add item to inventory | +| | | boolean removeItemFromInventory(Item item) | if Item in Inventory | remove item from Inventory and return true | +| | | | if Item not in Inventory | return false | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | | Item | -float price | float getPrice() | always | return price | | | -String variant | String getVariant() | always | return variant | @@ -69,8 +71,16 @@ As a customer: | | | | if Filling is null | return false | | | | List getFillings() | always | return list of fillings | | | | float getTotalPrice() | always | return bagel price + sum of filling price | +| | | boolean removeFilling(Filling filling) | if Filling in fillings list | remove Filling from list and return true | +| | | | if Filling not in fillings list | return false | | | | Inherits all Item methods | | | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | | Coffee | | Inherits all Item methods | | | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Filling | | Inherits all Item methods | | | \ No newline at end of file +| Filling | | Inherits all Item methods | | | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Order | List orders | Item createOrder(String variant) | if variant in Inventory | create Item and return Item | +| | | | if variant not in Inventory | return null | +| | | | | | +| | | | | | +| | | | | | diff --git a/src/img.png b/src/img.png deleted file mode 100644 index 97c8f502cecdf92be5b0d9ed530c7ff1d52eed5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61565 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 Date: Mon, 11 Aug 2025 13:50:37 +0200 Subject: [PATCH 08/27] publicMemberTest ok --- src/main/java/com/booleanuk/core/Bagel.java | 6 ++- src/main/java/com/booleanuk/core/Basket.java | 29 +++++++++++ src/main/java/com/booleanuk/core/Coffee.java | 6 ++- src/main/java/com/booleanuk/core/Filling.java | 4 +- .../java/com/booleanuk/core/Inventory.java | 42 +++++++++++++++ src/main/java/com/booleanuk/core/Item.java | 8 +++ .../java/com/booleanuk/core/publicMember.java | 19 ++++--- .../com/booleanuk/core/publicMemberTest.java | 51 ++++++++++++++----- 8 files changed, 142 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java index e74f6c330..bf361e721 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -1,4 +1,8 @@ package com.booleanuk.core; -public class Bagel { +public class Bagel extends Item{ + + public Bagel(String item) { + super.variant = item; + } } diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 4aab45ed7..c6ae1605f 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -1,4 +1,33 @@ package com.booleanuk.core; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + public class Basket { + private int capacity; + private final int DEFAULT_CAPACITY = 5; + List items; + + public Basket(){ + this.capacity = DEFAULT_CAPACITY; + this.items = new ArrayList<>(); + } + public void addBagelToBasket(String variant) { + Bagel bagel = new Bagel(variant); + items.add(bagel); + } + + public boolean isFull() { + return items.size() == capacity; + } + + public boolean removeItem(String itemToRemove){ + for (Item item : items){ + if (Objects.equals(item.getVariant().toUpperCase(), itemToRemove)){ + items.remove(item); + return true; + } + }return false; + } } diff --git a/src/main/java/com/booleanuk/core/Coffee.java b/src/main/java/com/booleanuk/core/Coffee.java index 08b04e421..d665e4a07 100644 --- a/src/main/java/com/booleanuk/core/Coffee.java +++ b/src/main/java/com/booleanuk/core/Coffee.java @@ -1,4 +1,8 @@ package com.booleanuk.core; -public class Coffee { +public class Coffee extends Item { + + public Coffee(String variant) { + super.variant = variant; + } } diff --git a/src/main/java/com/booleanuk/core/Filling.java b/src/main/java/com/booleanuk/core/Filling.java index b25b3ff10..68f902f36 100644 --- a/src/main/java/com/booleanuk/core/Filling.java +++ b/src/main/java/com/booleanuk/core/Filling.java @@ -1,4 +1,6 @@ package com.booleanuk.core; -public class Filling { +public class Filling extends Item { + public Filling(String bacon) { + } } diff --git a/src/main/java/com/booleanuk/core/Inventory.java b/src/main/java/com/booleanuk/core/Inventory.java index 375cdb479..c95a1dd25 100644 --- a/src/main/java/com/booleanuk/core/Inventory.java +++ b/src/main/java/com/booleanuk/core/Inventory.java @@ -1,4 +1,46 @@ package com.booleanuk.core; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + public class Inventory { + private Map inventory = new HashMap<>(); + + public Inventory(){ + setDefaultInventory(); + System.out.println(inventory); + } + + public boolean inInventory(String variant) { + for (String key : inventory.keySet()) { + if (Objects.equals(key, variant)) { + return true; + } + } return false; + } + + private void setDefaultInventory(){ + inventory.put("ONION", new Bagel("Onion")); + inventory.put("PLAIN", new Bagel("Plain")); + inventory.put("EVERYTHING", new Bagel("Everything")); + inventory.put("SESAME", new Bagel("Sesame")); + + inventory.put("BLACK", new Coffee("Black")); + inventory.put("WHITE", new Coffee("White")); + inventory.put("CAPUCCINO", new Coffee("Capuccino")); + inventory.put("LATTE", new Coffee("Latte")); + + inventory.put("BACON", new Filling("Bacon")); + inventory.put("EGG", new Filling("Egg")); + inventory.put("CHEESE", new Filling("Cheese")); + inventory.put("CREAM CHEESE", new Filling("Cream Cheese")); + inventory.put("SMOKED SALMON", new Filling("Smoked Salmon")); + inventory.put("HAM", new Filling("Ham")); + + + + + + } } diff --git a/src/main/java/com/booleanuk/core/Item.java b/src/main/java/com/booleanuk/core/Item.java index b85344c21..87eaf4f03 100644 --- a/src/main/java/com/booleanuk/core/Item.java +++ b/src/main/java/com/booleanuk/core/Item.java @@ -1,4 +1,12 @@ package com.booleanuk.core; public class Item { + protected String variant; + protected float price; + protected String sku; + protected String name; + + public String getVariant() { + return variant; + } } diff --git a/src/main/java/com/booleanuk/core/publicMember.java b/src/main/java/com/booleanuk/core/publicMember.java index 835b2f18a..606a2f62a 100644 --- a/src/main/java/com/booleanuk/core/publicMember.java +++ b/src/main/java/com/booleanuk/core/publicMember.java @@ -2,20 +2,27 @@ public class publicMember { Basket basket; + Inventory inventory; - public publicMember(Basket basket){ + public publicMember(Basket basket, Inventory inventory){ this.basket = basket; + this.inventory = inventory; } - public Boolean addBagelToBasket(String variant){ - return null; + public boolean addBagelToBasket(String variant){ + String item = variant.toUpperCase(); + if (inventory.inInventory(item) && !basket.isFull()){ + basket.addBagelToBasket(item); + return true; + } else return false; } - public Boolean changeOrder(String sesame) { - return null; + public boolean removeItem(String item) { + String itemUpperCase = item.toUpperCase(); + return basket.removeItem(itemUpperCase); } public Boolean isBasketFull() { - return null; + return basket.isFull(); } } diff --git a/src/test/java/com/booleanuk/core/publicMemberTest.java b/src/test/java/com/booleanuk/core/publicMemberTest.java index c8c44678c..26f4bcf04 100644 --- a/src/test/java/com/booleanuk/core/publicMemberTest.java +++ b/src/test/java/com/booleanuk/core/publicMemberTest.java @@ -9,64 +9,87 @@ public class publicMemberTest { @Test public void addBagelToBasketOk(){ Basket basket = new Basket(); - publicMember member = new publicMember(basket); + Inventory inventory = new Inventory(); + publicMember member = new publicMember(basket, inventory); Assertions.assertEquals(true, member.addBagelToBasket("Onion")); Assertions.assertEquals(true, member.addBagelToBasket("Plain")); - Assertions.assertEquals(true, member.addBagelToBasket("Everything")); + Assertions.assertEquals(true, member.addBagelToBasket("everything")); Assertions.assertEquals(true, member.addBagelToBasket("Sesame")); Assertions.assertEquals(true,member.addBagelToBasket("OnIOn")); - Assertions.assertEquals(true,member.addBagelToBasket("SESAME")); } @Test public void addBagelToBasketNotOk(){ Basket basket = new Basket(); - publicMember member = new publicMember(basket); + Inventory inventory = new Inventory(); + publicMember member = new publicMember(basket, inventory); Assertions.assertEquals(false, member.addBagelToBasket(" ")); Assertions.assertEquals(false, member.addBagelToBasket("Sesamee")); - Assertions.assertEquals(false, member.addBagelToBasket("Cheese")); - Assertions.assertEquals(false, member.addBagelToBasket("Egg")); + Assertions.assertEquals(false, member.addBagelToBasket("Cheeseee")); + Assertions.assertEquals(false, member.addBagelToBasket("Eggy")); } @Test - public void changeOrderOK(){ + public void addBagelToBasketFULL(){ Basket basket = new Basket(); - publicMember member = new publicMember(basket); + Inventory inventory = new Inventory(); + publicMember member = new publicMember(basket, inventory); + + Assertions.assertEquals(true, member.addBagelToBasket("Onion")); + Assertions.assertEquals(true, member.addBagelToBasket("Plain")); + Assertions.assertEquals(true, member.addBagelToBasket("everything")); + Assertions.assertEquals(true, member.addBagelToBasket("Sesame")); + Assertions.assertEquals(true,member.addBagelToBasket("OnIOn")); + Assertions.assertEquals(false, member.addBagelToBasket("Onion")); + Assertions.assertEquals(false, member.addBagelToBasket("Plain")); + + } + + @Test + public void removeItemOK(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + publicMember member = new publicMember(basket, inventory); member.addBagelToBasket("Sesame"); - Assertions.assertEquals(true, member.changeOrder("Sesame")); + Assertions.assertEquals(true, member.removeItem("Sesame")); } @Test - public void changeOrderNotOK(){ + public void removeItemNotOk(){ Basket basket = new Basket(); - publicMember member = new publicMember(basket); + Inventory inventory = new Inventory(); + publicMember member = new publicMember(basket, inventory); member.addBagelToBasket("Sesame"); - Assertions.assertEquals(false, member.changeOrder("Onion")); + Assertions.assertEquals(false, member.removeItem("Onion")); } @Test public void isBasketFullTrue(){ Basket basket = new Basket(); - publicMember member = new publicMember(basket); + Inventory inventory = new Inventory(); + publicMember member = new publicMember(basket, inventory); + member.addBagelToBasket("Sesame"); member.addBagelToBasket("Sesame"); member.addBagelToBasket("Sesame"); member.addBagelToBasket("Sesame"); member.addBagelToBasket("Sesame"); member.addBagelToBasket("Sesame"); + Assertions.assertEquals(true, member.isBasketFull()); } @Test public void isBasketFullFalse(){ Basket basket = new Basket(); - publicMember member = new publicMember(basket); + Inventory inventory = new Inventory(); + publicMember member = new publicMember(basket, inventory); member.addBagelToBasket("Sesame"); member.addBagelToBasket("Sesame"); member.addBagelToBasket("Sesame"); From 09fcea1a06b1465825c68e4a0669f702d37ed1f3 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Mon, 11 Aug 2025 14:15:20 +0200 Subject: [PATCH 09/27] ManagerTest --- src/domain-model.md | 134 +++++++++--------- src/main/java/com/booleanuk/core/Basket.java | 10 +- src/main/java/com/booleanuk/core/Manager.java | 11 +- .../{publicMember.java => PublicMember.java} | 4 +- .../java/com/booleanuk/core/ManagerTest.java | 31 ++++ .../com/booleanuk/core/PublicMemberTest.java | 101 +++++++++++++ .../com/booleanuk/core/publicMemberTest.java | 101 ------------- 7 files changed, 216 insertions(+), 176 deletions(-) rename src/main/java/com/booleanuk/core/{publicMember.java => PublicMember.java} (87%) create mode 100644 src/test/java/com/booleanuk/core/ManagerTest.java create mode 100644 src/test/java/com/booleanuk/core/PublicMemberTest.java delete mode 100644 src/test/java/com/booleanuk/core/publicMemberTest.java diff --git a/src/domain-model.md b/src/domain-model.md index b7b112037..2b160e062 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -16,71 +16,69 @@ As a customer: - I'd like to be able to choose fillings for my bagel. - I'd like to know the cost of each filling. -| Classes | Instance variable | Methods | Scenario | Output | -|-------------------|--------------------------------|--------------------------------------------------|--------------------------------------------------|------------------------------------------------| -| publicMember | -Basket basket | boolean addBagelToBasket(String variant) | if basket is not full and variant in Inventory | add Bagel to Basket and return true | -| | -Inventory inventory | | if basket is full | return false | -| | | boolean removeItem(String item) | if item in basket | remove item from Basket and return true | -| | | | if item not in basket | return false | -| | | boolean isBasketFull() | if basket is full | return true | -| | | | if basket is not full | return false | -| ----------------- | ----------------------------- | ---------------------------------------------- | --------------------------------------------- | -------------------------------------------- | -| Manager | Inherits basket and inventory | boolean canOrder(String item) | if item in Inventory | return true | -| | from public member | | if item not in Inventory | return false | -| | | boolean changeBasketCapacity(int capacity) | if capacity not negative | change basket capacity and return true | -| | | | if capacity negative | return false | -| ----------------- | ----------------------------- | ----------------------------------------------- | ---------------------------------------------- | --------------------------------------------- | -| Customer | Inherits basket and inventory | float getTotalCost() | if Basket contains at least 1 item | return total cost | -| | from public member | | if Basket is empty | return 0 | -| | | float getBagelPrice(String variant) | always | return Bagel price | -| | | boolean addFilling(Bagel bagel, Filling filling) | if Filling is not null | add Filling to Bagel and return true | -| | | | if Filling is null | return false | -| | | float getFillingPrice(Filling filling) | always | return Filling price | -| | | float getTotalBagelPrice() | always | return Bagel price with Filling | -| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Basket | -int capacity | List getItems() | if Basket contains at least one item | return List of items | -| | -List items | | if Basket is empty | return empty List | -| | | boolean removeItem(String item) | if item in basket | remove item from Basket and return true | -| | | | if item not in basket | return false | -| | | boolean addItemToBasket(Item item) | if Basket is not full | add item to Basket and return true | -| | | | if Basket is full | return false | -| | | int getCurrentCapacity() | always | return capacity | -| | | | | | -| | | float getTotalCost() | if Basket contains at least one item | return sum of all item prices | -| | | | if Basket is empty | return 0 | -| | | boolean setCapacity(int capacity) | if called by Manager | change basket capacity and return true | -| | | | if not called by Manager | return false | -| | | boolean isEmpty() | if Basket is empty | return true | -| | | | if Basket is not empty | return false | -| | | boolean isFull() | if items.size() >= capacity | return true | -| | | | if Basket is not full | return false | -| | | int getNumberOfItems() | always | return number of items | -| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Inventory | -Map items | boolean inInventory(String item) | if item in inventory map | return true | -| | | | if item not in inventory map | return false | -| | | boolean addToInventory(Item item) | always | add item to inventory | -| | | boolean removeItemFromInventory(Item item) | if Item in Inventory | remove item from Inventory and return true | -| | | | if Item not in Inventory | return false | -| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Item | -float price | float getPrice() | always | return price | -| | -String variant | String getVariant() | always | return variant | -| | -String SKU | String getSKU() | always | return SKU | -| | -String name | String getNAme() | always | return name | -| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Bagel | -List fillings | boolean addFilling(Filling filling) | if Filling is not null | add Filling to Bagel ajd return true | -| | | | if Filling is null | return false | -| | | List getFillings() | always | return list of fillings | -| | | float getTotalPrice() | always | return bagel price + sum of filling price | -| | | boolean removeFilling(Filling filling) | if Filling in fillings list | remove Filling from list and return true | -| | | | if Filling not in fillings list | return false | -| | | Inherits all Item methods | | | -| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Coffee | | Inherits all Item methods | | | -| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Filling | | Inherits all Item methods | | | -| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Order | List orders | Item createOrder(String variant) | if variant in Inventory | create Item and return Item | -| | | | if variant not in Inventory | return null | -| | | | | | -| | | | | | -| | | | | | +| Classes | Instance variable | Methods | Scenario | Output | +|-------------------|--------------------------------|--------------------------------------------------|--------------------------------------------------|-------------------------------------------------| +| publicMember | -Basket basket | boolean addBagelToBasket(String variant) | if basket is not full and variant in Inventory | add Bagel to Basket and return true | +| | -Inventory inventory | | if basket is full | return false | +| | | boolean removeItem(String item) | if item in basket | remove item from Basket and return true | +| | | | if item not in basket | return false | +| | | boolean isBasketFull() | if basket is full | return true | +| | | | if basket is not full | return false | +| ----------------- | ----------------------------- | ---------------------------------------------- | --------------------------------------------- | -------------------------------------------- | +| Manager | Inherits basket and inventory | boolean changeBasketCapacity(int capacity) | if capacity not negative | change basket capacity and return true | +| | from public member | | if capacity negative | return false | +| ----------------- | ----------------------------- | ----------------------------------------------- | ---------------------------------------------- | --------------------------------------------- | +| Customer | Inherits basket and inventory | float getTotalCost() | if Basket contains at least 1 item | return total cost | +| | from public member | | if Basket is empty | return 0 | +| | | float getBagelPrice(String variant) | always | return Bagel price | +| | | boolean addFilling(Bagel bagel, Filling filling) | if Filling is not null | add Filling to Bagel and return true | +| | | | if Filling is null | return false | +| | | float getFillingPrice(Filling filling) | always | return Filling price | +| | | float getTotalBagelPrice() | always | return Bagel price with Filling | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Basket | -int capacity | List getItems() | if Basket contains at least one item | return List of items | +| | -List items | | if Basket is empty | return empty List | +| | | boolean removeItem(String item) | if item in basket | remove item from Basket and return true | +| | | | if item not in basket | return false | +| | | boolean addItemToBasket(Item item) | if Basket is not full | add item to Basket and return true | +| | | | if Basket is full | return false | +| | | int getCurrentCapacity() | always | return capacity | +| | | | | | +| | | float getTotalCost() | if Basket contains at least one item | return sum of all item prices | +| | | | if Basket is empty | return 0 | +| | | boolean setCapacity(int capacity) | if called by Manager | change basket capacity and return true | +| | | | if not called by Manager | return false | +| | | boolean isEmpty() | if Basket is empty | return true | +| | | | if Basket is not empty | return false | +| | | boolean isFull() | if items.size() >= capacity | return true | +| | | | if Basket is not full | return false | +| | | int getNumberOfItems() | always | return number of items | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Inventory | -Map items | boolean inInventory(String item) | if item in inventory map | return true | +| | | | if item not in inventory map | return false | +| | | boolean addToInventory(Item item) | always | add item to inventory | +| | | boolean removeItemFromInventory(Item item) | if Item in Inventory | remove item from Inventory and return true | +| | | | if Item not in Inventory | return false | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Item | -float price | float getPrice() | always | return price | +| | -String variant | String getVariant() | always | return variant | +| | -String SKU | String getSKU() | always | return SKU | +| | -String name | String getNAme() | always | return name | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Bagel | -List fillings | boolean addFilling(Filling filling) | if Filling is not null | add Filling to Bagel ajd return true | +| | | | if Filling is null | return false | +| | | List getFillings() | always | return list of fillings | +| | | float getTotalPrice() | always | return bagel price + sum of filling price | +| | | boolean removeFilling(Filling filling) | if Filling in fillings list | remove Filling from list and return true | +| | | | if Filling not in fillings list | return false | +| | | Inherits all Item methods | | | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Coffee | | Inherits all Item methods | | | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Filling | | Inherits all Item methods | | | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Order | List orders | Item createOrder(String variant) | if variant in Inventory | create Item and return Item | +| | | | if variant not in Inventory | return null | +| | | | | | +| | | | | | +| | | | | | diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index c6ae1605f..1a329f600 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -23,10 +23,12 @@ public boolean isFull() { } public boolean removeItem(String itemToRemove){ - for (Item item : items){ - if (Objects.equals(item.getVariant().toUpperCase(), itemToRemove)){ - items.remove(item); - return true; + if (!items.isEmpty()) { + for (Item item : items){ + if (Objects.equals(item.getVariant().toUpperCase(), itemToRemove)){ + items.remove(item); + return true; + } } }return false; } diff --git a/src/main/java/com/booleanuk/core/Manager.java b/src/main/java/com/booleanuk/core/Manager.java index 690d54d8f..7df832d68 100644 --- a/src/main/java/com/booleanuk/core/Manager.java +++ b/src/main/java/com/booleanuk/core/Manager.java @@ -1,4 +1,13 @@ package com.booleanuk.core; -public class Manager { +public class Manager extends PublicMember { + + public Manager(Basket basket, Inventory inventory) { + super(basket, inventory); + } + + public Boolean changeBasketCapacity(int capacity){ + return null; + } + } diff --git a/src/main/java/com/booleanuk/core/publicMember.java b/src/main/java/com/booleanuk/core/PublicMember.java similarity index 87% rename from src/main/java/com/booleanuk/core/publicMember.java rename to src/main/java/com/booleanuk/core/PublicMember.java index 606a2f62a..baf24fe1b 100644 --- a/src/main/java/com/booleanuk/core/publicMember.java +++ b/src/main/java/com/booleanuk/core/PublicMember.java @@ -1,10 +1,10 @@ package com.booleanuk.core; -public class publicMember { +public class PublicMember { Basket basket; Inventory inventory; - public publicMember(Basket basket, Inventory inventory){ + public PublicMember(Basket basket, Inventory inventory){ this.basket = basket; this.inventory = inventory; } diff --git a/src/test/java/com/booleanuk/core/ManagerTest.java b/src/test/java/com/booleanuk/core/ManagerTest.java new file mode 100644 index 000000000..d23cc8d52 --- /dev/null +++ b/src/test/java/com/booleanuk/core/ManagerTest.java @@ -0,0 +1,31 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ManagerTest { + + @Test + public void changeBasketCapacityOk(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Manager manager = new Manager(basket, inventory); + + Assertions.assertEquals(true, manager.changeBasketCapacity(10)); + Assertions.assertEquals(true, manager.changeBasketCapacity(100)); + Assertions.assertEquals(true, manager.changeBasketCapacity(50)); + + } + + @Test + public void changeBasketCapacityNotOk() { + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Manager manager = new Manager(basket, inventory); + + Assertions.assertEquals(false, manager.changeBasketCapacity(-10)); + Assertions.assertEquals(false, manager.changeBasketCapacity(-100)); + Assertions.assertEquals(false, manager.changeBasketCapacity(-1)); + } + +} diff --git a/src/test/java/com/booleanuk/core/PublicMemberTest.java b/src/test/java/com/booleanuk/core/PublicMemberTest.java new file mode 100644 index 000000000..84b5a1f83 --- /dev/null +++ b/src/test/java/com/booleanuk/core/PublicMemberTest.java @@ -0,0 +1,101 @@ +package com.booleanuk.core; + + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class PublicMemberTest { + + @Test + public void addBagelToBasketOk(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + PublicMember member = new PublicMember(basket, inventory); + + Assertions.assertTrue(member.addBagelToBasket("Onion")); + Assertions.assertTrue(member.addBagelToBasket("Plain")); + Assertions.assertTrue(member.addBagelToBasket("everything")); + Assertions.assertTrue(member.addBagelToBasket("Sesame")); + Assertions.assertTrue(member.addBagelToBasket("OnIOn")); + } + + @Test + public void addBagelToBasketNotOk(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + PublicMember member = new PublicMember(basket, inventory); + + Assertions.assertFalse(member.addBagelToBasket(" ")); + Assertions.assertFalse(member.addBagelToBasket("Sesamee")); + Assertions.assertFalse(member.addBagelToBasket("Cheeseee")); + Assertions.assertFalse(member.addBagelToBasket("Eggy")); + } + + @Test + public void addBagelToBasketFULL(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + PublicMember member = new PublicMember(basket, inventory); + + Assertions.assertTrue(member.addBagelToBasket("Onion")); + Assertions.assertTrue(member.addBagelToBasket("Plain")); + Assertions.assertTrue(member.addBagelToBasket("everything")); + Assertions.assertTrue(member.addBagelToBasket("Sesame")); + Assertions.assertTrue(member.addBagelToBasket("OnIOn")); + Assertions.assertFalse(member.addBagelToBasket("Onion")); + Assertions.assertFalse(member.addBagelToBasket("Plain")); + + } + + @Test + public void removeItemOK(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + PublicMember member = new PublicMember(basket, inventory); + member.addBagelToBasket("Sesame"); + + Assertions.assertTrue(member.removeItem("Sesame")); + + } + + @Test + public void removeItemNotOk(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + PublicMember member = new PublicMember(basket, inventory); + member.addBagelToBasket("Sesame"); + + Assertions.assertFalse(member.removeItem("Onion")); + + } + + @Test + public void isBasketFullTrue(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + PublicMember member = new PublicMember(basket, inventory); + member.addBagelToBasket("Sesame"); + member.addBagelToBasket("Sesame"); + member.addBagelToBasket("Sesame"); + member.addBagelToBasket("Sesame"); + member.addBagelToBasket("Sesame"); + member.addBagelToBasket("Sesame"); + + + Assertions.assertEquals(true, member.isBasketFull()); + } + + @Test + public void isBasketFullFalse(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + PublicMember member = new PublicMember(basket, inventory); + member.addBagelToBasket("Sesame"); + member.addBagelToBasket("Sesame"); + member.addBagelToBasket("Sesame"); + + Assertions.assertEquals(false, member.isBasketFull()); + } + + +} diff --git a/src/test/java/com/booleanuk/core/publicMemberTest.java b/src/test/java/com/booleanuk/core/publicMemberTest.java deleted file mode 100644 index 26f4bcf04..000000000 --- a/src/test/java/com/booleanuk/core/publicMemberTest.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.booleanuk.core; - - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -public class publicMemberTest { - - @Test - public void addBagelToBasketOk(){ - Basket basket = new Basket(); - Inventory inventory = new Inventory(); - publicMember member = new publicMember(basket, inventory); - - Assertions.assertEquals(true, member.addBagelToBasket("Onion")); - Assertions.assertEquals(true, member.addBagelToBasket("Plain")); - Assertions.assertEquals(true, member.addBagelToBasket("everything")); - Assertions.assertEquals(true, member.addBagelToBasket("Sesame")); - Assertions.assertEquals(true,member.addBagelToBasket("OnIOn")); - } - - @Test - public void addBagelToBasketNotOk(){ - Basket basket = new Basket(); - Inventory inventory = new Inventory(); - publicMember member = new publicMember(basket, inventory); - - Assertions.assertEquals(false, member.addBagelToBasket(" ")); - Assertions.assertEquals(false, member.addBagelToBasket("Sesamee")); - Assertions.assertEquals(false, member.addBagelToBasket("Cheeseee")); - Assertions.assertEquals(false, member.addBagelToBasket("Eggy")); - } - - @Test - public void addBagelToBasketFULL(){ - Basket basket = new Basket(); - Inventory inventory = new Inventory(); - publicMember member = new publicMember(basket, inventory); - - Assertions.assertEquals(true, member.addBagelToBasket("Onion")); - Assertions.assertEquals(true, member.addBagelToBasket("Plain")); - Assertions.assertEquals(true, member.addBagelToBasket("everything")); - Assertions.assertEquals(true, member.addBagelToBasket("Sesame")); - Assertions.assertEquals(true,member.addBagelToBasket("OnIOn")); - Assertions.assertEquals(false, member.addBagelToBasket("Onion")); - Assertions.assertEquals(false, member.addBagelToBasket("Plain")); - - } - - @Test - public void removeItemOK(){ - Basket basket = new Basket(); - Inventory inventory = new Inventory(); - publicMember member = new publicMember(basket, inventory); - member.addBagelToBasket("Sesame"); - - Assertions.assertEquals(true, member.removeItem("Sesame")); - - } - - @Test - public void removeItemNotOk(){ - Basket basket = new Basket(); - Inventory inventory = new Inventory(); - publicMember member = new publicMember(basket, inventory); - member.addBagelToBasket("Sesame"); - - Assertions.assertEquals(false, member.removeItem("Onion")); - - } - - @Test - public void isBasketFullTrue(){ - Basket basket = new Basket(); - Inventory inventory = new Inventory(); - publicMember member = new publicMember(basket, inventory); - member.addBagelToBasket("Sesame"); - member.addBagelToBasket("Sesame"); - member.addBagelToBasket("Sesame"); - member.addBagelToBasket("Sesame"); - member.addBagelToBasket("Sesame"); - member.addBagelToBasket("Sesame"); - - - Assertions.assertEquals(true, member.isBasketFull()); - } - - @Test - public void isBasketFullFalse(){ - Basket basket = new Basket(); - Inventory inventory = new Inventory(); - publicMember member = new publicMember(basket, inventory); - member.addBagelToBasket("Sesame"); - member.addBagelToBasket("Sesame"); - member.addBagelToBasket("Sesame"); - - Assertions.assertEquals(false, member.isBasketFull()); - } - - -} From cfc8e94924266140ab13e34312cd2fc937535db5 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Mon, 11 Aug 2025 14:42:08 +0200 Subject: [PATCH 10/27] ManagerTest ok --- src/main/java/com/booleanuk/core/Bagel.java | 19 +++++++++++++++++-- src/main/java/com/booleanuk/core/Basket.java | 12 +++++++++++- src/main/java/com/booleanuk/core/Coffee.java | 19 ++++++++++++++++++- src/main/java/com/booleanuk/core/Filling.java | 17 ++++++++++++++++- .../java/com/booleanuk/core/Inventory.java | 5 ----- src/main/java/com/booleanuk/core/Manager.java | 2 +- 6 files changed, 63 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java index bf361e721..8ef7102e0 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -2,7 +2,22 @@ public class Bagel extends Item{ - public Bagel(String item) { - super.variant = item; + public Bagel(String variant) { + super.variant = variant.toUpperCase(); + super.name = "Bagel"; + super.price = 0.49F; + setRest(); + } + + private void setRest(){ + switch (super.variant) { + case "ONION" -> super.sku = "BGLO"; + case "PLAIN" -> { + super.price = 0.39F; + super.sku = "BGLP"; + } + case "EVERYTHING" -> super.sku = "BGLE"; + case "SESAME" -> super.sku = "BGLS"; + } } } diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 1a329f600..6e6004751 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -30,6 +30,16 @@ public boolean removeItem(String itemToRemove){ return true; } } - }return false; + } return false; + } + + public boolean setCapacity(int newCapacity, Manager manager){ + if (manager == null) { + throw new SecurityException("Only managers can change basket capacity"); + } + if (newCapacity >= 0){ + this.capacity = newCapacity; + return true; + } else return false; } } diff --git a/src/main/java/com/booleanuk/core/Coffee.java b/src/main/java/com/booleanuk/core/Coffee.java index d665e4a07..30fa360ed 100644 --- a/src/main/java/com/booleanuk/core/Coffee.java +++ b/src/main/java/com/booleanuk/core/Coffee.java @@ -3,6 +3,23 @@ public class Coffee extends Item { public Coffee(String variant) { - super.variant = variant; + super.variant = variant.toUpperCase(); + super.name = "Coffee"; + super.price = 1.29F; + setRest(); + } + + private void setRest(){ + switch (super.variant) { + case "BLACK" -> { + super.price = 0.99F; + super.sku = "COFB"; + } + case "WHITE" -> { + super.price = 1.19F; + super.sku = "COFW"; + } case "CAPUCCINO" -> super.sku = "COFC"; + case "LATTE" -> super.sku = "COFL"; + } } } diff --git a/src/main/java/com/booleanuk/core/Filling.java b/src/main/java/com/booleanuk/core/Filling.java index 68f902f36..025c3a29e 100644 --- a/src/main/java/com/booleanuk/core/Filling.java +++ b/src/main/java/com/booleanuk/core/Filling.java @@ -1,6 +1,21 @@ package com.booleanuk.core; public class Filling extends Item { - public Filling(String bacon) { + + public Filling (String variant) { + super.variant = variant.toUpperCase(); + super.name = "Filling"; + super.price = 0.12F; + setRest(); + } + + private void setRest(){ + switch(super.variant) { + case "BACON" -> super.sku = "FILB"; + case "CHEESE" -> super.sku = "FILC"; + case "CREAM CHEESE" -> super.sku = "FILX"; + case "SMOKED SALMON" -> super.sku = "FILS"; + case "HAM" -> super.sku = "FILH"; + } } } diff --git a/src/main/java/com/booleanuk/core/Inventory.java b/src/main/java/com/booleanuk/core/Inventory.java index c95a1dd25..0b83e0982 100644 --- a/src/main/java/com/booleanuk/core/Inventory.java +++ b/src/main/java/com/booleanuk/core/Inventory.java @@ -9,7 +9,6 @@ public class Inventory { public Inventory(){ setDefaultInventory(); - System.out.println(inventory); } public boolean inInventory(String variant) { @@ -38,9 +37,5 @@ private void setDefaultInventory(){ inventory.put("SMOKED SALMON", new Filling("Smoked Salmon")); inventory.put("HAM", new Filling("Ham")); - - - - } } diff --git a/src/main/java/com/booleanuk/core/Manager.java b/src/main/java/com/booleanuk/core/Manager.java index 7df832d68..1cdc6d9b4 100644 --- a/src/main/java/com/booleanuk/core/Manager.java +++ b/src/main/java/com/booleanuk/core/Manager.java @@ -7,7 +7,7 @@ public Manager(Basket basket, Inventory inventory) { } public Boolean changeBasketCapacity(int capacity){ - return null; + return super.basket.setCapacity(capacity, this); } } From ce425b566e85e301b99f8da747c6f9c9539c0297 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Mon, 11 Aug 2025 15:14:02 +0200 Subject: [PATCH 11/27] CustomerTest --- src/domain-model.md | 131 +++++++++--------- src/main/java/com/booleanuk/core/Basket.java | 4 + .../java/com/booleanuk/core/Customer.java | 27 +++- src/main/java/com/booleanuk/core/Item.java | 6 +- .../java/com/booleanuk/core/CustomerTest.java | 85 ++++++++++++ 5 files changed, 185 insertions(+), 68 deletions(-) create mode 100644 src/test/java/com/booleanuk/core/CustomerTest.java diff --git a/src/domain-model.md b/src/domain-model.md index 2b160e062..86ae2db3f 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -16,69 +16,68 @@ As a customer: - I'd like to be able to choose fillings for my bagel. - I'd like to know the cost of each filling. -| Classes | Instance variable | Methods | Scenario | Output | -|-------------------|--------------------------------|--------------------------------------------------|--------------------------------------------------|-------------------------------------------------| -| publicMember | -Basket basket | boolean addBagelToBasket(String variant) | if basket is not full and variant in Inventory | add Bagel to Basket and return true | -| | -Inventory inventory | | if basket is full | return false | -| | | boolean removeItem(String item) | if item in basket | remove item from Basket and return true | -| | | | if item not in basket | return false | -| | | boolean isBasketFull() | if basket is full | return true | -| | | | if basket is not full | return false | -| ----------------- | ----------------------------- | ---------------------------------------------- | --------------------------------------------- | -------------------------------------------- | -| Manager | Inherits basket and inventory | boolean changeBasketCapacity(int capacity) | if capacity not negative | change basket capacity and return true | -| | from public member | | if capacity negative | return false | -| ----------------- | ----------------------------- | ----------------------------------------------- | ---------------------------------------------- | --------------------------------------------- | -| Customer | Inherits basket and inventory | float getTotalCost() | if Basket contains at least 1 item | return total cost | -| | from public member | | if Basket is empty | return 0 | -| | | float getBagelPrice(String variant) | always | return Bagel price | -| | | boolean addFilling(Bagel bagel, Filling filling) | if Filling is not null | add Filling to Bagel and return true | -| | | | if Filling is null | return false | -| | | float getFillingPrice(Filling filling) | always | return Filling price | -| | | float getTotalBagelPrice() | always | return Bagel price with Filling | -| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Basket | -int capacity | List getItems() | if Basket contains at least one item | return List of items | -| | -List items | | if Basket is empty | return empty List | -| | | boolean removeItem(String item) | if item in basket | remove item from Basket and return true | -| | | | if item not in basket | return false | -| | | boolean addItemToBasket(Item item) | if Basket is not full | add item to Basket and return true | -| | | | if Basket is full | return false | -| | | int getCurrentCapacity() | always | return capacity | -| | | | | | -| | | float getTotalCost() | if Basket contains at least one item | return sum of all item prices | -| | | | if Basket is empty | return 0 | -| | | boolean setCapacity(int capacity) | if called by Manager | change basket capacity and return true | -| | | | if not called by Manager | return false | -| | | boolean isEmpty() | if Basket is empty | return true | -| | | | if Basket is not empty | return false | -| | | boolean isFull() | if items.size() >= capacity | return true | -| | | | if Basket is not full | return false | -| | | int getNumberOfItems() | always | return number of items | -| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Inventory | -Map items | boolean inInventory(String item) | if item in inventory map | return true | -| | | | if item not in inventory map | return false | -| | | boolean addToInventory(Item item) | always | add item to inventory | -| | | boolean removeItemFromInventory(Item item) | if Item in Inventory | remove item from Inventory and return true | -| | | | if Item not in Inventory | return false | -| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Item | -float price | float getPrice() | always | return price | -| | -String variant | String getVariant() | always | return variant | -| | -String SKU | String getSKU() | always | return SKU | -| | -String name | String getNAme() | always | return name | -| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Bagel | -List fillings | boolean addFilling(Filling filling) | if Filling is not null | add Filling to Bagel ajd return true | -| | | | if Filling is null | return false | -| | | List getFillings() | always | return list of fillings | -| | | float getTotalPrice() | always | return bagel price + sum of filling price | -| | | boolean removeFilling(Filling filling) | if Filling in fillings list | remove Filling from list and return true | -| | | | if Filling not in fillings list | return false | -| | | Inherits all Item methods | | | -| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Coffee | | Inherits all Item methods | | | -| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Filling | | Inherits all Item methods | | | -| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Order | List orders | Item createOrder(String variant) | if variant in Inventory | create Item and return Item | -| | | | if variant not in Inventory | return null | -| | | | | | -| | | | | | -| | | | | | +| Classes | Instance variable | Methods | Scenario | Output | +|-------------------|--------------------------------|--------------------------------------------------|--------------------------------------------------|------------------------------------------------| +| publicMember | -Basket basket | boolean addBagelToBasket(String variant) | if basket is not full and variant in Inventory | add Bagel to Basket and return true | +| | -Inventory inventory | | if basket is full | return false | +| | | boolean removeItem(String item) | if item in basket | remove item from Basket and return true | +| | | | if item not in basket | return false | +| | | boolean isBasketFull() | if basket is full | return true | +| | | | if basket is not full | return false | +| ----------------- | ----------------------------- | ---------------------------------------------- | --------------------------------------------- | -------------------------------------------- | +| Manager | Inherits basket and inventory | boolean changeBasketCapacity(int capacity) | if capacity not negative | change basket capacity and return true | +| | from public member | | if capacity negative | return false | +| ----------------- | ----------------------------- | ----------------------------------------------- | ---------------------------------------------- | --------------------------------------------- | +| Customer | Inherits basket and inventory | float getTotalCost() | always | return total cost of items | +| | | float getBagelPrice(String variant) | always | return Bagel price | +| | | boolean addFilling(String bagel,String filling) | if Filling is not null | add Filling to Bagel and return true | +| | | | if Filling is null | return false | +| | | float getFillingPrice(String filling) | always | return Filling price | +| | | float getTotalBagelPrice() | always | return Bagel price with Filling | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Basket | -int capacity | List getItems() | if Basket contains at least one item | return List of items | +| | -List items | | if Basket is empty | return empty List | +| | | boolean removeItem(String item) | if item in basket | remove item from Basket and return true | +| | | | if item not in basket | return false | +| | | boolean addItemToBasket(Item item) | if Basket is not full | add item to Basket and return true | +| | | | if Basket is full | return false | +| | | int getCurrentCapacity() | always | return capacity | +| | | | | | +| | | float getTotalCost() | if Basket contains at least one item | return sum of all item prices | +| | | | if Basket is empty | return 0 | +| | | boolean setCapacity(int capacity) | if called by Manager | change basket capacity and return true | +| | | | if not called by Manager | return false | +| | | boolean isEmpty() | if Basket is empty | return true | +| | | | if Basket is not empty | return false | +| | | boolean isFull() | if items.size() >= capacity | return true | +| | | | if Basket is not full | return false | +| | | int getNumberOfItems() | always | return number of items | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Inventory | -Map items | boolean inInventory(String item) | if item in inventory map | return true | +| | | | if item not in inventory map | return false | +| | | boolean addToInventory(Item item) | always | add item to inventory | +| | | boolean removeItemFromInventory(Item item) | if Item in Inventory | remove item from Inventory and return true | +| | | | if Item not in Inventory | return false | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Item | -float price | float getPrice() | always | return price | +| | -String variant | String getVariant() | always | return variant | +| | -String SKU | String getSKU() | always | return SKU | +| | -String name | String getNAme() | always | return name | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Bagel | -List fillings | boolean addFilling(Filling filling) | if Filling is not null | add Filling to Bagel ajd return true | +| | | | if Filling is null | return false | +| | | List getFillings() | always | return list of fillings | +| | | float getTotalPrice() | always | return bagel price + sum of filling price | +| | | boolean removeFilling(Filling filling) | if Filling in fillings list | remove Filling from list and return true | +| | | | if Filling not in fillings list | return false | +| | | Inherits all Item methods | | | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Coffee | | Inherits all Item methods | | | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Filling | | Inherits all Item methods | | | +| ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | +| Order | List orders | Item createOrder(String variant) | if variant in Inventory | create Item and return Item | +| | | | if variant not in Inventory | return null | +| | | | | | +| | | | | | +| | | | | | diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 6e6004751..ced0b7733 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -42,4 +42,8 @@ public boolean setCapacity(int newCapacity, Manager manager){ return true; } else return false; } + + public float getTotalCost() { + return 100000; + } } diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java index 6f3a664d5..86fdf563b 100644 --- a/src/main/java/com/booleanuk/core/Customer.java +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -1,4 +1,29 @@ package com.booleanuk.core; -public class Customer { +public class Customer extends PublicMember { + + public Customer(Basket basket, Inventory inventory) { + super(basket, inventory); + } + + + public float getTotalCost() { + return super.basket.getTotalCost(); + } + + public float getBagelPrice(String everything) { + return 0; + } + + public Boolean addFilling(String bagel, String filling) { + return null; + } + + public float getFillingPrice(String cheese) { + return 100000; + } + + public float getTotalBagelPrice() { + return 1000000; + } } diff --git a/src/main/java/com/booleanuk/core/Item.java b/src/main/java/com/booleanuk/core/Item.java index 87eaf4f03..379ea96ad 100644 --- a/src/main/java/com/booleanuk/core/Item.java +++ b/src/main/java/com/booleanuk/core/Item.java @@ -7,6 +7,10 @@ public class Item { protected String name; public String getVariant() { - return variant; + return this.variant; + } + + public float getPrice() { + return this.price; } } diff --git a/src/test/java/com/booleanuk/core/CustomerTest.java b/src/test/java/com/booleanuk/core/CustomerTest.java new file mode 100644 index 000000000..80cf942a1 --- /dev/null +++ b/src/test/java/com/booleanuk/core/CustomerTest.java @@ -0,0 +1,85 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class CustomerTest { + + @Test + public void getTotalCostWithItems(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Customer customer = new Customer(basket, inventory); + + customer.addBagelToBasket("onion"); + customer.addBagelToBasket("onion"); + + Assertions.assertEquals(0.98F, customer.getTotalCost()); + } + + @Test + public void getTotalCostWithNoItems(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Customer customer = new Customer(basket, inventory); + + Assertions.assertEquals(0.0, customer.getTotalCost()); + } + + @Test + public void getBagelPrice(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Customer customer = new Customer(basket, inventory); + + Assertions.assertEquals(0.49F, customer.getBagelPrice("Everything")); + Assertions.assertEquals(0.49F, customer.getBagelPrice("Onion")); + Assertions.assertEquals(0.39F, customer.getBagelPrice("Plain")); + Assertions.assertEquals(0.49F, customer.getBagelPrice("Sesame")); + } + + @Test + public void addFillingOk(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Customer customer = new Customer(basket, inventory); + + + Assertions.assertEquals(true, customer.addFilling("onion", "egg")); + } + + @Test + public void addFillingNotOk(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Customer customer = new Customer(basket, inventory); + + + Assertions.assertEquals(true, customer.addFilling("everything", "eggy")); + } + + @Test + public void getFillingPrice(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Customer customer = new Customer(basket, inventory); + + Assertions.assertEquals(0.12F, customer.getFillingPrice("Cheese")); + Assertions.assertEquals(0.12F, customer.getFillingPrice("Bacon")); + Assertions.assertEquals(0.12F, customer.getFillingPrice("Egg")); + Assertions.assertEquals(0.12F, customer.getFillingPrice("Cream cheese")); + Assertions.assertEquals(0.12F, customer.getFillingPrice("smoked salmon")); + Assertions.assertEquals(0.12F, customer.getFillingPrice("ham")); + } + + @Test + public void getTotalBagelPrice(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Customer customer = new Customer(basket, inventory); + + customer.addFilling("onion","egg"); + + Assertions.assertEquals(0.61F, customer.getTotalBagelPrice()); + } +} From 8795dcce78ff265f75080403cfe9b082a082a83d Mon Sep 17 00:00:00 2001 From: Linda Do Date: Tue, 12 Aug 2025 08:25:23 +0200 Subject: [PATCH 12/27] CustomerTest ok --- src/main/java/com/booleanuk/core/Bagel.java | 27 +++++++++++++ src/main/java/com/booleanuk/core/Basket.java | 39 ++++++++++++++++--- .../java/com/booleanuk/core/Customer.java | 38 +++++++++++++----- src/main/java/com/booleanuk/core/Filling.java | 1 + .../java/com/booleanuk/core/Inventory.java | 7 ++++ .../java/com/booleanuk/core/PublicMember.java | 6 +++ .../java/com/booleanuk/core/CustomerTest.java | 21 +++++++++- 7 files changed, 123 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java index 8ef7102e0..c6a99348d 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -1,6 +1,10 @@ package com.booleanuk.core; +import java.util.ArrayList; +import java.util.List; + public class Bagel extends Item{ + List fillings = new ArrayList<>(); public Bagel(String variant) { super.variant = variant.toUpperCase(); @@ -20,4 +24,27 @@ private void setRest(){ case "SESAME" -> super.sku = "BGLS"; } } + + @Override + public float getPrice(){ + float totalPrice = super.price; + + System.out.println("variant: " + super.variant); + System.out.println("Base: " + super.price); + System.out.println("Number fillings: " + fillings.size()); + + if (!fillings.isEmpty()){ + for (Filling filling : fillings) { + totalPrice += filling.getPrice(); + } + } + return totalPrice; + } + + public void addFilling(String filling){ + String addFilling = filling.toUpperCase(); + fillings.add(new Filling(addFilling)); + } + + } diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index ced0b7733..abe310efd 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -5,12 +5,12 @@ import java.util.Objects; public class Basket { - private int capacity; + private static int capacity; private final int DEFAULT_CAPACITY = 5; List items; public Basket(){ - this.capacity = DEFAULT_CAPACITY; + capacity = DEFAULT_CAPACITY; this.items = new ArrayList<>(); } public void addBagelToBasket(String variant) { @@ -18,8 +18,12 @@ public void addBagelToBasket(String variant) { items.add(bagel); } + public void addBagelToBasket(Bagel variant) { + items.add(variant); + } + public boolean isFull() { - return items.size() == capacity; + return items.size() >= capacity; } public boolean removeItem(String itemToRemove){ @@ -38,12 +42,37 @@ public boolean setCapacity(int newCapacity, Manager manager){ throw new SecurityException("Only managers can change basket capacity"); } if (newCapacity >= 0){ - this.capacity = newCapacity; + capacity = newCapacity; return true; } else return false; } public float getTotalCost() { - return 100000; + float sum = 0; + for (Item item: items){ + sum += item.getPrice(); + } + return sum; + } + + public boolean addFillingToBagel(String bagel, String filling) { + String bagelToUpper = bagel.toUpperCase(); + String fillingToUpper = filling.toUpperCase(); + for (Item item : items) { + if (item instanceof Bagel && item.getVariant().toUpperCase().equals(bagelToUpper)) { + ((Bagel) item).addFilling(filling); + return true; + } + } + + if(isFull()){ + System.out.println("Cannot add new bagel. The basket is full."); + return false; + } + + Bagel newBagel = new Bagel(bagelToUpper); + newBagel.addFilling(fillingToUpper); + items.add(newBagel); + return true; } } diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java index 86fdf563b..b85b6e3b5 100644 --- a/src/main/java/com/booleanuk/core/Customer.java +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -8,22 +8,42 @@ public Customer(Basket basket, Inventory inventory) { public float getTotalCost() { - return super.basket.getTotalCost(); + return basket.getTotalCost(); } - public float getBagelPrice(String everything) { - return 0; + public float getBagelPrice(String variant) { + Item item = inventory.getItem(variant); + if (item != null) { + return item.getPrice(); + } return 0; } - public Boolean addFilling(String bagel, String filling) { - return null; + public boolean addFilling(String bagel, String filling) { + String bagelToUpper = bagel.toUpperCase(); + String fillingToUpper = filling.toUpperCase(); + + if (!inventory.inInventory(bagelToUpper)) { + System.out.println("We don't sell this bagel here!"); + return false; + } + + if (!inventory.inInventory(fillingToUpper)) { + System.out.println("We don't sell this filling here!"); + return false; + } + + return basket.addFillingToBagel(bagelToUpper, fillingToUpper); } - public float getFillingPrice(String cheese) { - return 100000; + + public float getFillingPrice(String variant) { + Item item = inventory.getItem(variant); + if (item != null) { + return item.getPrice(); + } return 0; } - public float getTotalBagelPrice() { - return 1000000; + public float getTotalBagelPrice(Bagel bagel) { + return bagel.getPrice(); } } diff --git a/src/main/java/com/booleanuk/core/Filling.java b/src/main/java/com/booleanuk/core/Filling.java index 025c3a29e..17dd23f0c 100644 --- a/src/main/java/com/booleanuk/core/Filling.java +++ b/src/main/java/com/booleanuk/core/Filling.java @@ -16,6 +16,7 @@ private void setRest(){ case "CREAM CHEESE" -> super.sku = "FILX"; case "SMOKED SALMON" -> super.sku = "FILS"; case "HAM" -> super.sku = "FILH"; + case "EGG" -> super.sku = "FILE"; } } } diff --git a/src/main/java/com/booleanuk/core/Inventory.java b/src/main/java/com/booleanuk/core/Inventory.java index 0b83e0982..8ac886aa1 100644 --- a/src/main/java/com/booleanuk/core/Inventory.java +++ b/src/main/java/com/booleanuk/core/Inventory.java @@ -9,9 +9,11 @@ public class Inventory { public Inventory(){ setDefaultInventory(); + System.out.println(inventory); } public boolean inInventory(String variant) { + String item = variant.toUpperCase(); for (String key : inventory.keySet()) { if (Objects.equals(key, variant)) { return true; @@ -38,4 +40,9 @@ private void setDefaultInventory(){ inventory.put("HAM", new Filling("Ham")); } + + public Item getItem(String variant){ + String item = variant.toUpperCase(); + return inventory.get(item); + } } diff --git a/src/main/java/com/booleanuk/core/PublicMember.java b/src/main/java/com/booleanuk/core/PublicMember.java index baf24fe1b..1235cbb35 100644 --- a/src/main/java/com/booleanuk/core/PublicMember.java +++ b/src/main/java/com/booleanuk/core/PublicMember.java @@ -17,6 +17,12 @@ public boolean addBagelToBasket(String variant){ } else return false; } + public void addBagelToBasket(Bagel bagel){ + if (!basket.isFull()){ + basket.addBagelToBasket(bagel); + } + } + public boolean removeItem(String item) { String itemUpperCase = item.toUpperCase(); return basket.removeItem(itemUpperCase); diff --git a/src/test/java/com/booleanuk/core/CustomerTest.java b/src/test/java/com/booleanuk/core/CustomerTest.java index 80cf942a1..5704a7803 100644 --- a/src/test/java/com/booleanuk/core/CustomerTest.java +++ b/src/test/java/com/booleanuk/core/CustomerTest.java @@ -17,6 +17,7 @@ public void getTotalCostWithItems(){ Assertions.assertEquals(0.98F, customer.getTotalCost()); } + @Test public void getTotalCostWithNoItems(){ Basket basket = new Basket(); @@ -55,7 +56,21 @@ public void addFillingNotOk(){ Customer customer = new Customer(basket, inventory); - Assertions.assertEquals(true, customer.addFilling("everything", "eggy")); + Assertions.assertEquals(false, customer.addFilling("everything", "eggy")); + } + + @Test + public void getTotalCostWithItemsWithFILLING(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Customer customer = new Customer(basket, inventory); + + customer.addBagelToBasket("onion"); + customer.addFilling("onion", "cheese"); + customer.addBagelToBasket("plain"); + customer.addBagelToBasket("everything"); + + Assertions.assertEquals(1.49F, customer.getTotalCost()); } @Test @@ -78,8 +93,10 @@ public void getTotalBagelPrice(){ Inventory inventory = new Inventory(); Customer customer = new Customer(basket, inventory); + Bagel bagel = new Bagel("onion"); + customer.addBagelToBasket(bagel); customer.addFilling("onion","egg"); - Assertions.assertEquals(0.61F, customer.getTotalBagelPrice()); + Assertions.assertEquals(0.61F, customer.getTotalBagelPrice(bagel)); } } From 444aa171a85aaf9983c49ae7cc57d4682316e0af Mon Sep 17 00:00:00 2001 From: Linda Do Date: Tue, 12 Aug 2025 08:54:00 +0200 Subject: [PATCH 13/27] changed Item to interface --- src/domain-model.md | 30 +++++++----- src/main/java/com/booleanuk/core/Bagel.java | 45 ++++++++++++------ src/main/java/com/booleanuk/core/Coffee.java | 46 ++++++++++++++----- src/main/java/com/booleanuk/core/Filling.java | 46 ++++++++++++++----- .../java/com/booleanuk/core/Inventory.java | 1 - src/main/java/com/booleanuk/core/Item.java | 17 ++----- .../java/com/booleanuk/core/BasketTest.java | 8 ++++ 7 files changed, 131 insertions(+), 62 deletions(-) create mode 100644 src/test/java/com/booleanuk/core/BasketTest.java diff --git a/src/domain-model.md b/src/domain-model.md index 86ae2db3f..707837aa3 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -33,7 +33,7 @@ As a customer: | | | boolean addFilling(String bagel,String filling) | if Filling is not null | add Filling to Bagel and return true | | | | | if Filling is null | return false | | | | float getFillingPrice(String filling) | always | return Filling price | -| | | float getTotalBagelPrice() | always | return Bagel price with Filling | +| | | float getTotalBagelPrice(Bagel) | always | return Bagel price with Filling | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | | Basket | -int capacity | List getItems() | if Basket contains at least one item | return List of items | | | -List items | | if Basket is empty | return empty List | @@ -59,22 +59,28 @@ As a customer: | | | boolean removeItemFromInventory(Item item) | if Item in Inventory | remove item from Inventory and return true | | | | | if Item not in Inventory | return false | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Item | -float price | float getPrice() | always | return price | -| | -String variant | String getVariant() | always | return variant | -| | -String SKU | String getSKU() | always | return SKU | -| | -String name | String getNAme() | always | return name | +| Item - interface | | float getPrice() | always | return price | +| | | String getVariant() | always | return variant | +| | | String getSKU() | always | return SKU | +| | | String getNAme() | always | return name | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | | Bagel | -List fillings | boolean addFilling(Filling filling) | if Filling is not null | add Filling to Bagel ajd return true | -| | | | if Filling is null | return false | -| | | List getFillings() | always | return list of fillings | -| | | float getTotalPrice() | always | return bagel price + sum of filling price | -| | | boolean removeFilling(Filling filling) | if Filling in fillings list | remove Filling from list and return true | +| | - float price | | if Filling is null | return false | +| | - String variant | List getFillings() | always | return list of fillings | +| | - String sku | float getTotalPrice() | always | return bagel price + sum of filling price | +| | - String name | boolean removeFilling(Filling filling) | if Filling in fillings list | remove Filling from list and return true | | | | | if Filling not in fillings list | return false | -| | | Inherits all Item methods | | | +| | | implements all Item methods | | | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Coffee | | Inherits all Item methods | | | +| Coffee | - float price | implements all Item methods | | | +| | - String variant | | | | +| | - String sku | | | | +| | - String name | | | | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Filling | | Inherits all Item methods | | | +| Filling | - float price | implements all Item methods | | | +| | - String variant | | | | +| | - String sku | | | | +| | - String name | | | | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | | Order | List orders | Item createOrder(String variant) | if variant in Inventory | create Item and return Item | | | | | if variant not in Inventory | return null | diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java index c6a99348d..db8d53805 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -3,35 +3,40 @@ import java.util.ArrayList; import java.util.List; -public class Bagel extends Item{ +public class Bagel implements Item{ List fillings = new ArrayList<>(); + private String variant; + private String name; + private String sku; + private float price; public Bagel(String variant) { - super.variant = variant.toUpperCase(); - super.name = "Bagel"; - super.price = 0.49F; + this.variant = variant.toUpperCase(); + this.name = "Bagel"; + this.price = 0.49F; setRest(); } private void setRest(){ - switch (super.variant) { - case "ONION" -> super.sku = "BGLO"; + switch (this.variant) { + case "ONION" -> this.sku = "BGLO"; case "PLAIN" -> { - super.price = 0.39F; - super.sku = "BGLP"; + this.price = 0.39F; + this.sku = "BGLP"; } - case "EVERYTHING" -> super.sku = "BGLE"; - case "SESAME" -> super.sku = "BGLS"; + case "EVERYTHING" -> this.sku = "BGLE"; + case "SESAME" -> this.sku = "BGLS"; } } @Override - public float getPrice(){ - float totalPrice = super.price; + public String getVariant() { + return this.variant; + } - System.out.println("variant: " + super.variant); - System.out.println("Base: " + super.price); - System.out.println("Number fillings: " + fillings.size()); + @Override + public float getPrice(){ + float totalPrice = this.price; if (!fillings.isEmpty()){ for (Filling filling : fillings) { @@ -41,6 +46,16 @@ public float getPrice(){ return totalPrice; } + @Override + public String getSku() { + return this.sku; + } + + @Override + public String getName() { + return this.name; + } + public void addFilling(String filling){ String addFilling = filling.toUpperCase(); fillings.add(new Filling(addFilling)); diff --git a/src/main/java/com/booleanuk/core/Coffee.java b/src/main/java/com/booleanuk/core/Coffee.java index 30fa360ed..a79a9b58f 100644 --- a/src/main/java/com/booleanuk/core/Coffee.java +++ b/src/main/java/com/booleanuk/core/Coffee.java @@ -1,25 +1,49 @@ package com.booleanuk.core; -public class Coffee extends Item { +public class Coffee implements Item { + private String variant; + private String name; + private String sku; + private float price; public Coffee(String variant) { - super.variant = variant.toUpperCase(); - super.name = "Coffee"; - super.price = 1.29F; + this.variant = variant.toUpperCase(); + this.name = "Coffee"; + this.price = 1.29F; setRest(); } private void setRest(){ - switch (super.variant) { + switch (this.variant) { case "BLACK" -> { - super.price = 0.99F; - super.sku = "COFB"; + this.price = 0.99F; + this.sku = "COFB"; } case "WHITE" -> { - super.price = 1.19F; - super.sku = "COFW"; - } case "CAPUCCINO" -> super.sku = "COFC"; - case "LATTE" -> super.sku = "COFL"; + this.price = 1.19F; + this.sku = "COFW"; + } case "CAPUCCINO" -> this.sku = "COFC"; + case "LATTE" -> this.sku = "COFL"; } } + + @Override + public String getVariant() { + return this.variant; + } + + @Override + public float getPrice() { + return this.price; + } + + @Override + public String getSku() { + return this.sku; + } + + @Override + public String getName() { + return this.name; + } } diff --git a/src/main/java/com/booleanuk/core/Filling.java b/src/main/java/com/booleanuk/core/Filling.java index 17dd23f0c..b4b288ee8 100644 --- a/src/main/java/com/booleanuk/core/Filling.java +++ b/src/main/java/com/booleanuk/core/Filling.java @@ -1,22 +1,46 @@ package com.booleanuk.core; -public class Filling extends Item { +public class Filling implements Item { + private String variant; + private String name; + private String sku; + private float price; public Filling (String variant) { - super.variant = variant.toUpperCase(); - super.name = "Filling"; - super.price = 0.12F; + this.variant = variant.toUpperCase(); + this.name = "Filling"; + this.price = 0.12F; setRest(); } private void setRest(){ - switch(super.variant) { - case "BACON" -> super.sku = "FILB"; - case "CHEESE" -> super.sku = "FILC"; - case "CREAM CHEESE" -> super.sku = "FILX"; - case "SMOKED SALMON" -> super.sku = "FILS"; - case "HAM" -> super.sku = "FILH"; - case "EGG" -> super.sku = "FILE"; + switch(this.variant) { + case "BACON" -> this.sku = "FILB"; + case "CHEESE" -> this.sku = "FILC"; + case "CREAM CHEESE" -> this.sku = "FILX"; + case "SMOKED SALMON" -> this.sku = "FILS"; + case "HAM" -> this.sku = "FILH"; + case "EGG" -> this.sku = "FILE"; } } + + @Override + public String getVariant() { + return this.variant; + } + + @Override + public float getPrice() { + return this.price; + } + + @Override + public String getSku() { + return this.sku; + } + + @Override + public String getName() { + return this.name; + } } diff --git a/src/main/java/com/booleanuk/core/Inventory.java b/src/main/java/com/booleanuk/core/Inventory.java index 8ac886aa1..0766dfa79 100644 --- a/src/main/java/com/booleanuk/core/Inventory.java +++ b/src/main/java/com/booleanuk/core/Inventory.java @@ -9,7 +9,6 @@ public class Inventory { public Inventory(){ setDefaultInventory(); - System.out.println(inventory); } public boolean inInventory(String variant) { diff --git a/src/main/java/com/booleanuk/core/Item.java b/src/main/java/com/booleanuk/core/Item.java index 379ea96ad..1104613d1 100644 --- a/src/main/java/com/booleanuk/core/Item.java +++ b/src/main/java/com/booleanuk/core/Item.java @@ -1,16 +1,9 @@ package com.booleanuk.core; -public class Item { - protected String variant; - protected float price; - protected String sku; - protected String name; +interface Item { - public String getVariant() { - return this.variant; - } - - public float getPrice() { - return this.price; - } + String getVariant(); + float getPrice(); + String getSku(); + String getName(); } diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java new file mode 100644 index 000000000..44dd06749 --- /dev/null +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -0,0 +1,8 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Test; + +public class BasketTest { + + +} From 3a9538df23a4114516d5498b56e7fbbbceae1bf5 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Tue, 12 Aug 2025 11:20:51 +0200 Subject: [PATCH 14/27] basketTest --- src/domain-model.md | 5 +- src/main/java/com/booleanuk/core/Bagel.java | 2 +- src/main/java/com/booleanuk/core/Basket.java | 26 +++- .../java/com/booleanuk/core/Customer.java | 9 +- .../java/com/booleanuk/core/Inventory.java | 5 +- src/main/java/com/booleanuk/core/Item.java | 2 +- src/main/java/com/booleanuk/core/Manager.java | 2 +- .../java/com/booleanuk/core/PublicMember.java | 8 +- .../java/com/booleanuk/core/BasketTest.java | 127 ++++++++++++++++++ .../java/com/booleanuk/core/CustomerTest.java | 2 +- 10 files changed, 162 insertions(+), 26 deletions(-) diff --git a/src/domain-model.md b/src/domain-model.md index 707837aa3..7539f348a 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -39,16 +39,13 @@ As a customer: | | -List items | | if Basket is empty | return empty List | | | | boolean removeItem(String item) | if item in basket | remove item from Basket and return true | | | | | if item not in basket | return false | -| | | boolean addItemToBasket(Item item) | if Basket is not full | add item to Basket and return true | +| | | boolean addItemToBasket(Item item) | if Basket is not full and Item not Filling | add item to Basket and return true | | | | | if Basket is full | return false | | | | int getCurrentCapacity() | always | return capacity | -| | | | | | | | | float getTotalCost() | if Basket contains at least one item | return sum of all item prices | | | | | if Basket is empty | return 0 | | | | boolean setCapacity(int capacity) | if called by Manager | change basket capacity and return true | | | | | if not called by Manager | return false | -| | | boolean isEmpty() | if Basket is empty | return true | -| | | | if Basket is not empty | return false | | | | boolean isFull() | if items.size() >= capacity | return true | | | | | if Basket is not full | return false | | | | int getNumberOfItems() | always | return number of items | diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java index db8d53805..babbf34cf 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -4,7 +4,7 @@ import java.util.List; public class Bagel implements Item{ - List fillings = new ArrayList<>(); + private List fillings = new ArrayList<>(); private String variant; private String name; private String sku; diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index abe310efd..419454f5f 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -7,19 +7,23 @@ public class Basket { private static int capacity; private final int DEFAULT_CAPACITY = 5; - List items; + private List items; public Basket(){ capacity = DEFAULT_CAPACITY; this.items = new ArrayList<>(); } public void addBagelToBasket(String variant) { - Bagel bagel = new Bagel(variant); + String item = variant.toUpperCase(); + Bagel bagel = new Bagel(item); items.add(bagel); } - public void addBagelToBasket(Bagel variant) { - items.add(variant); + public boolean addItemToBasket(Item variant) { + if (!this.isFull() && !(variant instanceof Filling)){ + items.add(variant); + return true; + }return false; } public boolean isFull() { @@ -29,7 +33,7 @@ public boolean isFull() { public boolean removeItem(String itemToRemove){ if (!items.isEmpty()) { for (Item item : items){ - if (Objects.equals(item.getVariant().toUpperCase(), itemToRemove)){ + if (Objects.equals(item.getVariant().toUpperCase(), itemToRemove.toUpperCase())){ items.remove(item); return true; } @@ -75,4 +79,16 @@ public boolean addFillingToBagel(String bagel, String filling) { items.add(newBagel); return true; } + + public List getItems() { + return null; + } + + public int getCurrentCapacity() { + return 0; + } + + public int getNumberOfItems() { + return 0; + } } diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java index b85b6e3b5..fd723cd71 100644 --- a/src/main/java/com/booleanuk/core/Customer.java +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -19,20 +19,17 @@ public float getBagelPrice(String variant) { } public boolean addFilling(String bagel, String filling) { - String bagelToUpper = bagel.toUpperCase(); - String fillingToUpper = filling.toUpperCase(); - - if (!inventory.inInventory(bagelToUpper)) { + if (!inventory.inInventory(bagel)) { System.out.println("We don't sell this bagel here!"); return false; } - if (!inventory.inInventory(fillingToUpper)) { + if (!inventory.inInventory(filling)) { System.out.println("We don't sell this filling here!"); return false; } - return basket.addFillingToBagel(bagelToUpper, fillingToUpper); + return basket.addFillingToBagel(bagel, filling); } diff --git a/src/main/java/com/booleanuk/core/Inventory.java b/src/main/java/com/booleanuk/core/Inventory.java index 0766dfa79..7c72b2ec5 100644 --- a/src/main/java/com/booleanuk/core/Inventory.java +++ b/src/main/java/com/booleanuk/core/Inventory.java @@ -14,7 +14,7 @@ public Inventory(){ public boolean inInventory(String variant) { String item = variant.toUpperCase(); for (String key : inventory.keySet()) { - if (Objects.equals(key, variant)) { + if (Objects.equals(key, item)) { return true; } } return false; @@ -41,7 +41,6 @@ private void setDefaultInventory(){ } public Item getItem(String variant){ - String item = variant.toUpperCase(); - return inventory.get(item); + return inventory.get(variant.toUpperCase()); } } diff --git a/src/main/java/com/booleanuk/core/Item.java b/src/main/java/com/booleanuk/core/Item.java index 1104613d1..1fd379168 100644 --- a/src/main/java/com/booleanuk/core/Item.java +++ b/src/main/java/com/booleanuk/core/Item.java @@ -1,6 +1,6 @@ package com.booleanuk.core; -interface Item { +public interface Item { String getVariant(); float getPrice(); diff --git a/src/main/java/com/booleanuk/core/Manager.java b/src/main/java/com/booleanuk/core/Manager.java index 1cdc6d9b4..5657e4e0b 100644 --- a/src/main/java/com/booleanuk/core/Manager.java +++ b/src/main/java/com/booleanuk/core/Manager.java @@ -7,7 +7,7 @@ public Manager(Basket basket, Inventory inventory) { } public Boolean changeBasketCapacity(int capacity){ - return super.basket.setCapacity(capacity, this); + return basket.setCapacity(capacity, this); } } diff --git a/src/main/java/com/booleanuk/core/PublicMember.java b/src/main/java/com/booleanuk/core/PublicMember.java index 1235cbb35..ac52e1c58 100644 --- a/src/main/java/com/booleanuk/core/PublicMember.java +++ b/src/main/java/com/booleanuk/core/PublicMember.java @@ -1,8 +1,8 @@ package com.booleanuk.core; public class PublicMember { - Basket basket; - Inventory inventory; + protected Basket basket; + protected Inventory inventory; public PublicMember(Basket basket, Inventory inventory){ this.basket = basket; @@ -17,9 +17,9 @@ public boolean addBagelToBasket(String variant){ } else return false; } - public void addBagelToBasket(Bagel bagel){ + public void addItemToBasket(Item bagel){ if (!basket.isFull()){ - basket.addBagelToBasket(bagel); + basket.addItemToBasket(bagel); } } diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 44dd06749..f541ae958 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -1,8 +1,135 @@ package com.booleanuk.core; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.List; + public class BasketTest { + @Test + public void getItems(){ + Basket basket = new Basket(); + Bagel bagel = new Bagel("onion"); + basket.addItemToBasket(bagel); + + Assertions.assertEquals(true, basket.getItems().contains(bagel)); + + } + @Test + public void getItemsEmptyBasket(){ + Basket basket = new Basket(); + + Assertions.assertNull(basket.getItems()); + } + + @Test + public void removeItemOk(){ + Basket basket = new Basket(); + basket.addBagelToBasket("onion"); + + Assertions.assertTrue(basket.removeItem("onion")); + } + + @Test + public void removeItemNotOk(){ + Basket basket = new Basket(); + Assertions.assertFalse(basket.removeItem("onion")); + } + + @Test + public void addItemToBasketOK(){ + Basket basket = new Basket(); + Bagel bagel = new Bagel("plain"); + Coffee coffee = new Coffee("black"); + + Assertions.assertTrue(basket.addItemToBasket(bagel)); + Assertions.assertTrue(basket.addItemToBasket(coffee)); + } + + @Test + public void addItemToBasketNotOk(){ + Basket basket = new Basket(); + Bagel bagel = new Bagel("plain"); + Bagel bagel2 = new Bagel("plain"); + Bagel bagel3 = new Bagel("plain"); + Bagel bagel4 = new Bagel("plain"); + Bagel bagel5 = new Bagel("plain"); + Coffee coffee = new Coffee("black"); + Filling filling = new Filling("egg"); + + Assertions.assertEquals(false, basket.addItemToBasket(filling)); + + basket.addItemToBasket(bagel); + basket.addItemToBasket(bagel2); + basket.addItemToBasket(bagel3); + basket.addItemToBasket(bagel4); + basket.addItemToBasket(bagel5); + + Assertions.assertEquals(false, basket.addItemToBasket(coffee)); + } + + @Test + public void getCurrentCapacity(){ + Basket basket = new Basket(); + Assertions.assertEquals(5, basket.getCurrentCapacity()); + } + + @Test + public void getTotalCost(){ + Basket basket = new Basket(); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + Assertions.assertEquals(0.98F, basket.getTotalCost()); + } + + @Test + public void getTotalCostEmptyBasket(){ + Basket basket = new Basket(); + Assertions.assertEquals(0.0F, basket.getTotalCost()); + } + + @Test + public void setCapacityOk(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Manager manager = new Manager(basket, inventory); + + Assertions.assertEquals(true,manager.changeBasketCapacity(10)); + } + + @Test + public void isFull(){ + Basket basket = new Basket(); + Assertions.assertEquals(false, basket.isFull()); + } + + @Test + public void isFulltrue(){ + Basket basket = new Basket(); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + + + Assertions.assertEquals(true, basket.isFull()); + } + + @Test + public void getNumberOfItems(){ + Basket basket = new Basket(); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + basket.addBagelToBasket("onion"); + + Assertions.assertEquals(5, basket.getNumberOfItems()); + } } diff --git a/src/test/java/com/booleanuk/core/CustomerTest.java b/src/test/java/com/booleanuk/core/CustomerTest.java index 5704a7803..c8a59bf55 100644 --- a/src/test/java/com/booleanuk/core/CustomerTest.java +++ b/src/test/java/com/booleanuk/core/CustomerTest.java @@ -94,7 +94,7 @@ public void getTotalBagelPrice(){ Customer customer = new Customer(basket, inventory); Bagel bagel = new Bagel("onion"); - customer.addBagelToBasket(bagel); + customer.addItemToBasket(bagel); customer.addFilling("onion","egg"); Assertions.assertEquals(0.61F, customer.getTotalBagelPrice(bagel)); From 713df81938955cece1b1cfc8628fdef5e9a53906 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Tue, 12 Aug 2025 11:25:40 +0200 Subject: [PATCH 15/27] basketTest ok --- src/main/java/com/booleanuk/core/Basket.java | 14 ++++++++------ src/test/java/com/booleanuk/core/BasketTest.java | 14 +++++++------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index 419454f5f..d7fe524b1 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -14,9 +14,11 @@ public Basket(){ this.items = new ArrayList<>(); } public void addBagelToBasket(String variant) { - String item = variant.toUpperCase(); - Bagel bagel = new Bagel(item); - items.add(bagel); + if (!this.isFull()) { + String item = variant.toUpperCase(); + Bagel bagel = new Bagel(item); + items.add(bagel); + } } public boolean addItemToBasket(Item variant) { @@ -81,14 +83,14 @@ public boolean addFillingToBagel(String bagel, String filling) { } public List getItems() { - return null; + return items; } public int getCurrentCapacity() { - return 0; + return capacity; } public int getNumberOfItems() { - return 0; + return items.size(); } } diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index f541ae958..1e2e4b8d0 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -13,14 +13,14 @@ public void getItems(){ Bagel bagel = new Bagel("onion"); basket.addItemToBasket(bagel); - Assertions.assertEquals(true, basket.getItems().contains(bagel)); + Assertions.assertTrue(basket.getItems().contains(bagel)); } @Test public void getItemsEmptyBasket(){ Basket basket = new Basket(); - Assertions.assertNull(basket.getItems()); + Assertions.assertTrue(basket.getItems().isEmpty()); } @Test @@ -58,7 +58,7 @@ public void addItemToBasketNotOk(){ Coffee coffee = new Coffee("black"); Filling filling = new Filling("egg"); - Assertions.assertEquals(false, basket.addItemToBasket(filling)); + Assertions.assertFalse(basket.addItemToBasket(filling)); basket.addItemToBasket(bagel); basket.addItemToBasket(bagel2); @@ -66,7 +66,7 @@ public void addItemToBasketNotOk(){ basket.addItemToBasket(bagel4); basket.addItemToBasket(bagel5); - Assertions.assertEquals(false, basket.addItemToBasket(coffee)); + Assertions.assertFalse(basket.addItemToBasket(coffee)); } @Test @@ -101,11 +101,11 @@ public void setCapacityOk(){ @Test public void isFull(){ Basket basket = new Basket(); - Assertions.assertEquals(false, basket.isFull()); + Assertions.assertFalse(basket.isFull()); } @Test - public void isFulltrue(){ + public void isFullTrue(){ Basket basket = new Basket(); basket.addBagelToBasket("onion"); basket.addBagelToBasket("onion"); @@ -115,7 +115,7 @@ public void isFulltrue(){ basket.addBagelToBasket("onion"); - Assertions.assertEquals(true, basket.isFull()); + Assertions.assertTrue(basket.isFull()); } @Test From 05c60ffe180fda5e3fa6e6c5d5e4764d242c6add Mon Sep 17 00:00:00 2001 From: Linda Do Date: Tue, 12 Aug 2025 11:43:29 +0200 Subject: [PATCH 16/27] Inventorytest ok --- src/domain-model.md | 3 -- .../java/com/booleanuk/core/BasketTest.java | 2 -- .../com/booleanuk/core/InventoryTest.java | 28 +++++++++++++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 src/test/java/com/booleanuk/core/InventoryTest.java diff --git a/src/domain-model.md b/src/domain-model.md index 7539f348a..e5faa84b3 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -52,9 +52,6 @@ As a customer: | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | | Inventory | -Map items | boolean inInventory(String item) | if item in inventory map | return true | | | | | if item not in inventory map | return false | -| | | boolean addToInventory(Item item) | always | add item to inventory | -| | | boolean removeItemFromInventory(Item item) | if Item in Inventory | remove item from Inventory and return true | -| | | | if Item not in Inventory | return false | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | | Item - interface | | float getPrice() | always | return price | | | | String getVariant() | always | return variant | diff --git a/src/test/java/com/booleanuk/core/BasketTest.java b/src/test/java/com/booleanuk/core/BasketTest.java index 1e2e4b8d0..19f6280b2 100644 --- a/src/test/java/com/booleanuk/core/BasketTest.java +++ b/src/test/java/com/booleanuk/core/BasketTest.java @@ -3,8 +3,6 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import java.util.List; - public class BasketTest { @Test diff --git a/src/test/java/com/booleanuk/core/InventoryTest.java b/src/test/java/com/booleanuk/core/InventoryTest.java new file mode 100644 index 000000000..e5d07e57f --- /dev/null +++ b/src/test/java/com/booleanuk/core/InventoryTest.java @@ -0,0 +1,28 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class InventoryTest { + + @Test + public void inInventoryTrue(){ + Inventory inventory = new Inventory(); + Assertions.assertTrue(inventory.inInventory("onion")); + Assertions.assertTrue(inventory.inInventory("plain")); + Assertions.assertTrue(inventory.inInventory("bacon")); + Assertions.assertTrue(inventory.inInventory("EGG")); + Assertions.assertTrue(inventory.inInventory("BlAck")); + Assertions.assertTrue(inventory.inInventory("Cream CHEESE")); + } + + @Test + public void inInventoryFalse(){ + Inventory inventory = new Inventory(); + Assertions.assertFalse(inventory.inInventory("eggy")); + Assertions.assertFalse(inventory.inInventory(" ")); + Assertions.assertFalse(inventory.inInventory("LAtteee")); + Assertions.assertFalse(inventory.inInventory("toast")); + Assertions.assertFalse(inventory.inInventory("something")); + } +} From a6595a62acb9aa89f505ec413bfd5b799bb7c44e Mon Sep 17 00:00:00 2001 From: Linda Do Date: Tue, 12 Aug 2025 12:41:28 +0200 Subject: [PATCH 17/27] Bageltest --- src/domain-model.md | 4 +- src/main/java/com/booleanuk/core/Bagel.java | 15 ++++- .../java/com/booleanuk/core/BagelTest.java | 60 +++++++++++++++++++ 3 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 src/test/java/com/booleanuk/core/BagelTest.java diff --git a/src/domain-model.md b/src/domain-model.md index e5faa84b3..851079445 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -58,11 +58,11 @@ As a customer: | | | String getSKU() | always | return SKU | | | | String getNAme() | always | return name | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Bagel | -List fillings | boolean addFilling(Filling filling) | if Filling is not null | add Filling to Bagel ajd return true | +| Bagel | -List fillings | boolean addFilling(Filling filling) | if Filling is not null | add Filling to Bagel and return true | | | - float price | | if Filling is null | return false | | | - String variant | List getFillings() | always | return list of fillings | | | - String sku | float getTotalPrice() | always | return bagel price + sum of filling price | -| | - String name | boolean removeFilling(Filling filling) | if Filling in fillings list | remove Filling from list and return true | +| | - String name | boolean removeFilling(String filling) | if Filling in fillings list | remove Filling from list and return true | | | | | if Filling not in fillings list | return false | | | | implements all Item methods | | | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java index babbf34cf..67a57c011 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -1,6 +1,7 @@ package com.booleanuk.core; import java.util.ArrayList; +import java.util.Collection; import java.util.List; public class Bagel implements Item{ @@ -56,10 +57,18 @@ public String getName() { return this.name; } - public void addFilling(String filling){ - String addFilling = filling.toUpperCase(); - fillings.add(new Filling(addFilling)); + public boolean addFilling(String filling){ + //String addFilling = filling.toUpperCase(); + //fillings.add(new Filling(addFilling)); + return false; } + public ListgetFillings() { + return null; + } + + public boolean removeFilling(String filling) { + return false; + } } diff --git a/src/test/java/com/booleanuk/core/BagelTest.java b/src/test/java/com/booleanuk/core/BagelTest.java new file mode 100644 index 000000000..dd41511b4 --- /dev/null +++ b/src/test/java/com/booleanuk/core/BagelTest.java @@ -0,0 +1,60 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class BagelTest { + @Test + public void getFillings(){ + Bagel bagel = new Bagel("onion"); + Assertions.assertTrue(bagel.getFillings().isEmpty()); + + bagel.addFilling("egg"); + Assertions.assertFalse(bagel.getFillings().isEmpty()); + } + @Test + public void addFillingOk(){ + Bagel bagel = new Bagel("onion"); + + Assertions.assertTrue(bagel.addFilling("egg")); + Assertions.assertTrue(bagel.addFilling("bacon")); + Assertions.assertTrue(bagel.addFilling("cheese")); + Assertions.assertTrue(bagel.addFilling("cReaAm cheese")); + Assertions.assertTrue(bagel.addFilling("smoked SALMON")); + Assertions.assertTrue(bagel.addFilling("hAM")); + } + + @Test + public void addFillingNotOk(){ + Bagel bagel = new Bagel("onion"); + + Assertions.assertFalse(bagel.addFilling(" ")); + Assertions.assertFalse(bagel.addFilling("something ")); + Assertions.assertFalse(bagel.addFilling("everything")); + Assertions.assertFalse(bagel.addFilling("white")); + } + + @Test + public void getTotalPrice(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Customer customer = new Customer(basket, inventory); + + customer.addBagelToBasket("onion"); + customer.addFilling("onion", "cheese"); + customer.addBagelToBasket("plain"); + customer.addBagelToBasket("everything"); + + Assertions.assertEquals(1.49F, customer.getTotalCost()); + } + + @Test + public void removeFilling(){ + Bagel bagel = new Bagel("sesame"); + bagel.addFilling("egg"); + + Assertions.assertTrue(bagel.removeFilling("egg")); + Assertions.assertFalse(bagel.removeFilling("egg")); + + } +} From 7417fd6e9b88e9381472ae7d3a4769cbcb481643 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Tue, 12 Aug 2025 12:48:48 +0200 Subject: [PATCH 18/27] Bageltest update --- src/main/java/com/booleanuk/core/Bagel.java | 7 +++---- .../java/com/booleanuk/core/BagelTest.java | 21 +++++++++++++------ 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java index 67a57c011..2d734598c 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -57,10 +57,9 @@ public String getName() { return this.name; } - public boolean addFilling(String filling){ - //String addFilling = filling.toUpperCase(); - //fillings.add(new Filling(addFilling)); - return false; + public void addFilling(String filling){ + String addFilling = filling.toUpperCase(); + fillings.add(new Filling(addFilling)); } diff --git a/src/test/java/com/booleanuk/core/BagelTest.java b/src/test/java/com/booleanuk/core/BagelTest.java index dd41511b4..eaddbc2b1 100644 --- a/src/test/java/com/booleanuk/core/BagelTest.java +++ b/src/test/java/com/booleanuk/core/BagelTest.java @@ -3,6 +3,8 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.List; + public class BagelTest { @Test public void getFillings(){ @@ -15,13 +17,20 @@ public void getFillings(){ @Test public void addFillingOk(){ Bagel bagel = new Bagel("onion"); + bagel.addFilling("egg"); + bagel.addFilling("bacon"); + bagel.addFilling("ham"); + bagel.addFilling("CHEEse"); + + List fillings = bagel.getFillings(); + + Assertions.assertEquals("EGG", fillings.get(0).getVariant()); + Assertions.assertEquals("BACON", fillings.get(1).getVariant()); + Assertions.assertEquals("HAM", fillings.get(2).getVariant()); + Assertions.assertEquals("CHEESE", fillings.get(3).getVariant()); + + - Assertions.assertTrue(bagel.addFilling("egg")); - Assertions.assertTrue(bagel.addFilling("bacon")); - Assertions.assertTrue(bagel.addFilling("cheese")); - Assertions.assertTrue(bagel.addFilling("cReaAm cheese")); - Assertions.assertTrue(bagel.addFilling("smoked SALMON")); - Assertions.assertTrue(bagel.addFilling("hAM")); } @Test From 48fe0fa49b336daca1ec89652d0c2f36d277ddfe Mon Sep 17 00:00:00 2001 From: Linda Do Date: Tue, 12 Aug 2025 12:50:07 +0200 Subject: [PATCH 19/27] Bageltest update --- src/test/java/com/booleanuk/core/BagelTest.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/booleanuk/core/BagelTest.java b/src/test/java/com/booleanuk/core/BagelTest.java index eaddbc2b1..5ad07ffd0 100644 --- a/src/test/java/com/booleanuk/core/BagelTest.java +++ b/src/test/java/com/booleanuk/core/BagelTest.java @@ -36,11 +36,13 @@ public void addFillingOk(){ @Test public void addFillingNotOk(){ Bagel bagel = new Bagel("onion"); + bagel.addFilling(" "); + bagel.addFilling("b"); + bagel.addFilling("hm"); + bagel.addFilling("CEEse"); + List fillings = bagel.getFillings(); - Assertions.assertFalse(bagel.addFilling(" ")); - Assertions.assertFalse(bagel.addFilling("something ")); - Assertions.assertFalse(bagel.addFilling("everything")); - Assertions.assertFalse(bagel.addFilling("white")); + Assertions.assertEquals(true, fillings.isEmpty()); } @Test From 42fbebf42336a4aa80224db72fdc556eb1f7f0d3 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Tue, 12 Aug 2025 12:56:15 +0200 Subject: [PATCH 20/27] Bageltest ok --- src/domain-model.md | 4 ++-- src/main/java/com/booleanuk/core/Bagel.java | 10 ++++++++-- src/test/java/com/booleanuk/core/BagelTest.java | 12 ------------ 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/domain-model.md b/src/domain-model.md index 851079445..78bfe8c26 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -58,8 +58,8 @@ As a customer: | | | String getSKU() | always | return SKU | | | | String getNAme() | always | return name | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Bagel | -List fillings | boolean addFilling(Filling filling) | if Filling is not null | add Filling to Bagel and return true | -| | - float price | | if Filling is null | return false | +| Bagel | -List fillings | boolean addFilling(String filling) | if Filling is in inventory | add Filling to Bagel and return true | +| | - float price | | if Filling is not in inventory | return false | | | - String variant | List getFillings() | always | return list of fillings | | | - String sku | float getTotalPrice() | always | return bagel price + sum of filling price | | | - String name | boolean removeFilling(String filling) | if Filling in fillings list | remove Filling from list and return true | diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java index 2d734598c..a66f30f60 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -64,10 +64,16 @@ public void addFilling(String filling){ public ListgetFillings() { - return null; + return fillings; } public boolean removeFilling(String filling) { - return false; + String fillingToRemove = filling.toUpperCase(); + for(Filling fillingInList: fillings){ + if (fillingInList.getVariant().equals(fillingToRemove)){ + fillings.remove(fillingInList); + return true; + } + }return false; } } diff --git a/src/test/java/com/booleanuk/core/BagelTest.java b/src/test/java/com/booleanuk/core/BagelTest.java index 5ad07ffd0..848bf2106 100644 --- a/src/test/java/com/booleanuk/core/BagelTest.java +++ b/src/test/java/com/booleanuk/core/BagelTest.java @@ -33,18 +33,6 @@ public void addFillingOk(){ } - @Test - public void addFillingNotOk(){ - Bagel bagel = new Bagel("onion"); - bagel.addFilling(" "); - bagel.addFilling("b"); - bagel.addFilling("hm"); - bagel.addFilling("CEEse"); - List fillings = bagel.getFillings(); - - Assertions.assertEquals(true, fillings.isEmpty()); - } - @Test public void getTotalPrice(){ Basket basket = new Basket(); From d8bd5e33c31a19be9a410f9a7185a77b272541e4 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Tue, 12 Aug 2025 13:12:13 +0200 Subject: [PATCH 21/27] ItemsTest ok --- src/domain-model.md | 2 - .../java/com/booleanuk/core/ItemsTest.java | 103 ++++++++++++++++++ 2 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/booleanuk/core/ItemsTest.java diff --git a/src/domain-model.md b/src/domain-model.md index 78bfe8c26..9e12760a0 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -76,8 +76,6 @@ As a customer: | | - String sku | | | | | | - String name | | | | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Order | List orders | Item createOrder(String variant) | if variant in Inventory | create Item and return Item | -| | | | if variant not in Inventory | return null | | | | | | | | | | | | | | | | | | | diff --git a/src/test/java/com/booleanuk/core/ItemsTest.java b/src/test/java/com/booleanuk/core/ItemsTest.java new file mode 100644 index 000000000..86763308f --- /dev/null +++ b/src/test/java/com/booleanuk/core/ItemsTest.java @@ -0,0 +1,103 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ItemsTest { + Bagel onion = new Bagel("onion"); + Bagel plain = new Bagel("plain"); + Bagel everything = new Bagel("Everything"); + Bagel sesame = new Bagel("sesame"); + + Coffee black = new Coffee("black"); + Coffee white = new Coffee("white"); + Coffee capuccino = new Coffee("capuccino"); + Coffee latte = new Coffee("latte"); + + Filling bacon = new Filling("bacon"); + Filling egg = new Filling("egg"); + Filling cheese = new Filling("cheese"); + Filling creamCheese = new Filling("cream Cheese"); + Filling smokedSalmon = new Filling("smoked salmon"); + Filling ham = new Filling("ham"); + + @Test + public void getPrice(){ + Assertions.assertEquals(0.49F, onion.getPrice()); + Assertions.assertEquals(0.39F, plain.getPrice()); + Assertions.assertEquals(0.49F, everything.getPrice()); + Assertions.assertEquals(0.49F, sesame.getPrice()); + + Assertions.assertEquals(0.99F, black.getPrice()); + Assertions.assertEquals(1.19F, white.getPrice()); + Assertions.assertEquals(1.29F, capuccino.getPrice()); + Assertions.assertEquals(1.29F, latte.getPrice()); + + Assertions.assertEquals(0.12F, bacon.getPrice()); + Assertions.assertEquals(0.12F, egg.getPrice()); + Assertions.assertEquals(0.12F, cheese.getPrice()); + Assertions.assertEquals(0.12F, creamCheese.getPrice()); + Assertions.assertEquals(0.12F, smokedSalmon.getPrice()); + Assertions.assertEquals(0.12F, ham.getPrice()); + } + + @Test + public void getVariant(){ + Assertions.assertEquals("ONION", onion.getVariant()); + Assertions.assertEquals("PLAIN", plain.getVariant()); + Assertions.assertEquals("EVERYTHING", everything.getVariant()); + Assertions.assertEquals("SESAME",sesame.getVariant()); + + Assertions.assertEquals("BLACK", black.getVariant()); + Assertions.assertEquals("WHITE", white.getVariant()); + Assertions.assertEquals("CAPUCCINO", capuccino.getVariant()); + Assertions.assertEquals("LATTE", latte.getVariant()); + + Assertions.assertEquals("BACON", bacon.getVariant()); + Assertions.assertEquals("EGG", egg.getVariant()); + Assertions.assertEquals("CHEESE", cheese.getVariant()); + Assertions.assertEquals("CREAM CHEESE", creamCheese.getVariant()); + Assertions.assertEquals("SMOKED SALMON", smokedSalmon.getVariant()); + Assertions.assertEquals("HAM", ham.getVariant()); + } + + @Test + public void getSKU(){ + Assertions.assertEquals("BGLO", onion.getSku()); + Assertions.assertEquals("BGLP", plain.getSku()); + Assertions.assertEquals("BGLE", everything.getSku()); + Assertions.assertEquals("BGLS",sesame.getSku()); + + Assertions.assertEquals("COFB", black.getSku()); + Assertions.assertEquals("COFW", white.getSku()); + Assertions.assertEquals("COFC", capuccino.getSku()); + Assertions.assertEquals("COFL", latte.getSku()); + + Assertions.assertEquals("FILB", bacon.getSku()); + Assertions.assertEquals("FILE", egg.getSku()); + Assertions.assertEquals("FILC", cheese.getSku()); + Assertions.assertEquals("FILX", creamCheese.getSku()); + Assertions.assertEquals("FILS", smokedSalmon.getSku()); + Assertions.assertEquals("FILH", ham.getSku()); + } + + @Test + public void getName(){ + Assertions.assertEquals("Bagel", onion.getName()); + Assertions.assertEquals("Bagel", plain.getName()); + Assertions.assertEquals("Bagel", everything.getName()); + Assertions.assertEquals("Bagel",sesame.getName()); + + Assertions.assertEquals("Coffee", black.getName()); + Assertions.assertEquals("Coffee", white.getName()); + Assertions.assertEquals("Coffee", capuccino.getName()); + Assertions.assertEquals("Coffee", latte.getName()); + + Assertions.assertEquals("Filling", bacon.getName()); + Assertions.assertEquals("Filling", egg.getName()); + Assertions.assertEquals("Filling", cheese.getName()); + Assertions.assertEquals("Filling", creamCheese.getName()); + Assertions.assertEquals("Filling", smokedSalmon.getName()); + Assertions.assertEquals("Filling", ham.getName()); + } +} From e202c962ba77f53fd79c86334b95e4e3f6d9ab94 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Tue, 12 Aug 2025 17:49:59 +0200 Subject: [PATCH 22/27] OrderTest --- src/class-diagram-core.png | Bin 0 -> 68138 bytes src/class_diagram.png | Bin 66000 -> 0 bytes src/domain-model.md | 42 ++++++-- .../java/com/booleanuk/extension/Bagel.java | 78 ++++++++++++++ .../java/com/booleanuk/extension/Basket.java | 101 ++++++++++++++++++ .../java/com/booleanuk/extension/Coffee.java | 49 +++++++++ .../com/booleanuk/extension/Customer.java | 50 +++++++++ .../java/com/booleanuk/extension/Filling.java | 46 ++++++++ .../com/booleanuk/extension/Inventory.java | 46 ++++++++ .../java/com/booleanuk/extension/Item.java | 9 ++ .../java/com/booleanuk/extension/Manager.java | 13 +++ .../java/com/booleanuk/extension/Order.java | 37 +++++++ .../com/booleanuk/extension/PublicMember.java | 34 ++++++ 13 files changed, 497 insertions(+), 8 deletions(-) create mode 100644 src/class-diagram-core.png delete mode 100644 src/class_diagram.png create mode 100644 src/main/java/com/booleanuk/extension/Bagel.java create mode 100644 src/main/java/com/booleanuk/extension/Basket.java create mode 100644 src/main/java/com/booleanuk/extension/Coffee.java create mode 100644 src/main/java/com/booleanuk/extension/Customer.java create mode 100644 src/main/java/com/booleanuk/extension/Filling.java create mode 100644 src/main/java/com/booleanuk/extension/Inventory.java create mode 100644 src/main/java/com/booleanuk/extension/Item.java create mode 100644 src/main/java/com/booleanuk/extension/Manager.java create mode 100644 src/main/java/com/booleanuk/extension/Order.java create mode 100644 src/main/java/com/booleanuk/extension/PublicMember.java diff --git a/src/class-diagram-core.png b/src/class-diagram-core.png new file mode 100644 index 0000000000000000000000000000000000000000..abeada47b6c5b99ec37eff222b4586b616ade38f GIT binary patch literal 68138 zcmd3PXIPV27p-M1BZ6Z=6a*YWQE7toY8jdcSccwIkd8=i2{CHr1A~is0Awcd4MT4L--+k_n`)3|yfH&_syR5zT+S~gVG*y_lv2RR*@Et=kx~Zrz50t((DDHj9)^u3L9&o!Vcg|MoB$EYW(%+p0eqeNgX~-s@9#C8vs< zK4(a7%R9Acd^kBuoSfq!MCktg`y<1!T3*_X zd}H@b%_r{ndr-}lHRs8Sw39uqZf<+$=kT-=N|Zz3#E^q;vA9ksbavYDGQ~q%D2%=RIjv!^!Tuwq4nHd%A5COTlkd z^Jw2$mCJ|q_P)1$or+|s+Th9jB&_+W{=tm5Sz|H+Og-XyIwk?v|3Pl9`Y`ZX;8F9H zR^y4};O%m2{2zT!&L^A3*ac*Brar~1bas{pPzY~JjF-R6pHZH5MIeJ6^CtV0iQn~J z*EJt{)|*?-;}6tWSVm9umMJ&JZ@Zm|wBg-|{l!OQ8Pevle!uuR7ase+et&3zU(U@b zuHQz*@p}h)dR~A7hPiL~fVRzAeUcvx5lR@t@RFA%Mkk&J3)qv|NHR$9w%J@npuKpqn8iVt;RYM@OiFUZN9ae+c!Iw;I%vti zyzbHsF8{jr<`iYo|ECXN8G?>~z34GLauwxy6TA(B?9RCEG=M80=m=1zJ>IP|Nge;P!T6r>I%ihrymt}Ai@*OEWx>(j$TM3NyFBWZ z$DDoV6KZEZ_?AW|__xT}@N)h-Mqi*C$(v}&5E6=dBgMpX!c{!v8vg~JJ_b`-BgDV` zje{&BD{Fgu8e|v$jkRc-EI7B~jpN)InCF$_1XxeIL#eZg1K)(E2PGPRiRW0}?G{yn zvve&Hl1ebrLwi1kH<~XcnU!&l?ts8W@-h~Duz=G}A@4qWeW2{sO64&)Z9K5kjGOA= zf%V3n)TPbl>Xs=&CK3ii=DQrd<_?}0!q+N01e9Y=7dY1CLO)<&H%~;~!6a~Wy2!Xt z$0!Ian#G|;J}b%}CBF$At^}gWQGsX{eH8fb*o{QGr^}jp`1Tk&lr*xF469}TUiAE2 z2VgNEHjgCohxm?nnBLWb_SbiY62pAvsBEQs=ZCpVSS`SlaZESdXGnRjD zrYziayXicY_9VgGFL8gd%L)6jYnQ_%0$Lw*-$p0GjLFcMg2Z6CtpVXXX0i29iqGJv zBe!EkUH^%Wd(@b8nmAc@SDdLvr#3=V&hGhPf9_DXJ+VjE{ zr`S4~OlR9i{7cW-%n;e;ClOiWH?Gv^wMBGNm0;#mW|pv?9BaF=e3l_c$HAGa;tB8};j_c*0#->9gL&jM(U{-a?pN zkM#beT8p#%TGKQ*cfTfYJmCe!dlwVTyu)Fp0Qsk&L~7shYu9;NW#TAPItI?k%DWzV za)td{ZXX(meaHF2zj*54LKfuX;{)-_4k># zqO*dIvruZc+y~&nE3w~7x1^{4tV4mf!HKmTZcz0CScV~EF6Xo*IBC+x4uXpJC)2j$ zLVLZeQ+QV5!}a8T`He9*+#&zM2hxVus>v^ZTgJ4@iB~q~2lM$k1TphM_{{W;^rvJ< zxGSFC;8rJ*LdYE47Qk*KYSW6hj9sOF^$VvW|{jHjze09erYj z-s$*BM`L@X5ai4#=c}B=iwgA5w}3(!V%hiFp%rCPqCyWEQzsFW^9lm*bn3+|(QD;9 z##9H2gvrI?;LA|aQMPM_eNowFaVm#bl@QNL;9T6n?G$=!?} zGi9c^)U=9V<9DsF9+1WWR{WgX_=urSX;}WD`~uf~Ea?bBJZsEdj&PRpAxOcSKDFlg zOt@Oac_fQNFI@lBP$q)P&vjTi(Y7{dEguY+T+`%?*?I+SqBHk~!FtN(EU8k3J6VM4 z}K0O32F>E!K{AnopP461cz)17oy6=l{_or zBX=$O=SObC%e+*eEmUF~9AAxi@>28+riMS;!WzxHwh3eU7Mje8Fv&j1Uqc{WB902OSjV~J+fp7E zp0(pola{@{*3B@6Bw$o_rVF*{I$V0-*j|5D%=qD#RxD(WFD;WTPd&-aCb`?IBtxvW z)lZ%4qCyUf-argqc*3?JioB2zbWbtS~tTiD-75V8Ll z7528TN-LE0v@fme`IKsH#x(<;sE6IX+1Yo+jjhETAjbr_xJ_>lP}Onetu`kr@;?3l z<&(HAJ6xJ|4l)!ktHURCdbB%nY&1#$L^2SX=E=LSrM!))Av(oiDS9=9uY<@(xl=GJ z6BVeF$H#N5dC5ZynfE)LQ8}hLa!Y$#zF!Sm;-Z-sJSb>vz~#?8_UcxM5SkJLUs35n zI(6pOF7P%vOg!i*D^8v~ND=tp`Vn;z8>L5fe9-vm!Hck!G)i>}s~SH;f$s%3|DwOn zp_y7EQ9h&SWEP?9G>1N>ll0TL(r+QVI!opcJVz=S1)oQ?lseumZou8R zQ*n%EIEC^aHXbjR$o*D?`aXEaU7FXcxyZ1DL`R7{CG@c-_2wAPwMrPqmgV!^rx1;+krE3-7BI$%qTf3|-H`6{clo!t@q6_-7Vw$kyxND|nzf?W2YoJ0>UChRfNB=fKm>2h6PVa)!)*JrhwkhBH+ ze?$CeNX7kmY9Jm1AqSN7Tak9W-wLxBz-8DN!_#T$DUBcx@V=Mfqu z4E)lzsl4am^U_fGwO6Ol)+^z>BgCv~)Kx<(;Uy|ghC!E8*_Ms5G3IAM(DCiP;=Ct$ z?nCaJxO4{c?j@b?;?Fwjk-~uyJZQ|^Vd2&*<<2S|qVt{3qkD=-2D=&_W!3(Cnfz-& zc}~m{ys&g>S;88?{fAnYUWURvV`F2*PeW?*E6Uar z&BR+h+@C^_M*`XFy&;eo+U%Vcn-l*dmX>|HQRfwPij-gZUqaDbutUj&jxEwbgmhsM zzJWW-J)|G3^cIAeOj|3Zy6<3Yfl?&M%gfsjw?(aHwsaS0r!PZZrICNMpZiHT0E`CO zcON5ITi_)?uKUHwakix>*R6@NehJOQ*Qf;k&43iV#$Oh8YSwnm22BPhCuvb$V{+P2=9i} zqOS?cur)by^_qz@622?_5)@QJ1AszYND=)(44)s0OlsaywnZ`8L+i#JzpDIb2mL%a z+rv=^0~y%*tmKD~^bI&NAnQChs94Gw%TZ8@rKhc#WEc*kRRLG4yvvj?^u*~o0=}B7 zeU<{Su||pS#6WhY-#}9K=M%#Fx+#oQ``X0T4+cc_C}vlCNUIF58yvdn(Wm@cXH=}C zz-1rGWq7u3H;GwNQ;zGZ$%#rby-%?0%|D0R43S`R3@5W)ani-tp+1t+hbLXt zWXA7iRQd%8*FVxr+=ih;QE)BOT}&?}AC5!(kUPIoY(IYVUsGLN+}uP(MFtr0Eppol zljan+Do&Qpk~-V#6=^jNno(iz#k>b3@f`DC=J9v%QVvJEyW4OM0g46V9Gwm}B{b2ZZT3L5Oew)oE{vY$l%ECWkYO$0m!Jq$m#9!q+3(WMJcGrt2Q4Fy)7kwk3e6W%`K~_a5 z;B(km3P$BX^>M|Z6SRw4jp2PqN;VP>X_og5dbY-ja#W?2zmwA4HWuCppAO8nuVQ!`USX~5gvK&+J5*nGw|!+DTsOkd zwPG{@b{yr9@upTsH5$84PSI`lKq7ytRBa(^!?c`bEg6CDEx=y7Y{XvfEEU1&JgZ-T zhG)tX6bB~pXZuJeC=|YQ6l6S}n_1EUXSWSPj>g-eN`2;L21OiYw-MjO%DR_1W922Q zUcfykTP>r>M~C^K+eHy`gO<@5PsjIpsH6SP%WbLez7PM0ja8ozaZ$=w9bF!@AIplH z^%#+twSXv2VxrHo179by#rd@yQBYh&>^!T zb6OuT$0=?u^cd_z%~E>M{s>EoUeW0z&fUZ)iC4yEecgt>JN!$_8^pu=0@&5~V@eac zuc99ki&9`cy;b4m7|blMW$8fEsCU*kvZpn$|A#IiW7m&~?I=Z0LjuQnbdmU0AXlGk zg_CN6EU=Nbl^+kh(6F@Ich1byEKH0)ml|WcA^J!{N^rGKcVai0KLmHhpnmt1to{2h z8gT2j0?ul73`JY2A;#YErGv*KJn||JiuG7Pfheg#YQLde= zYgA3tcENP3T9y4D?axdWGrcl7|oC}VlnpOE&C<$7dQX^yylVe!Lo z&&sHLr|)L+gRs6;mzrdQtKm_&`uyWf|r?>PI^6aQyae#3QYjKhpYjeS;W zVxO(f;MitycgvKh@KG*Ik#b!urQd4a=Y8G2xN;dhkMwA1z%;QH-+2ON&WL`#%)M7p zs6!5l`(JPF6kOHgSpp5q?QA+@#T{Gsphw7wA9ukDx<{8+%ZAieL}e^|)&ZthZaHoJ zA_g+&khT{EKGxaf9g==qf_ZXXkl+fgY2^9+zj+F!{{1%zz00fnNs$j4#8xD+4} z4qP3e*~vhLRgNum=+_|O)+48-{zy|5s$G8jXC*thzIH3#V#Hi;E0MLewNVFAg!XHl zw*X`Koo|*`P^k6wG5jzat8IzUFW8pNF?Qa;xHYQ~XmXwFh{;;IWS^`(XnU+eX+ zp`W$aM$scCC0^nkCEo6@24#@I+m^cCgGv)|ad8r$zXzq4A&l)k-0xhk&wVcSEfuG? zj=Wu59-AgP9K)$j+Q!vRIk%FKZS$$`P*nFDrs>}JYuu)Y!Svh9gr^4R?;i8WFe=HxEJa5YODb zt&rJrmq8t*$oa8W|1^$@9MTz(=*RSfFdkILcc!z*^2aW;K4%zz2xe5vce93#*MTj> z8Z)o_)+X%h6HQ_{;fdV2B8C&yzM8$6`aG>g>$M_$wyVkMID}Z5Ri(bZvC|+p=f~dC zS`B78($|00De|%Ud~{YJcJq0TH0#R&%10<2Z(BSPYnnUsX1`Foe35hoGyv>vG_WkIgXy_S55{PCYkMu?9eQo4zXw9HnwE?-|q@BVWqi~nNu zBL)cws3L0IwllDZrxwvU_4#Z~A#1)%W6eEg?e{v!uH@#~Ny_G9)QATK&>~SOTc-z9 zL9r0Jtl|c|h#zw9Awflj`)`{p5U|pHGKe6%VloAb+VzGm;$K zv)m|He%w+FV5AN~W5>5BCiPA)Oy^l}cB13V^b1VZ-1GxO?@~3hhSa|Zq~O$XtbB$` zg^+Yy>pVY)njH-N&(z;XsMd4ananhJ3TvlSHIbNyDZv5ZFX$(wF(~k+*63E#8BivTtJ<%HQKJ2l zGy3^w_c7w4TT_IZXoFzh<--8{+*`jbHO7X{cj+zA@A?KH*x7wg-5<+?LDvlm(`Hz7DHTHp@uJhn%i-uQ(eD7q4 zKhfm}q6%;ZDY6XJ1KnC~0rf@a_sBT`Jck-ka5g|8$Si9fR;JSpnzHI%hMt9HZtt;WMuH;B4wxH z;S5&zmLX-)!p>R@>}J82l84Z!w+i~7H2y~yY*zA|s=0P;V}P8TEaq7JWb?fcY;cxi&dwHI^bXc%i; z^a;jST9;wc_TfKRTtec92#K40DkkS6ZSRCwd>wx`wL7|a(sJLm(g0#F=n5FrT$!(H z`kD+#*s!w6Oet`EKo>Clv7d#C5+lHc<=|ylURObxMCc0s^p|c&`lV z4(Q<%wD*B-etWa6>m}_U8Kk&)JWQL{-x!weVekwSWy{Ny;wBC=$Gzx9$BO2sjiWx) zW_qOd5--j~J`OU@S(~AL>kV2biBB-;<gr2(I-ZMUMVx&;WUZ-JB^J2paRx2(xBnR=Wf+3%4(&FBhWw0SVg)(A8+KXI{N z;-)nP3I9Tb{af#!UT$8VhNy8zmm2o?^w|3xH>u20qN9_%=AQjR&eT# z1{t;Jx?TF&e{p1c_6G^O@=A_G7S4#<NI_lZyDks;W|7<(CMT9E5o6)q zMh&1c4PjrbOihf<)Xs`c?GMamt#0}9)G<;*;{6c~xTJ`hvp@7*qT?hKgsh0eXvOPI zJr$$r-7#K7ofAx;vLc?TL`yK^28p8bsM$hubnh2R1;MEwlf6)rVqcAr)r^_o)+ZUO z2L?$WsNsNaXSLDi34g#3TD>`7+8LFj+kGwmBD;E2DTTGPLDD$$VU1Q6f)XBm1lD6z zAD!w|3BC2=nGL6}RYtWqTun!})iDuvtvEQwwD)WUtGemony9j-De1mEYt*>&Q5YyO zrNev_?yJMhnSh$bIDnqSz2Ll<6_r4G+NrfN7OwD6WRS1{Q~-9E`Ld^yXqGuop;e=x z0_dvxDu}BMJ=sr$j21tz~p3xG*P-JFDm*&j?8eDh z&jm~>T;OSCY+rsST&tY=-R+Hc2ZDmI^ygQ)@-TSnJW_ew0a=*qI1<7ZMj zpg#Ic@{vT6Yh}~cZiDvE&r#EULLAc7a3dy#PKP@Ros)9y-?Nh`gcTaO1vTssBq8-{ ziPwZp0Z4L}T3tOr8OYF@Vo*c7Hv$Z~px9W=7>;x)%NDiPb}>@=49fDnjQ_&!|GTJo zt@hLi4(WNBKZJJ~sRvB{2U>gq9gg%n^Lj2zm)BO5(;N8yEjlZMHoIEfauNO`;r!44 zO|#|5AK}{&Dk1O$R}!wINl#-E=+R#-b*YBha%YKr45}Wzz*>LT7?tnE^!GIFfE-nx zZpueBwn^kjatAU9mTd$;sY{nA7VEg*`SErB8|qtyv0?wEH2a}_w9Z5<*oK#FIUxLK zEexuO9}bi@euaJ|^&p__k2#|i; zp_gz|wgqChTRd^<>(`^Dnrz<%5-mr7T73^vH{IxW_u&p}dycG12nqnp1r0md-*6&6 zxEf8}OJ>nt;ZH9ul5j|u7jLYA%iu}0OgA1z?1-u*?q_@cD?m9mrLvfKW^4lt-67@A$mR!ao4aLIVx%IFE$ z=ZZ}{!)*p_YZ0c&!Kv?`1BiRfjTyB0sb8UE7`{eE%x%L9r9QV0{5FmPW)##77hKrn z$k88e%>&#NLr4O1H6O)7eyU#mW#fI7F!Fn9{FTbDs5NM{ihi{;a6Qt?n*TpAI;+CQ zuh`hwD`qB^mX;cem-l7`ssHm9A3bdDLAsN0_BN3#IENpSUvYozm-Q(PbJQtAv*?#1 zB`PW^6xSk#2C>9NhW;CBWd40V&MQS6mmlH&a&hp)1`phle%o_kq-$bXl~?O&jGd=TjKHPk>rxj?|q_o%v!b!^OnC6}~VA0hpKE zN}H_Wp1CknO4vxKA|@>R$RsY(PMCmhwpTN zuM~tf_frQ)Cm2?_9HQO~{a4ttf6+vS05mk!jI0{^0^E$FV*OUKn0YL3=x4PU+K zEHM4~--qmsD}a8Uc|k(nqCz@O`#*B`cc_bgvQoeZ1S;ss#aSMx38@+i1*1IMgp-5!$gU%hKNq`)%dlMl zr%p$ipcT>HOjk7>>tK=KZvP9+&9uFkqWe|(7RBke1geHt{bD5BhU3>wza#5DoRi0_ zZ>E3;;00)!Y;;Qsc3ar-(x$aa_bE(f!ULv|M0w{4tf}we*>YXe4??ZN5_B0%&)5*e z1KJ_8Js^MV^r!F?-Hh~chjVzcRpYX70Z5?+j{~rhht{Weg>1M>rd51fY4RoklHbLm zobA!+s`He9Ed8rv%W^ z^1z-OE0}9*y}Q6&55`O4vgB9x4BhM;+EnK|5s*J2bG22SwVny4rqg4AomIXxe3rbC z9WwZ@diOtAgfz-}kd$bnqMe#V_P6ynyCLmwC+hpmlHk!2&uV;xVu?xJ@5Rh8h)kLN zG@}pD5#REu5lwE6QZ~VHF15H#RKoIrA9!8RdswBLhfXB2;m`P0N-uCFs@{e+3PIgDr3S-1!^_4r?*@jMXYB~3rb^Lkm zCE(v)JAfxFP9LUsDe+LMN@uJ7i$g`5c+e(>*klI~s7a^1fItn@p*|RHoNB$%(`-`8 zmdlbqaJTJrUHJRG(e)PMb?l!iPuTAvhc~rN!+P}o`u$fk8McTHBJptluiIDmuCmsH-kV~Lc*KT5TTt3Gw z)}6!hTf1ygf=w8V8t7{%PzHn|{yALVAme$)`9$u8? z4~;j0%%ICMXsoDG?%`4$gmEt=QF{U+niGpR{x>pF>GcSyHyRnk$gzYPY=gT-o@YFtPeP;PhDX2A* zNphVz3EF15_oTOH)w9oTv$NcfXajxROab{_LlvWnp?xS{!Py#igu}T;vLKyMxx!tN zg4}NXKZe)#jNqK`_*t|saZ;Rx+WVvX{=|y@s32 z`jrkU&J2t^`8L!go0sp>Dflk^(l0DDz=4;j%gd7*{2OeFHlKU*W*Wo@+}Pt}q9G#} zM@J*ji6=rx{}%0YA_7q&b1I>&w+vF*yvI%G7K+|@q)YYanc!!t z03ZqZe3*n*oF7dLen*FqOQT~p=Y@w~yMq=R`|fYXAzRz>iL;N02nM}EuU@<{8j{Qmbg}qT2|fy%q`J3 z7mKIFjxd#uFf9bMMSbnsWphLN!qfl_$#%{1^vS{xrN=-R(N+gD;R_l70FF{T6hZE? zR&v7pPytZ;>D7Nmg@23wYnj5q6r&Z1bCDBUNbZuT99Fx!=tCmM4Ij6P@IMYF#wuX5ZD<3K5Hm3)0%(pcY4w4N2+ z9-h>0(V}ppn*H@4wojqU$I&i)M^ZPL*{c76MnBSF-Z7~eJLO08!0Gw8_Mb;2iNE+$ znnex|L1YHU_|98xCk7Q;U%`@Vu;Y-yC!~{Hj@8@Sk){V4RL2BbBv(z#<%{7Tu>~(G@kh0UZ*}6NY0R?>)ilBlwMx^p+j#avht?$jZrD*jY{~_yDBO% zCQtgA5g8x;yqqs1`B``TilT-e8;6?j@BMamd0kd`72QHg6w1Xd{VJIlLg<>W&up3Y z+W62SGbQ+ZkmHQp!>{UD80VvDe@WEX%{ZA}?3rjbHJ!ol`5OKNbMDL+F^Du7rV>q=+#+&B*_4)$WuTFGH9)nL2KV*j0Dp2^}qt>FQMZKQytFgSQukR zr8TnzFtlvHrvVoRw9vv-*@ZDcz1Y(g$Kw;}V+v9qn?Z3&PZ~@93G8i|6v-@M>yi&S zbN-VzV-))z&Rxwh_`=$D_H)w)!`gv&R)lI$PSa<)zk)3#7{(1hgD5}&{qmdX`K=n9 z2xH-%qI}7ScPXav4j&ZkDA}?&uXBe!*FHLYioPl&SHlD{yQPYyGi_mHa42~SZ2Z^` zNY_h1GW0Jojaq#Y+tX}xW>8>y8h)Loae5V$PVUj>(Z?+hR@nhfv%u3CFY+SX2IOD_ zTUG6k_qd#Ap97{LJP)+R4g>j2+hPPG9TztJ4O+5#+0w^m@VyTLe`9Agb`bc60nX7& zz(oU~r}EcuT(qQvko+pI`T6ZF_~9B6^B31)oS?sM`6Gf?Ty-tQ5FSt2116xtC3oHh z6>eQ8g=h1Zo}6<1vrb0&Eam2+kvdMP{&NTu#jOGPS#LF`olS4}lE*Q_yZ=K}V9>Rl zHYJV0dJcJ<%w-RZYTi~GtzuhNI~6JcCw6aX&TNjO!ectN2Gq=d7`NU`HJ@5SLO(~T z_MuaABwt04*1y?Ge`87~*gd0u{UWqv_2QYoO&4b8Ypz#ErN*?lJUbT1?;UC#+707n zN3?!0C41P(Zk5#R>K>%Fhj%M<o!1rLA)JJ*(p4ZMxF?-&S{G&LcenW{BmixwH2DZzI5lf8 z+;hh%o>v2~3Vkpg#<&F_8VPI`@~gG}gI+Qv#2?(~P=CDDecL?JS6Bz<@9XBoW2lV_h1azN(?9=i|#{#7nv`t=2m%C$S;zgCOw(4H%`l1KmncedtOwDn7af4WPtf6O$0no)pGVZsR$XTkx6dZH&B#ycdnqJ{_(D*$F?Dx!G;+sR zz@aZQk4M3JgS=o+F9M%e4q;sW1gg6mdBHiAM@tNoOI4gip~9xkK733-EML0qo+6dX zOw`>GZQt5&TtsVAuEVETk-W#}&Kvt9OzTzC$?_qggYqwk=-X4aZd_!pr{H(LMJ=vU zI83i2=$sU+fwi+8Yt2io+nU5M9R*W!EMW-=ql0gd>mwx3 z&SJHjV-8R$1VGn=Km(^u!`Xbf0<&JCa0?y&x;bBzsYCHS{=Zlxj6>mz{}g4F*+u1wH<=%CJs( z7aPwRfvV$dnYUuMMuk3Ss?JX@d`keIb&$&BcHY76^<^NMSwWIBl%a;7RTX?@r69xD z(gyuAFYKNNH^l5YwsJ?$C&s*f3D(1(f#SkJr#|cSJvZ*LOQ!$CPVo>HXdZp`?SVfnkXQHOF$ObTkAvsHKHvOICiS;J*)7M!|cPq|allYt$T0gMms%WI1F+F2$xu97N zt4isa+)>R@jeuxomf7DWXXY3pY5Gal8FkO3uFH{XSSO^gf>Zo^3Bc#n%dT= zKt2yk@8`g%Ng@3e5nz?dAl8OgSA{>s|HywHSy(*MJ*VEm|Gy!b)v^#x&I7jvFLUblBE3^0!whV z%fq^$Dm|YJWQAN>4~KB%u-QB4GR}1}4e;#>Etj?G0wuOy-EZK_zNbP0LlOm^7!o1Q73J_^9)@!@h4qlg$Iei3O^Q3GAC_7C&7n zX~CU)@SW%t91^hT6`uYXl$bz&)4wSZgdS1eln7_MDP&|v$7L<~#wb~Faa>%o<^EIYV?`@h z{=vRIVF4J>Kh-e_7`vLv_g$GY#oIL?*0xTu4Mxy`!?N5ap7DN`Wmbwb3Rcn`^R5Ro0F%U7!79pP zW5+UGINIaj34m92vlAvT6SS;NI&Bq**E;`tkG3K7v|yLHt0oUq=tSelc)eCWL9+(g z9~C-!!-5X&#S__ReYXvctk5&d=1omcOO+DnH&>clH6MMu-fsO*g{g2vonU&DT zJ9>MU0(Oxv&Bsrte9|9pF#@v z)<2(Ie@QE>i`f(SX4@$Rcbmn8s^|(tMBc-N3D~!5kOB9fr4JNknITFS>Rbnt87?*B zoIve2$o*Zp<58j4b{dn^uFl!clD!^CEswriMW)jbzZo$is29+wE6n(Mp&NH7*E6oQ=F2)6! zo{i$GJS~4Vju3` zGXuA~8aIb=QfI+jD4^FCaiV9ZKU>*AMroYoou^lDSLPoRw3nAbSnD`n66k8nwN3N9 zd@^G!Q*Sz8cNm>DGV^jwUx;-KBOpOT72p_!ww*O@?lsG-RPd!!1`BeZJ$|=5PrjoW zS<}xlZQbj|v($=Q8G zuSGY_7Hn>AlWd~ycd2LV*P$6;`$D1(uEx4G$7@v|L8jVgX1Xoc+=wTE;EKMJy zC%b?_viUC?@}dtdd-U%PD2jzb_~Iq^I6q*$aWV#;kO0os(Z!`9>ZCZ?<|P<1?fnoI zR{K^#oIs|pmjaz7x5hwlJVtxK)o{>$+10?j!$ zPCBwS{8E@GVY``KE3IiS1mhS03Z_hv;=*YzO~ zOkwsd7j7_3;vDBzKM}{fc)?RF5Bn-8`GfRN#n^OR%kTIlLabV3gl4TknP2P zL*dH}eXf#H&W=jw!M$tU--0-&SxP@lGDUihdXL|Zg2#5mM9Q;hV8=y>HCizaj@2|& zJIp+vk29Ni!Zs^P+QzJqCsr}PyYR_PuMm=VD-j`6-#tbirFqC$>p7;j7Vbu-~z25@X z{am^3=ukFvR35)I5#8)#cLsIne)m0%cZ1YTX!-U}74%@3QiI9SFEfMOn87Qd@mfZo zg3K@nY@_1ss%e_U=#M#9Z9TV<^CEr2lVJKYEqC9E#43I!XMa&g(CoPV(FtS^8FV|* z!D~CEP{tQUr3}GF1`qJhZr6D>PzL*!oEP{-dJV(~QP&CypxFTWEM<1CSMywlui=FD z5p`v{Y*cVBJx@Ln|E+bCK!oh(CRN;-_6s=6qD$iW+>mhNi2NYQ!w$T%Iwxh}?NcsS z>34*ew&qowLW&H|Q18RlX*WVMrG4um7QXpvmzyT_c3YTXY`PORBCzj*vAS}k_WWwx zWCA+xiqBr1-|8zr(#$sB5KD6Gbs6laI$ir zRr(w$athr1;&*FA;`?F=_4Wy9HV&}-+AxkGMy^mzt{Ij|OQiT)2S_&uCwJ~g=%?Wn z$d;Ol-oai!jLkW_tpj+TNCkz@cc(l%&q$V7Y2~Ttg1;tZY`9L+t`eTEC(24HT$hl* z-)lp4I}32ScNJe*g^Be@(ycSa!eaL-N)dJ4A)cYB`x2e4=jCr@?ydGKB$w-Mu^;Xl z9aS`ULeI{QO0(s=Pe&15PdFFx`5Jk1CDERpq{Vz7j)CQDH@KOwDPD0vG~LtzDq3S_ zQCy9{QnPP~WdUlv<@mag`sm~cAU<{Nc#DsvsSY1WnsB#g6$EK8`$LQoKbTgD<(Y$r zi$6*?lHet39v&#N1!VwO&$qmTVi902XZnRMD3qK&UDvefMGC*HXK?Jt)O&wJf?int z1Cp}(L7k{j+atb;-NTucpw2>3KhPdu*V!HJDe!C{!F&OROb3E3B0y=#pjK}EI`@uG zVW)}rP%Z(Vnsf6sz^M~}9?A!L%$CYLqM7wjGMl2=TnrnX1*MG%)3U}(k1=XD(o2K) z95NbIzGNp1Hgt-Ie1`&GD=6V?^UTG7WFXW3Jpz9=6DzQ&Gt&UHKtM;=cw$+#VR}5U ze_-MLj3)`Ne-yP``=deifyf0O>o*+28!oNnZ|EafgURk;G_j4#tUq0Q4+gh+Btk}= z2a0Z-s|%Q}D}mts!@s1BiI%pik0wgWMh?rCNMi?2QY-}eUU?KEO5W8e>_N>T_g<7i zO=Nvi&g!ykR70e;$TWcI^6%*$Ojvo1AC-elpTNr%fXN4jO_2|KIn#n;iutd%T}kUL zQ?TYGM&-|9Q@%*CL<;)F;r{<1d5vm_1dlTNp%FNBA+e;=w-w zu!Bo(t10D!?%3+(K)B^P!_r%U5nk==^sgo+gyxc0UUkAU_rB3^m8_w^;W5)|~gJi2Exhjg?2w1_XcSAb!!CQxj z;-zEKG;$nNpq!#mDl>I)=TJ8+y)~c(JC}NQ{SPqaYs@=r-=*1z2h+~y2v|FoJ(U)U z-946U`87}hm6>4HKI~amDHkP?H`n9k{TftFbU! z^7S~9ve(_lrv8TAq4`nnf)n{9Xti!RL6J|`B*L&l*=cgDYC4z+qarK@`&**v#=+uA z*r>;BJvx#5>Ir+Hz1&leUu526Cd@il$@R57Cx+b+t^ z{V1W>V>%1}*g}GKOsMr)#kpd2-N5cC`aYR#gqod@)`%Lc($2f9?H%@_02-_`wygz( z+%vEgG>l(YM`jDPAp#V23!>8ychm^t)$-;}ZBtTm>A;MauHfRX<0mFyL@<_yD9MLq z_7qh?B@f-&Wl|P6eS5>{4V*PGdIwJ(-F2yM=b4f9zYnwRNvip)dDs0@qvjiq9=!d| zFh;6--{VN2m+IO#She%*Z|R&^j}5#?>0nK-m?vtr2e1W}XCym#f(S?XxR^TFpXuai zD(2cW&NO?yqP2PJHV&uH&Ay0@h<z#y`;b3<|*!ih4w)wRP&nAs3*RB zw5feO>tIm0d4_z5_!tR~%-xkh*6X2yQEpbIEO}l9a0=d;G>hHbXa zzp0t|ownr^9T@T!@^cNpdZLJSGE?)=(Zswe?*tr4N;MCkEu-+jzDz!4Xv#z&-LjG; zqy%(IQiLz3WIcO>%M_cIk!-IHPlVviJQ=k z?!hXY|6GS&wlX+n8km>>KJaaAiqJk@@(V9sZ=Pmn$>YT}FVjkbThoUx8p0*wH>;ho z*~cq5a{W<5?)U`5PhE$yQBpTn%_M&O{_9i5hU8WAyhb-~^%~up#{aaDzjenaH|8%Q zN4AHUvz|~j_)`2ne;hguerCn*>h7;P_{x@kj!#fr8cZ`gLhkI_td_+N9z33FWiaC< zCioN_Hp@_zH~0$Ur}*S&ZnKVqqW6H{Q%+FG8^M*05asT9Ggr(xq!HIYP*ISYDP&8R z-|!L))x)K&Bb?iVu8%0(e+t`6E`WRtwrG<^juoEIlcQheoDH^ zv0*srosZufU#_XYeO5Y{i_29T`h&_F$zq9(gH1+<%pJFL_7@hsaMk<%-rRF|Z&Hc- zu-WS!_}6KFE!+328M<~t`_c9!<{^%}LW5k=A%yG8>(KJaU3B|5n0aD*F=fp7wTh_t z11pW>qzq?XUHlUk?W?!W&+aLS7#n5N#&RpSrw%usSKM~CZu}lsZ7KDj@`l`!=h%jU z#(ojkf3jPHYHa>)xEaZedHYXCQSnX_EuE@1q!cM{|Mfe~qi=mqIyh{7qZxSy&-eRP z_=}CGzz)fV0Ecah76tC7?bS?{N?jM^C-yLm8=vz`PZALiu}v04=H&LtZ}&5szPwrI zH-3?AHo4XPt}X3Hg~eUlyNJQ^_k_ND$n$7_&Bb|o*S$xaLdBoeWk_I6mdbCy9=5Hv zhlAFRs6eC29Zx2JsedydonBe@N88Kee3cPrC!hbRmwPse+2obP{$$?!Um|9$ArT={ z+mCF}`z>)(Rmi|0zZWFdY6q3yhu2S~9c)F0JKr!=cNV+yh&Scd>AEvZUP5>4p^vBo zcIY#7M_M+^2w7DFC;5=RDwWG6@K<@b+b_23)f`TE3rYLPDx4yqnwZby&lD8o5$S(g zw9x+A%+7yKhoo-Uti}XkE9^+wf#0)e@n3B}EqKIDBPg3^!%n>>N&oN9& z)68+-dvnU8JC82sGdsb}_vJlx!d`y|4bV39j%}Au5#3(f@6B6v+uTN0u8!<9;DbK0 zPA9zhjP5>O5%D&O;sZDywI)vbqxXZABlHOM&9L?HN(uvSvQWns{fr*e-X=pVBlb1D zeS7+F2M(tY$2U}HQf$%CH2-xtSk6xNu(yKu!EAdK`v#ps$*s^=bK4Zlp|z|mcV64? zqVn$dXJQlji>it732WygbrfFKZZUbTlvc-v#v{>JxKURP@6*Hc9%xn0xM1`1pcGQ% zNlU_f>RG`7j=XTIi{pazb@@ht24SS_CwpvcZL2y89C_q)W%r7exTUSXx%q3FtrxG7 zaQBj2x)(1@1Si=KJ zY}gMf1<;SPb4Zk|shDXsMPXvE^VlF8+2Ep?y@THJ3yg57ohj;+2f+{giGJq}FIU|8 z<%!Sj-Cz|NS#Tz`JnhuAM@kPpN99Y|O9Kwp=}hyt>6DZ(-pTA~r^u?K;h#dxHZ6y+ zy|G4{#yg|We9uJ5C=l9+hGY8SUUKbt8Vve>DEsn2DEsg2rwvI|60%1rI~9>3sf>gQ zNw$RSOLjAcA|%x?itJgkW=ZyCgd{OU_Q8;S9sAh5pW9ODS>EsO&*#Z(_x(BNT-SB3 zb8ebGcK_D{yt>Y9g&I^ZZa+`yj@aeOaK$k-{496K(3s}4Z>NXIZ4TG&pwGF$U-0_} z?(pDZ{Exsx!{%Niu>O>oS7|QHS}TjbYJM&soR7BMe<)kW>1lgIs?GJcm zW%_CDvzSb74M(zTeR2H=7h)o6ikLTMu4qb>&*^BvcgJJ3~C6_W<)CbuY zAWyGXj;#oRsuoL|qnlgtQEP4kV?x;6x%tmBHqDY#69jS=W>G$==j;n?YzgDu*T^c} z2*O6X12u{$^xJ(H?oP*)DGM04R@n59&g#S665iDxicWoYid2E(0G&*{D05RvX%{&) z^$|z*{N_YaakuHQXXl?-jc2E7TL~ObC@QtG`%>q%6~GDtB+8*O5U5ZQ{aN*y)pcEJ z5+m);MN*CXhpl+)o-W8^t$e}0&;aAEZZ&g23O~iNa=|Dvi|53uEI=0B7l``pdYsPr zOM{_^ycBdkKcVmV5jq>lZ;ymVybz6_MW-bsi^IPYCLT8Ikbfc2Vikd!YwdOQjO>;g zpyUuXS0RB?T@xwIHg^8_lA2|tT}-g&*zr3JJSgQzDHut(#oMaoR`gq|yd#$hBK)YT ztc0FnO|a-{`r}@=&V~FB{X|n;g5|Cs;pdfa$xKOP=CVyi#3wC8SY#nT}Cc8=U)FL>(sx-MhzMGZFyp_zDbAZFUdzQ659DiW!8lXQ*mTeZ20Yoy_u;C zy;Ab<{el)*TiFf*L+3LEiT;_fF2WPklmnFCemLi+@`nx7zg0*fbVyFf`niB7GwHAP z>8`%56TgY2wg{Jr#E<+2bf(GWFH&w+h@AwCKb7p_?^x@+8ledGqK$I!ckBf&!2t%Y zN*)NE1$m4O{tj!{O&Hst$BsN(7&Ve+Qetfvi{Cm`V;LZxe|x3O&F0@gCz*WJH*E0~ zZ}GkC?CjD?kEQ;f$V$5@NCrc-b2CwFp;G87c+VO7Wm1hTf#*ev`Izi1QT9C#{{n~Qw! zlm|_4ldUkz^a2H%+36jni}Fff>os$AZlBo^+CS?;lVEZ}UDh7j^aR7o< z2^O2{xJ;HCFRr7oUneEytD_gAjibcS%?&g|KxVyHObSlNc!68~yLv}o%cm7w2NK#wubR?kmv3OK9 z@Z^Y@GsS>vQRf&IO+0s*@Zc%7r@P99RXp>Q&ahy%xVGg@%Gc%>e#e;0{lWo##^>y#?-Pv(2SDTCaj7IIaG!pU-o6vNIR;yrvHaAJ>)xguJK$L& zygXETy4z>~Z#rqtoEfa4`)I#;jnTH!FHs3~t9RJ@PY z({oH&t<71LX~$p0r`as^W{{}g{e%FZto;r_Kv2f7fOs>U&Z|WUgh}RFDXkM02wobZ z2BFUIyhZmmX1>M3jN!E-fx-m88DcC^`yRSCMI<%?fgKQ?7L zdl(=(`ewNF{I1Qyzgqj;t!58?yv4(kXHcW>EBd9#wo$ZyOdCby@@{E_$})BpZ+2&N z?>lNUH7mBbcv(e;d>d&Q+U!G})4M@Z$wG{q=bDqS**PqC2>PeW-e_O>8gJL3Nwl>? z$C{gwH_zpNv1ofYFg+r6mCiejA8D{_VCRX)u5$a*BjF z%ArT2FO5h&tau^>AO6Wqe-_o>l2#Qv;N5_<+E0g|+7j1;bqURo6cT1!WKaOxar*__wr~Dg9?IualcW*8_$;vP&Mh{Qe1G7W zoYV7xaF6>R!w`RkAzG(|StlK8hXRf!kmpvJD6cfRRP7QIHc)0I1N*bK&g5UZ;J>y) zVEuE?C1Hs!1LtvIZ|Q>dRM&6hG-y^^!|&M@6`W^yi1F%?NqsS%mxh7<8V)l{$C$k; zR9rI~+fTDkdj7#j0NVNz~LPl4l(=GOL@|G^Bz#N0qo1dkI)U#_f7PEQr zkqY5!xipjW&l)l`$GDTn@P&f|lU0d?_(7P^n1yA;_(!K^!UlGR)$b zDhEa7^@a#ttzjSQe)s#wZZBBB`gW#GLUNDAgNN1pOk?9k2?OOeT7&O$l4oFkj}&V{ zXZ$U+@yFv8N?GOeI&mYPkj?W0dO#ETDXmQW&k=q48r4Ww*PBC@R#tK{BKh&}=}xxo z`0f?&fDRmOq?A=HsCd^QFkqD;%fQvQ_~hV%lbq z>}7^<<~Oub8H(nzncDo%*{LuovzEF#p{~W#cZ*Bt5B|o=QZ69}YQmFBf0qqrV7C3$ z?SJqwz(_heQrr#Bp#ZjaFvSWMFWbCbnTeOy?%-rpV*9GT&dh+m=Ac1fy#J-KsVOk; zLC=-f2d^ET+bzYcw=T8OV5BZpHsh8nt7K?PC}T@segES33MeXk=R*W^ykSW1s)o*8 zc{rQ4b{UZ@ZJT^9Doi)RyITaY{>4{m$5rm=z3xu8c(zf2DY4K)gD+NeiDZ2p+mHWz z5~6e#^w@;UepL7%ew<^1#8s@5d8?!AfMbaCyoa=qmD>^?$F@?(796=c6e((j8qth# zrcZfEWB>)-w8Ld!+&{C|!+`EWQfG32w+z<2}(b-r~;Scwv-b}Tudd3q`A%}*lgpyfz-AE`Q});G+|b}dyV=&ab~7Iyp?7keF=Z|p*NXFZ0b*`!5ei^vRiPu2TV#=8A0fISN}@3l#394JGf*FKMO=Qu_XU6UYmU z*r)!fUno_-x9P493yl0 z_lVunaQ;PF4Ay+e_pEbQH&EwA&};0mOrv7Zyr@laX{~jnt><4y0TSy-P=Um|EkdQX zC^hwkb6rvNvN*mj&H*Jrsga)h8AI0Dv#=bkA>Ue0RqaA2VN=;|tpn&o;JrdZJI|&l zK$3N~AR!gS875lmN~dJ|cB~f2kAS7AEo^=Btus_Yni=~3_fK&QX7`!SXPbY-CS+6- z=0jN%#1gL;Yzft#cwvw)SsXC=Zn&)Fl&oeYxlFI zNV>Q@+kqIwJX(sCFG^4#6xS+0ecj$P&x}=K_FH#xS^83!{OR-d;^s%H2iz7Ks;lpx zww)@uSzhO{Cb+@fUhCbvO-@e!${L9bmBH}so?}|}e$|#Xak_m#tNQ{4{%YoU#Eaj% z5j>~|%Q)npApW-Rv;;lZTJzds#zKLzv>A4!KnI_syIig-x>l>Nyn8K~0az zE8UUg(0AB}nKwbso4=+lZZ3L~O8%`W&Y7YlEm*gL1iw=o;Aps9N-%R{IzwacZ6Q7D z*3^0Wu{;yc3b9lW-;dB!-?uvF8y3p1(zYt83ckxdG*Fi20M^^0eO*g~G3c5<7!Cl$ zpc ziCx1}0)I=fc;TB~I`2NiF?J2_^HI&qcv#>)M)%LMsm6Os4L7;egBbd-5tOxWiUyZ^xy zYgGtOdU=s6kjcYujT5jH87y3eME$cg?$P_6zerLP5POZ?IltzTlok?y41 z1i9Ncm#Q2W--YLd`RAsHpd)<4BMe9+%T|sA;4@$^CYAer9#v+Ct(cRa>hcGf3|H-0 zt{jzJ-?`9r(X4!dhWxW`SZQ5)dk7e6hQzD zY8QQEmnVDlJ9=F1w_3g5$m`Sj1zJO8(RLQ7EXi#;TO!H!R||PONSctuCUyE?zzD?^km+};t3nF*CMh>n!#XLo05!B7}Ki?cTY5WR7(exq+` z`V>3wwt!t4-?vtE!ffa2+;l|ft5N9PI7kEOibsGdUIjWTK)aa>buOOW*>Xw+kl^AQ zP`@#7{)cT(1adqPyFfK!VTIIe=pP2f;6`Y&BX&AmZC&t_Sj6_Q5EGP+mYQg{txIiV zs;CFdlB@GQ-BCB~nEPJH2=z{eu5%mE(kPU}@KJ7k332{!a|2=P$^KSf)#hb$Ked?8 z?o%x7n^og^z(=1Ww)fmu7LU7Mdc@)(bO4&LXi`Fo!7HdVK=l|1V;;~kC^?LBj=uP0 zPvoOS{iwgahLNi>`X64==kpajyQf-iby}tMn88=jG=x;N3)9*s;I80tKW8B&9R>Rf_3utD5Pg^ftLYE0b za4C}KNIzKi{Pd{|<{H!zfliq*wraP$i9UHR%4XFbyRugQuOg9n1E)H|vx?|~YHbHjVAzc^C+<<{$l3VV5>~fzV zTa#}}B#6b~Ty{oQ-s2TF#u+Z{cV6z#gzCEY912)JalV3B21UWiKIaa^hc9^=pn>u| zI&(!l9^$WAJP_ih^YSYOfIFA%P_+AReUEIQE3eS4j)TgdIOl=S(G`hY7`5%sN<&#B zcdm@<3Ky@fNimL|rcbBdU61W4Snfsn1u$y3jH*e zBz>T9ZDnwc9(>?uvPzuqEZDUm!fnKjleM)w`I4;C6kEW+we%Q<$sPotWdBeVYvn8; z+yG|u-Fb;X_pXo#Y#r&o639982Cq^aHaAMl@jG#0dLWq+udsf>)W>{R?stw%?4W*p zIK-jVtZ)dZm&dVS1;E-WVXa(i@e?7q*3u$0r3@pz_ML56BYpRw?+3XAEf;mJ(*Kn_ zluEMs&MqY?lRdb$s0D$H-@LmPbcnQ-?w>*43td=Qb z^MMX77->`0dX}cc5U+A4gBi4Ips4xgLL!lHWB8o1%F9578QBlO_qr}aCLi;wAjJ*x zdh}+Eh*ehzu7#&5H>j;CopEQCKe*h+ak}pN$uh%^`}Piudgl!NM%jKH>=$ic+4Hc! zqV3Et0qE{iEWnqBm3u0Mu6vOb$zacOU9$2IH|dOnZsMNTHSDdtKfmDiklp?!R2bAD z-L~P<2%?FkiBkUcQ^Zgz@Ys(sLppX^(oInd=<050H#>1anC7G0{CV!1IGY2~5A}?w z0Bo|fd-EG?f)K)SELZ?*!n!8&MZ$wN8%lMR`j^kYu=#!ioYcIbjQ}d&%L$sF2+KSr z-&!N7Ree+mVYSsLQgNI~dr7G|Q-J>}KGJrxV{Yij_ialTI(r#tEf@KyFs=ybubyHp z#uNmL46rkA1&_xM1de2G-3$(Sm{&$3K-SXs){wz^M_m(6$1o>}?7_ zW$T&n&x`cYB#;+ap@*GAG~Tm&|f``Uj|>bhOzZVOx_q z;t7f-#H>oFXv-wdolAH;&!}YUNk{!JH;HX!P%hbj$0XaW+t4#i8u}??Dm^W1LPTNa z0qY#8XGkxU4@cUkJMX>#ZM+=3eMRbzX>B_w?;Ju=NzJD0WwQoJCKnzK-E{Nbn`y$klI2?+m8vl z)92|Ss)6WQLx1~+G8pV3#eHXVfr;Sfsrd7og%4aZB$Wi*7Y$`;lAk`n1*QCC!exB9 zqU}_}{f==21MM`6QmdUsypTG}BK52qUYjUP%&Wp7&yf-VrFjyG#r-Hf<|=^>7GLPH z%o1?Wpn0#3Ib6anuj>OH?+s%P+=nO`S!;mUN@uUvg<$!X6C+@|!3|BHBj<(xkbNzD zh?_ETS#8K}3fE%{$CiDnt{fCOIFmHd@6L4b_)hJ6Qp@k+80o1E+25hUbP#gzaEio6 ziF7$kbw%q3qnI85dMNP*pk8}fWUQYA5?Cdb41}_jPdUre!PgEhkG-dfoqL{c5dnNX z0f4^ih4OCLa}3ej@1P>8=Xqyw0(Y%v#gQ?c3-nyt7iL17u;USz=~ss@Jh49Nd|tv1 z00pHM&dndr3M>llT~@WMm6n@`_~b}82=39$t!)rbkXnnZllJIH zp^0}jb4B~m#C`sk1XW`n{bOAGa1k0u%oWVQ3LY$}&0bPajaf+Y<3>uM29pt&%KP4D z7}=#pRGY58F?!`k&A>Ip3n4jJlE>JY9L`G|!po?G)Y53>#;S8vPeaFfULBq~;+5wz z5WY75OF`HkC3CLP#{@0LcC^~cfB7Z^uUC(T^5a77z>8%5kP@6IE^g_EBDK>kZQ&mX z4q+IT!MNkHq{fh_AenAWr66UDVQAOdj`yi`YcyCfRm7!T1!`5+SO=l3`w^oSG!>v? zZZW1Szoh1Cbz*MO8SHgFr9WC|J*z7ZaqI$w0y>ehi~Z7((=zqCS&#hg>sIlK_dYaI zM91!PS4^-SD^X*mc>crGf1=6LsWou^>LHmH&Qq|E=5dkse4MA=9Q?}5QFU>C1{=4U z4GSRTU%e>J9#>+pOTju2uwfCGe7%%hHZxkV`F30APbCC0G~~?{@ZnEoxp)6 zgh5Kw*o`?wl+;pZe*PUj9&APXizgk_PgCUtQ6|Z<+0AJ&f|TE@s6F%<_%t8OhIKi9TOd2919s#la24%WOUlkQz zjdCvB8+-=vruCEv)UpR`YyQLj%#j^aH#FssKmx+L!YQ-;>;^_AG(38@cm#RN`^+T& z`=$P)90$2{kCJ9MA}zzIjMAuKiG$mvu&`)0@Yc9@2B)?aBO6mUN6{N^VLt} z+R^nQxi0(J6}?v6!=XN3)ioT*lEM^BMTMDpWqjw&!Z?wrzH9vP%lSA^m==FY34gng zpJYVFSca1_^2BlQ71S$V>aAZOcMepQbR_)_4|Mmm z@aj$FwZbZwaR(0a%OebvXJcnQ-_Eyx&d<@f8~)-PP-E7q?|sW18A1q}4YU(33}{_` z-J{=oCqUH=oQGCpoi22Nf1_pWTbdS8{@Zc9dyDA7DCyRq}y-}BewbmI-G09riq(=-&&F5_Q<|-;`6Tyyo=(ftsW?MMGbUMr8A2^QL@3BeiP9g z-}kv+p`fd(>;!WhR`rtR%<(AQ)&BAZiQ~&rrk2QbG>wm-sMJRF1@69-q~-zH(r7$C`D_=Xj$t&88^8RDBSY*) z(J&`v$rV1%BBl3kOHXNcx6KRM%zPw71ZDp-X6jc~rO=Sxsw*A%5yyt6roNTbpjzeq z0vwm$n3BHb>Ez#fXolEznHXDG&Q9eaBUD{WPhNTQT+M@Ep3E`LlQ&0RPAETXz_ABk zS*Hg8wcmav_y^`v3{NE#{Yu5cEf8_~UmliNhBaWN2hx7kpCDVU{0g{@6xatX401`ptT5f;xhp`+9HbMvPNKQ|DbY*SE|Izpe%Gf5ZL&t=mQ>91u~1 ztUWCMEpKQKPK%#Chr1Coj=H98bN=vDXMOwIOu7C4SET=nQ76K0wg)`nr%pJ-9AGmC zI#fj>2WnxVu(NBkwm_mX_;1;(H>;7x_E*T$u)EyedKJcpmbz26QoB& zh^Jd9 zaH=ZG&Lo=`?<3D@9d(j2SgK=njcrV=c=V2GD`PQmZM(m}QouUmVgbfoOof|yh~k3r z^QONfDbVvQ-)&adfdBu`bUptEF6r z=1;z45ii?C@l&Dp&)Oc*CPwZHuZ;NIMG`u9A9m=C`g;~@m7woWMd{fMt>P(OsXY7_ zf(3$o#+&JkOoUS`+0ENth}J}f_&c8n(eZfZj*-?yueJM#y}baTZenvCV9q||C9XW; zTE2*B6zWn_(Y|Zu9>aOC?b{vlqKT{q?-Jp@5o7)`r?GaKn_d;YeHj(>TR?MTpkOcF zKpQ+B7&xcyabJNn+^wz%AR7FWMVsRW^BUjxtv*yJYAQ0h_F0hD+OO% z;-Hb%Z7)JkvC2DI>Dg-}7IQU{Za-DfFMBu?mleoe`a_Zgzg0yGdn-aEN`fB&eeM*Z ze^__K*S&k>|985h-OEHQC$s&SVGufBTWtTsCbxQ6{R*fh z?lgJ?-PXo5>TiA{0|3~&Uw~e^u1g!D7`KN7I6KGbKJ!h}^!p9^n|D+l!&*3S?Bm{T zKVchmp*%=_Pj~wC>gyNm!Qc7>moh#9FTjE&(&C$WpbB}NfpTn%PKLxrvDx@=^12`d zrwZysprl-e^ba5w0Ydzb&?{8phKX+fnGro9?@NA%i+oceE({zO@HF+5aCSeu=cDRv zyV$se?1@XU_9kZ8a`p4G=Gw!3ft;PmU7FJ;;Q1syI&K#(_l<1rH3QInz%10xSnqlN zQK@i|2`^_r`H26~S?Y}7V!7&PZe2B!D0fq|5&NDSKJ)Pel8dE7CWCUcb@n(IaM;AK zD=R45rMWR{8-J_S={%bDhxg{S%xGK!7A19GEPlA|>Ju0wy7h6?>O>;<_K$=(bN7*$xZiG z+F*INl^p%J;8Zmyl1Cy}-C)eRT-i%)9)ku-h778Ddfb2i@C9LtWUnSf3-1R0+FadSDN`N8JhMlu+GOX@5%ZL<{&@WW9^L<6zEGR}^c`P3F|;)AkIO zD4&6yM#HFc_dzKVq`e7wvZ+YP&Y34I0ONz?qjfLqkyBLUOxas)TE#lY&2fk2wdByj zSc6y94=N9HQ2vc+QS73?=oRoi#)%aTDfSl;QE3YUZmR=vu(gFSO1;1Za#`CVlxwi1 z>%z14xRg9DwrSszPwkB?xV62Oc`{b_2KXsH3gp;(KDkY{T$Ze65UN?*uw>o-k-)li zA-9-H<7c1N;L%Te!>Pso;>i;RD*z#&2I`{E5b9Yg9gCMb`hoxdEx_)pmeU`1(WpKW znO$hdKGvD}*qWH~P(zgA&Qjn`eAP+W*WVY|P3-HFb*?0nf1q~1VI9^ZqDFt+gMBFV zqL1wR_WlV}f}8l2bUAQ?frAt*c-_Xr9lrp1P26&VwbIo^_~Wylw6(>wsH?W8%W?9@yH-q7vH#z=BWp7IDM4MuXI<(q z&hIddJlT4XYT&rr#Q{HV@#&0bfz>n~2GUsRwP|TW*k3(1iZ7`QNdz}HwHG9CGWsE3 zRMNve2XZ^X0%7$%UEV|UERSk%(~oFe-thdTOG2KbDQuUJp6~Kd%X0=jpjzl*C&S=U z(7(=5cJYe0H%^7@KrH)I-+VMS@!0S~&uX<{VA0kUAR?LzoOZr5 zmL*IN)T+b$Dg27TQvAEAT6r1Y2B!T-eKbqn7|TteUej(BV5;qB3@AOA)og|@H>U5P zYZ3(2lS-8<5?rS=$A_g!i`XzqlEiy0dM+l^eXQl$gbjb818GN|LiBLoS%Md5E^7pZ z8i|o5TiY(8+h$qfYP!_?m3B8-nonTSwDr@5?5^E>@5A#B(uHOlmd=HgvbUlIm0X>7 zwx_(p>aI=&;Yi>)Nx_jTt&wM;o&QW0AQO8u7?pobl;)(3M0-5oB6u(Sn^-%|&7&r?7)$IKfK#_^0a!}%wwMtKI4D&(yF;A`7 zNLi%d`*U%%ku5dVPo5?g??1K03v}BB5$i>vcWHULRxB-CbZy~U(~hl6w>hhFahWPU zue62%vO^7C_{|Olb!8M>9xSMyD|AU#=dJtD_&8M}q0$*2v*WAK9q)`Lv3kq=f*FcO zxD{4GF>1`vg2alZjPOC=*LF$Buc$8~zqeAPykrkIyYtp9j-~#Cg{5XaUc*A=d%uT) zeC}}*YiGUT+jT%_w`-8BAlB^SUM4Kqvk5hyu2M8f&d=6&7;g3_(mICH(v0?I-D`zd z^T~P0q16xCLg5Pd^??|cwqNe7`1R7d!wtzQx8bUx!tD8p#o`7-rEd(4`;Sucn)>ZS za+%>ORdNkP$4$(ixEmm_N^XplDxjNqh6UkwEyX*gEgOio{5E*41A@BTnEP*Kri2D@ zI*!?U-J1z+rD5QSGVq{=TUq)w*m28g)fMD>t9$G1CrWI*a%BHr>l8yjF5gl}eT5ng z^|!Y507HxIlE84`m0hFMHV*ltmjkLy5WKWivmB}8QTsq3P0{SSy^=rdlQ}|*mPpuB zIcMX7PJT;?L3MJT%Kl!2o_z9@3gespRY9|?m|oH`bxbv_Ouv79L`=MeEu?d1abGCW zB(AwCg@j9!oIO(PR!~@z6{eBxBS|Lm0|B`XKe5*VkCuJY2->dS4SEwK2%^%#SPIl!bNeLVgJSV3)<2sN_G;rfRD zdLw=EPH`&x#HFXn&~TT}^+hu`eN-sY>bytnKq6A<^@rv_ypB#=l9_@FL`MHjGn2f* z@##Z7yGd`6-&jNm&?|5Fy(1DY589CwqQwq*+>Vm_zzNTGaYh?>Kx*^UwDV6-i%{98 zbZTm9o{he#Cm5(oVPZMC-R=(h9&>XJL~fq$-Gb$BIEtrvCxPO}@Vi-SF zAo=N9Udp%xYRrkWoq|Sk1{pN6LEEeVyur(U-z83~j(obTpoXnantNnj%#e|};+*hz zPLFfz={Q*U$44%Vn-cr?A*fN;O#2AtaQ|H4EtLv4P)5s;J9}O+7*`KW>~bE*K1C6R1elWe9nX zDw4YO2^Z<)cBiOd&yJ=6)r0qmsO`BUI{2Zp0PBzP;L5{zlGI zNFnWyiS7!gAHrd`pD^3)eq!B7b@G^wTu^pX+xVYzZh*Fc_%KT!e*@R|vS2&6W_q;~js)EerU2JRhMSEYW?E?S?E{c`W$L=-XmXw1I5 ztaW8{v!CgVK?!Jp0R}miY|ZY+Z_}tT19y=ZE)6Z2j%<)y3}I%nd(-*=9yU2 zkygs5KJ2Z-eX@GQvBVez>-*r4N44zR`KoV{|LSAVn6f6k;>NlwC&A~^Vd#~td`%Ig{jJreHfFuk< z4THx?vSb8(Gr38WO~Tc(2}rN3zD)i8z1@jw|}Z2$LYB&60D2VLgO!8 zPr_dXj`pfFiLUFNepuZ+0@Tb(bMLY`d?p3Q_kPkeZ%*fK5$ zW-gd^gbQCai8oDjH;5#`o1mY|z*T_$qjSAEY#aMYY+L#N133k8^T2HCp0~BpiWSIN z9A7EhYLWe(v_7(LZ!tSZ*K;rEv@ZS@zQ);6bV@8b?Q3o0?$X2-MoZWs^M z2bS#0eDHwohFj6)dr$n0=?Qub7lXA7^BS^W?%2$Ywho>H?t)SpiOcjkwt4g#hN+z9gSVwr#sTC_U{Eeuh6=K2|Py2wV4!V!&Ki;3i!vHyRgYn0Kaj$|kD>ba?Uxz&=wWP8J5hqyd@%%W(?10k{9$X_*ZD^q_wKgQ1N*9Bt@DYxHYt*dy=n zYZ9|mm+@w=5$`^YdxZ9LvF^8FcpY&tE!jvSTe3HXXV{q%HKs4FrTo^Zzb7$YTQZO{ zOxZHoMfJ;ROKqi27B~Yy~aRpThM=YXDB-aqY9+EF(?Sm}7I>2p z6~xZpI|I%3fVp|>Vq==<`l!t3&sWr(Rv_=Mzrfr5W~>C&=kJRWx3=g|o#wmAKrQ-n zE*7+yHphOPq%2B5o}7evjAtme_V1OwOItr|-H$lDBKhEr!k)|WrupN%IVoej$cwhq z3#{@3!4$5u%iK&WV4ju=6JxWz+#g1HCyNz!?^o-deT~fk?cjBv_%{6^4#CC0z&=Dg z2vS~Ic%j>SYM;5)i}b4owGkAKK8Ahn246YpxD;HXY>S@d)_&*TH*!6zS&#p$u32!3 zwK^%}>ylV#IzwUPTN3<=OvaeZqUS~<8B$0O>Na!wH0v*Z-TK){0C)Y_6Xp!&ZsZi- zb0;c`+@RL*vLFDp93ZnoF%NAf(EjA8Uq&V`6qojE)N{)4k4CBQ?#f%WU5^o;7pX85 z{$of5nU19dDLKqL%B>Ur(+CL7b5~S4g3Ul8mo}WN`G3nDp6*;6w4PfG1pS$rNhQCV5Rek4ZB=sxgu9yYQOt~ww(;TWi9O;)Q zp1e?TRc*k%us4IL+oZCK6PFEMg-N?fIlnWmxM3*)*~!FMATPu>>^Z$le%BOh`EzKX zGry2u;nuZ&yf$V+vv_pLw)KT@1pX4~)m=NP zuyYnzBjI7a!#fnEj+Pb8P5UZng?6>jaq%Y_ew|H<&vbvIRqUh#TqZuVezi{TkP070 zI{2P28#qEvxd#iL5I>W77(Ch7 zFJ(XdX9Og&o17Z*|0MYUtgWZK{}zT3iS4d$xW%r}0s81{J%)((IjR=U*1XQ%bDK^Z z$YuNgIi}iN@I@VLfcFlb2WSJ9(a{wj5anMN`Z946Pbx2*h&!K_UZitk=iAZaS$H+& z+8LhD;GeS{4rEmY1}%Dx@NeEH$mIs+5H{p+Xv`Lr@c)b^F}C&PS!nKpK9CKveoE>^ zFsapDd_M}_m#{N#E|BW@xl`v8nET>=XAKr|*vIVpTgRuPvoqp6{4v-6Pjj&eZ97nNx#CL(XcFO}Z8&FiU2b@@GiD2Fh7hlxjY~r=lk1>|czxHI+^MNpi_VJNBq?OyzAqGRm}x)(JZuD@dE8UH5$iT&QSf_rUDC*BqV_Tp{o4ZtJM z+&RbyCS)BCy5U~2=iqlf9Z$fC90)9Z^Xj#-RE2P^Y9r}Hw#Oaho%8TT>tPRT+J-xL zdiPm-qRLnh;r zQ&~n~Uq_-8m7otiD$RC3X5kP?;ImA<^U_}@nvYAn9pKU&IgGhYXqY~wVxbi3vUUj1 zSH!?Y4i;HK8UBC!&_EY-YuXMl%u3A=iBl^ds7>bz}Fbcf-6B7kWiJCe&vqe5&-zQBU)bTxIO7cdo?97jY-f zK5ypl==acDUVWP#EMsH5g^xS%_+&uG8Qa9-VM>1#HL@PnZfCAv6G35jqyKIg%D1c3 zDt3h}ztiA2#y9(Dbnm;9Oj&C6FjL;(L;upX1$z@xDKXudQK&Le^@>W;Y?>QN%?TEl z2JxAVCK8COZRK5zz?sK`pu)@+g{|sTgnU|grO_W8#Ejf>lY;4Ee&~dPrE&iXDq`rl z_G++fITJ+Scm6Ms0xU_(`2SP@fPv;>gt_iLe0_H!*stM&*qlhc(V<;!nUzZ;d@;vC zlka~$T_BjMRb1WlnYqf@&xx^#gtCy13(%5*C0Rq8N9G@D$3J*l{;hZDZ~`93YOiM^ zeZOo@vTcV+y^P4L({q5*$+8Z1`jl9{Dfz%LjXw0ij3wu+>+A)|l!fxS>R}_(Gp!@cG$oGIx>4-4O@YmGXfA}pIGEeQr;7-#sxhrUvPqSvRGtM3UTs5aEBjR*~ zE23-=HaeoJY1$ELpF5->#Fm4tEJ{`n^d<`9LaXFzcv)EK%~# z%YM*G)qLJ|REcdPQaWH5-7{>3BmDjMu8i=EEoC}aX|tUXqvPk9%X+10q&`u&N=TIh zwuc50?Braa3AF!>RUKH({~(+sICwr}^xFvaeVEsREL>%V4xXZ|3WFZT?MtsstM)X{ z&3zu(dvAa6(O=fgtr}cskB(ibc9n>+k425Gsp+a_vd?ApHnmO?mD??pB-3d{)s63@ zr(4+|`8SXfI{8l+3XCK< zm+>c&08|-@^q1t7t+i6xIgNS;9}$K4#@XRDN(~%!s8$W~%5a(xS^+B2?`>7{5v|H< zx~BQOdhPU2zp3t+OH6BFXLQjRLUQ#8-nPZ_`s6?m(mC=t6j9L5&h7UHt>kxR2+6dU z@!)SfCV7YBMK5S)UI6j)6=%P9JGDFRudSu;07)(Fye4_xoCSlfOVW5b6@oU@kR86t zhQ3|Uzs4=TRvjj}RNnOJ^aH<_>IE$iL-0ECg+%~bep%v!1|h-u_@k;KV*wH3-6S4c zWohOxmyu&mTRjXj))(htP#~9~VRRfW`X*?mp>OnW7qq5*r-9xKE5*A1n)@kOQ`q#J z`tWZX2?6HH{zUrviZ{5z?Lda>KT(eLnSEhYN00P`#9Rm1Kj)a^JOz5(3;ojGP1!It z#T=M_Gf~o{b2*>3|56916N%QQjRh>A&|}FS`(mhd9?8HZeQ#y>?i0}*KGnXFIF=f) zqRr=PPmSBsg|mbXW%e)m3(BCuFooyk?bOi>aquT;Kr^EijX^To?9<-+F$MRVJA!WN z*7w|Y=?a;54G&25%Av1IN_c#QOBNWL2-bIk z)~)2nu)r#!ITFtackL2lkBhT6yWzW3Q(Od1KtLmje~v>D{erR=udAXXcy@N>%G{)i zxb87wEURw{9_}HTKWM}rHSQn|A&bM`b;x6#rOss!MigFYbVy=Vf-!vU@G1;= z9@L!Qd4>M^ic4s*6;Z)Nzj=sJjAEy|J_}dqql0gJvK2I?Tc;Vx8m@*@q_UD+zmzbV z{}n_uQn-kCyitSBZ0vG_3g93oyoSiTwfA>@s&tzw3jq((iDT_8%^BV|yrSadG8k`l z2&nACh-Ugkd_tUbWJ+lBI5pa|i=jbb(&JR_!kzCdlM-(cT(Fk@`CoO&Dx@=>{T4xjE zb6Cm75If6Ve5}=vaAl2MO<~I}!?AgfUTr)`(Q_aIq5I|fmc&n;3DuBo8wLYq&fUU zLH?&HK*(eY_F)mac&>28&tuptx zRHCoXGs|b(IWp$|>A_5o^lFbH&C_?y#jCSm##;;PcG7=)CeN8@(V^74no=yV72pI6#%aQ7dM%-q5aE1g5`j zq$IRh4&yhg4<4xefVpTyn@Gv6{&N}-d=MLQ^nKFD*VseQ9^4z#sPCbjv8FNv?8b_$ z^(BSdKX+cc>^eqc(GJ$Kvh;=Qg2QCoqua*?(k zuoo55I*hSMuz&F@J7bK=kQvy(_Tg_Dm?ND`J^A|={(1vsST17ywYnp*9fs-T(LlfGCdvZkj8n>ohI} zYX$jz%1|LHL$uVw><3CAWmin!Cm{jU0ZsPsjmkeBG=^!kH-D;yN^9H^e`C7 zP-`BS)$ycIN*PNnQ*PO%j`N6s)$MCRq$T~;2fG=xAkm(k<8JW5^1(@qi^1)w2Du6x z@r}gG!z=Px;ubcVDn!kD;pn{^^sBySuoFpq9v1~V&|sA?z@gM*zc$5XKOuV1NZqE> zF~jPGCSP`ekUO%$W%ArXMc-k3&idMU2Myi1KVaDclFJb3NYqc_r^e_Rk2b}-Yly-f zW>fQ8Rl51?_nN{woX_q!$M~|)TT6^Bgx?Zu#kz_3YOk2;yGy1BjQoZ4E(P8m&$8Q!l1hNn&ue$E&jx; zPMbW@hsUm0>SSG7N>pSE3t4a>h7x7$yKnKOQC`38jlkc5xjf3D^1#6`dt?r&gd2T3 zFVP9ZSZdM|HSdR`cWq!?p*V2Do&kXmEVc$W_3uzr3kDpQJr${J*AoOqU>L~$acCoq z?p_0$D+5>`zV9E;sGKbSdJBenp?29>OaDp z1P2>huWYH%zqYZyu>zlcW~Bf8-`o>pVC%$s18{5061cgVKMIP9aP0DM+=gd#=A49W z|FttLzs&=K0kj;z&u1>Xu%Tw^k|yp<@6Sp-G6_j=AWe3(v|P_hz@j!*7J%)MdR~_) z%SyZ~^np3z6j)=XGSku4CL(6pPEi{lbnI+KlFPE(>D#`{>2IgO9{Wf4@1Tu{e8puuzO0CH&JW^#GUk;WTMeE1LS~G)9X{a0Lfdalc zk~besEhA#C8_Nn-=t5tQ1sb%Q9b5V=h7~qdP$OX9f~^iu!M*;?=yV>q0giA@Ke7n^ zOT(5ScR3;Hn53wTxsM_5UHlItAyd4T66vl)m3gyBn@I^!<7#3qn_$86?90HM05;Qr z^ZEV8NI!sg+m5EyDr;o}Czt6>7%Ch+Y%IOX`D;&o-ZQmYg5JlBnAdTUa;HoXmuLnE zsEO;|te<4jM#HnFv#;~58_g^3&l+REqWZ)EWzmswR-ztT$$RGqoffA#r8{L`yawA@ z_V)PLN9^3v}MW~hnEWqpf35yvgh$246f6lNAMEmq|?!Yxo` z5y#!+d~9<<^))CL!l3_gWc}>@$(vMUM5vI8wOYH}ACKmldMhy%-n0-=l|NJ>yzqU# z>ll&o+V1oxLT7@(22Vge_e|q&>_m{-st)6YiP>3aPW5IY!Zk^14w>Q>$?>h;#HQ5) zWOJ#cWros?4!l0#iR<}-f$RI&hoGuuLU^2Xi4eV?0(qRsq9L|;* z_rJC~sNYqpo#}Q~R&!p*2cEJwV;a2sF^OYvbo5gpZp4fMgZa2W9|h+1QHxOR8YdFG zv_Pl$K2r32voqySjJmn3W2@MO=k57YItV-P!{{82PU-N!IikQmH-y`A#mQd8m_Ysw z%_YuOPVtAzviI@%z_x(e7|{bdd$<%zBIL!1OG+kX;m6X2zBwGvrESr?NzJB`Tr9 zScZ|xzJ)R|#>imO7-JpGSiY~Zl)6-(@9+2RKaU>onfJV2uXE1xJkRr-R}1o3M#AFo zHu|HRh#A~N_Uh_K43U&hk@1twOH&KIyQMTCI5X6`}lRHN^Rbym*L0za%LRjPr> z39+#1u5WDb-+uq!s<|(N$@v}f^787y)db0)T@&RxwZPxN)}2xtRMx}(Mt@~n3u6A6O-x!V|4P(K%tlyP&R#!u8j12Lk+VQaB=ja*KObu z=XZgmD!zaj!4=5gBjxX&;S*CC%~hD&an?mGU|asLo}kXmcpvW6tNeEVzVV%3rnIqk zUaJ+P6UXLi@Bn9Of<<_>^I!OA>HIuUa471Eb+y2Y} z_p(3zPHVK}h)9_gUSw(6F7L3{CeBaq0%xR@L-^^EGlH6?SY+A%gIR%<$yNCxv?%N<_oQVVXWoMqbo-s_x-{nGQVaY3DFC)V^Cl*e#xT#-=Fxk zF$Z&Ag8%F3UMw8M={egG9*|!MGY!2a+d7$T`ZPcb;@a>%EGcnkaojE+D-%4Zugxg zWeHdW7S$@+$C^T>fov7!%X2Vhv{{8;R2IyIff;K{GTrZ;A&s@&tlB)V);W~W@o!+i z+`)Bj`%

|HjGv+(?>T-WkjdJsYLg{F;?G8!t?g`rkicyQHiB%1AG`X6iUalVfq7 z7po=$;_Sl3M<9l^fjcl_o742Q=C(cc!Q9Xlpw(X+^|)^qQ#|4jc@gu%%X`aY?){SM z*lTK8yLXHx%S&I~vHm(SrL;ZOf)O1eEovR2ww8NFHqTDlCL~2E`tWJKa|`1i zJ8b9NVUfvzJn9R$s*uT}Buc-zWv|P}vSnUV-!h zgMH+DakcXA%PEKq{6mdOkRilN3C)(~1U?23f9+(n-T2r!5u^L8|2Y7#usXP*X)@Yj z)38KyOMkk0(=jZH3hu||gMc>7e#UcZ7?_qKfR@cbN}Sc^!innD8K$AxGk+UC9BY8( zYF;zBL+5}+fSp5q9VljKwwc19&hi>cBa=fjBech8Bi7>eLNW335(@HSUVGeT*j_6?(kjzElA29#lE||ZpS||dJSPR^%X1vS zzVPMqR^lv;Cy(f??{+wtffP*rEtiqXMzfghz2r)YICN-`7jfb7>VJj{xWfL4&~at= zMV=N>6kd3qV0meWyu5tq#u_&>{tq8>GLGXr1pk0aHSX#*NxcKOa1o+R2C^o1?Ib2yZc0f z{P|r;GZjQs6tWH6avUx^8m_A=gme><;}#-j=8ow?dfE)C!C5J=+GkM*q#~>{Uk#f0 zBH(cbV5Z;k4D1kRz3Ox``6JwiQ8Ng-^0L^6;4{-cdNbX^Y;u(}c5}E;K=z4sM|q-7 z)`^dfOwLLqG{`-pty8;e;VklOAlZ^C8&w&8$aZ68+U!hoi9UoXAXXr|(@;Az>0ubZ zbz3gu^Ny;Qxks_=&DFRIUrx=V_wv}(e&N}n*&Au9lScVSZyrghtgAIX)3llWt*@k? zJ&1VI`Sjj~%N%xf3~K*NzwFFuMq?|z7#ewB-Q}^vy(iV=Jr?!Hyu*|donM#^DYsqs znc3hIIwjD19-G12mHhNl(2QWSUZmj=L{!zq(+|n0BF^mktD#g|BrYB$096_xy?0k~ zu21MemmK`@VJv5(`Ah`NZkhR9GNmggIWw%f+eCr=MjD!n!@zv2T-pwpJ_>4XJ;=Ll zJ>i<3fA?v&S5JluCS`V6XqOkf;~c;g*_C_c(T_f}+1?GU0xU;43?dUQ??_fQ6jiPKMmOJ;6rFlR}kagiY$R>ixv z_~p-Vs>v$^+e*g2?9^R&8BaG&8AP>1ynLLxOpJ8_y7Gb@c#Cq+TjjG;J?FqX?6VQe zvydFcA}@!Z6vbP_E^OVC2u{;4R=ME+{x(MGGgl8-`(HFZ#aplK{wTuK{^)r_aNAM& z1xe~%=^eG&=WqDhf+Ha6h~Kb zjJCMXyv>Sqq-EZG<{P)J>LL5}InzLPCf0j+;qOPhnPpduhNt^~^)c-bsR{xAi*BY~ zPD1srKm8#Teh=J9*|ov8k$XJPRyx0UckR@qDMvxFF}6u`}U6)6FwHmcPDgLT7#LpDm=>jwQ5UG%dW2`AE~Sx(EVjUo$i|#>jxH-^&HQoGxO1=nwqU3{$o3^@094Z zocF{o8m(KWl~V8R0yoHrbJhHKUw3!}E1v&88ni=#U%!}NR12OcUx&pYwCE^KrAx7Q zSj;kT@v5Ec%FYgvglF@s(zk-BbR5r70BK9}smK8I_cd1Ug1aW|gPv4{v%aby3?>Cl3xUR{ zm?N+dJKSeXDgVHhd_l)H_rM6+1$At|?~_7%y1im8u`w|*b;3>}sl8RV_WB|5^0yl( zt5Dal+RT98D8zy_*h<6a$|nWndxIV#4~zaA!{jo|&CCuH+1E=S-nMO?z0 zxX+Bjxl+y2v(_!^%njM#(%VjQuD#Q6<-Ypq_83!D02>rn1{xM1@S2KC?>q~^`K~+R zY~eC}P-C{&5=4s?Tn7QVZaCjbFJb`8!#C-PV+MwiQQ9MD>pd31LNRdt$Bw%0^xd2=OVy~IDo|AxpfCKGi zCW*MCa_sfi>3Bb|Q|an5PG2z1A~3NZE3SFTY<-kILZ7Jc6&Gbbwm}pRSlwiythL-fHpP5Q0P;4SyN~YrF)?LFxV3HufG=7 zw&9I02B@wt6=rUj>Pm&~ZlezzUEZIRjdTPF#W*P)eQs2QUkx)pY7-5i;J5H{Cqv9FI}P!_VC^;^?h)pGMxygo3F+WuxeqU(J|ywDa?hZKq9jflH+D7f{r2`xK- zjQ?BYc+x%sxta8uTeY^Aa2_jkC@D|Tt%H6+b^;5<)TxdVTOWjD1V)Vd<-(JZmrE2r z1(ka+sc4kR5KZ&07J;V5Oyu#|=L?zWzNP;Hm7_n0^bT}8Y*MKIh=9zfXyMtqPq-mN zMlQzl5Akj4n0+nvsb6IXt(CGx%jnhvyH*{t`wM9dPL_CsZNssKz2bOC zu#0#f)4aodGWxIhfyejS-Wb6qUAE_Reh2gP6wTCqE4%UOa zUq$Cc=%9IKAy@E6qSQB|o-xjtluTTbC*hQAy1mCqXey;t#~RN5+{g6K6XChV(6Qm_ zJbC4rj9Y4|*XA{R#p2cPL(i;keg5X!Gvy@L?C?1C7n4@^q1nn43h~GIn$%?oyyg|2*KzyB znp4^5V!`Cyhtnt`RxjL>N^#>IntJd_L0vmMw-4Ra^+GAtCftXz>t~)M580_A(Ej#P z;QBoGR9Lg=$#=Y0`kvN5yWj6a8NjW{WgF=Rt;BgV)@;*N>rOl>jLXa}eR}7-&C&CT z4F=kYS8&qF2v`4$&t8cnj`j5r4C3Po1bCxFvNQfDffHS^D2rPr{u)}L0$w6^xMRu0 zB8z7A7sR}lm}2V=1106&OJTWj&@q?aagJ!u4?QhMs($7eB!oR^9PyE+f(3jh8m(`x zzTgST@@dJk3ByL1PCm7$>tXncIU=A5tScWN_8hSIoh0~yqJp#D0N*_NK3{>nFRBZAb`Wfg${DIka`$&e-C zDyYY(D__FY(VU@aY|J<=j6qp_|b0AIF!$q$tg}<_?_|9G=Q`ZA= zl7Uy_v^iHVglga5J;ggtJ*w#X;9eTI#dYF%@Yj~cba)qgO z`E(0bNZ^)cSZM3GM!5XvG3WSOeS-gx+Npsf66AYBzE4yPRNp+X6$;2JhDsjG6i)p_ z6aZQ23it^=^wLXdpY1 ztbaHMWS^Z#oZ|tAe>&cv@8wB>1Q1GlCLO7D{krhCRL>)SuzRtM4UH2XMz|IIadUl@ zFQR;JBDEi7m%UT#FKzFkn#}W*X&pRYY06t+)jeZOw<#3j4>8fgSLm3e$B6PY1Tt5S zCkoZFQjD+LP&AUlHsI#egw?az1n1Z*9K!``o_BM8NdsH6FdK^AT$o>`3rZM7N6&fF zh%0GQHbIJX>GR3?er7_OqP^+(e|7>mxtDeYXhwNo$;#!P7SbxuWMqYnoExHb@>Kv zOyGu0SVp*xb&m|4B87-8llFV`7=|>V(+k$jNZO+e-h=We@ebofp=`O zkL$se3Ak*oB2v8nR+nj;3TB@Ct!HPRC&$MeZy2NG2js;@vmjzM*%9(E&54xLIQo}7 zyVtw&!H*;52P*>b=1LXj+BQr%#oj|{p;m;>^IOg0V@2a*E~|!;On>&Gw0rCwuGy}q zu9vziKdNs3c!wam1mN2wnuH_ZGmo-h}Z z|N5Kc&&QS5)#-}9kuk%uyDLBsG-7>bu{U#yk1z5@*O4_j!xFe%-FO^GKkjTO!jKa+ zvRsJ?)^A5w$vfo>j^?mEiX6W}{Dk1P%9{;WkreULs&-eRk~W{F`RZpsq}HA2H*)fW z2A#;y&)?o{c6d@ib9mp5XXCC;3K2AwUQyKXV^hqgP2>rxgK~hAU&Tjc5dod0^(K7s zS)7!z%r1h>z5Cp!-jNxXljdojO5Cm&DE=Z#oskP#B9BS!5et|NHh6>i9~ehGT5uQ0 zx4tG{v9z9^OCHmVD~vp4Hul|eNBe{V1@GDOs9r}oJ=x}I(Oz!jFm?My?c+d}(`yiG zeTkA_dzw4cU3E(hOXY9w$(D}R50CGXkQ6{{jk11YaX-bg)lsVMW4^@5TaRv+%xjM~ zvQk8*MWt-tHO$qwgYT zY2Bk?t_zs_{o!R3bNJ-pOBa-$L1;F6NWOm}ju_ZPyzZEDZI2@PkhVpxkfHngy>`UK zUI&qQe*^h%q`HHNm{?W-12R2+LkGgk8%2-_NjhyLQh^K=qnT_ZYpEKtGlcBSFS(E^ z!(G3g#1-i69ya(jHNDxhnXu@gk4{IoaJ#q{XYmg@>Tf$)qDu=zZ)wHF$0*jqdkYJP@BRmy$y9{DZj*@(Ir zUj?Uep|#I-aJjw~?LTD78X$XJNJ^meE z_U^L@WU#zb4snv%u6wL$&R5CDR;t*4T+6PRRz2s$AP4tG6ZeayC3ok0nJ#|T3Z)r@ zBF{me*X+V?M`=eD1U`)p)Zgvsk?|7URH9_%8dHO(lHw<`wS=`01*1lZ6Pf;U6j$tB z@_?Y|$%JHs#D>XszWN=;LP>CZgQ|U&l7p*?tKi*XOrPHamE2r};d`pIq`X6*)bCC) zpP?{i3IobKXVTk-Yd15^t{}Jzw_)-jFVV2^-G#vvOJR&@u?m-J`_RLVS3eC+ARE{q ze0f|SifZQ!>U!m@C8DUQyggV*+KTPdMEs;X-r2+pQS(VMX1mV0BX1$Ufg>GFc9lfH zX0M!vQ-o$4yVH6Ox$t?m*4W8mJk%#qqy87qavH-X>{884-l;0Uj8z}R9wTZ_e;6BA zu&y9zZfS6@@W1#XJTd(*JwV$33{%272^);vxlZF(M{fADsr2MXST}xbbQW`&IY(n<0<9yTLNt6Fo~@ThZHF;Au}Sx=3dllFF3obO zFHP`ePB%NIah0N{%DeHt68Vel$Nkx;9!~dE?wt|{n!}X|Rrm6>DK54M5u+nJRdc5x zLFz7?r&F$^B@gTuBYC%JhYm2>wp-^nxvQ+ ztP@lKzI@DjOG~thgQ!<~uGKS)=8O9gA+9{Qvri(r0ax~4XN2R%=PN?$_BlB_OIIrO zj9{ONmNatw@!9n&b3>8Nj^?Xc5^%7ysZ>*eWbL?&&f@0>|3X(?^m zH@FZM(_$O;IaI>G4SeD8m+3`KQafM%Fw|A3`iVwc-HiLK$5rsMCg2bkNtflzM|o3s zWkd$bH{*`%OQLi>%8J~Y9YqP)_e1i-WaOpSgp&t}p?meT!PVEof3X3|(xIMwM*WvS z-FvPg=d@StvinF%TZ5h$fpiH9N!q?&tPJ%l3FWx3MQ2{FzU>C6`ydkUJ@c2BUjQ9V zkK>1Q3&lhfi$0_s8_BPuVFh=F(jdy$$uF@{Fnu#dRtQzm&v@zYexlKLCLYr6lWwAV- zkD3>I57=A*k~cu>+m)6-SpQq1RusBysH-ek4O|jaG8ni#&V-;Chl-GsGSf=8eYe^X z9zVjYuj&Zt<|=&k{Gr57nz43ynKj+bNP3$vaBW}U7dCiGva5b&})hfUZ*X|0_LO!@~`pb#53DH5VBEq zIyQv{wX7%4RFV(>-!Scm2YFeCja3Ny_6%T3s}I3oupJ`NeT8z*UfY@6q)#))LCs{h z@t1sHvF47YfByU@s0plJQk2*__O)y?d``S!fzy%qc#T?<=ckM3+B9EFUns2Cjt>vZ z6nRgB>64OgI{vp5lto=7vs(OeATCb93Q}= z05}AQ6tKn1sS!Tkl>yZaQ_6MZ%*=QR(W7GMV}P(+BwF;;pcU_bSjqzr?W=%~Q#ofb zTH2NwIn}4{bENWKQ$sw9onwOQ4(XdEk_{}jMt%yo{bLuEu70}qH}=4NuH=zecNh^t z>+lD<`qXsWalvou=jW?e5Mi)BpllycR1%7AG%?xWlbD%EK+FkN7AtI)`&J-~veuoD z-nL(i{NH?)|GKJ4RK=VCWU*KhJxs{q4`f5oeCI?N+c{HyRMkMuOce;l?6g@e-&5HG zN)URH4c2W1C~3>%B5@|FXu>`u_;gmPIe)YO)wm8!hFK!vVaXXD0ZB?qZ19==VkJ|< zHG`AnBwJiK6tRvdJ+J+k=Ox8^($APICwsBD*S5d6>$V>B+cj1=yuw1!1pK?R18hG! zzoqcb z+%0n)YY=LiZ4gR?2WNRC4P8C|)?GF^k5=OCmhNSloh%F=PnWlD<4qut^CeDWb`_|O z*lF04H+wQ2i0+vB;5K@;BaE1?K0Gt2oO%yGPQV~Of-4mJKDYkstgIja>PU+y@+N7V zQEL8_9bvA})7Esx1k?ID$4Mu~xim=qz}*4|bZe2GE&oUS)!d{qBAc1XD)eu#cDX6X z58P6EuCiGYe{jY(+?c*@fq7FsFy?O2Wu(2e50om-35q9G2X4{tGkydm>mB* zf?W-i)4T|^rdrC!0?OQa62-+7>k7gs5{+`wO$mcu}=5-YJ{JB z`(AT!7r|wv<3MfnReE%gSW{CIS>Y2>r`@YBTvrF_Z5u8#G(H$6aSVI8-)1Okd~99k zM|AbNswr|Hj;!`P^vs1@aVMVs8Qj)yYow~5sLa=m$CeIzW?Et=WZ3;LwqfB1i3JM< zYM^|R1sy2gdH284;V{jn?FYm%KG@reI@ehm{sG0?6llswi2bv})bIn5JX33L$_XoM zeHEoHGp=~m+|NO51HPnvCI>&*aCl0bq9q$O!VFtlD**DO6?|`)g{YCDb+!k=%p^@z zNp#XC6@wPql;#$i0z+F@E>RSnT3$((i3St5#LeB<65I@2HW%`ph_6a0Bdt|@sP6KO zSL}R;T!C$HkQCD(Jc_st=lr7mD}4+kg3C%{&S?h~07{X#J#|qp`1hHS70!6QiMDwF zg`O%y(1nY4@#8}z#;v^=eU+h3E1`Q=0>*p?nyg0Iz)-r@e!v zw_9|#XP2+(yYfbv$7&$V>JCCz7wj(VtIrO2{fY`RpPYsdyb5yIqZM?{nz*J(NYn*E z7*04XG6{w+A4WiR zwjBmll~Y@L)>pJ|&e#7ecq98CzgNzmO41_)z?fitdC^wyXe!-{Dd>e(CFZ=$;OCh) zmL-k~1hVB-3UxeDnpGhw4No@M4s}^U&sUaFS~qjrijnw=VZnG*2V7Iez6zdY#=ML> z9A#Ikfc{S$--&)#Jo?3&7d^Mvogg??L;xY^;?KIj{I?YA19#?bn^&f1W8jpnGW|la zXA7lb{d3cgv67`u^u}U5->Z*y4^1>PBL(8s>fl-T?$sVN65*rb*pS$d4UW3txG8?K zeopo)2~vmDT@nb{e~+B**Bxjx-dn&|HI}S?8Y}%(ESlE)-vZOm_5R(1J6^G!?k~PK zR8!B}a#H!s-NdUHxv#!>Nf{GBjW!hOrzkaJ_4N<&d-W4JhoMBvNoB)>7N)|Jtjprx z{)$JX72Aky+f|&|IIt(a0%hCm%qrav`RX|DF3#}?m}QM}#`Dc_{SzfQTx#|>j9@{ZS^B`1Lerw({V zQC%=lJTBj(e_ImN_s#)<=1UCMp$1n2xF+J zvferE@}vh6(M*c#A=TjDZN)iQrccx z?gZr|G=k&Li8WF?ymG+kv`h1f}Dm|ovI12a*(Uw|!%_9FXw$+y>4H9(rpOnh0Y_{IK% z<<*k^-;%c#z{-<|t*-y5yLhu)%-5Is`yuk*)xwpx_x<}jAjh011>%+FVE7EkmDl-z zh6oM{nRQIRiqqem#_|_^gbab}gVpdNUp13}gZz8a+}u2|gQWUK&11N`YA2DtA-ciU z|BD=dB|!?%zy}p5JmjnT<{W^;D>HIgGR>9(BE>)TZ-Yz_NnKbAu#OP*NjwOEZ$bDsa-kbTKoegiAOUbO9y@5 w2esrosn}%=auHs$o+Q&jk^RO}k2=fE6H;hGXgR!b75H~TL+^N|y5-;h19>ol?EnA( literal 0 HcmV?d00001 diff --git a/src/class_diagram.png b/src/class_diagram.png deleted file mode 100644 index 60a085d09afa8e3cde9bbe750bfd71b402115e24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66000 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 BiiiLJ diff --git a/src/domain-model.md b/src/domain-model.md index 9e12760a0..19a555872 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -24,14 +24,15 @@ As a customer: | | | | if item not in basket | return false | | | | boolean isBasketFull() | if basket is full | return true | | | | | if basket is not full | return false | +| | | boolean addItemToBasket(Item) | if basket is not full | add Item to basket | | ----------------- | ----------------------------- | ---------------------------------------------- | --------------------------------------------- | -------------------------------------------- | | Manager | Inherits basket and inventory | boolean changeBasketCapacity(int capacity) | if capacity not negative | change basket capacity and return true | | | from public member | | if capacity negative | return false | | ----------------- | ----------------------------- | ----------------------------------------------- | ---------------------------------------------- | --------------------------------------------- | | Customer | Inherits basket and inventory | float getTotalCost() | always | return total cost of items | | | | float getBagelPrice(String variant) | always | return Bagel price | -| | | boolean addFilling(String bagel,String filling) | if Filling is not null | add Filling to Bagel and return true | -| | | | if Filling is null | return false | +| | | boolean addFilling(String bagel,String filling) | if Filling is in inventory | add Filling to Bagel and return true | +| | | | if Filling is not in inventory | return false | | | | float getFillingPrice(String filling) | always | return Filling price | | | | float getTotalBagelPrice(Bagel) | always | return Bagel price with Filling | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | @@ -49,6 +50,10 @@ As a customer: | | | boolean isFull() | if items.size() >= capacity | return true | | | | | if Basket is not full | return false | | | | int getNumberOfItems() | always | return number of items | +| | | boolean addBagelToBasket(String variant) | if basket is not full | add Bagel to Basket | +| | | boolean addFilling(String bagel,String filling) | if bagel already in basket | add Filling to Bagel and return true | +| | | | if bagel not in basket and basket not full | add new Bagel to basket and return true | +| | | | if bagel not in basket and basket is full | return false | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | | Inventory | -Map items | boolean inInventory(String item) | if item in inventory map | return true | | | | | if item not in inventory map | return false | @@ -58,10 +63,10 @@ As a customer: | | | String getSKU() | always | return SKU | | | | String getNAme() | always | return name | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| Bagel | -List fillings | boolean addFilling(String filling) | if Filling is in inventory | add Filling to Bagel and return true | -| | - float price | | if Filling is not in inventory | return false | +| Bagel | -List fillings | void addFilling(String filling) | always | add Filling to Bagel | +| | - float price | | | | | | - String variant | List getFillings() | always | return list of fillings | -| | - String sku | float getTotalPrice() | always | return bagel price + sum of filling price | +| | - String sku | | | | | | - String name | boolean removeFilling(String filling) | if Filling in fillings list | remove Filling from list and return true | | | | | if Filling not in fillings list | return false | | | | implements all Item methods | | | @@ -76,6 +81,27 @@ As a customer: | | - String sku | | | | | | - String name | | | | | ----------------- | ------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ---------------------------------------------- | -| | | | | | -| | | | | | -| | | | | | + + +## Extension 1: Discounts + +As a customer: +- When I place an order, and it contains 6 bagels I will get a discount: 6 bagels for 2.49 +- When I place an order, and it contains 12 bagels I will get a discount: 12 bagels for 3.99 +- When I place an order, and it contains 1 coffee and 1 bagel I will get a discount: coffee & bagel for 1.25 + + +| Classes | Instance variables | Methods | Scenario | Output | +|---------|----------------------|-----------------------------------------------|-----------------------------------------------|------------------------------------------------------------------------| +| Order | int numberOfFillings | float getTotalCost() | always | return number of bagels in order | +| | List bagels | float applyBagelDiscount(int remainingBagels) | remainingBagels < 6 | no bulk discount applied | +| | List coffees | | remainingBagels = 6 | 2.49 special offer | +| | | | remainingBagels < 12 && remainingBagels > 6 | special offer 2.49 + total cost of rest of bagels | +| | | | remainingBagels = 12 | 3.99 special offer | +| | | | remainingBagels > 12 && remainingBagels < 18 | 3.99 special offer + total cost of rest of bagels | +| | | | remainingBagels >= 18 && remainingBagels < 24 | 3.99 special offer + 2.49 special offer + total cost of rest of bagels | +| | | | remainingBagels >= 24 .... | 3.99 + 3.99 + total cost of rest of bagels | +| | | List getBagels | always | return list of bagels | +| | | List getCoffees | always | return list of coffees | + + diff --git a/src/main/java/com/booleanuk/extension/Bagel.java b/src/main/java/com/booleanuk/extension/Bagel.java new file mode 100644 index 000000000..f92b54892 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Bagel.java @@ -0,0 +1,78 @@ +package com.booleanuk.extension; + +import java.util.ArrayList; +import java.util.List; + +public class Bagel implements Item { + private List fillings = new ArrayList<>(); + private String variant; + private String name; + private String sku; + private float price; + + public Bagel(String variant) { + this.variant = variant.toUpperCase(); + this.name = "Bagel"; + this.price = 0.49F; + setRest(); + } + + private void setRest(){ + switch (this.variant) { + case "ONION" -> this.sku = "BGLO"; + case "PLAIN" -> { + this.price = 0.39F; + this.sku = "BGLP"; + } + case "EVERYTHING" -> this.sku = "BGLE"; + case "SESAME" -> this.sku = "BGLS"; + } + } + + @Override + public String getVariant() { + return this.variant; + } + + @Override + public float getPrice(){ + float totalPrice = this.price; + + if (!fillings.isEmpty()){ + for (Filling filling : fillings) { + totalPrice += filling.getPrice(); + } + } + return totalPrice; + } + + @Override + public String getSku() { + return this.sku; + } + + @Override + public String getName() { + return this.name; + } + + public void addFilling(String filling){ + String addFilling = filling.toUpperCase(); + fillings.add(new Filling(addFilling)); + } + + + public ListgetFillings() { + return fillings; + } + + public boolean removeFilling(String filling) { + String fillingToRemove = filling.toUpperCase(); + for(Filling fillingInList: fillings){ + if (fillingInList.getVariant().equals(fillingToRemove)){ + fillings.remove(fillingInList); + return true; + } + }return false; + } +} diff --git a/src/main/java/com/booleanuk/extension/Basket.java b/src/main/java/com/booleanuk/extension/Basket.java new file mode 100644 index 000000000..4ac5487fe --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Basket.java @@ -0,0 +1,101 @@ +package com.booleanuk.extension; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class Basket { + private static int capacity; + private final int DEFAULT_CAPACITY = 12; + private List items; + + public Basket(){ + capacity = DEFAULT_CAPACITY; + this.items = new ArrayList<>(); + } + public void addBagelToBasket(String variant) { + if (!this.isFull()) { + String item = variant.toUpperCase(); + Bagel bagel = new Bagel(item); + items.add(bagel); + } + } + + public boolean addItemToBasket(Item variant) { + if (!this.isFull() && !(variant instanceof Filling)){ + items.add(variant); + return true; + }return false; + } + + public boolean isFull() { + return items.size() >= capacity; + } + + public boolean removeItem(String itemToRemove){ + if (!items.isEmpty()) { + for (Item item : items){ + if (Objects.equals(item.getVariant().toUpperCase(), itemToRemove.toUpperCase())){ + items.remove(item); + return true; + } + } + } return false; + } + + public boolean setCapacity(int newCapacity, Manager manager){ + if (manager == null) { + throw new SecurityException("Only managers can change basket capacity"); + } + if (newCapacity >= 0){ + capacity = newCapacity; + return true; + } else return false; + } + + public float getTotalCost() { + float sum = 0; + for (Item item: items){ + sum += item.getPrice(); + } + return sum; + } + + public boolean addFillingToBagel(String bagel, String filling) { + String bagelToUpper = bagel.toUpperCase(); + String fillingToUpper = filling.toUpperCase(); + for (Item item : items) { + if (item instanceof Bagel && item.getVariant().toUpperCase().equals(bagelToUpper)) { + ((Bagel) item).addFilling(filling); + return true; + } + } + + if(isFull()){ + System.out.println("Cannot add new bagel. The basket is full."); + return false; + } + + Bagel newBagel = new Bagel(bagelToUpper); + newBagel.addFilling(fillingToUpper); + items.add(newBagel); + return true; + } + + public List getItems() { + return items; + } + + public int getCurrentCapacity() { + return capacity; + } + + public int getNumberOfItems() { + return items.size(); + } + + public Order placeOrder(){ + return new Order(items); + } + +} diff --git a/src/main/java/com/booleanuk/extension/Coffee.java b/src/main/java/com/booleanuk/extension/Coffee.java new file mode 100644 index 000000000..87fd3d572 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Coffee.java @@ -0,0 +1,49 @@ +package com.booleanuk.extension; + +public class Coffee implements Item { + private String variant; + private String name; + private String sku; + private float price; + + public Coffee(String variant) { + this.variant = variant.toUpperCase(); + this.name = "Coffee"; + this.price = 1.29F; + setRest(); + } + + private void setRest(){ + switch (this.variant) { + case "BLACK" -> { + this.price = 0.99F; + this.sku = "COFB"; + } + case "WHITE" -> { + this.price = 1.19F; + this.sku = "COFW"; + } case "CAPUCCINO" -> this.sku = "COFC"; + case "LATTE" -> this.sku = "COFL"; + } + } + + @Override + public String getVariant() { + return this.variant; + } + + @Override + public float getPrice() { + return this.price; + } + + @Override + public String getSku() { + return this.sku; + } + + @Override + public String getName() { + return this.name; + } +} diff --git a/src/main/java/com/booleanuk/extension/Customer.java b/src/main/java/com/booleanuk/extension/Customer.java new file mode 100644 index 000000000..deba32489 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Customer.java @@ -0,0 +1,50 @@ +package com.booleanuk.extension; + +public class Customer extends PublicMember { + + public Customer(Basket basket, Inventory inventory) { + super(basket, inventory); + } + + + public float getTotalCost() { + return basket.getTotalCost(); + } + + public float getBagelPrice(String variant) { + Item item = inventory.getItem(variant); + if (item != null) { + return item.getPrice(); + } return 0; + } + + public boolean addFilling(String bagel, String filling) { + if (!inventory.inInventory(bagel)) { + System.out.println("We don't sell this bagel here!"); + return false; + } + + if (!inventory.inInventory(filling)) { + System.out.println("We don't sell this filling here!"); + return false; + } + + return basket.addFillingToBagel(bagel, filling); + } + + + public float getFillingPrice(String variant) { + Item item = inventory.getItem(variant); + if (item != null) { + return item.getPrice(); + } return 0; + } + + public float getTotalBagelPrice(Bagel bagel) { + return bagel.getPrice(); + } + + public Order placeOrder() { + return basket.placeOrder(); + } +} diff --git a/src/main/java/com/booleanuk/extension/Filling.java b/src/main/java/com/booleanuk/extension/Filling.java new file mode 100644 index 000000000..661316571 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Filling.java @@ -0,0 +1,46 @@ +package com.booleanuk.extension; + +public class Filling implements Item { + private String variant; + private String name; + private String sku; + private float price; + + public Filling (String variant) { + this.variant = variant.toUpperCase(); + this.name = "Filling"; + this.price = 0.12F; + setRest(); + } + + private void setRest(){ + switch(this.variant) { + case "BACON" -> this.sku = "FILB"; + case "CHEESE" -> this.sku = "FILC"; + case "CREAM CHEESE" -> this.sku = "FILX"; + case "SMOKED SALMON" -> this.sku = "FILS"; + case "HAM" -> this.sku = "FILH"; + case "EGG" -> this.sku = "FILE"; + } + } + + @Override + public String getVariant() { + return this.variant; + } + + @Override + public float getPrice() { + return this.price; + } + + @Override + public String getSku() { + return this.sku; + } + + @Override + public String getName() { + return this.name; + } +} diff --git a/src/main/java/com/booleanuk/extension/Inventory.java b/src/main/java/com/booleanuk/extension/Inventory.java new file mode 100644 index 000000000..2e2241ae0 --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Inventory.java @@ -0,0 +1,46 @@ +package com.booleanuk.extension; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class Inventory { + private Map inventory = new HashMap<>(); + + public Inventory(){ + setDefaultInventory(); + } + + public boolean inInventory(String variant) { + String item = variant.toUpperCase(); + for (String key : inventory.keySet()) { + if (Objects.equals(key, item)) { + return true; + } + } return false; + } + + private void setDefaultInventory(){ + inventory.put("ONION", new Bagel("Onion")); + inventory.put("PLAIN", new Bagel("Plain")); + inventory.put("EVERYTHING", new Bagel("Everything")); + inventory.put("SESAME", new Bagel("Sesame")); + + inventory.put("BLACK", new Coffee("Black")); + inventory.put("WHITE", new Coffee("White")); + inventory.put("CAPUCCINO", new Coffee("Capuccino")); + inventory.put("LATTE", new Coffee("Latte")); + + inventory.put("BACON", new Filling("Bacon")); + inventory.put("EGG", new Filling("Egg")); + inventory.put("CHEESE", new Filling("Cheese")); + inventory.put("CREAM CHEESE", new Filling("Cream Cheese")); + inventory.put("SMOKED SALMON", new Filling("Smoked Salmon")); + inventory.put("HAM", new Filling("Ham")); + + } + + public Item getItem(String variant){ + return inventory.get(variant.toUpperCase()); + } +} diff --git a/src/main/java/com/booleanuk/extension/Item.java b/src/main/java/com/booleanuk/extension/Item.java new file mode 100644 index 000000000..78e31b16c --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Item.java @@ -0,0 +1,9 @@ +package com.booleanuk.extension; + +public interface Item { + + String getVariant(); + float getPrice(); + String getSku(); + String getName(); +} diff --git a/src/main/java/com/booleanuk/extension/Manager.java b/src/main/java/com/booleanuk/extension/Manager.java new file mode 100644 index 000000000..08e7b054f --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Manager.java @@ -0,0 +1,13 @@ +package com.booleanuk.extension; + +public class Manager extends PublicMember { + + public Manager(Basket basket, Inventory inventory) { + super(basket, inventory); + } + + public Boolean changeBasketCapacity(int capacity){ + return basket.setCapacity(capacity, this); + } + +} diff --git a/src/main/java/com/booleanuk/extension/Order.java b/src/main/java/com/booleanuk/extension/Order.java new file mode 100644 index 000000000..ad0a214ca --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Order.java @@ -0,0 +1,37 @@ +package com.booleanuk.extension; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class Order { + private List bagels; + private List coffees; + + + public Order(List itemsOrdered){ + this.bagels = new ArrayList<>(); + this.coffees = new ArrayList<>(); + + for (Item item : itemsOrdered){ + if (item instanceof Bagel){ + bagels.add((Bagel) item); + } else if (item instanceof Coffee){ + coffees.add((Coffee) item); + } + } + } + + + public List getBagels() { + return null; + } + + public List getCoffees() { + return null; + } + + public float getTotalCost() { + return 0; + } +} diff --git a/src/main/java/com/booleanuk/extension/PublicMember.java b/src/main/java/com/booleanuk/extension/PublicMember.java new file mode 100644 index 000000000..736565fdb --- /dev/null +++ b/src/main/java/com/booleanuk/extension/PublicMember.java @@ -0,0 +1,34 @@ +package com.booleanuk.extension; + +public class PublicMember { + protected Basket basket; + protected Inventory inventory; + + public PublicMember(Basket basket, Inventory inventory){ + this.basket = basket; + this.inventory = inventory; + } + + public boolean addBagelToBasket(String variant){ + String item = variant.toUpperCase(); + if (inventory.inInventory(item) && !basket.isFull()){ + basket.addBagelToBasket(item); + return true; + } else return false; + } + + public void addItemToBasket(Item bagel){ + if (!basket.isFull()){ + basket.addItemToBasket(bagel); + } + } + + public boolean removeItem(String item) { + String itemUpperCase = item.toUpperCase(); + return basket.removeItem(itemUpperCase); + } + + public Boolean isBasketFull() { + return basket.isFull(); + } +} From 6bfb8d94341a61fd1e44ed55b81f49a8d0ddb080 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Tue, 12 Aug 2025 19:24:28 +0200 Subject: [PATCH 23/27] OrderTest ok --- src/domain-model.md | 4 +- .../java/com/booleanuk/extension/Order.java | 82 +++++++-- .../com/booleanuk/extension/OrderTest.java | 155 ++++++++++++++++++ 3 files changed, 226 insertions(+), 15 deletions(-) create mode 100644 src/test/java/com/booleanuk/extension/OrderTest.java diff --git a/src/domain-model.md b/src/domain-model.md index 19a555872..b174012e1 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -90,6 +90,7 @@ As a customer: - When I place an order, and it contains 12 bagels I will get a discount: 12 bagels for 3.99 - When I place an order, and it contains 1 coffee and 1 bagel I will get a discount: coffee & bagel for 1.25 +-Extension of the domain model over: | Classes | Instance variables | Methods | Scenario | Output | |---------|----------------------|-----------------------------------------------|-----------------------------------------------|------------------------------------------------------------------------| @@ -103,5 +104,6 @@ As a customer: | | | | remainingBagels >= 24 .... | 3.99 + 3.99 + total cost of rest of bagels | | | | List getBagels | always | return list of bagels | | | | List getCoffees | always | return list of coffees | +| | | | | | - +## Extension 2: Receipt diff --git a/src/main/java/com/booleanuk/extension/Order.java b/src/main/java/com/booleanuk/extension/Order.java index ad0a214ca..412768b5c 100644 --- a/src/main/java/com/booleanuk/extension/Order.java +++ b/src/main/java/com/booleanuk/extension/Order.java @@ -1,37 +1,91 @@ package com.booleanuk.extension; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; public class Order { private List bagels; private List coffees; - - public Order(List itemsOrdered){ + public Order(List basketItems) { this.bagels = new ArrayList<>(); this.coffees = new ArrayList<>(); - for (Item item : itemsOrdered){ - if (item instanceof Bagel){ + for (Item item : basketItems) { + if (item instanceof Bagel) { bagels.add((Bagel) item); - } else if (item instanceof Coffee){ + } else if (item instanceof Coffee) { coffees.add((Coffee) item); } } } + public float getTotalCost() { + float total = 0; - public List getBagels() { - return null; + int blackCoffeeCount = 0; + for (Coffee coffee : coffees) { + if (coffee.getVariant().equals("BLACK")) { + blackCoffeeCount++; + } + } + + int totalFillings = 0; + for (Bagel bagel : bagels) { + totalFillings += bagel.getFillings().size(); + } + + int combos = Math.min(blackCoffeeCount, bagels.size()); + int remainingBagels = bagels.size() - combos; + int remainingBlackCoffees = blackCoffeeCount - combos; + + total += combos * 1.25f; + total += applyBagelBulkDiscounts(remainingBagels); + total += remainingBlackCoffees * 0.99f; + + for (Coffee coffee : coffees) { + if (!coffee.getVariant().equals("BLACK")) { + total += coffee.getPrice(); + } + } + + total += totalFillings * 0.12f; + + return total; } - public List getCoffees() { - return null; + private float applyBagelBulkDiscounts(int remainingBagels) { + float total = 0; + + if (remainingBagels >= 12) { + int twelvePacks = remainingBagels / 12; + total += twelvePacks * 3.99f; + remainingBagels -= twelvePacks * 12; + } + + if (remainingBagels >= 6) { + int sixPacks = remainingBagels / 6; + total += sixPacks * 2.49f; + remainingBagels -= sixPacks * 6; + } + + int startIndex = bagels.size() - remainingBagels; + for (int i = startIndex; i < bagels.size(); i++) { + Bagel bagel = bagels.get(i); + total += getBagelPrice(bagel); + } + + return total; } - public float getTotalCost() { - return 0; + private float getBagelPrice(Bagel bagel) { + return bagel.getVariant().equals("PLAIN") ? 0.39f : 0.49f; + } + + public List getBagels() { + return bagels; + } + + public List getCoffees() { + return coffees; } } diff --git a/src/test/java/com/booleanuk/extension/OrderTest.java b/src/test/java/com/booleanuk/extension/OrderTest.java new file mode 100644 index 000000000..9abc1fc61 --- /dev/null +++ b/src/test/java/com/booleanuk/extension/OrderTest.java @@ -0,0 +1,155 @@ +package com.booleanuk.extension; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +public class OrderTest { + + Bagel onion = new Bagel("Onion"); + Bagel plain = new Bagel("Plain"); + Bagel everything = new Bagel("Everything"); + Bagel sesame = new Bagel("Sesame"); + + Coffee black = new Coffee("Black"); + Coffee white = new Coffee("White"); + Coffee capuccino = new Coffee("Capuccino"); + Coffee latte = new Coffee("Latte"); + + Filling bacon = new Filling("Bacon"); + Filling egg = new Filling("Egg"); + Filling cheese = new Filling("Cheese"); + Filling creamCheese =new Filling("Cream Cheese"); + Filling salmon = new Filling("Smoked Salmon"); + Filling ham = new Filling("Ham"); + + @Test + public void emptyOrder(){ + Basket basket = new Basket(); + Inventory inventory = new Inventory(); + Customer customer = new Customer(basket,inventory); + + Order order = customer.placeOrder(); + + Assertions.assertEquals(0, order.getBagels().size()); + Assertions.assertEquals(0, order.getCoffees().size()); + Assertions.assertEquals(0, order.getTotalCost()); + } + + @Test + public void coffeeAndBagelOrder(){ + List items = new ArrayList<>(); + items.add(black); + items.add(plain); + + Order order = new Order(items); + Assertions.assertEquals(1, order.getBagels().size()); + Assertions.assertEquals(1, order.getCoffees().size()); + Assertions.assertEquals(1.25F, order.getTotalCost()); + + items.add(black); + items.add(everything); + Order order2 = new Order(items); + Assertions.assertEquals(2.5F, order2.getTotalCost()); + } + + @Test + public void coffeeAndBagelOrderExtraCoffee(){ + List items = new ArrayList<>(); + items.add(black); + items.add(black); + items.add(plain); + + Order order = new Order(items); + Assertions.assertEquals(2.24F, order.getTotalCost()); + } + + @Test + public void sixBagelsDiscount(){ + List items = new ArrayList<>(); + for (int i =0; i<6;i++){ + items.add(plain); + } + + Order order = new Order(items); + + Assertions.assertEquals(2.49F, order.getTotalCost()); + } + + @Test + public void sevenBagels(){ + List items = new ArrayList<>(); + for (int i =0; i<7;i++){ + items.add(everything); + } + + Order order = new Order(items); + Assertions.assertEquals(2.98F, order.getTotalCost()); + } + + @Test + public void twelveBagelsDiscount(){ + List items = new ArrayList<>(); + for (int i =0; i<12;i++){ + items.add(everything); + } + Order order = new Order(items); + Assertions.assertEquals(3.99F, order.getTotalCost()); + } + + @Test + public void sixteenBagels(){ + List items = new ArrayList<>(); + for (int i =0; i<16;i++){ + items.add(plain); + } + Order order = new Order(items); + Assertions.assertEquals(5.55F, order.getTotalCost(), 0.001); + } + + @Test + public void eighteenBagels(){ + List items = new ArrayList<>(); + for (int i =0; i<18;i++){ + items.add(plain); + } + Order order = new Order(items); + Assertions.assertEquals(6.48F, order.getTotalCost()); + } + + @Test + public void testFillingNotDiscount(){ + List items = new ArrayList<>(); + for (int i =0; i<5;i++){ + items.add(everything); + } + Bagel bagelWithFilling = new Bagel("sesame"); + bagelWithFilling.addFilling("egg"); + items.add(bagelWithFilling); + + Order order = new Order(items); + Assertions.assertEquals(2.61F, order.getTotalCost()); + } + + @Test + public void twentyBagels(){ + List items = new ArrayList<>(); + for (int i =0; i < 20;i++){ + items.add(sesame); + } + Order order = new Order(items); + Assertions.assertEquals(7.46F, order.getTotalCost(),0.001); + } + + @Test + public void twentyfourBagels(){ + List items = new ArrayList<>(); + for (int i =0; i < 24;i++){ + items.add(plain); + } + Order order = new Order(items); + Assertions.assertEquals(7.98F, order.getTotalCost(),0.001); + } +} \ No newline at end of file From 8aa5edf65c52b606ea2bd6d4f30838570dc7aa01 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Tue, 12 Aug 2025 20:36:46 +0200 Subject: [PATCH 24/27] ReceiptTest --- src/domain-model.md | 13 +++ .../java/com/booleanuk/extension/Order.java | 8 +- .../java/com/booleanuk/extension/Receipt.java | 21 +++++ .../com/booleanuk/extension/OrderTest.java | 23 ++--- .../com/booleanuk/extension/ReceiptTest.java | 89 +++++++++++++++++++ 5 files changed, 133 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/booleanuk/extension/Receipt.java create mode 100644 src/test/java/com/booleanuk/extension/ReceiptTest.java diff --git a/src/domain-model.md b/src/domain-model.md index b174012e1..727520e5a 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -104,6 +104,19 @@ As a customer: | | | | remainingBagels >= 24 .... | 3.99 + 3.99 + total cost of rest of bagels | | | | List getBagels | always | return list of bagels | | | | List getCoffees | always | return list of coffees | +| Basket | | Order placeOrder(List) | always | return Order | +| | | | | | +| | | | | | +| | | | | | | | | | | | ## Extension 2: Receipt + +| Classes | Instance variables | Methods | Scenario | Output | +|----------|-------------------------|-----------------------------------------------|-----------------------------------------------|------------------------------------------------------------------------| +| Receipt | Order order | | | | +| | LocalDateTime timestamp | | | | +| | | | | | +| | | | | | +| | | | | | + diff --git a/src/main/java/com/booleanuk/extension/Order.java b/src/main/java/com/booleanuk/extension/Order.java index 412768b5c..85af09597 100644 --- a/src/main/java/com/booleanuk/extension/Order.java +++ b/src/main/java/com/booleanuk/extension/Order.java @@ -1,6 +1,8 @@ package com.booleanuk.extension; -import java.util.*; + +import java.util.ArrayList; +import java.util.List; public class Order { private List bagels; @@ -39,7 +41,7 @@ public float getTotalCost() { int remainingBlackCoffees = blackCoffeeCount - combos; total += combos * 1.25f; - total += applyBagelBulkDiscounts(remainingBagels); + total += applyBagelDiscounts(remainingBagels); total += remainingBlackCoffees * 0.99f; for (Coffee coffee : coffees) { @@ -53,7 +55,7 @@ public float getTotalCost() { return total; } - private float applyBagelBulkDiscounts(int remainingBagels) { + private float applyBagelDiscounts(int remainingBagels) { float total = 0; if (remainingBagels >= 12) { diff --git a/src/main/java/com/booleanuk/extension/Receipt.java b/src/main/java/com/booleanuk/extension/Receipt.java new file mode 100644 index 000000000..df66f23ed --- /dev/null +++ b/src/main/java/com/booleanuk/extension/Receipt.java @@ -0,0 +1,21 @@ +package com.booleanuk.extension; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +public class Receipt { + public Receipt(Order order, LocalDateTime testTime) { + } + + public Order getOrder() { + return null; + } + + public LocalDate getTimestamp() { + return null; + } + + public String generateReceiptContent() { + return ""; + } +} diff --git a/src/test/java/com/booleanuk/extension/OrderTest.java b/src/test/java/com/booleanuk/extension/OrderTest.java index 9abc1fc61..790186b9b 100644 --- a/src/test/java/com/booleanuk/extension/OrderTest.java +++ b/src/test/java/com/booleanuk/extension/OrderTest.java @@ -7,30 +7,17 @@ import java.util.List; public class OrderTest { - - Bagel onion = new Bagel("Onion"); - Bagel plain = new Bagel("Plain"); + Bagel plain = new Bagel("Plain"); Bagel everything = new Bagel("Everything"); Bagel sesame = new Bagel("Sesame"); - Coffee black = new Coffee("Black"); - Coffee white = new Coffee("White"); - Coffee capuccino = new Coffee("Capuccino"); - Coffee latte = new Coffee("Latte"); - Filling bacon = new Filling("Bacon"); - Filling egg = new Filling("Egg"); - Filling cheese = new Filling("Cheese"); - Filling creamCheese =new Filling("Cream Cheese"); - Filling salmon = new Filling("Smoked Salmon"); - Filling ham = new Filling("Ham"); @Test public void emptyOrder(){ Basket basket = new Basket(); Inventory inventory = new Inventory(); Customer customer = new Customer(basket,inventory); - Order order = customer.placeOrder(); Assertions.assertEquals(0, order.getBagels().size()); @@ -43,8 +30,8 @@ public void coffeeAndBagelOrder(){ List items = new ArrayList<>(); items.add(black); items.add(plain); - Order order = new Order(items); + Assertions.assertEquals(1, order.getBagels().size()); Assertions.assertEquals(1, order.getCoffees().size()); Assertions.assertEquals(1.25F, order.getTotalCost()); @@ -52,6 +39,7 @@ public void coffeeAndBagelOrder(){ items.add(black); items.add(everything); Order order2 = new Order(items); + Assertions.assertEquals(2.5F, order2.getTotalCost()); } @@ -61,8 +49,8 @@ public void coffeeAndBagelOrderExtraCoffee(){ items.add(black); items.add(black); items.add(plain); - Order order = new Order(items); + Assertions.assertEquals(2.24F, order.getTotalCost()); } @@ -72,7 +60,6 @@ public void sixBagelsDiscount(){ for (int i =0; i<6;i++){ items.add(plain); } - Order order = new Order(items); Assertions.assertEquals(2.49F, order.getTotalCost()); @@ -84,8 +71,8 @@ public void sevenBagels(){ for (int i =0; i<7;i++){ items.add(everything); } - Order order = new Order(items); + Assertions.assertEquals(2.98F, order.getTotalCost()); } diff --git a/src/test/java/com/booleanuk/extension/ReceiptTest.java b/src/test/java/com/booleanuk/extension/ReceiptTest.java new file mode 100644 index 000000000..115dac5d3 --- /dev/null +++ b/src/test/java/com/booleanuk/extension/ReceiptTest.java @@ -0,0 +1,89 @@ +package com.booleanuk.extension; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +public class ReceiptTest { + + Bagel plain = new Bagel("Plain"); + Bagel sesame = new Bagel("Sesame"); + Coffee black = new Coffee("Black"); + + + @Test + public void createReceipt() { + List items = new ArrayList<>(); + items.add(plain); + Order order = new Order(items); + LocalDateTime testTime = LocalDateTime.of(2025, 8, 12, 11, 00, 00); + Receipt receipt = new Receipt(order, testTime); + + Assertions.assertNotNull(receipt); + Assertions.assertEquals(order, receipt.getOrder()); + Assertions.assertNotNull(receipt.getTimestamp()); + } + + @Test + public void checkPrintTop() { + List items = new ArrayList<>(); + items.add(plain); + Order order = new Order(items); + LocalDateTime testTime = LocalDateTime.of(2025, 8, 12, 11, 00, 00); + Receipt receipt = new Receipt(order, testTime); + + String content = receipt.generateReceiptContent(); + + Assertions.assertTrue(content.contains("~~~ Bob's Bagels ~~~")); + Assertions.assertTrue(content.contains("2025-08-12 11:00:00")); + Assertions.assertTrue(content.contains("----------------------------")); + } + + @Test + public void checkPrintBottom() { + List items = new ArrayList<>(); + items.add(sesame); + Order order = new Order(items); + LocalDateTime testTime = LocalDateTime.of(2025, 8, 12, 11, 00, 00); + Receipt receipt = new Receipt(order, testTime); + + String content = receipt.generateReceiptContent(); + + Assertions.assertTrue(content.contains("Thank you")); + Assertions.assertTrue(content.contains("for your order!")); + } + + @Test + public void oneItemReceipt() { + List items = new ArrayList<>(); + items.add(plain); + Order order = new Order(items); + LocalDateTime testTime = LocalDateTime.of(2025, 8, 12, 11, 00, 00); + Receipt receipt = new Receipt(order, testTime); + + String content = receipt.generateReceiptContent(); + + Assertions.assertTrue(content.contains("Plain Bagel")); + Assertions.assertTrue(content.contains("1")); + Assertions.assertTrue(content.contains("£0.39")); + Assertions.assertTrue(content.contains("Total")); + } + + @Test + public void totalSum() { + List items = new ArrayList<>(); + items.add(plain); + items.add(black); + + Order order = new Order(items); + LocalDateTime testTime = LocalDateTime.of(2025, 8, 12, 11, 00, 00); + Receipt receipt = new Receipt(order, testTime); + String content = receipt.generateReceiptContent(); + + Assertions.assertTrue(content.contains("Total")); + Assertions.assertTrue(content.contains("£1.25")); + } +} \ No newline at end of file From ca8ede9988efbf2e440954025fd6ae163d8166f2 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Tue, 12 Aug 2025 20:37:03 +0200 Subject: [PATCH 25/27] ReceiptTest --- src/test/java/com/booleanuk/extension/OrderTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/booleanuk/extension/OrderTest.java b/src/test/java/com/booleanuk/extension/OrderTest.java index 790186b9b..0f81986a2 100644 --- a/src/test/java/com/booleanuk/extension/OrderTest.java +++ b/src/test/java/com/booleanuk/extension/OrderTest.java @@ -12,7 +12,6 @@ public class OrderTest { Bagel sesame = new Bagel("Sesame"); Coffee black = new Coffee("Black"); - @Test public void emptyOrder(){ Basket basket = new Basket(); From 9d4beeb641323281d3a31faa2172448a838b312b Mon Sep 17 00:00:00 2001 From: Linda Do Date: Tue, 12 Aug 2025 21:09:33 +0200 Subject: [PATCH 26/27] ReceiptTest update --- src/domain-model.md | 50 +++++++++---------- .../java/com/booleanuk/extension/Order.java | 18 +++++-- .../java/com/booleanuk/extension/Receipt.java | 17 +++---- .../com/booleanuk/extension/ReceiptTest.java | 30 ++++------- 4 files changed, 55 insertions(+), 60 deletions(-) diff --git a/src/domain-model.md b/src/domain-model.md index 727520e5a..dff97036a 100644 --- a/src/domain-model.md +++ b/src/domain-model.md @@ -90,33 +90,33 @@ As a customer: - When I place an order, and it contains 12 bagels I will get a discount: 12 bagels for 3.99 - When I place an order, and it contains 1 coffee and 1 bagel I will get a discount: coffee & bagel for 1.25 --Extension of the domain model over: -| Classes | Instance variables | Methods | Scenario | Output | -|---------|----------------------|-----------------------------------------------|-----------------------------------------------|------------------------------------------------------------------------| -| Order | int numberOfFillings | float getTotalCost() | always | return number of bagels in order | -| | List bagels | float applyBagelDiscount(int remainingBagels) | remainingBagels < 6 | no bulk discount applied | -| | List coffees | | remainingBagels = 6 | 2.49 special offer | -| | | | remainingBagels < 12 && remainingBagels > 6 | special offer 2.49 + total cost of rest of bagels | -| | | | remainingBagels = 12 | 3.99 special offer | -| | | | remainingBagels > 12 && remainingBagels < 18 | 3.99 special offer + total cost of rest of bagels | -| | | | remainingBagels >= 18 && remainingBagels < 24 | 3.99 special offer + 2.49 special offer + total cost of rest of bagels | -| | | | remainingBagels >= 24 .... | 3.99 + 3.99 + total cost of rest of bagels | -| | | List getBagels | always | return list of bagels | -| | | List getCoffees | always | return list of coffees | -| Basket | | Order placeOrder(List) | always | return Order | -| | | | | | -| | | | | | -| | | | | | -| | | | | | +Extension of the domain model over: + +| Classes | Instance variables | Methods | Scenario | Output | +|----------|----------------------|-----------------------------------------------|-----------------------------------------------|------------------------------------------------------------------------| +| Order | int numberOfFillings | float getTotalCost() | always | return number of bagels in order | +| | List bagels | float applyBagelDiscount(int remainingBagels) | remainingBagels < 6 | no bulk discount applied | +| | List coffees | | remainingBagels = 6 | 2.49 special offer | +| | | | remainingBagels < 12 && remainingBagels > 6 | special offer 2.49 + total cost of rest of bagels | +| | | | remainingBagels = 12 | 3.99 special offer | +| | | | remainingBagels > 12 && remainingBagels < 18 | 3.99 special offer + total cost of rest of bagels | +| | | | remainingBagels >= 18 && remainingBagels < 24 | 3.99 special offer + 2.49 special offer + total cost of rest of bagels | +| | | | remainingBagels >= 24 .... | 3.99 + 3.99 + total cost of rest of bagels | +| | | List getBagels | always | return list of bagels | +| | | List getCoffees | always | return list of coffees | +| Basket | | Order placeOrder(List) | always | return Order | +| Customer | | Order placeOrder() | always | return Order | ## Extension 2: Receipt -| Classes | Instance variables | Methods | Scenario | Output | -|----------|-------------------------|-----------------------------------------------|-----------------------------------------------|------------------------------------------------------------------------| -| Receipt | Order order | | | | -| | LocalDateTime timestamp | | | | -| | | | | | -| | | | | | -| | | | | | +Extension of the domain model over: + +| Classes | Instance variables | Methods | Scenario | Output | +|---------|--------------------|-----------------------|----------|------------------------------------| +| Receipt | Order order | String makeReceipt() | always | return String with receipt details | +| Order | | Receipt makeReceipt() | always | return Receipt | +| | | void printReceipt() | always | print Receipt details | +| | | | | | +| | | | | | diff --git a/src/main/java/com/booleanuk/extension/Order.java b/src/main/java/com/booleanuk/extension/Order.java index 85af09597..219605e7b 100644 --- a/src/main/java/com/booleanuk/extension/Order.java +++ b/src/main/java/com/booleanuk/extension/Order.java @@ -1,6 +1,7 @@ package com.booleanuk.extension; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -36,11 +37,11 @@ public float getTotalCost() { totalFillings += bagel.getFillings().size(); } - int combos = Math.min(blackCoffeeCount, bagels.size()); - int remainingBagels = bagels.size() - combos; - int remainingBlackCoffees = blackCoffeeCount - combos; + int coffeeAndBagelCombo = Math.min(blackCoffeeCount, bagels.size()); + int remainingBagels = bagels.size() - coffeeAndBagelCombo; + int remainingBlackCoffees = blackCoffeeCount - coffeeAndBagelCombo; - total += combos * 1.25f; + total += coffeeAndBagelCombo * 1.25f; total += applyBagelDiscounts(remainingBagels); total += remainingBlackCoffees * 0.99f; @@ -90,4 +91,13 @@ public List getBagels() { public List getCoffees() { return coffees; } + + public Receipt makeReceipt(){ + return new Receipt(this); + } + + public void printReceipt(){ + Receipt receipt = makeReceipt(); + receipt.printReceipt(); + } } diff --git a/src/main/java/com/booleanuk/extension/Receipt.java b/src/main/java/com/booleanuk/extension/Receipt.java index df66f23ed..52f89b276 100644 --- a/src/main/java/com/booleanuk/extension/Receipt.java +++ b/src/main/java/com/booleanuk/extension/Receipt.java @@ -1,21 +1,16 @@ package com.booleanuk.extension; -import java.time.LocalDate; -import java.time.LocalDateTime; - public class Receipt { - public Receipt(Order order, LocalDateTime testTime) { + Order order; + public Receipt(Order order) { + this.order = order; } - public Order getOrder() { - return null; - } - public LocalDate getTimestamp() { - return null; + public String generateReceipt() { + return ""; } - public String generateReceiptContent() { - return ""; + public void printReceipt() { } } diff --git a/src/test/java/com/booleanuk/extension/ReceiptTest.java b/src/test/java/com/booleanuk/extension/ReceiptTest.java index 115dac5d3..2750481b4 100644 --- a/src/test/java/com/booleanuk/extension/ReceiptTest.java +++ b/src/test/java/com/booleanuk/extension/ReceiptTest.java @@ -2,8 +2,6 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - -import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -19,12 +17,9 @@ public void createReceipt() { List items = new ArrayList<>(); items.add(plain); Order order = new Order(items); - LocalDateTime testTime = LocalDateTime.of(2025, 8, 12, 11, 00, 00); - Receipt receipt = new Receipt(order, testTime); + Receipt receipt = new Receipt(order); Assertions.assertNotNull(receipt); - Assertions.assertEquals(order, receipt.getOrder()); - Assertions.assertNotNull(receipt.getTimestamp()); } @Test @@ -32,13 +27,11 @@ public void checkPrintTop() { List items = new ArrayList<>(); items.add(plain); Order order = new Order(items); - LocalDateTime testTime = LocalDateTime.of(2025, 8, 12, 11, 00, 00); - Receipt receipt = new Receipt(order, testTime); + Receipt receipt = new Receipt(order); - String content = receipt.generateReceiptContent(); + String content = receipt.generateReceipt(); Assertions.assertTrue(content.contains("~~~ Bob's Bagels ~~~")); - Assertions.assertTrue(content.contains("2025-08-12 11:00:00")); Assertions.assertTrue(content.contains("----------------------------")); } @@ -47,10 +40,9 @@ public void checkPrintBottom() { List items = new ArrayList<>(); items.add(sesame); Order order = new Order(items); - LocalDateTime testTime = LocalDateTime.of(2025, 8, 12, 11, 00, 00); - Receipt receipt = new Receipt(order, testTime); + Receipt receipt = new Receipt(order); - String content = receipt.generateReceiptContent(); + String content = receipt.generateReceipt(); Assertions.assertTrue(content.contains("Thank you")); Assertions.assertTrue(content.contains("for your order!")); @@ -61,12 +53,11 @@ public void oneItemReceipt() { List items = new ArrayList<>(); items.add(plain); Order order = new Order(items); - LocalDateTime testTime = LocalDateTime.of(2025, 8, 12, 11, 00, 00); - Receipt receipt = new Receipt(order, testTime); + Receipt receipt = new Receipt(order); - String content = receipt.generateReceiptContent(); + String content = receipt.generateReceipt(); - Assertions.assertTrue(content.contains("Plain Bagel")); + Assertions.assertTrue(content.contains("PLAIN Bagel")); Assertions.assertTrue(content.contains("1")); Assertions.assertTrue(content.contains("£0.39")); Assertions.assertTrue(content.contains("Total")); @@ -79,9 +70,8 @@ public void totalSum() { items.add(black); Order order = new Order(items); - LocalDateTime testTime = LocalDateTime.of(2025, 8, 12, 11, 00, 00); - Receipt receipt = new Receipt(order, testTime); - String content = receipt.generateReceiptContent(); + Receipt receipt = new Receipt(order); + String content = receipt.generateReceipt(); Assertions.assertTrue(content.contains("Total")); Assertions.assertTrue(content.contains("£1.25")); From a34e69fc38659e4397e833bbdd8dfd1bcc1867a9 Mon Sep 17 00:00:00 2001 From: Linda Do Date: Wed, 13 Aug 2025 08:33:42 +0200 Subject: [PATCH 27/27] Receipt --- .../java/com/booleanuk/extension/Receipt.java | 52 +++++++++++++++++-- .../com/booleanuk/extension/ReceiptTest.java | 9 ++-- 2 files changed, 52 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/booleanuk/extension/Receipt.java b/src/main/java/com/booleanuk/extension/Receipt.java index 52f89b276..6c5987394 100644 --- a/src/main/java/com/booleanuk/extension/Receipt.java +++ b/src/main/java/com/booleanuk/extension/Receipt.java @@ -1,16 +1,58 @@ package com.booleanuk.extension; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.Map; + public class Receipt { - Order order; + private Order order; + public Receipt(Order order) { this.order = order; } - - public String generateReceipt() { - return ""; + public void printReceipt() { + System.out.println(makeReceipt()); } - public void printReceipt() { + public String makeReceipt() { + StringBuilder receipt = new StringBuilder(); + + receipt.append(" ~~~ Bob's Bagels ~~~\n\n"); + receipt.append(" ").append(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))).append("\n\n"); + receipt.append("----------------------------\n\n"); + + Map bagelCounts = new HashMap<>(); + Map bagelTotals = new HashMap<>(); + + for (Bagel bagel : order.getBagels()) { + String variant = bagel.getVariant(); + bagelCounts.put(variant, bagelCounts.getOrDefault(variant, 0) + 1); + bagelTotals.put(variant, bagelTotals.getOrDefault(variant, 0F) + bagel.getPrice()); + } + + for (String variant : bagelCounts.keySet()) { + int count = bagelCounts.get(variant); + float totalPrice = bagelTotals.get(variant); + String name = variant + " Bagel"; + receipt.append(String.format("%-15s %8d £%.2f\n", name, count, totalPrice)); + } + + int coffeeCount = order.getCoffees().size(); + if (coffeeCount > 0) { + float coffeeTotal = 0; + for (Coffee coffee : order.getCoffees()) { + coffeeTotal += coffee.getPrice(); + } + receipt.append(String.format("%-15s %8d £%.2f\n", "Coffee", coffeeCount, coffeeTotal)); + } + + receipt.append("\n----------------------------\n"); + receipt.append(String.format("Total%18s£%.2f\n", "", order.getTotalCost())); + receipt.append("\n Thank you\n"); + receipt.append(" for your order!\n"); + + return receipt.toString(); } } diff --git a/src/test/java/com/booleanuk/extension/ReceiptTest.java b/src/test/java/com/booleanuk/extension/ReceiptTest.java index 2750481b4..dddb55bda 100644 --- a/src/test/java/com/booleanuk/extension/ReceiptTest.java +++ b/src/test/java/com/booleanuk/extension/ReceiptTest.java @@ -18,6 +18,7 @@ public void createReceipt() { items.add(plain); Order order = new Order(items); Receipt receipt = new Receipt(order); + receipt.printReceipt(); Assertions.assertNotNull(receipt); } @@ -29,7 +30,7 @@ public void checkPrintTop() { Order order = new Order(items); Receipt receipt = new Receipt(order); - String content = receipt.generateReceipt(); + String content = receipt.makeReceipt(); Assertions.assertTrue(content.contains("~~~ Bob's Bagels ~~~")); Assertions.assertTrue(content.contains("----------------------------")); @@ -42,7 +43,7 @@ public void checkPrintBottom() { Order order = new Order(items); Receipt receipt = new Receipt(order); - String content = receipt.generateReceipt(); + String content = receipt.makeReceipt(); Assertions.assertTrue(content.contains("Thank you")); Assertions.assertTrue(content.contains("for your order!")); @@ -55,7 +56,7 @@ public void oneItemReceipt() { Order order = new Order(items); Receipt receipt = new Receipt(order); - String content = receipt.generateReceipt(); + String content = receipt.makeReceipt(); Assertions.assertTrue(content.contains("PLAIN Bagel")); Assertions.assertTrue(content.contains("1")); @@ -71,7 +72,7 @@ public void totalSum() { Order order = new Order(items); Receipt receipt = new Receipt(order); - String content = receipt.generateReceipt(); + String content = receipt.makeReceipt(); Assertions.assertTrue(content.contains("Total")); Assertions.assertTrue(content.contains("£1.25"));