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 84baf1f..bda3d64 100644 --- a/src/main/kotlin/Decorator/littlekai/base/IngredientDecorator.kt +++ b/src/main/kotlin/Decorator/littlekai/base/IngredientDecorator.kt @@ -1,7 +1,3 @@ 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 class IngredientDecorator (private val noodles: Noodles): Noodles by noodles diff --git a/src/main/kotlin/Decorator/littlekai/base/Noodles.kt b/src/main/kotlin/Decorator/littlekai/base/Noodles.kt index d4f81ca..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 + 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..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) : IngredientDecorator(noodles) { - override val COST: Double = 3.50 +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 7d2843a..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) : IngredientDecorator(noodles) { - override val COST: Double = 2.50 +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 b3c7c0c..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) : IngredientDecorator(noodles) { - override val COST: Double = 4.00 +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 209b69c..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) : IngredientDecorator(noodles) { - override val COST: Double = 2.75 +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 2a274a6..b622839 100644 --- a/src/main/kotlin/Decorator/littlekai/noodles/EggNoodles.kt +++ b/src/main/kotlin/Decorator/littlekai/noodles/EggNoodles.kt @@ -2,8 +2,9 @@ package Decorator.littlekai.noodles import Decorator.littlekai.base.Noodles -class EggNoodles : Noodles { - private val COST : Double = 3.75 +class EggNoodles(): Noodles { + val COST: Double = 3.75 - override fun calculateCost(): Double = this.COST + 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..09a5a34 100644 --- a/src/main/kotlin/Decorator/littlekai/noodles/UdonNoodles.kt +++ b/src/main/kotlin/Decorator/littlekai/noodles/UdonNoodles.kt @@ -2,8 +2,9 @@ package Decorator.littlekai.noodles import Decorator.littlekai.base.Noodles -class UdonNoodles : Noodles { - private val COST : Double = 4.00 +class UdonNoodles(): Noodles { + val COST: Double = 4.00 - override fun calculateCost(): Double = this.COST + 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..4ae1703 100644 --- a/src/main/kotlin/Decorator/littlekai/noodles/WheatNoodles.kt +++ b/src/main/kotlin/Decorator/littlekai/noodles/WheatNoodles.kt @@ -2,8 +2,9 @@ package Decorator.littlekai.noodles import Decorator.littlekai.base.Noodles -class WheatNoodles : Noodles { - private val COST : Double = 3.50 +class WheatNoodles(): Noodles { + val COST: Double = 3.50 - override fun calculateCost(): Double = this.COST + 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 4630730..a963df8 100644 --- a/src/test/kotlin/Decorator/littlekai/base/IngredientDecoratorTest.kt +++ b/src/test/kotlin/Decorator/littlekai/base/IngredientDecoratorTest.kt @@ -1,31 +1,35 @@ 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 org.hamcrest.CoreMatchers.`is` -import org.junit.Assert.assertThat +import Decorator.littlekai.sauces.BittersweetSauce 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: + fun `has the same interface`() = + assertTrue(BittersweetSauce(Chicken(EggNoodles())) is Noodles) @Test - fun `Ingredient Decorator should return ingredient cost plus base noodle cost`() = - assertThat(Pork(UdonNoodles()).calculateCost(), `is`(8.00)) + fun `does not modify behavior`() = + assertTrue(EggNoodles().calculateCost() == BittersweetSauce(Chicken(EggNoodles())).calculateCost()) @Test - fun `check decorated Noodles is of type IngredientDecorator`() = - assertTrue(Tuna(UdonNoodles()) is IngredientDecorator) + fun `adds behavior`() = + assertTrue(Chicken(EggNoodles()).calculateTotalCost() == EggNoodles().calculateCost() + Chicken(EggNoodles()).COST) @Test - fun `price of ingredient is calculated correctly`() = - assertThat(Tuna(Pork(UdonNoodles())).calculateCost(), `is`(10.75)) - + fun `is stackable`() = + assertTrue( + Tuna(Pork(Peanuts(Chicken(EggNoodles())))).calculateTotalCost() == + EggNoodles().COST + + Chicken(EggNoodles()).COST + + Peanuts(EggNoodles()).COST + + Pork(EggNoodles()).COST + + Tuna(EggNoodles()).COST) }