From 6b956fa065e179d2c646103b0ff60219c411137e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Trujillo=20Mart=C3=ADnez?= Date: Wed, 15 Mar 2017 15:21:40 +0100 Subject: [PATCH 1/6] Redesign of decorator pattern --- .../littlekai/base/IngredientDecorator.kt | 4 +- .../littlekai/ingredients/Chicken.kt | 6 +- .../littlekai/ingredients/Peanuts.kt | 6 +- .../Decorator/littlekai/ingredients/Pork.kt | 6 +- .../Decorator/littlekai/ingredients/Tuna.kt | 6 +- .../littlekai/base/IngredientDecoratorTest.kt | 77 +++++++++++++++++++ 6 files changed, 98 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/Decorator/littlekai/base/IngredientDecorator.kt b/src/main/kotlin/Decorator/littlekai/base/IngredientDecorator.kt index 84baf1f..5a81ef5 100644 --- a/src/main/kotlin/Decorator/littlekai/base/IngredientDecorator.kt +++ b/src/main/kotlin/Decorator/littlekai/base/IngredientDecorator.kt @@ -1,7 +1,5 @@ package Decorator.littlekai.base abstract class IngredientDecorator (private val noodles: Noodles) : Noodles by noodles { - protected abstract val COST : Double - - override fun calculateCost(): Double = noodles.calculateCost() + this.COST + abstract fun calculateTotalCost(): Double } diff --git a/src/main/kotlin/Decorator/littlekai/ingredients/Chicken.kt b/src/main/kotlin/Decorator/littlekai/ingredients/Chicken.kt index bc18640..98fb26f 100644 --- a/src/main/kotlin/Decorator/littlekai/ingredients/Chicken.kt +++ b/src/main/kotlin/Decorator/littlekai/ingredients/Chicken.kt @@ -5,5 +5,9 @@ import Decorator.littlekai.base.Noodles class Chicken(noodles: Noodles) : IngredientDecorator(noodles) { - override val COST: Double = 3.50 + private val COST: Double = 3.50 + + override fun calculateTotalCost(): Double { + return calculateCost() + COST + } } diff --git a/src/main/kotlin/Decorator/littlekai/ingredients/Peanuts.kt b/src/main/kotlin/Decorator/littlekai/ingredients/Peanuts.kt index 7d2843a..bce8bef 100644 --- a/src/main/kotlin/Decorator/littlekai/ingredients/Peanuts.kt +++ b/src/main/kotlin/Decorator/littlekai/ingredients/Peanuts.kt @@ -5,5 +5,9 @@ import Decorator.littlekai.base.Noodles class Peanuts(noodles: Noodles) : IngredientDecorator(noodles) { - override val COST: Double = 2.50 + private val COST: Double = 2.50 + + override fun calculateTotalCost(): Double { + return calculateCost() + COST + } } diff --git a/src/main/kotlin/Decorator/littlekai/ingredients/Pork.kt b/src/main/kotlin/Decorator/littlekai/ingredients/Pork.kt index b3c7c0c..7dec866 100644 --- a/src/main/kotlin/Decorator/littlekai/ingredients/Pork.kt +++ b/src/main/kotlin/Decorator/littlekai/ingredients/Pork.kt @@ -5,5 +5,9 @@ import Decorator.littlekai.base.Noodles class Pork(noodles: Noodles) : IngredientDecorator(noodles) { - override val COST: Double = 4.00 + private val COST: Double = 4.00 + + override fun calculateTotalCost(): Double { + return calculateCost() + COST + } } diff --git a/src/main/kotlin/Decorator/littlekai/ingredients/Tuna.kt b/src/main/kotlin/Decorator/littlekai/ingredients/Tuna.kt index 209b69c..3cc7eba 100644 --- a/src/main/kotlin/Decorator/littlekai/ingredients/Tuna.kt +++ b/src/main/kotlin/Decorator/littlekai/ingredients/Tuna.kt @@ -5,5 +5,9 @@ import Decorator.littlekai.base.Noodles class Tuna(noodles: Noodles) : IngredientDecorator(noodles) { - override val COST: Double = 2.75 + private val COST: Double = 2.75 + + override fun calculateTotalCost(): Double { + return calculateCost() + COST + } } diff --git a/src/test/kotlin/Decorator/littlekai/base/IngredientDecoratorTest.kt b/src/test/kotlin/Decorator/littlekai/base/IngredientDecoratorTest.kt index 4630730..a18a314 100644 --- a/src/test/kotlin/Decorator/littlekai/base/IngredientDecoratorTest.kt +++ b/src/test/kotlin/Decorator/littlekai/base/IngredientDecoratorTest.kt @@ -1,10 +1,16 @@ package Decorator.littlekai.base +import Decorator.littlekai.ingredients.Chicken +import Decorator.littlekai.ingredients.Peanuts import Decorator.littlekai.ingredients.Pork import Decorator.littlekai.ingredients.Tuna import Decorator.littlekai.noodles.EggNoodles import Decorator.littlekai.noodles.UdonNoodles import Decorator.littlekai.noodles.WheatNoodles +import Decorator.littlekai.sauces.BittersweetSauce +import Decorator.littlekai.sauces.RedPepperSauce +import Decorator.littlekai.sauces.SateSauce +import Decorator.littlekai.sauces.TeriyakiSauce import org.hamcrest.CoreMatchers.`is` import org.junit.Assert.assertThat import org.junit.Assert.assertTrue @@ -28,4 +34,75 @@ class IngredientDecoratorTest { fun `price of ingredient is calculated correctly`() = assertThat(Tuna(Pork(UdonNoodles())).calculateCost(), `is`(10.75)) + @Test + fun `has the same interface`() { + assertTrue(BittersweetSauce(Chicken(EggNoodles())) is Noodles) + assertTrue(BittersweetSauce(Chicken(UdonNoodles())) is Noodles) + assertTrue(BittersweetSauce(Chicken(WheatNoodles())) is Noodles) + assertTrue(BittersweetSauce(Peanuts(EggNoodles())) is Noodles) + assertTrue(BittersweetSauce(Peanuts(UdonNoodles())) is Noodles) + assertTrue(BittersweetSauce(Peanuts(WheatNoodles())) is Noodles) + assertTrue(BittersweetSauce(Pork(EggNoodles())) is Noodles) + assertTrue(BittersweetSauce(Pork(UdonNoodles())) is Noodles) + assertTrue(BittersweetSauce(Pork(WheatNoodles())) is Noodles) + assertTrue(BittersweetSauce(Tuna(EggNoodles())) is Noodles) + assertTrue(BittersweetSauce(Tuna(UdonNoodles())) is Noodles) + assertTrue(BittersweetSauce(Tuna(WheatNoodles())) is Noodles) + assertTrue(RedPepperSauce(Chicken(EggNoodles())) is Noodles) + assertTrue(RedPepperSauce(Chicken(UdonNoodles())) is Noodles) + assertTrue(RedPepperSauce(Chicken(WheatNoodles())) is Noodles) + assertTrue(RedPepperSauce(Peanuts(EggNoodles())) is Noodles) + assertTrue(RedPepperSauce(Peanuts(UdonNoodles())) is Noodles) + assertTrue(RedPepperSauce(Peanuts(WheatNoodles())) is Noodles) + assertTrue(RedPepperSauce(Pork(EggNoodles())) is Noodles) + assertTrue(RedPepperSauce(Pork(UdonNoodles())) is Noodles) + assertTrue(RedPepperSauce(Pork(WheatNoodles())) is Noodles) + assertTrue(RedPepperSauce(Tuna(EggNoodles())) is Noodles) + assertTrue(RedPepperSauce(Tuna(UdonNoodles())) is Noodles) + assertTrue(RedPepperSauce(Tuna(WheatNoodles())) is Noodles) + assertTrue(SateSauce(Chicken(EggNoodles())) is Noodles) + assertTrue(SateSauce(Chicken(UdonNoodles())) is Noodles) + assertTrue(SateSauce(Chicken(WheatNoodles())) is Noodles) + assertTrue(SateSauce(Peanuts(EggNoodles())) is Noodles) + assertTrue(SateSauce(Peanuts(UdonNoodles())) is Noodles) + assertTrue(SateSauce(Peanuts(WheatNoodles())) is Noodles) + assertTrue(SateSauce(Pork(EggNoodles())) is Noodles) + assertTrue(SateSauce(Pork(UdonNoodles())) is Noodles) + assertTrue(SateSauce(Pork(WheatNoodles())) is Noodles) + assertTrue(SateSauce(Tuna(EggNoodles())) is Noodles) + assertTrue(SateSauce(Tuna(UdonNoodles())) is Noodles) + assertTrue(SateSauce(Tuna(WheatNoodles())) is Noodles) + assertTrue(TeriyakiSauce(Chicken(EggNoodles())) is Noodles) + assertTrue(TeriyakiSauce(Chicken(UdonNoodles())) is Noodles) + assertTrue(TeriyakiSauce(Chicken(WheatNoodles())) is Noodles) + assertTrue(TeriyakiSauce(Peanuts(EggNoodles())) is Noodles) + assertTrue(TeriyakiSauce(Peanuts(UdonNoodles())) is Noodles) + assertTrue(TeriyakiSauce(Peanuts(WheatNoodles())) is Noodles) + assertTrue(TeriyakiSauce(Pork(EggNoodles())) is Noodles) + assertTrue(TeriyakiSauce(Pork(UdonNoodles())) is Noodles) + assertTrue(TeriyakiSauce(Pork(WheatNoodles())) is Noodles) + assertTrue(TeriyakiSauce(Tuna(EggNoodles())) is Noodles) + assertTrue(TeriyakiSauce(Tuna(UdonNoodles())) is Noodles) + assertTrue(TeriyakiSauce(Tuna(WheatNoodles())) is Noodles) + } + + @Test + fun `does not modify behavior`() { + val eggNoodles = EggNoodles() + val chickenEggNoodles = Chicken(eggNoodles) + val bittersweetEggNoodles = BittersweetSauce(eggNoodles) + assertTrue(eggNoodles.calculateCost() == chickenEggNoodles.calculateCost()) + assertTrue(eggNoodles.calculateCost() == bittersweetEggNoodles.calculateCost()) + } + + @Test + fun `adds behavior`() { + + + } + + @Test + fun `is stackable`() { + + } } From 45f69a10bf7da0fd8835e0a737d5bf12c9fead20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Trujillo=20Mart=C3=ADnez?= Date: Wed, 15 Mar 2017 19:51:12 +0100 Subject: [PATCH 2/6] Remove unnecessary asserts --- .../littlekai/base/IngredientDecoratorTest.kt | 59 +------------------ 1 file changed, 3 insertions(+), 56 deletions(-) diff --git a/src/test/kotlin/Decorator/littlekai/base/IngredientDecoratorTest.kt b/src/test/kotlin/Decorator/littlekai/base/IngredientDecoratorTest.kt index a18a314..68a6200 100644 --- a/src/test/kotlin/Decorator/littlekai/base/IngredientDecoratorTest.kt +++ b/src/test/kotlin/Decorator/littlekai/base/IngredientDecoratorTest.kt @@ -35,65 +35,12 @@ class IngredientDecoratorTest { assertThat(Tuna(Pork(UdonNoodles())).calculateCost(), `is`(10.75)) @Test - fun `has the same interface`() { + fun `has the same interface`() = assertTrue(BittersweetSauce(Chicken(EggNoodles())) is Noodles) - assertTrue(BittersweetSauce(Chicken(UdonNoodles())) is Noodles) - assertTrue(BittersweetSauce(Chicken(WheatNoodles())) is Noodles) - assertTrue(BittersweetSauce(Peanuts(EggNoodles())) is Noodles) - assertTrue(BittersweetSauce(Peanuts(UdonNoodles())) is Noodles) - assertTrue(BittersweetSauce(Peanuts(WheatNoodles())) is Noodles) - assertTrue(BittersweetSauce(Pork(EggNoodles())) is Noodles) - assertTrue(BittersweetSauce(Pork(UdonNoodles())) is Noodles) - assertTrue(BittersweetSauce(Pork(WheatNoodles())) is Noodles) - assertTrue(BittersweetSauce(Tuna(EggNoodles())) is Noodles) - assertTrue(BittersweetSauce(Tuna(UdonNoodles())) is Noodles) - assertTrue(BittersweetSauce(Tuna(WheatNoodles())) is Noodles) - assertTrue(RedPepperSauce(Chicken(EggNoodles())) is Noodles) - assertTrue(RedPepperSauce(Chicken(UdonNoodles())) is Noodles) - assertTrue(RedPepperSauce(Chicken(WheatNoodles())) is Noodles) - assertTrue(RedPepperSauce(Peanuts(EggNoodles())) is Noodles) - assertTrue(RedPepperSauce(Peanuts(UdonNoodles())) is Noodles) - assertTrue(RedPepperSauce(Peanuts(WheatNoodles())) is Noodles) - assertTrue(RedPepperSauce(Pork(EggNoodles())) is Noodles) - assertTrue(RedPepperSauce(Pork(UdonNoodles())) is Noodles) - assertTrue(RedPepperSauce(Pork(WheatNoodles())) is Noodles) - assertTrue(RedPepperSauce(Tuna(EggNoodles())) is Noodles) - assertTrue(RedPepperSauce(Tuna(UdonNoodles())) is Noodles) - assertTrue(RedPepperSauce(Tuna(WheatNoodles())) is Noodles) - assertTrue(SateSauce(Chicken(EggNoodles())) is Noodles) - assertTrue(SateSauce(Chicken(UdonNoodles())) is Noodles) - assertTrue(SateSauce(Chicken(WheatNoodles())) is Noodles) - assertTrue(SateSauce(Peanuts(EggNoodles())) is Noodles) - assertTrue(SateSauce(Peanuts(UdonNoodles())) is Noodles) - assertTrue(SateSauce(Peanuts(WheatNoodles())) is Noodles) - assertTrue(SateSauce(Pork(EggNoodles())) is Noodles) - assertTrue(SateSauce(Pork(UdonNoodles())) is Noodles) - assertTrue(SateSauce(Pork(WheatNoodles())) is Noodles) - assertTrue(SateSauce(Tuna(EggNoodles())) is Noodles) - assertTrue(SateSauce(Tuna(UdonNoodles())) is Noodles) - assertTrue(SateSauce(Tuna(WheatNoodles())) is Noodles) - assertTrue(TeriyakiSauce(Chicken(EggNoodles())) is Noodles) - assertTrue(TeriyakiSauce(Chicken(UdonNoodles())) is Noodles) - assertTrue(TeriyakiSauce(Chicken(WheatNoodles())) is Noodles) - assertTrue(TeriyakiSauce(Peanuts(EggNoodles())) is Noodles) - assertTrue(TeriyakiSauce(Peanuts(UdonNoodles())) is Noodles) - assertTrue(TeriyakiSauce(Peanuts(WheatNoodles())) is Noodles) - assertTrue(TeriyakiSauce(Pork(EggNoodles())) is Noodles) - assertTrue(TeriyakiSauce(Pork(UdonNoodles())) is Noodles) - assertTrue(TeriyakiSauce(Pork(WheatNoodles())) is Noodles) - assertTrue(TeriyakiSauce(Tuna(EggNoodles())) is Noodles) - assertTrue(TeriyakiSauce(Tuna(UdonNoodles())) is Noodles) - assertTrue(TeriyakiSauce(Tuna(WheatNoodles())) is Noodles) - } @Test - fun `does not modify behavior`() { - val eggNoodles = EggNoodles() - val chickenEggNoodles = Chicken(eggNoodles) - val bittersweetEggNoodles = BittersweetSauce(eggNoodles) - assertTrue(eggNoodles.calculateCost() == chickenEggNoodles.calculateCost()) - assertTrue(eggNoodles.calculateCost() == bittersweetEggNoodles.calculateCost()) - } + fun `does not modify behavior`() = + assertTrue(EggNoodles().calculateCost() == BittersweetSauce(Chicken(EggNoodles())).calculateCost()) @Test fun `adds behavior`() { From 5be0c75a98303d74951bf96fd6bf44446df9d857 Mon Sep 17 00:00:00 2001 From: Cotel Date: Wed, 15 Mar 2017 21:01:15 +0100 Subject: [PATCH 3/6] Using `by` keyword with IngredientDecorator --- src/main/kotlin/Command/base/Cart.kt | 10 ++++++---- .../Decorator/littlekai/base/IngredientDecorator.kt | 4 +++- src/main/kotlin/Decorator/littlekai/base/Noodles.kt | 2 +- .../kotlin/Decorator/littlekai/ingredients/Chicken.kt | 6 +----- .../kotlin/Decorator/littlekai/ingredients/Peanuts.kt | 6 +----- .../kotlin/Decorator/littlekai/ingredients/Pork.kt | 6 +----- .../kotlin/Decorator/littlekai/ingredients/Tuna.kt | 6 +----- 7 files changed, 14 insertions(+), 26 deletions(-) diff --git a/src/main/kotlin/Command/base/Cart.kt b/src/main/kotlin/Command/base/Cart.kt index dc4d2a2..574f590 100644 --- a/src/main/kotlin/Command/base/Cart.kt +++ b/src/main/kotlin/Command/base/Cart.kt @@ -1,14 +1,12 @@ package Command.base +import Decorator.littlekai.base.IngredientDecorator import Decorator.littlekai.base.Noodles import Decorator.littlekai.base.SauceDecorator import Decorator.littlekai.ingredients.Chicken import Decorator.littlekai.ingredients.Peanuts import Decorator.littlekai.ingredients.Pork import Decorator.littlekai.ingredients.Tuna -import Decorator.littlekai.noodles.EggNoodles -import Decorator.littlekai.noodles.UdonNoodles -import Decorator.littlekai.noodles.WheatNoodles import Decorator.littlekai.sauces.BittersweetSauce import Decorator.littlekai.sauces.RedPepperSauce import Decorator.littlekai.sauces.SateSauce @@ -79,7 +77,11 @@ open class Cart(private val scanner: Scanner) { } fun showPrice() { - println("> Your order is: ${noodles.calculateCost()} $") + var totalCost = noodles.calculateCost() + if (noodles is IngredientDecorator) { + totalCost = (noodles as IngredientDecorator).calculateTotalCost() + } + println("> Your order is: $totalCost $") if (noodles is SauceDecorator) { println("> Spiciness is: ${(noodles as SauceDecorator).SPICINESS} out of 4") } else { diff --git a/src/main/kotlin/Decorator/littlekai/base/IngredientDecorator.kt b/src/main/kotlin/Decorator/littlekai/base/IngredientDecorator.kt index 5a81ef5..7f6dc7d 100644 --- a/src/main/kotlin/Decorator/littlekai/base/IngredientDecorator.kt +++ b/src/main/kotlin/Decorator/littlekai/base/IngredientDecorator.kt @@ -1,5 +1,7 @@ package Decorator.littlekai.base abstract class IngredientDecorator (private val noodles: Noodles) : Noodles by noodles { - abstract fun calculateTotalCost(): Double + protected abstract val COST : Double + + fun calculateTotalCost(): Double = noodles.calculateCost() + COST } diff --git a/src/main/kotlin/Decorator/littlekai/base/Noodles.kt b/src/main/kotlin/Decorator/littlekai/base/Noodles.kt index d4f81ca..479d0d6 100644 --- a/src/main/kotlin/Decorator/littlekai/base/Noodles.kt +++ b/src/main/kotlin/Decorator/littlekai/base/Noodles.kt @@ -1,5 +1,5 @@ package Decorator.littlekai.base -interface Noodles { +interface Noodles { fun calculateCost() : Double } diff --git a/src/main/kotlin/Decorator/littlekai/ingredients/Chicken.kt b/src/main/kotlin/Decorator/littlekai/ingredients/Chicken.kt index 98fb26f..bc18640 100644 --- a/src/main/kotlin/Decorator/littlekai/ingredients/Chicken.kt +++ b/src/main/kotlin/Decorator/littlekai/ingredients/Chicken.kt @@ -5,9 +5,5 @@ import Decorator.littlekai.base.Noodles class Chicken(noodles: Noodles) : IngredientDecorator(noodles) { - private val COST: Double = 3.50 - - override fun calculateTotalCost(): Double { - return calculateCost() + COST - } + override val COST: Double = 3.50 } diff --git a/src/main/kotlin/Decorator/littlekai/ingredients/Peanuts.kt b/src/main/kotlin/Decorator/littlekai/ingredients/Peanuts.kt index bce8bef..7d2843a 100644 --- a/src/main/kotlin/Decorator/littlekai/ingredients/Peanuts.kt +++ b/src/main/kotlin/Decorator/littlekai/ingredients/Peanuts.kt @@ -5,9 +5,5 @@ import Decorator.littlekai.base.Noodles class Peanuts(noodles: Noodles) : IngredientDecorator(noodles) { - private val COST: Double = 2.50 - - override fun calculateTotalCost(): Double { - return calculateCost() + COST - } + override val COST: Double = 2.50 } diff --git a/src/main/kotlin/Decorator/littlekai/ingredients/Pork.kt b/src/main/kotlin/Decorator/littlekai/ingredients/Pork.kt index 7dec866..b3c7c0c 100644 --- a/src/main/kotlin/Decorator/littlekai/ingredients/Pork.kt +++ b/src/main/kotlin/Decorator/littlekai/ingredients/Pork.kt @@ -5,9 +5,5 @@ import Decorator.littlekai.base.Noodles class Pork(noodles: Noodles) : IngredientDecorator(noodles) { - private val COST: Double = 4.00 - - override fun calculateTotalCost(): Double { - return calculateCost() + COST - } + override val COST: Double = 4.00 } diff --git a/src/main/kotlin/Decorator/littlekai/ingredients/Tuna.kt b/src/main/kotlin/Decorator/littlekai/ingredients/Tuna.kt index 3cc7eba..209b69c 100644 --- a/src/main/kotlin/Decorator/littlekai/ingredients/Tuna.kt +++ b/src/main/kotlin/Decorator/littlekai/ingredients/Tuna.kt @@ -5,9 +5,5 @@ import Decorator.littlekai.base.Noodles class Tuna(noodles: Noodles) : IngredientDecorator(noodles) { - private val COST: Double = 2.75 - - override fun calculateTotalCost(): Double { - return calculateCost() + COST - } + override val COST: Double = 2.75 } From b31714e1576ecc4132be412f88b30fcd65ed2ab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Trujillo=20Mart=C3=ADnez?= Date: Wed, 15 Mar 2017 21:35:36 +0100 Subject: [PATCH 4/6] Improve Decorator Pattern design --- .../littlekai/base/IngredientDecorator.kt | 6 +-- .../Decorator/littlekai/base/Noodles.kt | 5 ++- .../littlekai/base/SauceDecorator.kt | 2 +- .../littlekai/ingredients/Chicken.kt | 4 +- .../littlekai/ingredients/Peanuts.kt | 4 +- .../Decorator/littlekai/ingredients/Pork.kt | 4 +- .../Decorator/littlekai/ingredients/Tuna.kt | 4 +- .../Decorator/littlekai/noodles/EggNoodles.kt | 7 ++-- .../littlekai/noodles/UdonNoodles.kt | 7 ++-- .../littlekai/noodles/WheatNoodles.kt | 7 ++-- .../littlekai/sauces/BittersweetSauce.kt | 2 +- .../littlekai/sauces/RedPepperSauce.kt | 2 +- .../Decorator/littlekai/sauces/SateSauce.kt | 2 +- .../littlekai/sauces/TeriyakiSauce.kt | 2 +- .../littlekai/base/IngredientDecoratorTest.kt | 40 +++++-------------- 15 files changed, 37 insertions(+), 61 deletions(-) diff --git a/src/main/kotlin/Decorator/littlekai/base/IngredientDecorator.kt b/src/main/kotlin/Decorator/littlekai/base/IngredientDecorator.kt index 7f6dc7d..117d056 100644 --- a/src/main/kotlin/Decorator/littlekai/base/IngredientDecorator.kt +++ b/src/main/kotlin/Decorator/littlekai/base/IngredientDecorator.kt @@ -1,7 +1,5 @@ package Decorator.littlekai.base -abstract class IngredientDecorator (private val noodles: Noodles) : Noodles by noodles { - protected abstract val COST : Double - - fun calculateTotalCost(): Double = noodles.calculateCost() + COST +abstract class IngredientDecorator (private val noodles: Noodles): Noodles by noodles { + override fun calculateTotalCost(): Double = noodles.calculateTotalCost() } diff --git a/src/main/kotlin/Decorator/littlekai/base/Noodles.kt b/src/main/kotlin/Decorator/littlekai/base/Noodles.kt index 479d0d6..da62c0c 100644 --- a/src/main/kotlin/Decorator/littlekai/base/Noodles.kt +++ b/src/main/kotlin/Decorator/littlekai/base/Noodles.kt @@ -1,5 +1,6 @@ package Decorator.littlekai.base -interface Noodles { - fun calculateCost() : Double +interface Noodles { + fun calculateCost(): Double + fun calculateTotalCost(): Double } diff --git a/src/main/kotlin/Decorator/littlekai/base/SauceDecorator.kt b/src/main/kotlin/Decorator/littlekai/base/SauceDecorator.kt index 46a503e..c814616 100644 --- a/src/main/kotlin/Decorator/littlekai/base/SauceDecorator.kt +++ b/src/main/kotlin/Decorator/littlekai/base/SauceDecorator.kt @@ -1,5 +1,5 @@ package Decorator.littlekai.base -abstract class SauceDecorator(private val noodles: Noodles) : Noodles by noodles { +abstract class SauceDecorator(private val noodles: Noodles): Noodles by noodles { abstract val SPICINESS: Int } diff --git a/src/main/kotlin/Decorator/littlekai/ingredients/Chicken.kt b/src/main/kotlin/Decorator/littlekai/ingredients/Chicken.kt index bc18640..c15056f 100644 --- a/src/main/kotlin/Decorator/littlekai/ingredients/Chicken.kt +++ b/src/main/kotlin/Decorator/littlekai/ingredients/Chicken.kt @@ -4,6 +4,6 @@ import Decorator.littlekai.base.IngredientDecorator import Decorator.littlekai.base.Noodles -class Chicken(noodles: Noodles) : IngredientDecorator(noodles) { - override val COST: Double = 3.50 +class Chicken(noodles: Noodles, val COST: Double = 3.50): IngredientDecorator(noodles) { + override fun calculateTotalCost(): Double = super.calculateTotalCost() + COST } diff --git a/src/main/kotlin/Decorator/littlekai/ingredients/Peanuts.kt b/src/main/kotlin/Decorator/littlekai/ingredients/Peanuts.kt index 7d2843a..176fde6 100644 --- a/src/main/kotlin/Decorator/littlekai/ingredients/Peanuts.kt +++ b/src/main/kotlin/Decorator/littlekai/ingredients/Peanuts.kt @@ -4,6 +4,6 @@ import Decorator.littlekai.base.IngredientDecorator import Decorator.littlekai.base.Noodles -class Peanuts(noodles: Noodles) : IngredientDecorator(noodles) { - override val COST: Double = 2.50 +class Peanuts(noodles: Noodles, val COST: Double = 2.50): IngredientDecorator(noodles) { + override fun calculateTotalCost(): Double = super.calculateTotalCost() + COST } diff --git a/src/main/kotlin/Decorator/littlekai/ingredients/Pork.kt b/src/main/kotlin/Decorator/littlekai/ingredients/Pork.kt index b3c7c0c..a127f6c 100644 --- a/src/main/kotlin/Decorator/littlekai/ingredients/Pork.kt +++ b/src/main/kotlin/Decorator/littlekai/ingredients/Pork.kt @@ -4,6 +4,6 @@ import Decorator.littlekai.base.IngredientDecorator import Decorator.littlekai.base.Noodles -class Pork(noodles: Noodles) : IngredientDecorator(noodles) { - override val COST: Double = 4.00 +class Pork(noodles: Noodles, val COST: Double = 4.00): IngredientDecorator(noodles) { + override fun calculateTotalCost(): Double = super.calculateTotalCost() + COST } diff --git a/src/main/kotlin/Decorator/littlekai/ingredients/Tuna.kt b/src/main/kotlin/Decorator/littlekai/ingredients/Tuna.kt index 209b69c..4b8e70f 100644 --- a/src/main/kotlin/Decorator/littlekai/ingredients/Tuna.kt +++ b/src/main/kotlin/Decorator/littlekai/ingredients/Tuna.kt @@ -4,6 +4,6 @@ import Decorator.littlekai.base.IngredientDecorator import Decorator.littlekai.base.Noodles -class Tuna(noodles: Noodles) : IngredientDecorator(noodles) { - override val COST: Double = 2.75 +class Tuna(noodles: Noodles, val COST: Double = 2.75): IngredientDecorator(noodles) { + override fun calculateTotalCost(): Double = super.calculateTotalCost() + COST } diff --git a/src/main/kotlin/Decorator/littlekai/noodles/EggNoodles.kt b/src/main/kotlin/Decorator/littlekai/noodles/EggNoodles.kt index 2a274a6..1afd07b 100644 --- a/src/main/kotlin/Decorator/littlekai/noodles/EggNoodles.kt +++ b/src/main/kotlin/Decorator/littlekai/noodles/EggNoodles.kt @@ -2,8 +2,7 @@ package Decorator.littlekai.noodles import Decorator.littlekai.base.Noodles -class EggNoodles : Noodles { - private val COST : Double = 3.75 - - override fun calculateCost(): Double = this.COST +class EggNoodles(val COST: Double = 3.75): Noodles { + override fun calculateCost(): Double = COST + override fun calculateTotalCost(): Double = COST } diff --git a/src/main/kotlin/Decorator/littlekai/noodles/UdonNoodles.kt b/src/main/kotlin/Decorator/littlekai/noodles/UdonNoodles.kt index 23f11e8..2b0edb6 100644 --- a/src/main/kotlin/Decorator/littlekai/noodles/UdonNoodles.kt +++ b/src/main/kotlin/Decorator/littlekai/noodles/UdonNoodles.kt @@ -2,8 +2,7 @@ package Decorator.littlekai.noodles import Decorator.littlekai.base.Noodles -class UdonNoodles : Noodles { - private val COST : Double = 4.00 - - override fun calculateCost(): Double = this.COST +class UdonNoodles(val COST: Double = 4.00): Noodles { + override fun calculateCost(): Double = COST + override fun calculateTotalCost(): Double = COST } diff --git a/src/main/kotlin/Decorator/littlekai/noodles/WheatNoodles.kt b/src/main/kotlin/Decorator/littlekai/noodles/WheatNoodles.kt index f89b570..4cf1d1b 100644 --- a/src/main/kotlin/Decorator/littlekai/noodles/WheatNoodles.kt +++ b/src/main/kotlin/Decorator/littlekai/noodles/WheatNoodles.kt @@ -2,8 +2,7 @@ package Decorator.littlekai.noodles import Decorator.littlekai.base.Noodles -class WheatNoodles : Noodles { - private val COST : Double = 3.50 - - override fun calculateCost(): Double = this.COST +class WheatNoodles(val COST: Double = 3.50): Noodles { + override fun calculateCost(): Double = COST + override fun calculateTotalCost(): Double = COST } diff --git a/src/main/kotlin/Decorator/littlekai/sauces/BittersweetSauce.kt b/src/main/kotlin/Decorator/littlekai/sauces/BittersweetSauce.kt index ceac5be..0c5e70f 100644 --- a/src/main/kotlin/Decorator/littlekai/sauces/BittersweetSauce.kt +++ b/src/main/kotlin/Decorator/littlekai/sauces/BittersweetSauce.kt @@ -3,7 +3,7 @@ package Decorator.littlekai.sauces import Decorator.littlekai.base.Noodles import Decorator.littlekai.base.SauceDecorator -class BittersweetSauce(noodles: Noodles) : SauceDecorator(noodles) { +class BittersweetSauce(noodles: Noodles): SauceDecorator(noodles) { override val SPICINESS: Int = 1 } diff --git a/src/main/kotlin/Decorator/littlekai/sauces/RedPepperSauce.kt b/src/main/kotlin/Decorator/littlekai/sauces/RedPepperSauce.kt index bfb50d3..c78a6ee 100644 --- a/src/main/kotlin/Decorator/littlekai/sauces/RedPepperSauce.kt +++ b/src/main/kotlin/Decorator/littlekai/sauces/RedPepperSauce.kt @@ -4,6 +4,6 @@ import Decorator.littlekai.base.Noodles import Decorator.littlekai.base.SauceDecorator -class RedPepperSauce(noodles: Noodles) : SauceDecorator(noodles) { +class RedPepperSauce(noodles: Noodles): SauceDecorator(noodles) { override val SPICINESS: Int = 4 } diff --git a/src/main/kotlin/Decorator/littlekai/sauces/SateSauce.kt b/src/main/kotlin/Decorator/littlekai/sauces/SateSauce.kt index 1dba816..3ca111a 100644 --- a/src/main/kotlin/Decorator/littlekai/sauces/SateSauce.kt +++ b/src/main/kotlin/Decorator/littlekai/sauces/SateSauce.kt @@ -3,6 +3,6 @@ package Decorator.littlekai.sauces import Decorator.littlekai.base.Noodles import Decorator.littlekai.base.SauceDecorator -class SateSauce(noodles: Noodles) : SauceDecorator(noodles) { +class SateSauce(noodles: Noodles): SauceDecorator(noodles) { override val SPICINESS: Int = 2 } diff --git a/src/main/kotlin/Decorator/littlekai/sauces/TeriyakiSauce.kt b/src/main/kotlin/Decorator/littlekai/sauces/TeriyakiSauce.kt index 2d4c3de..13f0891 100644 --- a/src/main/kotlin/Decorator/littlekai/sauces/TeriyakiSauce.kt +++ b/src/main/kotlin/Decorator/littlekai/sauces/TeriyakiSauce.kt @@ -4,6 +4,6 @@ import Decorator.littlekai.base.Noodles import Decorator.littlekai.base.SauceDecorator -class TeriyakiSauce(noodles: Noodles) : SauceDecorator(noodles) { +class TeriyakiSauce(noodles: Noodles): SauceDecorator(noodles) { override val SPICINESS: Int = 0 } diff --git a/src/test/kotlin/Decorator/littlekai/base/IngredientDecoratorTest.kt b/src/test/kotlin/Decorator/littlekai/base/IngredientDecoratorTest.kt index 68a6200..a963df8 100644 --- a/src/test/kotlin/Decorator/littlekai/base/IngredientDecoratorTest.kt +++ b/src/test/kotlin/Decorator/littlekai/base/IngredientDecoratorTest.kt @@ -5,35 +5,12 @@ import Decorator.littlekai.ingredients.Peanuts import Decorator.littlekai.ingredients.Pork import Decorator.littlekai.ingredients.Tuna import Decorator.littlekai.noodles.EggNoodles -import Decorator.littlekai.noodles.UdonNoodles -import Decorator.littlekai.noodles.WheatNoodles import Decorator.littlekai.sauces.BittersweetSauce -import Decorator.littlekai.sauces.RedPepperSauce -import Decorator.littlekai.sauces.SateSauce -import Decorator.littlekai.sauces.TeriyakiSauce -import org.hamcrest.CoreMatchers.`is` -import org.junit.Assert.assertThat import org.junit.Assert.assertTrue import org.junit.Test class IngredientDecoratorTest { - @Test - fun `check if decorated element is still Noodles`() = - assertTrue(Pork(UdonNoodles()) is Noodles) //:+1: - - @Test - fun `Ingredient Decorator should return ingredient cost plus base noodle cost`() = - assertThat(Pork(UdonNoodles()).calculateCost(), `is`(8.00)) - - @Test - fun `check decorated Noodles is of type IngredientDecorator`() = - assertTrue(Tuna(UdonNoodles()) is IngredientDecorator) - - @Test - fun `price of ingredient is calculated correctly`() = - assertThat(Tuna(Pork(UdonNoodles())).calculateCost(), `is`(10.75)) - @Test fun `has the same interface`() = assertTrue(BittersweetSauce(Chicken(EggNoodles())) is Noodles) @@ -43,13 +20,16 @@ class IngredientDecoratorTest { assertTrue(EggNoodles().calculateCost() == BittersweetSauce(Chicken(EggNoodles())).calculateCost()) @Test - fun `adds behavior`() { - - - } + fun `adds behavior`() = + assertTrue(Chicken(EggNoodles()).calculateTotalCost() == EggNoodles().calculateCost() + Chicken(EggNoodles()).COST) @Test - fun `is stackable`() { - - } + fun `is stackable`() = + assertTrue( + Tuna(Pork(Peanuts(Chicken(EggNoodles())))).calculateTotalCost() == + EggNoodles().COST + + Chicken(EggNoodles()).COST + + Peanuts(EggNoodles()).COST + + Pork(EggNoodles()).COST + + Tuna(EggNoodles()).COST) } From 12ba9ba6d110715be490c2174195e4ac383dbe38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Trujillo=20Mart=C3=ADnez?= Date: Tue, 21 Mar 2017 20:31:03 +0100 Subject: [PATCH 5/6] Extract the variable COST from the constructor to an immutable constant --- src/main/kotlin/Decorator/littlekai/ingredients/Chicken.kt | 4 +++- src/main/kotlin/Decorator/littlekai/ingredients/Peanuts.kt | 4 +++- src/main/kotlin/Decorator/littlekai/ingredients/Pork.kt | 4 +++- src/main/kotlin/Decorator/littlekai/ingredients/Tuna.kt | 4 +++- src/main/kotlin/Decorator/littlekai/noodles/EggNoodles.kt | 4 +++- src/main/kotlin/Decorator/littlekai/noodles/UdonNoodles.kt | 4 +++- src/main/kotlin/Decorator/littlekai/noodles/WheatNoodles.kt | 4 +++- 7 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/Decorator/littlekai/ingredients/Chicken.kt b/src/main/kotlin/Decorator/littlekai/ingredients/Chicken.kt index c15056f..1dc4647 100644 --- a/src/main/kotlin/Decorator/littlekai/ingredients/Chicken.kt +++ b/src/main/kotlin/Decorator/littlekai/ingredients/Chicken.kt @@ -4,6 +4,8 @@ import Decorator.littlekai.base.IngredientDecorator import Decorator.littlekai.base.Noodles -class Chicken(noodles: Noodles, val COST: Double = 3.50): IngredientDecorator(noodles) { +class Chicken(noodles: Noodles): IngredientDecorator(noodles) { + val COST: Double = 3.50 + override fun calculateTotalCost(): Double = super.calculateTotalCost() + COST } diff --git a/src/main/kotlin/Decorator/littlekai/ingredients/Peanuts.kt b/src/main/kotlin/Decorator/littlekai/ingredients/Peanuts.kt index 176fde6..e703664 100644 --- a/src/main/kotlin/Decorator/littlekai/ingredients/Peanuts.kt +++ b/src/main/kotlin/Decorator/littlekai/ingredients/Peanuts.kt @@ -4,6 +4,8 @@ import Decorator.littlekai.base.IngredientDecorator import Decorator.littlekai.base.Noodles -class Peanuts(noodles: Noodles, val COST: Double = 2.50): IngredientDecorator(noodles) { +class Peanuts(noodles: Noodles): IngredientDecorator(noodles) { + val COST: Double = 2.50 + override fun calculateTotalCost(): Double = super.calculateTotalCost() + COST } diff --git a/src/main/kotlin/Decorator/littlekai/ingredients/Pork.kt b/src/main/kotlin/Decorator/littlekai/ingredients/Pork.kt index a127f6c..ef1b2fa 100644 --- a/src/main/kotlin/Decorator/littlekai/ingredients/Pork.kt +++ b/src/main/kotlin/Decorator/littlekai/ingredients/Pork.kt @@ -4,6 +4,8 @@ import Decorator.littlekai.base.IngredientDecorator import Decorator.littlekai.base.Noodles -class Pork(noodles: Noodles, val COST: Double = 4.00): IngredientDecorator(noodles) { +class Pork(noodles: Noodles): IngredientDecorator(noodles) { + val COST: Double = 4.00 + override fun calculateTotalCost(): Double = super.calculateTotalCost() + COST } diff --git a/src/main/kotlin/Decorator/littlekai/ingredients/Tuna.kt b/src/main/kotlin/Decorator/littlekai/ingredients/Tuna.kt index 4b8e70f..6458965 100644 --- a/src/main/kotlin/Decorator/littlekai/ingredients/Tuna.kt +++ b/src/main/kotlin/Decorator/littlekai/ingredients/Tuna.kt @@ -4,6 +4,8 @@ import Decorator.littlekai.base.IngredientDecorator import Decorator.littlekai.base.Noodles -class Tuna(noodles: Noodles, val COST: Double = 2.75): IngredientDecorator(noodles) { +class Tuna(noodles: Noodles): IngredientDecorator(noodles) { + val COST: Double = 2.75 + override fun calculateTotalCost(): Double = super.calculateTotalCost() + COST } diff --git a/src/main/kotlin/Decorator/littlekai/noodles/EggNoodles.kt b/src/main/kotlin/Decorator/littlekai/noodles/EggNoodles.kt index 1afd07b..b622839 100644 --- a/src/main/kotlin/Decorator/littlekai/noodles/EggNoodles.kt +++ b/src/main/kotlin/Decorator/littlekai/noodles/EggNoodles.kt @@ -2,7 +2,9 @@ package Decorator.littlekai.noodles import Decorator.littlekai.base.Noodles -class EggNoodles(val COST: Double = 3.75): Noodles { +class EggNoodles(): Noodles { + val COST: Double = 3.75 + override fun calculateCost(): Double = COST override fun calculateTotalCost(): Double = COST } diff --git a/src/main/kotlin/Decorator/littlekai/noodles/UdonNoodles.kt b/src/main/kotlin/Decorator/littlekai/noodles/UdonNoodles.kt index 2b0edb6..09a5a34 100644 --- a/src/main/kotlin/Decorator/littlekai/noodles/UdonNoodles.kt +++ b/src/main/kotlin/Decorator/littlekai/noodles/UdonNoodles.kt @@ -2,7 +2,9 @@ package Decorator.littlekai.noodles import Decorator.littlekai.base.Noodles -class UdonNoodles(val COST: Double = 4.00): Noodles { +class UdonNoodles(): Noodles { + val COST: Double = 4.00 + override fun calculateCost(): Double = COST override fun calculateTotalCost(): Double = COST } diff --git a/src/main/kotlin/Decorator/littlekai/noodles/WheatNoodles.kt b/src/main/kotlin/Decorator/littlekai/noodles/WheatNoodles.kt index 4cf1d1b..4ae1703 100644 --- a/src/main/kotlin/Decorator/littlekai/noodles/WheatNoodles.kt +++ b/src/main/kotlin/Decorator/littlekai/noodles/WheatNoodles.kt @@ -2,7 +2,9 @@ package Decorator.littlekai.noodles import Decorator.littlekai.base.Noodles -class WheatNoodles(val COST: Double = 3.50): Noodles { +class WheatNoodles(): Noodles { + val COST: Double = 3.50 + override fun calculateCost(): Double = COST override fun calculateTotalCost(): Double = COST } From 917739544c27c2cf20196d40dd2e657300093455 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Trujillo=20Mart=C3=ADnez?= Date: Tue, 21 Mar 2017 20:49:42 +0100 Subject: [PATCH 6/6] Remove unnecessary override of function calculateTotalCost() in IngredientDecorator --- .../kotlin/Decorator/littlekai/base/IngredientDecorator.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/kotlin/Decorator/littlekai/base/IngredientDecorator.kt b/src/main/kotlin/Decorator/littlekai/base/IngredientDecorator.kt index 117d056..bda3d64 100644 --- a/src/main/kotlin/Decorator/littlekai/base/IngredientDecorator.kt +++ b/src/main/kotlin/Decorator/littlekai/base/IngredientDecorator.kt @@ -1,5 +1,3 @@ package Decorator.littlekai.base -abstract class IngredientDecorator (private val noodles: Noodles): Noodles by noodles { - override fun calculateTotalCost(): Double = noodles.calculateTotalCost() -} +abstract class IngredientDecorator (private val noodles: Noodles): Noodles by noodles