From 1eb237a8e90f18637472d810be44c6c87b644453 Mon Sep 17 00:00:00 2001 From: Aqsa Malik Date: Mon, 24 Jul 2023 10:14:37 -0400 Subject: [PATCH] Add new Coffee Shop Kata and Coffee Shop Kata solution module --- .github/workflows/maven.yml | 2 +- .github/workflows/solutions.yml | 4 +- README.md | 1 + .../new-java-features-solutions/pom.xml | 70 ++++++++ .../codekatas/coffeekata/CoffeeShopOrder.java | 136 ++++++++++++++++ .../bnymellon/codekatas/coffeekata/Item.java | 22 +++ .../coffeekata/beverage/Americano.java | 50 ++++++ .../coffeekata/beverage/Beverage.java | 24 +++ .../coffeekata/beverage/CoffeeDrink.java | 35 ++++ .../coffeekata/beverage/DrinkTemperature.java | 23 +++ .../coffeekata/beverage/FlavorSyrup.java | 24 +++ .../codekatas/coffeekata/beverage/Latte.java | 71 ++++++++ .../coffeekata/beverage/Macchiato.java | 64 ++++++++ .../coffeekata/beverage/MilkType.java | 25 +++ .../codekatas/coffeekata/beverage/Tea.java | 44 +++++ .../coffeekata/beverage/TeaType.java | 24 +++ .../codekatas/coffeekata/food/Bagel.java | 26 +++ .../codekatas/coffeekata/food/BagelType.java | 24 +++ .../codekatas/coffeekata/food/BakeryItem.java | 24 +++ .../codekatas/coffeekata/food/Cookie.java | 26 +++ .../codekatas/coffeekata/food/CookieType.java | 24 +++ .../codekatas/coffeekata/food/Donut.java | 26 +++ .../codekatas/coffeekata/food/DonutType.java | 25 +++ .../codekatas/coffeekata/food/SpreadType.java | 25 +++ .../src/test/java/CoffeeShopTest.java | 141 ++++++++++++++++ coffee-shop-kata/CoffeeShopDomain.png | Bin 0 -> 211368 bytes coffee-shop-kata/README.md | 24 +++ coffee-shop-kata/SETUP.md | 17 ++ coffee-shop-kata/new-java-features/pom.xml | 61 +++++++ .../codekatas/coffeekata/CoffeeShopOrder.java | 84 ++++++++++ .../bnymellon/codekatas/coffeekata/Item.java | 22 +++ .../coffeekata/beverage/Americano.java | 50 ++++++ .../coffeekata/beverage/Beverage.java | 25 +++ .../coffeekata/beverage/CoffeeDrink.java | 35 ++++ .../coffeekata/beverage/DrinkTemperature.java | 23 +++ .../coffeekata/beverage/FlavorSyrup.java | 24 +++ .../codekatas/coffeekata/beverage/Latte.java | 71 ++++++++ .../coffeekata/beverage/Macchiato.java | 64 ++++++++ .../coffeekata/beverage/MilkType.java | 25 +++ .../codekatas/coffeekata/beverage/Tea.java | 44 +++++ .../coffeekata/beverage/TeaType.java | 24 +++ .../codekatas/coffeekata/food/Bagel.java | 78 +++++++++ .../codekatas/coffeekata/food/BagelType.java | 24 +++ .../codekatas/coffeekata/food/BakeryItem.java | 23 +++ .../codekatas/coffeekata/food/Cookie.java | 70 ++++++++ .../codekatas/coffeekata/food/CookieType.java | 24 +++ .../codekatas/coffeekata/food/Donut.java | 63 +++++++ .../codekatas/coffeekata/food/DonutType.java | 25 +++ .../codekatas/coffeekata/food/SpreadType.java | 25 +++ .../src/test/java/CoffeeShopTest.java | 152 +++++++++++++++++ coffee-shop-kata/old-java-features/pom.xml | 58 +++++++ .../codekatas/coffeekata/CoffeeShopOrder.java | 154 ++++++++++++++++++ .../bnymellon/codekatas/coffeekata/Item.java | 22 +++ .../coffeekata/beverage/Americano.java | 51 ++++++ .../coffeekata/beverage/Beverage.java | 24 +++ .../coffeekata/beverage/CoffeeDrink.java | 22 +++ .../coffeekata/beverage/DrinkTemperature.java | 23 +++ .../coffeekata/beverage/FlavorSyrup.java | 24 +++ .../codekatas/coffeekata/beverage/Latte.java | 65 ++++++++ .../coffeekata/beverage/Macchiato.java | 58 +++++++ .../coffeekata/beverage/MilkType.java | 25 +++ .../codekatas/coffeekata/beverage/Tea.java | 39 +++++ .../coffeekata/beverage/TeaType.java | 24 +++ .../codekatas/coffeekata/food/Bagel.java | 78 +++++++++ .../codekatas/coffeekata/food/BagelType.java | 24 +++ .../codekatas/coffeekata/food/BakeryItem.java | 24 +++ .../codekatas/coffeekata/food/Cookie.java | 70 ++++++++ .../codekatas/coffeekata/food/CookieType.java | 24 +++ .../codekatas/coffeekata/food/Donut.java | 63 +++++++ .../codekatas/coffeekata/food/DonutType.java | 25 +++ .../codekatas/coffeekata/food/SpreadType.java | 25 +++ .../src/test/java/CoffeeShopTest.java | 134 +++++++++++++++ coffee-shop-kata/pom.xml | 47 ++++++ pom.xml | 2 + 74 files changed, 3139 insertions(+), 3 deletions(-) create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/pom.xml create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/CoffeeShopOrder.java create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/Item.java create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/Americano.java create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/Beverage.java create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/CoffeeDrink.java create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/DrinkTemperature.java create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/FlavorSyrup.java create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/Latte.java create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/Macchiato.java create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/MilkType.java create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/Tea.java create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/TeaType.java create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/Bagel.java create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/BagelType.java create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/BakeryItem.java create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/Cookie.java create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/CookieType.java create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/Donut.java create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/DonutType.java create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/SpreadType.java create mode 100644 coffee-shop-kata-solutions/new-java-features-solutions/src/test/java/CoffeeShopTest.java create mode 100644 coffee-shop-kata/CoffeeShopDomain.png create mode 100644 coffee-shop-kata/README.md create mode 100644 coffee-shop-kata/SETUP.md create mode 100644 coffee-shop-kata/new-java-features/pom.xml create mode 100644 coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/CoffeeShopOrder.java create mode 100644 coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/Item.java create mode 100644 coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Americano.java create mode 100644 coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Beverage.java create mode 100644 coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/CoffeeDrink.java create mode 100644 coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/DrinkTemperature.java create mode 100644 coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/FlavorSyrup.java create mode 100644 coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Latte.java create mode 100644 coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Macchiato.java create mode 100644 coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/MilkType.java create mode 100644 coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Tea.java create mode 100644 coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/TeaType.java create mode 100644 coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Bagel.java create mode 100644 coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/BagelType.java create mode 100644 coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/BakeryItem.java create mode 100644 coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Cookie.java create mode 100644 coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/CookieType.java create mode 100644 coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Donut.java create mode 100644 coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/DonutType.java create mode 100644 coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/SpreadType.java create mode 100644 coffee-shop-kata/new-java-features/src/test/java/CoffeeShopTest.java create mode 100644 coffee-shop-kata/old-java-features/pom.xml create mode 100644 coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/CoffeeShopOrder.java create mode 100644 coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/Item.java create mode 100644 coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Americano.java create mode 100644 coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Beverage.java create mode 100644 coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/CoffeeDrink.java create mode 100644 coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/DrinkTemperature.java create mode 100644 coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/FlavorSyrup.java create mode 100644 coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Latte.java create mode 100644 coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Macchiato.java create mode 100644 coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/MilkType.java create mode 100644 coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Tea.java create mode 100644 coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/TeaType.java create mode 100644 coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Bagel.java create mode 100644 coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/BagelType.java create mode 100644 coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/BakeryItem.java create mode 100644 coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Cookie.java create mode 100644 coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/CookieType.java create mode 100644 coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Donut.java create mode 100644 coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/DonutType.java create mode 100644 coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/SpreadType.java create mode 100644 coffee-shop-kata/old-java-features/src/test/java/CoffeeShopTest.java create mode 100644 coffee-shop-kata/pom.xml diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index f72ee351..f9bc3f6e 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -17,7 +17,7 @@ jobs: matrix: # os: [macos-latest, ubuntu-latest, windows-latest] os: [ubuntu-latest] - java-version: [17, 19, 20, 21] + java-version: [21] runs-on: ${{ matrix.os }} diff --git a/.github/workflows/solutions.yml b/.github/workflows/solutions.yml index b80f146a..393818d7 100644 --- a/.github/workflows/solutions.yml +++ b/.github/workflows/solutions.yml @@ -17,7 +17,7 @@ jobs: matrix: # os: [macos-latest, ubuntu-latest, windows-latest] os: [ubuntu-latest] - java-version: [17, 19, 20, 21] + java-version: [21] runs-on: ${{ matrix.os }} @@ -47,6 +47,6 @@ jobs: restore-keys: | ${{ runner.os }}-maven- - name: Maven - run: mvn -pl calendar-kata-solutions,code-point-kata-solutions,deck-of-cards-kata-solutions,donut-kata-solutions,java-lambda-kata-solutions,pitest-mutation-kata-solutions,kata-of-katas-solutions verify -Dmaven.javadoc.skip=true -B -V --no-transfer-progress + run: mvn -pl calendar-kata-solutions,code-point-kata-solutions,deck-of-cards-kata-solutions,donut-kata-solutions,java-lambda-kata-solutions,pitest-mutation-kata-solutions,coffee-shop-kata-solutions/new-java-features-solutions,kata-of-katas-solutions verify -Dmaven.javadoc.skip=true -B -V --no-transfer-progress env: MAVEN_OPTS: "-Dmaven.repo.local=$HOME/.m2/repository -Xmx1g -Dorg.slf4j.simpleLogger.showDateTime=true -Dorg.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss:SSS" diff --git a/README.md b/README.md index 358ebf72..71f50db0 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ Guava, Apache Commons and/or Vavr on a simple domain * [JMH Kata](./jmh-kata) - Experiment with the Java Microbenchmark Harness by running and writing micro-benchmark performance comparisons. * [Pitest Mutation Kata](./pitest-mutation-kata) - Practice and learn how to improve the quality of your tests by hunting mutants. * [Kata of Katas](./kata-of-katas) - Practice and learn advanced methods in Eclipse Collections. +* [Coffee Shop Kata](./coffee-shop-kata) - Practice and learn the latest Java features while comparing them with the older ones. ## Other Katas * [Eclipse Collections Katas](https://github.com/eclipse/eclipse-collections-kata) - Practice and diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/pom.xml b/coffee-shop-kata-solutions/new-java-features-solutions/pom.xml new file mode 100644 index 00000000..5eeffde9 --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/pom.xml @@ -0,0 +1,70 @@ + + + + + 4.0.0 + + bnymellon.codekatas + 1.0.0 + new-java-features-solutions + + Coffee Shop Kata Solutions + + The Coffee Shop Kata Solutions module contains solutions for the Coffee Shop Kata module + + + + UTF-8 + + 20 + 20 + 5.9.3 + + + + + org.junit.jupiter + junit-jupiter + ${junit5.version} + test + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 21 + 21 + + 3.11.0 + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.2 + + --enable-preview + + + + + + \ No newline at end of file diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/CoffeeShopOrder.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/CoffeeShopOrder.java new file mode 100644 index 00000000..c9387d41 --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/CoffeeShopOrder.java @@ -0,0 +1,136 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata; + +import bnymellon.codekatas.coffeekata.beverage.Americano; +import bnymellon.codekatas.coffeekata.beverage.CoffeeDrink; +import bnymellon.codekatas.coffeekata.beverage.DrinkTemperature; +import bnymellon.codekatas.coffeekata.beverage.FlavorSyrup; +import bnymellon.codekatas.coffeekata.beverage.Latte; +import bnymellon.codekatas.coffeekata.beverage.Macchiato; +import bnymellon.codekatas.coffeekata.beverage.MilkType; +import bnymellon.codekatas.coffeekata.beverage.Tea; +import bnymellon.codekatas.coffeekata.beverage.TeaType; +import bnymellon.codekatas.coffeekata.food.Bagel; +import bnymellon.codekatas.coffeekata.food.BagelType; +import bnymellon.codekatas.coffeekata.food.Cookie; +import bnymellon.codekatas.coffeekata.food.CookieType; +import bnymellon.codekatas.coffeekata.food.Donut; +import bnymellon.codekatas.coffeekata.food.DonutType; +import bnymellon.codekatas.coffeekata.food.SpreadType; + +import java.util.ArrayList; +import java.util.List; + +public class CoffeeShopOrder +{ + + private final String customerName; + private final List orderItems; + + public CoffeeShopOrder(String customerName, List orderItems) + { + this.customerName = customerName; + this.orderItems = orderItems; + } + + /** + * Print out a list of custom strings for the customer's food items! + * If the item is a Bagel: Print [bagelType] with [spreadType] + * If the item is a Cookie: Print [cookieType] + * If the item is a Donut: Print [donutType] + *

+ * NOTE: This method show-cases a switch-case pattern matching. + */ + public List getFoodItemsForOrder() + { + List foodItems = new ArrayList<>(); + for (Item item : this.orderItems) + { + switch (item) + { + case Bagel bagel -> foodItems.add(bagel.bagelType() + " bagel with " + bagel.spreadType()); + case Cookie cookie -> foodItems.add(cookie.cookieType() + " cookie"); + case Donut donut -> foodItems.add(donut.donutType() + " donut"); + default -> throw new IllegalStateException("Unexpected value: " + item); + } + } + return foodItems; + } + + /** + * Generate a receipt for a customer's order. + * If the item is a Donut: Print Donut: [donutType] $Price + * If the item is a Cookie: Print Cookie: [cookieType] $Price + * If the item is a Bagel: Print Bagel: [bagelType] $Price + * Total: $Total Price + *

+ * NOTE: The method highlights the usage of a record deconstruction pattern + * HINT: Use instanceOf + */ + public String generateReceipt() + { + double total = 0.0; + StringBuilder receiptBuilder = new StringBuilder(); + + for (Item item : this.orderItems) + { + if (item instanceof Donut(DonutType donutType)) + { + receiptBuilder.append("Donut: ").append(donutType).append(" $").append(item.getPrice()).append("\n"); + } + else if (item instanceof Bagel(BagelType bagelType, SpreadType spreadType, boolean toasted)) + { + receiptBuilder.append("Bagel: ").append(bagelType).append(" $").append(item.getPrice()).append("\n"); + } + else if (item instanceof Cookie(CookieType cookieType, boolean warmed)) + { + receiptBuilder.append("Cookie: ").append(cookieType).append(" $").append(item.getPrice()).append("\n"); + } + total += item.getPrice(); + } + + receiptBuilder.append("Total: $").append(total); + return receiptBuilder.toString(); + } + + /** + * Create and print drink order + * First drink : Hot Americano + * Second drink : Hot Caramel Latte with Almond Milk + * Third drink : Hot Vanilla Macchiato with Whole Milk + * Fourth drink : MATCHA Tea + *

+ * NOTE: Use interface to create four drinks + * Use the toString() to obtain descriptions of the dinks + */ + public List getDrinkForOrder() + { + List drinkItems = new ArrayList<>(); + CoffeeDrink coffeeDrink1 = new Americano(DrinkTemperature.HOT); + CoffeeDrink coffeeDrink2 = new Latte(FlavorSyrup.CARAMEL, MilkType.ALMOND_MILK, false, DrinkTemperature.HOT); + CoffeeDrink coffeeDrink3 = new Macchiato(MilkType.WHOLE_MILK, FlavorSyrup.VANILLA, DrinkTemperature.HOT); + Tea tea = new Tea(TeaType.MATCHA); + + drinkItems.add(coffeeDrink1.toString()); + drinkItems.add(coffeeDrink2.toString()); + drinkItems.add(coffeeDrink3.toString()); + drinkItems.add(tea.toString()); + + return drinkItems; + } +} diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/Item.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/Item.java new file mode 100644 index 00000000..76685d42 --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/Item.java @@ -0,0 +1,22 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata; + +public interface Item +{ + double getPrice(); +} diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/Americano.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/Americano.java new file mode 100644 index 00000000..b897a023 --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/Americano.java @@ -0,0 +1,50 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public final class Americano implements CoffeeDrink +{ + private final DrinkTemperature drinkTemperature; + + public Americano(DrinkTemperature drinkTemperature) + { + this.drinkTemperature = drinkTemperature; + } + + public DrinkTemperature getDrinkTemperature() + { + return drinkTemperature; + } + + @Override + public double getPrice() + { + return 2.00; + } + + @Override + public int espressoShot() + { + return 1; + } + + @Override + public String toString() + { + return drinkTemperature + " " + "Americano"; + } +} diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/Beverage.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/Beverage.java new file mode 100644 index 00000000..c4fa3a6e --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/Beverage.java @@ -0,0 +1,24 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +import bnymellon.codekatas.coffeekata.Item; + +public interface Beverage extends Item +{ + +} diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/CoffeeDrink.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/CoffeeDrink.java new file mode 100644 index 00000000..bfc1069c --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/CoffeeDrink.java @@ -0,0 +1,35 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +/** + * Prior to Java 15, a class was either declared as 'final' or left 'open,' + * which meant that the class could be extended infinitely. + * With the introduction of "sealed" classes, it becomes possible to + * establish a controlled hierarchy for extensions. + * Modify the following class to permit only the classes + * Latte, Macchiato, and Americano, while excluding Tea. + * + *

+ * NOTE: This class hierarchy shows the usage of sealed classes + */ + +//TODO Convert to Sealed interface +public sealed interface CoffeeDrink extends Beverage permits Latte, Macchiato, Americano +{ + int espressoShot(); +} diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/DrinkTemperature.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/DrinkTemperature.java new file mode 100644 index 00000000..2accc13d --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/DrinkTemperature.java @@ -0,0 +1,23 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public enum DrinkTemperature +{ + HOT, + ICED +} diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/FlavorSyrup.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/FlavorSyrup.java new file mode 100644 index 00000000..ee9ac59a --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/FlavorSyrup.java @@ -0,0 +1,24 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public enum FlavorSyrup +{ + VANILLA, + CHOCOLATE, + CARAMEL +} diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/Latte.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/Latte.java new file mode 100644 index 00000000..1654db5f --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/Latte.java @@ -0,0 +1,71 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public final class Latte implements CoffeeDrink +{ + private final MilkType milkType; + private final boolean extraFoam; + private final FlavorSyrup flavorSyrup; + private final DrinkTemperature drinkTemperature; + + public Latte(FlavorSyrup flavorSyrup, MilkType milkType, boolean extraFoam, DrinkTemperature drinkTemperature) + { + this.milkType = milkType; + this.extraFoam = extraFoam; + this.flavorSyrup = flavorSyrup; + this.drinkTemperature = drinkTemperature; + } + + public MilkType getMilkType() + { + return milkType; + } + + public boolean hasExtraFoam() + { + return extraFoam; + } + + public FlavorSyrup getFlavorSyrup() + { + return flavorSyrup; + } + + public DrinkTemperature getDrinkTemperature() + { + return drinkTemperature; + } + + @Override + public int espressoShot() + { + return 1; + } + + @Override + public String toString() + { + return drinkTemperature + " " + flavorSyrup + " Latte with " + milkType; + } + + @Override + public double getPrice() + { + return 3.75; + } +} diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/Macchiato.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/Macchiato.java new file mode 100644 index 00000000..74b690c4 --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/Macchiato.java @@ -0,0 +1,64 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public non-sealed class Macchiato implements CoffeeDrink +{ + private final MilkType milkType; + private final FlavorSyrup flavorSyrup; + private final DrinkTemperature drinkTemperature; + + public Macchiato(MilkType milkType, FlavorSyrup flavorSyrup, DrinkTemperature drinkTemperature) + { + this.milkType = milkType; + this.flavorSyrup = flavorSyrup; + this.drinkTemperature = drinkTemperature; + } + + public MilkType getMilkType() + { + return milkType; + } + + public FlavorSyrup getFlavorSyrup() + { + return flavorSyrup; + } + + public DrinkTemperature getDrinkTemperature() + { + return drinkTemperature; + } + + @Override + public int espressoShot() + { + return 2; + } + + @Override + public String toString() + { + return drinkTemperature + " " + flavorSyrup + " Macchiato with " + milkType; + } + + @Override + public double getPrice() + { + return 3.75; + } +} diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/MilkType.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/MilkType.java new file mode 100644 index 00000000..57e135b1 --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/MilkType.java @@ -0,0 +1,25 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public enum MilkType +{ + WHOLE_MILK, + OAT_MILK, + ALMOND_MILK, + COCONUT_MILK +} diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/Tea.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/Tea.java new file mode 100644 index 00000000..e3f9793c --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/Tea.java @@ -0,0 +1,44 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public class Tea implements Beverage +{ + private final TeaType teaType; + + public Tea(TeaType teaType) + { + this.teaType = teaType; + } + + @Override + public double getPrice() + { + return 1.50; + } + + @Override + public String toString() + { + return teaType + " " + "Tea"; + } + + public TeaType getTeaType() + { + return teaType; + } +} diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/TeaType.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/TeaType.java new file mode 100644 index 00000000..7bf89dd0 --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/beverage/TeaType.java @@ -0,0 +1,24 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public enum TeaType +{ + EARL_GREY, + MATCHA, + CHAI +} diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/Bagel.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/Bagel.java new file mode 100644 index 00000000..8300fe65 --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/Bagel.java @@ -0,0 +1,26 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +public record Bagel(BagelType bagelType, SpreadType spreadType, boolean toasted) implements BakeryItem +{ + @Override + public double getPrice() + { + return 2.50; + } +} diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/BagelType.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/BagelType.java new file mode 100644 index 00000000..d6fe0e59 --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/BagelType.java @@ -0,0 +1,24 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +public enum BagelType +{ + PLAIN, + EVERYTHING, + CINNAMON_RAISIN +} diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/BakeryItem.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/BakeryItem.java new file mode 100644 index 00000000..a080aebd --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/BakeryItem.java @@ -0,0 +1,24 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +import bnymellon.codekatas.coffeekata.Item; + +public interface BakeryItem extends Item +{ + +} diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/Cookie.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/Cookie.java new file mode 100644 index 00000000..04b13228 --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/Cookie.java @@ -0,0 +1,26 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +public record Cookie(CookieType cookieType, boolean warmed) implements BakeryItem +{ + @Override + public double getPrice() + { + return 1.25; + } +} diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/CookieType.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/CookieType.java new file mode 100644 index 00000000..5653c027 --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/CookieType.java @@ -0,0 +1,24 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +public enum CookieType +{ + CHOCOLATE_CHIP, + PEANUT_BUTTER, + OATMEAL_RAISIN +} diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/Donut.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/Donut.java new file mode 100644 index 00000000..aaa8fe06 --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/Donut.java @@ -0,0 +1,26 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +public record Donut(DonutType donutType) implements BakeryItem +{ + @Override + public double getPrice() + { + return 1.75; + } +} diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/DonutType.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/DonutType.java new file mode 100644 index 00000000..883041e8 --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/DonutType.java @@ -0,0 +1,25 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +public enum DonutType +{ + BOSTON_CREAM, + DOUBLE_CHOCOLATE, + GLAZED, + JELLY +} diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/SpreadType.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/SpreadType.java new file mode 100644 index 00000000..1761730a --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/main/java/bnymellon/codekatas/coffeekata/food/SpreadType.java @@ -0,0 +1,25 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +public enum SpreadType +{ + BUTTER, + PLAIN_CREAM_CHEESE, + HERB_GARLIC_CREAM_CHEESE, + STRAWBERRY_JAM +} diff --git a/coffee-shop-kata-solutions/new-java-features-solutions/src/test/java/CoffeeShopTest.java b/coffee-shop-kata-solutions/new-java-features-solutions/src/test/java/CoffeeShopTest.java new file mode 100644 index 00000000..0f8d104f --- /dev/null +++ b/coffee-shop-kata-solutions/new-java-features-solutions/src/test/java/CoffeeShopTest.java @@ -0,0 +1,141 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import bnymellon.codekatas.coffeekata.CoffeeShopOrder; +import bnymellon.codekatas.coffeekata.Item; +import bnymellon.codekatas.coffeekata.beverage.Americano; +import bnymellon.codekatas.coffeekata.beverage.CoffeeDrink; +import bnymellon.codekatas.coffeekata.beverage.Latte; +import bnymellon.codekatas.coffeekata.beverage.Macchiato; +import bnymellon.codekatas.coffeekata.food.Bagel; +import bnymellon.codekatas.coffeekata.food.Cookie; +import bnymellon.codekatas.coffeekata.food.Donut; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static bnymellon.codekatas.coffeekata.food.BagelType.EVERYTHING; +import static bnymellon.codekatas.coffeekata.food.CookieType.CHOCOLATE_CHIP; +import static bnymellon.codekatas.coffeekata.food.DonutType.GLAZED; +import static bnymellon.codekatas.coffeekata.food.SpreadType.HERB_GARLIC_CREAM_CHEESE; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class CoffeeShopTest +{ + private List itemList; + private CoffeeShopOrder coffeeShopOrder; + private Bagel bagel1; + private Cookie cookie1; + private Donut donut1; + + @BeforeEach + public void setUp() + { + bagel1 = new Bagel(EVERYTHING, HERB_GARLIC_CREAM_CHEESE, true); + cookie1 = new Cookie(CHOCOLATE_CHIP, true); + donut1 = new Donut(GLAZED); + itemList = List.of(bagel1, cookie1, donut1); + coffeeShopOrder = new CoffeeShopOrder("Emilie", itemList); + } + + @Test + public void getFoodItemsForOrderTest() + { + List expected = List.of("EVERYTHING bagel with HERB_GARLIC_CREAM_CHEESE", + "CHOCOLATE_CHIP cookie", "GLAZED donut"); + assertEquals(expected, coffeeShopOrder.getFoodItemsForOrder()); + } + + @Test + public void generateReceiptTest() + { + String expectedReceipt = """ + Bagel: EVERYTHING $2.5 + Cookie: CHOCOLATE_CHIP $1.25 + Donut: GLAZED $1.75 + Total: $5.5"""; + assertEquals(expectedReceipt, coffeeShopOrder.generateReceipt()); + } + + @Test + public void testBagelRecord() + { + Bagel bagel2 = new Bagel(EVERYTHING, HERB_GARLIC_CREAM_CHEESE, true); + assertTrue(Bagel.class.isRecord()); + assertEquals(bagel1, bagel2); + assertEquals("Bagel[bagelType=EVERYTHING, spreadType=HERB_GARLIC_CREAM_CHEESE, toasted=true]", bagel1.toString()); + } + + @Test + public void testBagelGetters() + { + assertTrue(bagel1.toasted()); + assertEquals(bagel1.bagelType(), EVERYTHING); + assertEquals(bagel1.spreadType(), HERB_GARLIC_CREAM_CHEESE); + } + + @Test + public void testCookieRecord() + { + Cookie cookie2 = new Cookie(CHOCOLATE_CHIP, true); + assertTrue(Cookie.class.isRecord()); + assertEquals(cookie1, cookie2); + assertEquals("Cookie[cookieType=CHOCOLATE_CHIP, warmed=true]", cookie1.toString()); + } + + @Test + public void testCookieGetters() + { + assertTrue(cookie1.warmed()); + assertEquals(cookie1.cookieType(), CHOCOLATE_CHIP); + } + + @Test + public void testDonutRecord() + { + Donut donut2 = new Donut(GLAZED); + assertTrue(Donut.class.isRecord()); + assertEquals(donut1.donutType(), GLAZED); + assertEquals(donut1, donut2); + assertEquals("Donut[donutType=GLAZED]", donut1.toString()); + } + + @Test + public void testDonutGetters() + { + assertEquals(donut1.donutType(), GLAZED); + } + + @Test + public void testSealedClasses() + { + assertTrue(CoffeeDrink.class.isSealed()); + assertFalse(Americano.class.isSealed()); + assertFalse(Macchiato.class.isSealed()); + assertFalse(Latte.class.isSealed()); + } + + @Test + public void getDrinkItems() + { + List expected = List.of("HOT Americano", "HOT CARAMEL Latte with ALMOND_MILK", + "HOT VANILLA Macchiato with WHOLE_MILK", "MATCHA Tea"); + assertEquals(expected, coffeeShopOrder.getDrinkForOrder()); + } +} diff --git a/coffee-shop-kata/CoffeeShopDomain.png b/coffee-shop-kata/CoffeeShopDomain.png new file mode 100644 index 0000000000000000000000000000000000000000..32c5298641245896f2de30c6a1d11877742a44e8 GIT binary patch literal 211368 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 %u4q8r^CP`9j2q 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

v3St^hNlmKHO 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

SSi~Ouc~t8l$~9hE4-rFD`dXd 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 + + + + 4.0.0 + + bnymellon.codekatas + 1.0.0 + new-java-features + + Coffee Shop Kata + + The Coffee Shop Kata can help developers learn the latest Java features. + + + + UTF-8 + + 20 + 20 + 5.9.3 + + + + + org.junit.jupiter + junit-jupiter + ${junit5.version} + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 21 + 21 + + 3.11.0 + + + + + \ No newline at end of file diff --git a/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/CoffeeShopOrder.java b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/CoffeeShopOrder.java new file mode 100644 index 00000000..edf85693 --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/CoffeeShopOrder.java @@ -0,0 +1,84 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata; + +import bnymellon.codekatas.coffeekata.beverage.Americano; +import bnymellon.codekatas.coffeekata.beverage.Latte; +import bnymellon.codekatas.coffeekata.beverage.Macchiato; +import bnymellon.codekatas.coffeekata.beverage.Tea; + +import java.util.ArrayList; +import java.util.List; + +public class CoffeeShopOrder +{ + + private final String customerName; + private final List orderItems; + + public CoffeeShopOrder(String customerName, List orderItems) + { + this.customerName = customerName; + this.orderItems = orderItems; + } + + /** + * Print out a list of custom strings for the customer's food items! + * Start with, "Order #[orderNumber] for [customerName] includes: " + * If the item is a Bagel: Print [toasted] [bagelType] with [spreadType] + * If the item is a Cookie: Print [warmed] [cookieType] + * If the item is a Donut: Print [donutType] + *

+ * NOTE: This method show-cases a switch-case pattern matching. + */ + public List getFoodItemsForOrder() + { + // TODO implement method + return null; + } + + /** + * Generate a receipt for a customer's order. + * If the item is a Donut: Print Donut: [donutType] $Price + * If the item is a Cookie: Print Cookie: [cookieType] $Price + * If the item is a Bagel: Print Bagel: [bagelType] $Price + * Total: $Total Price + *

+ * NOTE: The method highlights the usage of a record deconstruction pattern + */ + public String generateReceipt() + { + // TODO: Implement the receipt generation logic here. + // Use the instanceof operator and the record pattern to differentiate between different food items. + return null; + } + + /** + * Create and print drink order + * First drink : Hot Americano + * Second drink : Hot Caramel Latte with Almond Milk + * Third drink : Hot Vanilla Macchiato with Whole Milk + * Fourth drink : MATCHA Tea + *

+ * NOTE: Use interface to create four drinks + */ + public List getDrinkForOrder() + { + // TODO implement method + return null; + } +} diff --git a/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/Item.java b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/Item.java new file mode 100644 index 00000000..76685d42 --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/Item.java @@ -0,0 +1,22 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata; + +public interface Item +{ + double getPrice(); +} diff --git a/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Americano.java b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Americano.java new file mode 100644 index 00000000..b897a023 --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Americano.java @@ -0,0 +1,50 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public final class Americano implements CoffeeDrink +{ + private final DrinkTemperature drinkTemperature; + + public Americano(DrinkTemperature drinkTemperature) + { + this.drinkTemperature = drinkTemperature; + } + + public DrinkTemperature getDrinkTemperature() + { + return drinkTemperature; + } + + @Override + public double getPrice() + { + return 2.00; + } + + @Override + public int espressoShot() + { + return 1; + } + + @Override + public String toString() + { + return drinkTemperature + " " + "Americano"; + } +} diff --git a/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Beverage.java b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Beverage.java new file mode 100644 index 00000000..686a845d --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Beverage.java @@ -0,0 +1,25 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +import bnymellon.codekatas.coffeekata.Item; + +public interface Beverage extends Item +{ + +} + diff --git a/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/CoffeeDrink.java b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/CoffeeDrink.java new file mode 100644 index 00000000..7fd3d860 --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/CoffeeDrink.java @@ -0,0 +1,35 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +/** + * Prior to Java 15, a class was either declared as 'final' or left 'open,' + * which meant that the class could be extended infinitely. + * With the introduction of "sealed" classes, it becomes possible to + * establish a controlled hierarchy for extensions. + * Modify the following class to permit only the classes + * Latte, Macchiato, and Americano, while excluding Tea. + * + *

+ * NOTE: This class hierarchy shows the usage of sealed classes + */ + +//TODO Convert to Sealed interface +public interface CoffeeDrink extends Beverage +{ + int espressoShot(); +} diff --git a/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/DrinkTemperature.java b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/DrinkTemperature.java new file mode 100644 index 00000000..2accc13d --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/DrinkTemperature.java @@ -0,0 +1,23 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public enum DrinkTemperature +{ + HOT, + ICED +} diff --git a/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/FlavorSyrup.java b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/FlavorSyrup.java new file mode 100644 index 00000000..ee9ac59a --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/FlavorSyrup.java @@ -0,0 +1,24 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public enum FlavorSyrup +{ + VANILLA, + CHOCOLATE, + CARAMEL +} diff --git a/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Latte.java b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Latte.java new file mode 100644 index 00000000..1654db5f --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Latte.java @@ -0,0 +1,71 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public final class Latte implements CoffeeDrink +{ + private final MilkType milkType; + private final boolean extraFoam; + private final FlavorSyrup flavorSyrup; + private final DrinkTemperature drinkTemperature; + + public Latte(FlavorSyrup flavorSyrup, MilkType milkType, boolean extraFoam, DrinkTemperature drinkTemperature) + { + this.milkType = milkType; + this.extraFoam = extraFoam; + this.flavorSyrup = flavorSyrup; + this.drinkTemperature = drinkTemperature; + } + + public MilkType getMilkType() + { + return milkType; + } + + public boolean hasExtraFoam() + { + return extraFoam; + } + + public FlavorSyrup getFlavorSyrup() + { + return flavorSyrup; + } + + public DrinkTemperature getDrinkTemperature() + { + return drinkTemperature; + } + + @Override + public int espressoShot() + { + return 1; + } + + @Override + public String toString() + { + return drinkTemperature + " " + flavorSyrup + " Latte with " + milkType; + } + + @Override + public double getPrice() + { + return 3.75; + } +} diff --git a/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Macchiato.java b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Macchiato.java new file mode 100644 index 00000000..64a2c32c --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Macchiato.java @@ -0,0 +1,64 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public final class Macchiato implements CoffeeDrink +{ + private final MilkType milkType; + private final FlavorSyrup flavorSyrup; + private final DrinkTemperature drinkTemperature; + + public Macchiato(MilkType milkType, FlavorSyrup flavorSyrup, DrinkTemperature drinkTemperature) + { + this.milkType = milkType; + this.flavorSyrup = flavorSyrup; + this.drinkTemperature = drinkTemperature; + } + + public MilkType getMilkType() + { + return milkType; + } + + public FlavorSyrup getFlavorSyrup() + { + return flavorSyrup; + } + + public DrinkTemperature getDrinkTemperature() + { + return drinkTemperature; + } + + @Override + public int espressoShot() + { + return 2; + } + + @Override + public String toString() + { + return drinkTemperature + " " + flavorSyrup + " Macchiato with " + milkType; + } + + @Override + public double getPrice() + { + return 3.75; + } +} diff --git a/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/MilkType.java b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/MilkType.java new file mode 100644 index 00000000..57e135b1 --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/MilkType.java @@ -0,0 +1,25 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public enum MilkType +{ + WHOLE_MILK, + OAT_MILK, + ALMOND_MILK, + COCONUT_MILK +} diff --git a/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Tea.java b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Tea.java new file mode 100644 index 00000000..14415f7b --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Tea.java @@ -0,0 +1,44 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public class Tea implements Beverage +{ + private final TeaType teaType; + + public Tea(TeaType teaType) + { + this.teaType = teaType; + } + + @Override + public double getPrice() + { + return 1.50; + } + + public TeaType getTeaType() + { + return teaType; + } + + @Override + public String toString() + { + return teaType + " " + "Tea"; + } +} diff --git a/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/TeaType.java b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/TeaType.java new file mode 100644 index 00000000..7bf89dd0 --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/TeaType.java @@ -0,0 +1,24 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public enum TeaType +{ + EARL_GREY, + MATCHA, + CHAI +} diff --git a/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Bagel.java b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Bagel.java new file mode 100644 index 00000000..60e0412d --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Bagel.java @@ -0,0 +1,78 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +import java.util.Objects; + +public class Bagel implements BakeryItem +{ + private final BagelType bagelType; + private final SpreadType spreadType; + private final boolean toasted; + + public Bagel(BagelType bagelType, SpreadType spreadType, boolean toasted) + { + this.bagelType = bagelType; + this.spreadType = spreadType; + this.toasted = toasted; + } + + @Override + public double getPrice() + { + return 2.50; + } + + public boolean isToasted() + { + return toasted; + } + + public BagelType getBagelType() + { + return bagelType; + } + + public SpreadType getSpreadType() + { + return spreadType; + } + + @Override + public boolean equals(Object obj) + { + if (obj instanceof Bagel) { + Bagel bagel = (Bagel) obj; + return this.isToasted() == bagel.isToasted() && this.getBagelType() == bagel.getBagelType() + && this.getSpreadType() == bagel.getSpreadType(); + } + return false; + } + + @Override + public String toString() + { + return String.format("Bagel[bagelType=%s, spreadType=%s, toasted=%s]", + this.getBagelType(), this.getSpreadType(), this.isToasted()); + } + + @Override + public int hashCode() + { + return Objects.hash(bagelType, spreadType, toasted); + } +} diff --git a/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/BagelType.java b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/BagelType.java new file mode 100644 index 00000000..d6fe0e59 --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/BagelType.java @@ -0,0 +1,24 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +public enum BagelType +{ + PLAIN, + EVERYTHING, + CINNAMON_RAISIN +} diff --git a/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/BakeryItem.java b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/BakeryItem.java new file mode 100644 index 00000000..8a238cc9 --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/BakeryItem.java @@ -0,0 +1,23 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +import bnymellon.codekatas.coffeekata.Item; + +public interface BakeryItem extends Item +{ +} diff --git a/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Cookie.java b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Cookie.java new file mode 100644 index 00000000..6f9b6522 --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Cookie.java @@ -0,0 +1,70 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +import java.util.Objects; + +public class Cookie implements BakeryItem +{ + private final CookieType cookieType; + private final boolean warmed; + + public Cookie(CookieType cookieType, boolean warmed) + { + this.cookieType = cookieType; + this.warmed = warmed; + } + + @Override + public double getPrice() + { + return 1.25; + } + + public boolean isWarmed() + { + return warmed; + } + + public CookieType getCookieType() + { + return cookieType; + } + + @Override + public boolean equals(Object obj) + { + if (obj instanceof Cookie) { + Cookie cookie = (Cookie) obj; + return this.isWarmed() == cookie.isWarmed() && this.getCookieType() == cookie.getCookieType(); + } + return false; + } + + @Override + public String toString() + { + return String.format("Cookie[cookieType=%s, warmed=%s]", + this.getCookieType(), this.isWarmed()); + } + + @Override + public int hashCode() + { + return Objects.hash(cookieType, warmed); + } +} diff --git a/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/CookieType.java b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/CookieType.java new file mode 100644 index 00000000..5653c027 --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/CookieType.java @@ -0,0 +1,24 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +public enum CookieType +{ + CHOCOLATE_CHIP, + PEANUT_BUTTER, + OATMEAL_RAISIN +} diff --git a/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Donut.java b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Donut.java new file mode 100644 index 00000000..3f114766 --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Donut.java @@ -0,0 +1,63 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +import java.util.Objects; + +public class Donut implements BakeryItem +{ + private final DonutType donutType; + + public Donut(DonutType donutType) + { + this.donutType = donutType; + } + + @Override + public double getPrice() + { + return 1.75; + } + + public DonutType getDonutType() + { + return this.donutType; + } + + @Override + public boolean equals(Object obj) + { + if (obj instanceof Donut) { + Donut donut = (Donut) obj; + return this.getDonutType() == donut.getDonutType(); + } + return false; + } + + @Override + public String toString() + { + return String.format("Donut[donutType=%s]", + this.getDonutType()); + } + + @Override + public int hashCode() + { + return Objects.hash(donutType); + } +} diff --git a/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/DonutType.java b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/DonutType.java new file mode 100644 index 00000000..883041e8 --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/DonutType.java @@ -0,0 +1,25 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +public enum DonutType +{ + BOSTON_CREAM, + DOUBLE_CHOCOLATE, + GLAZED, + JELLY +} diff --git a/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/SpreadType.java b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/SpreadType.java new file mode 100644 index 00000000..1761730a --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/SpreadType.java @@ -0,0 +1,25 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +public enum SpreadType +{ + BUTTER, + PLAIN_CREAM_CHEESE, + HERB_GARLIC_CREAM_CHEESE, + STRAWBERRY_JAM +} diff --git a/coffee-shop-kata/new-java-features/src/test/java/CoffeeShopTest.java b/coffee-shop-kata/new-java-features/src/test/java/CoffeeShopTest.java new file mode 100644 index 00000000..022bf65a --- /dev/null +++ b/coffee-shop-kata/new-java-features/src/test/java/CoffeeShopTest.java @@ -0,0 +1,152 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import bnymellon.codekatas.coffeekata.CoffeeShopOrder; +import bnymellon.codekatas.coffeekata.Item; +import bnymellon.codekatas.coffeekata.beverage.Americano; +import bnymellon.codekatas.coffeekata.beverage.CoffeeDrink; +import bnymellon.codekatas.coffeekata.beverage.Latte; +import bnymellon.codekatas.coffeekata.beverage.Macchiato; +import bnymellon.codekatas.coffeekata.food.*; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static bnymellon.codekatas.coffeekata.food.BagelType.EVERYTHING; +import static bnymellon.codekatas.coffeekata.food.CookieType.CHOCOLATE_CHIP; +import static bnymellon.codekatas.coffeekata.food.DonutType.GLAZED; +import static bnymellon.codekatas.coffeekata.food.SpreadType.HERB_GARLIC_CREAM_CHEESE; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class CoffeeShopTest +{ + + List itemList; + private CoffeeShopOrder coffeeShopOrder; + private Bagel bagel1; + private Cookie cookie1; + private Donut donut1; + + @BeforeEach + public void setUp() + { + bagel1 = new Bagel(EVERYTHING, HERB_GARLIC_CREAM_CHEESE, true); + cookie1 = new Cookie(CHOCOLATE_CHIP, true); + donut1 = new Donut(GLAZED); + itemList = new ArrayList<>(); + itemList.add(bagel1); + itemList.add(cookie1); + itemList.add(donut1); + coffeeShopOrder = new CoffeeShopOrder("Emilie", itemList); + } + + @Test + public void getFoodItemsForOrderTest() + { + // TODO: Complete the method getFoodItemsForOrder() in CoffeeShopOrder to make this pass + List expected = List.of("GLAZED donut", "toasted EVERYTHING bagel with HERB_GARLIC_CREAM_CHEESE"); + assertEquals(expected, coffeeShopOrder.getFoodItemsForOrder()); + } + + @Test + public void generateReceiptTest() + { + // TODO: Complete the method generateReceipt() in CoffeeShopOrder to make this pass + String expectedReceipt = """ + Bagel: EVERYTHING $2.5 + Cookie: CHOCOLATE_CHIP $1.25 + Donut: GLAZED $1.75 + Total: $5.5"""; + assertEquals(expectedReceipt, coffeeShopOrder.generateReceipt()); + } + + @Test + public void testBagelRecord() + { + // TODO: Convert Bagel to record + Bagel bagel2 = new Bagel(EVERYTHING, HERB_GARLIC_CREAM_CHEESE, true); + assertTrue(Bagel.class.isRecord()); + assertEquals(bagel1, bagel2); + assertEquals("Bagel[bagelType=EVERYTHING, spreadType=HERB_GARLIC_CREAM_CHEESE, toasted=true]", bagel1.toString()); + } + + @Test + public void testBagelGetters() + { + // TODO: Convert assertions to use Record getters + assertTrue(bagel1.isToasted()); + assertEquals(bagel1.getBagelType(), EVERYTHING); + assertEquals(bagel1.getSpreadType(), HERB_GARLIC_CREAM_CHEESE); + } + + @Test + public void testCookieRecord() + { + // TODO: Convert Cookie to record + Cookie cookie2 = new Cookie(CHOCOLATE_CHIP, true); + assertTrue(Cookie.class.isRecord()); + assertEquals(cookie1, cookie2); + assertEquals("Cookie[cookieType=CHOCOLATE_CHIP, warmed=true]", cookie1.toString()); + } + + @Test + public void testCookieGetters() + { + // TODO: Convert assertions to use Record getters + assertTrue(cookie1.isWarmed()); + assertEquals(cookie1.getCookieType(), CHOCOLATE_CHIP); + } + + @Test + public void testDonutRecord() + { + // TODO: Convert Donut to record + Donut donut2 = new Donut(GLAZED); + assertTrue(Donut.class.isRecord()); + assertEquals(donut1, donut2); + assertEquals("Donut[donutType=GLAZED]", donut1.toString()); + } + + @Test + public void testDonutGetters() + { + // TODO: Convert assertions to use Record getters + assertEquals(donut1.getDonutType(), GLAZED); + } + + @Test + public void testSealedClasses() + { + //TODO Convert Coffee Drink to sealed class + assertTrue(CoffeeDrink.class.isSealed()); + assertFalse(Americano.class.isSealed()); + assertFalse(Macchiato.class.isSealed()); + assertFalse(Latte.class.isSealed()); + } + + @Test + public void getDrinkItems() + { + //TODO Complete the method getDrinkForOrder() in CoffeeShopOrder to make this pass + List expected = List.of("HOT Americano", "HOT CARAMEL Latte with ALMOND_MILK", + "HOT VANILLA Macchiato with WHOLE_MILK", "MATCHA Tea"); + assertEquals(expected, coffeeShopOrder.getDrinkForOrder()); + } +} diff --git a/coffee-shop-kata/old-java-features/pom.xml b/coffee-shop-kata/old-java-features/pom.xml new file mode 100644 index 00000000..5ad94454 --- /dev/null +++ b/coffee-shop-kata/old-java-features/pom.xml @@ -0,0 +1,58 @@ + + + + + 4.0.0 + + bnymellon.codekatas + 1.0.0 + old-java-features + + Coffee Shop Kata + + The Coffee Shop Kata can help developers understand older Java features. + + + + UTF-8 + + 8 + 8 + 5.9.3 + + + + + org.junit.jupiter + junit-jupiter + ${junit5.version} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + + + + \ No newline at end of file diff --git a/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/CoffeeShopOrder.java b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/CoffeeShopOrder.java new file mode 100644 index 00000000..e1a9cb40 --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/CoffeeShopOrder.java @@ -0,0 +1,154 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata; + +import bnymellon.codekatas.coffeekata.beverage.Americano; +import bnymellon.codekatas.coffeekata.beverage.CoffeeDrink; +import bnymellon.codekatas.coffeekata.beverage.DrinkTemperature; +import bnymellon.codekatas.coffeekata.beverage.FlavorSyrup; +import bnymellon.codekatas.coffeekata.beverage.Latte; +import bnymellon.codekatas.coffeekata.beverage.Macchiato; +import bnymellon.codekatas.coffeekata.beverage.MilkType; +import bnymellon.codekatas.coffeekata.beverage.Tea; +import bnymellon.codekatas.coffeekata.beverage.TeaType; +import bnymellon.codekatas.coffeekata.food.Bagel; +import bnymellon.codekatas.coffeekata.food.BagelType; +import bnymellon.codekatas.coffeekata.food.Cookie; +import bnymellon.codekatas.coffeekata.food.CookieType; +import bnymellon.codekatas.coffeekata.food.Donut; +import bnymellon.codekatas.coffeekata.food.DonutType; +import bnymellon.codekatas.coffeekata.food.SpreadType; + +import java.util.ArrayList; +import java.util.List; + +public class CoffeeShopOrder +{ + + private final String customerName; + private final List orderItems; + + public CoffeeShopOrder(String customerName, java.util.List orderItems) + { + this.customerName = customerName; + this.orderItems = orderItems; + } + + /** + * Print out a list of custom strings for the customer's food items! + * If the item is a Bagel: Print [bagelType] with [spreadType] + * If the item is a Cookie: Print [cookieType] + * If the item is a Donut: Print [donutType] + *

+ * NOTE: This method show-cases a switch-case pattern matching. + */ + public List getFoodItemsForOrder() + { + List foodItems = new ArrayList<>(); + for (Item item : this.orderItems) + { + if (item instanceof Bagel) + { + Bagel bagel = (Bagel) item; + foodItems.add(bagel.getBagelType() + " bagel with " + bagel.getSpreadType()); + } + else if (item instanceof Cookie) + { + Cookie cookie = (Cookie) item; + foodItems.add(cookie.getCookieType() + " cookie"); + } + else if (item instanceof Donut) + { + Donut donut = (Donut) item; + foodItems.add(donut.getDonutType() + " donut"); + } + else + { + throw new IllegalStateException("Unexpected value: " + item); + } + } + return foodItems; + } + + /** + * Generate a receipt for a customer's order. + * If the item is a Donut: Print Donut: [donutType] $Price + * If the item is a Cookie: Print Cookie: [cookieType] $Price + * If the item is a Bagel: Print Bagel: [bagelType] $Price + * Total: $Total Price + *

+ * NOTE: The method highlights the usage of a data extraction + * HINT: Use instanceOf + */ + public String generateReceipt() + { + double total = 0.0; + StringBuilder receiptBuilder = new StringBuilder(); + + for (Item item : this.orderItems) + { + if (item instanceof Donut) + { + Donut donut = (Donut) item; + DonutType donutType = donut.getDonutType(); + receiptBuilder.append("Donut: ").append(donutType).append(" $").append(item.getPrice()).append("\n"); + } + else if (item instanceof Bagel) + { + Bagel bagel = (Bagel) item; + BagelType bagelType = bagel.getBagelType(); + receiptBuilder.append("Bagel: ").append(bagelType).append(" $").append(item.getPrice()).append("\n"); + } + else if (item instanceof Cookie) + { + Cookie cookie = (Cookie) item; + CookieType cookieType = cookie.getCookieType(); + receiptBuilder.append("Cookie: ").append(cookieType).append(" $").append(item.getPrice()).append("\n"); + } + total += item.getPrice(); + } + + receiptBuilder.append("Total: $").append(total); + return receiptBuilder.toString(); + } + + /** + * Create and print drink order + * First drink : Hot Americano + * Second drink : Hot Caramel Latte with Almond Milk + * Third drink : Hot Vanilla Macchiato with Whole Milk + * Fourth drink : MATCHA Tea + *

+ * NOTE: Use interface to create four drinks + * Use the toString() to obtain descriptions of the dinks + */ + public List getDrinkForOrder() + { + List drinkItems = new ArrayList<>(); + CoffeeDrink coffeeDrink1 = new Americano(DrinkTemperature.HOT); + CoffeeDrink coffeeDrink2 = new Latte(FlavorSyrup.CARAMEL, MilkType.ALMOND_MILK, false, DrinkTemperature.HOT); + CoffeeDrink coffeeDrink3 = new Macchiato(MilkType.WHOLE_MILK, FlavorSyrup.VANILLA, DrinkTemperature.HOT); + Tea tea = new Tea(TeaType.MATCHA); + + drinkItems.add(coffeeDrink1.toString()); + drinkItems.add(coffeeDrink2.toString()); + drinkItems.add(coffeeDrink3.toString()); + drinkItems.add(tea.toString()); + + return drinkItems; + } +} diff --git a/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/Item.java b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/Item.java new file mode 100644 index 00000000..76685d42 --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/Item.java @@ -0,0 +1,22 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata; + +public interface Item +{ + double getPrice(); +} diff --git a/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Americano.java b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Americano.java new file mode 100644 index 00000000..b8d6e684 --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Americano.java @@ -0,0 +1,51 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WAR RANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public final class Americano implements CoffeeDrink +{ + + private final DrinkTemperature drinkTemperature; + + public Americano(DrinkTemperature drinkTemperature) + { + this.drinkTemperature = drinkTemperature; + } + + public DrinkTemperature getDrinkTemperature() + { + return drinkTemperature; + } + + @Override + public double getPrice() + { + return 2.00; + } + + @Override + public int espressoShot() + { + return 1; + } + + @Override + public String toString() + { + return drinkTemperature + " " + "Americano"; + } +} diff --git a/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Beverage.java b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Beverage.java new file mode 100644 index 00000000..c4fa3a6e --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Beverage.java @@ -0,0 +1,24 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +import bnymellon.codekatas.coffeekata.Item; + +public interface Beverage extends Item +{ + +} diff --git a/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/CoffeeDrink.java b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/CoffeeDrink.java new file mode 100644 index 00000000..86bacb4c --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/CoffeeDrink.java @@ -0,0 +1,22 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public interface CoffeeDrink extends Beverage +{ + int espressoShot(); +} diff --git a/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/DrinkTemperature.java b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/DrinkTemperature.java new file mode 100644 index 00000000..2accc13d --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/DrinkTemperature.java @@ -0,0 +1,23 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public enum DrinkTemperature +{ + HOT, + ICED +} diff --git a/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/FlavorSyrup.java b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/FlavorSyrup.java new file mode 100644 index 00000000..ee9ac59a --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/FlavorSyrup.java @@ -0,0 +1,24 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public enum FlavorSyrup +{ + VANILLA, + CHOCOLATE, + CARAMEL +} diff --git a/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Latte.java b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Latte.java new file mode 100644 index 00000000..6b280ed2 --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Latte.java @@ -0,0 +1,65 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public final class Latte implements CoffeeDrink +{ + private final MilkType milkType; + private final boolean extraFoam; + private final FlavorSyrup flavorSyrup; + private final DrinkTemperature drinkTemperature; + + public Latte(FlavorSyrup flavorSyrup, MilkType milkType, boolean extraFoam, DrinkTemperature drinkTemperature) + { + this.milkType = milkType; + this.extraFoam = extraFoam; + this.flavorSyrup = flavorSyrup; + this.drinkTemperature = drinkTemperature; + } + + public MilkType getMilkType() + { + return milkType; + } + + public boolean hasExtraFoam() + { + return extraFoam; + } + + public FlavorSyrup getFlavorSyrup() + { + return flavorSyrup; + } + + public DrinkTemperature getDrinkTemperature() + { + return drinkTemperature; + } + + @Override + public int espressoShot() + { + return 1; + } + + @Override + public double getPrice() + { + return 3.75; + } +} diff --git a/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Macchiato.java b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Macchiato.java new file mode 100644 index 00000000..032b6dc4 --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Macchiato.java @@ -0,0 +1,58 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public final class Macchiato implements CoffeeDrink +{ + private final MilkType milkType; + private final FlavorSyrup flavorSyrup; + private final DrinkTemperature drinkTemperature; + + public Macchiato(MilkType milkType, FlavorSyrup flavorSyrup, DrinkTemperature drinkTemperature) + { + this.milkType = milkType; + this.flavorSyrup = flavorSyrup; + this.drinkTemperature = drinkTemperature; + } + + public MilkType getMilkType() + { + return milkType; + } + + public FlavorSyrup getFlavorSyrup() + { + return flavorSyrup; + } + + public DrinkTemperature getDrinkTemperature() + { + return drinkTemperature; + } + + @Override + public int espressoShot() + { + return 2; + } + + @Override + public double getPrice() + { + return 3.75; + } +} diff --git a/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/MilkType.java b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/MilkType.java new file mode 100644 index 00000000..57e135b1 --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/MilkType.java @@ -0,0 +1,25 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public enum MilkType +{ + WHOLE_MILK, + OAT_MILK, + ALMOND_MILK, + COCONUT_MILK +} diff --git a/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Tea.java b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Tea.java new file mode 100644 index 00000000..60de2a87 --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/Tea.java @@ -0,0 +1,39 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public class Tea implements Beverage +{ + + private final TeaType teaType; + + public Tea(TeaType teaType) + { + this.teaType = teaType; + } + + @Override + public double getPrice() + { + return 1.50; + } + + public TeaType getTeaType() + { + return teaType; + } +} diff --git a/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/TeaType.java b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/TeaType.java new file mode 100644 index 00000000..7bf89dd0 --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/beverage/TeaType.java @@ -0,0 +1,24 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.beverage; + +public enum TeaType +{ + EARL_GREY, + MATCHA, + CHAI +} diff --git a/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Bagel.java b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Bagel.java new file mode 100644 index 00000000..60e0412d --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Bagel.java @@ -0,0 +1,78 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +import java.util.Objects; + +public class Bagel implements BakeryItem +{ + private final BagelType bagelType; + private final SpreadType spreadType; + private final boolean toasted; + + public Bagel(BagelType bagelType, SpreadType spreadType, boolean toasted) + { + this.bagelType = bagelType; + this.spreadType = spreadType; + this.toasted = toasted; + } + + @Override + public double getPrice() + { + return 2.50; + } + + public boolean isToasted() + { + return toasted; + } + + public BagelType getBagelType() + { + return bagelType; + } + + public SpreadType getSpreadType() + { + return spreadType; + } + + @Override + public boolean equals(Object obj) + { + if (obj instanceof Bagel) { + Bagel bagel = (Bagel) obj; + return this.isToasted() == bagel.isToasted() && this.getBagelType() == bagel.getBagelType() + && this.getSpreadType() == bagel.getSpreadType(); + } + return false; + } + + @Override + public String toString() + { + return String.format("Bagel[bagelType=%s, spreadType=%s, toasted=%s]", + this.getBagelType(), this.getSpreadType(), this.isToasted()); + } + + @Override + public int hashCode() + { + return Objects.hash(bagelType, spreadType, toasted); + } +} diff --git a/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/BagelType.java b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/BagelType.java new file mode 100644 index 00000000..d6fe0e59 --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/BagelType.java @@ -0,0 +1,24 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +public enum BagelType +{ + PLAIN, + EVERYTHING, + CINNAMON_RAISIN +} diff --git a/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/BakeryItem.java b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/BakeryItem.java new file mode 100644 index 00000000..a080aebd --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/BakeryItem.java @@ -0,0 +1,24 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +import bnymellon.codekatas.coffeekata.Item; + +public interface BakeryItem extends Item +{ + +} diff --git a/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Cookie.java b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Cookie.java new file mode 100644 index 00000000..6f9b6522 --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Cookie.java @@ -0,0 +1,70 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +import java.util.Objects; + +public class Cookie implements BakeryItem +{ + private final CookieType cookieType; + private final boolean warmed; + + public Cookie(CookieType cookieType, boolean warmed) + { + this.cookieType = cookieType; + this.warmed = warmed; + } + + @Override + public double getPrice() + { + return 1.25; + } + + public boolean isWarmed() + { + return warmed; + } + + public CookieType getCookieType() + { + return cookieType; + } + + @Override + public boolean equals(Object obj) + { + if (obj instanceof Cookie) { + Cookie cookie = (Cookie) obj; + return this.isWarmed() == cookie.isWarmed() && this.getCookieType() == cookie.getCookieType(); + } + return false; + } + + @Override + public String toString() + { + return String.format("Cookie[cookieType=%s, warmed=%s]", + this.getCookieType(), this.isWarmed()); + } + + @Override + public int hashCode() + { + return Objects.hash(cookieType, warmed); + } +} diff --git a/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/CookieType.java b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/CookieType.java new file mode 100644 index 00000000..5653c027 --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/CookieType.java @@ -0,0 +1,24 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +public enum CookieType +{ + CHOCOLATE_CHIP, + PEANUT_BUTTER, + OATMEAL_RAISIN +} diff --git a/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Donut.java b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Donut.java new file mode 100644 index 00000000..3f114766 --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/Donut.java @@ -0,0 +1,63 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +import java.util.Objects; + +public class Donut implements BakeryItem +{ + private final DonutType donutType; + + public Donut(DonutType donutType) + { + this.donutType = donutType; + } + + @Override + public double getPrice() + { + return 1.75; + } + + public DonutType getDonutType() + { + return this.donutType; + } + + @Override + public boolean equals(Object obj) + { + if (obj instanceof Donut) { + Donut donut = (Donut) obj; + return this.getDonutType() == donut.getDonutType(); + } + return false; + } + + @Override + public String toString() + { + return String.format("Donut[donutType=%s]", + this.getDonutType()); + } + + @Override + public int hashCode() + { + return Objects.hash(donutType); + } +} diff --git a/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/DonutType.java b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/DonutType.java new file mode 100644 index 00000000..883041e8 --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/DonutType.java @@ -0,0 +1,25 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +public enum DonutType +{ + BOSTON_CREAM, + DOUBLE_CHOCOLATE, + GLAZED, + JELLY +} diff --git a/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/SpreadType.java b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/SpreadType.java new file mode 100644 index 00000000..1761730a --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/main/java/bnymellon/codekatas/coffeekata/food/SpreadType.java @@ -0,0 +1,25 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package bnymellon.codekatas.coffeekata.food; + +public enum SpreadType +{ + BUTTER, + PLAIN_CREAM_CHEESE, + HERB_GARLIC_CREAM_CHEESE, + STRAWBERRY_JAM +} diff --git a/coffee-shop-kata/old-java-features/src/test/java/CoffeeShopTest.java b/coffee-shop-kata/old-java-features/src/test/java/CoffeeShopTest.java new file mode 100644 index 00000000..035abb4c --- /dev/null +++ b/coffee-shop-kata/old-java-features/src/test/java/CoffeeShopTest.java @@ -0,0 +1,134 @@ +/* + * Copyright 2023 The Bank of New York Mellon. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import bnymellon.codekatas.coffeekata.CoffeeShopOrder; +import bnymellon.codekatas.coffeekata.Item; +import bnymellon.codekatas.coffeekata.food.Bagel; +import bnymellon.codekatas.coffeekata.food.Cookie; +import bnymellon.codekatas.coffeekata.food.Donut; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static bnymellon.codekatas.coffeekata.food.BagelType.EVERYTHING; +import static bnymellon.codekatas.coffeekata.food.CookieType.CHOCOLATE_CHIP; +import static bnymellon.codekatas.coffeekata.food.DonutType.GLAZED; +import static bnymellon.codekatas.coffeekata.food.SpreadType.HERB_GARLIC_CREAM_CHEESE; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class CoffeeShopTest +{ + + List itemList; + private CoffeeShopOrder coffeeShopOrder; + private Bagel bagel1; + private Cookie cookie1; + private Donut donut1; + + @BeforeEach + public void setUp() + { + bagel1 = new Bagel(EVERYTHING, HERB_GARLIC_CREAM_CHEESE, true); + cookie1 = new Cookie(CHOCOLATE_CHIP, true); + donut1 = new Donut(GLAZED); + itemList = new ArrayList<>(); + itemList.add(bagel1); + itemList.add(cookie1); + itemList.add(donut1); + coffeeShopOrder = new CoffeeShopOrder("Emilie", itemList); + } + + @Test + public void getFoodItemsForOrderTest() + { + ArrayList expected = new ArrayList<>(); + expected.add("EVERYTHING bagel with HERB_GARLIC_CREAM_CHEESE"); + expected.add("CHOCOLATE_CHIP cookie"); + expected.add("GLAZED donut"); + assertEquals(expected, coffeeShopOrder.getFoodItemsForOrder()); + } + + @Test + public void generateReceiptTest() + { + String expectedReceipt = + "Bagel: EVERYTHING $2.5\n" + + "Cookie: CHOCOLATE_CHIP $1.25\n" + + "Donut: GLAZED $1.75\n" + + "Total: $5.5"; + assertEquals(expectedReceipt, coffeeShopOrder.generateReceipt()); + } + + @Test + public void testBagelClass() + { + Bagel bagel2 = new Bagel(EVERYTHING, HERB_GARLIC_CREAM_CHEESE, true); + assertEquals(bagel1, bagel2); + assertEquals("Bagel[bagelType=EVERYTHING, spreadType=HERB_GARLIC_CREAM_CHEESE, toasted=true]", bagel1.toString()); + } + + @Test + public void testBagelGetters() + { + assertTrue(bagel1.isToasted()); + assertEquals(bagel1.getBagelType(), EVERYTHING); + assertEquals(bagel1.getSpreadType(), HERB_GARLIC_CREAM_CHEESE); + } + + @Test + public void testCookieClass() + { + Cookie cookie2 = new Cookie(CHOCOLATE_CHIP, true); + assertEquals(cookie1, cookie2); + assertEquals("Cookie[cookieType=CHOCOLATE_CHIP, warmed=true]", cookie1.toString()); + } + + @Test + public void testCookieGetters() + { + assertTrue(cookie1.isWarmed()); + assertEquals(cookie1.getCookieType(), CHOCOLATE_CHIP); + } + + @Test + public void testDonutClass() + { + Donut donut2 = new Donut(GLAZED); + assertEquals(donut1, donut2); + assertEquals("Donut[donutType=GLAZED]", donut1.toString()); + } + + @Test + public void testDonutGetters() + { + assertEquals(donut1.getDonutType(), GLAZED); + } + + + @Test + public void getDrinkItems() + { + ArrayList expected = new ArrayList<>(); + expected.add("HOT Americano"); + expected.add("HOT CARAMEL Latte with ALMOND_MILK"); + expected.add("HOT VANILLA Macchiato with WHOLE_MILK"); + expected.add("MATCHA Tea"); + assertEquals(expected, coffeeShopOrder.getDrinkForOrder()); + } +} diff --git a/coffee-shop-kata/pom.xml b/coffee-shop-kata/pom.xml new file mode 100644 index 00000000..38933f76 --- /dev/null +++ b/coffee-shop-kata/pom.xml @@ -0,0 +1,47 @@ + + + + 4.0.0 + + bnymellon.codekatas + coffee-shop-kata + 1.0.0 + + coffee-shop-kata + pom + + + UTF-8 + 20 + 20 + + + + new-java-features + old-java-features + + + + + + + maven-compiler-plugin + 3.11.0 + + + + + + + + + org.junit.jupiter + junit-jupiter + 5.9.2 + test + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index c2248418..1f891f55 100644 --- a/pom.xml +++ b/pom.xml @@ -43,5 +43,7 @@ kata-of-katas-solutions pitest-mutation-kata pitest-mutation-kata-solutions + coffee-shop-kata + coffee-shop-kata-solutions/new-java-features-solutions