├── solutions ├── java │ └── .gitkeep ├── scala │ └── .gitkeep └── dotnet-core │ ├── .gitkeep │ ├── piraces-decorator │ ├── Beverages │ │ ├── Interfaces │ │ │ └── Beverages │ │ │ │ └── Beverage.cs │ │ ├── Classes │ │ │ ├── Supplements │ │ │ │ ├── NoExtra.cs │ │ │ │ ├── Milk.cs │ │ │ │ ├── Cream.cs │ │ │ │ └── Cinnamon.cs │ │ │ └── Beverages │ │ │ │ ├── Tea.cs │ │ │ │ ├── Coffee.cs │ │ │ │ ├── HotChocolate.cs │ │ │ │ └── Drink.cs │ │ ├── Beverages.csproj │ │ └── Factories │ │ │ └── BeverageFactory.cs │ ├── Beverages.Test │ │ ├── Beverages.Tests.csproj │ │ └── BeveragesPricingTest.cs │ └── Beverages.sln │ └── piraces-composition │ ├── Beverages │ ├── Enums │ │ └── SupplementType.cs │ ├── Beverages.csproj │ ├── Beverage.cs │ └── Factories │ │ └── BeverageFactory.cs │ ├── Beverages.Test │ ├── Beverages.Tests.csproj │ └── BeveragesPricingTest.cs │ └── Beverages.sln ├── scala ├── project │ └── build.properties ├── src │ ├── main │ │ └── scala │ │ │ ├── Beverage.scala │ │ │ ├── Tea.scala │ │ │ ├── Coffee.scala │ │ │ ├── HotChocolate.scala │ │ │ ├── TeaWithMilk.scala │ │ │ ├── CoffeeWithMilk.scala │ │ │ ├── HotChocolateWithCream.scala │ │ │ └── CoffeeWithMilkAndCream.scala │ └── test │ │ └── scala │ │ └── BeveragesPricingTest.scala └── build.sbt ├── java ├── src │ ├── main │ │ └── java │ │ │ └── beverages │ │ │ ├── Beverage.java │ │ │ ├── Tea.java │ │ │ ├── Coffee.java │ │ │ ├── HotChocolate.java │ │ │ ├── TeaWithMilk.java │ │ │ ├── CoffeeWithMilk.java │ │ │ ├── HotChocolateWithCream.java │ │ │ └── CoffeeWithMilkAndCream.java │ └── test │ │ └── java │ │ └── unit_tests │ │ └── BeveragesPricingTest.java └── pom.xml ├── dotnet-core ├── Beverages │ ├── Beverage.cs │ ├── Beverages.csproj │ ├── Tea.cs │ ├── Coffee.cs │ ├── HotChocolate.cs │ ├── TeaWithMilk.cs │ ├── CoffeeWithMilk.cs │ ├── HotChocolateWithCream.cs │ └── CoffeeWithMilkAndCream.cs ├── Beverages.Test │ ├── Beverages.Tests.csproj │ └── BeveragesPricingTest.cs └── Beverages.sln ├── .gitignore └── README.md /solutions/java/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /solutions/scala/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /solutions/dotnet-core/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scala/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.3.2 -------------------------------------------------------------------------------- /scala/src/main/scala/Beverage.scala: -------------------------------------------------------------------------------- 1 | trait Beverage { 2 | def price(): Double 3 | } 4 | -------------------------------------------------------------------------------- /scala/src/main/scala/Tea.scala: -------------------------------------------------------------------------------- 1 | class Tea extends Beverage { 2 | override def price(): Double = 1.5 3 | } 4 | -------------------------------------------------------------------------------- /scala/src/main/scala/Coffee.scala: -------------------------------------------------------------------------------- 1 | class Coffee extends Beverage { 2 | override def price(): Double = 1.2 3 | } 4 | -------------------------------------------------------------------------------- /java/src/main/java/beverages/Beverage.java: -------------------------------------------------------------------------------- 1 | package beverages; 2 | 3 | public interface Beverage { 4 | double price(); 5 | } 6 | -------------------------------------------------------------------------------- /scala/src/main/scala/HotChocolate.scala: -------------------------------------------------------------------------------- 1 | class HotChocolate extends Beverage { 2 | override def price(): Double = 1.45 3 | } 4 | -------------------------------------------------------------------------------- /scala/src/main/scala/TeaWithMilk.scala: -------------------------------------------------------------------------------- 1 | class TeaWithMilk extends Tea { 2 | override def price(): Double = super.price() + 0.10 3 | } 4 | -------------------------------------------------------------------------------- /scala/src/main/scala/CoffeeWithMilk.scala: -------------------------------------------------------------------------------- 1 | class CoffeeWithMilk extends Coffee { 2 | override def price(): Double = super.price() + 0.10 3 | } 4 | -------------------------------------------------------------------------------- /dotnet-core/Beverages/Beverage.cs: -------------------------------------------------------------------------------- 1 | namespace Beverages 2 | { 3 | public interface Beverage 4 | { 5 | double Price(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /scala/src/main/scala/HotChocolateWithCream.scala: -------------------------------------------------------------------------------- 1 | class HotChocolateWithCream extends HotChocolate { 2 | override def price(): Double = 1.45 + 0.15 3 | } 4 | -------------------------------------------------------------------------------- /scala/src/main/scala/CoffeeWithMilkAndCream.scala: -------------------------------------------------------------------------------- 1 | class CoffeeWithMilkAndCream extends Coffee { 2 | override def price(): Double = super.price() + 0.25 3 | } 4 | -------------------------------------------------------------------------------- /java/src/main/java/beverages/Tea.java: -------------------------------------------------------------------------------- 1 | package beverages; 2 | 3 | public class Tea implements Beverage { 4 | @Override 5 | public double price() { 6 | return 1.5; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /java/src/main/java/beverages/Coffee.java: -------------------------------------------------------------------------------- 1 | package beverages; 2 | 3 | public class Coffee implements Beverage { 4 | @Override 5 | public double price() { 6 | return 1.2; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /dotnet-core/Beverages/Beverages.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netcoreapp2.2 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /java/src/main/java/beverages/HotChocolate.java: -------------------------------------------------------------------------------- 1 | package beverages; 2 | 3 | public class HotChocolate implements Beverage { 4 | @Override 5 | public double price() { 6 | return 1.45; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-decorator/Beverages/Interfaces/Beverages/Beverage.cs: -------------------------------------------------------------------------------- 1 | namespace Beverages.Interfaces.Beverages 2 | { 3 | public interface Beverage 4 | { 5 | double Price(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /java/src/main/java/beverages/TeaWithMilk.java: -------------------------------------------------------------------------------- 1 | package beverages; 2 | 3 | public class TeaWithMilk extends Tea { 4 | @Override 5 | public double price() { 6 | return super.price() + 0.10; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /dotnet-core/Beverages/Tea.cs: -------------------------------------------------------------------------------- 1 | namespace Beverages 2 | { 3 | public class Tea : Beverage 4 | { 5 | public virtual double Price() 6 | { 7 | return 1.5; 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /java/src/main/java/beverages/CoffeeWithMilk.java: -------------------------------------------------------------------------------- 1 | package beverages; 2 | 3 | public class CoffeeWithMilk extends Coffee { 4 | @Override 5 | public double price() { 6 | return super.price() + 0.10; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /dotnet-core/Beverages/Coffee.cs: -------------------------------------------------------------------------------- 1 | namespace Beverages 2 | { 3 | public class Coffee : Beverage 4 | { 5 | public virtual double Price() 6 | { 7 | return 1.2; 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /java/src/main/java/beverages/HotChocolateWithCream.java: -------------------------------------------------------------------------------- 1 | package beverages; 2 | 3 | public class HotChocolateWithCream extends HotChocolate { 4 | @Override 5 | public double price() { 6 | return 1.45 + 0.15; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-composition/Beverages/Enums/SupplementType.cs: -------------------------------------------------------------------------------- 1 | namespace Beverages.Enums 2 | { 3 | public enum SupplementType 4 | { 5 | Milk, 6 | Cream, 7 | Cinnamon 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /dotnet-core/Beverages/HotChocolate.cs: -------------------------------------------------------------------------------- 1 | namespace Beverages 2 | { 3 | public class HotChocolate : Beverage 4 | { 5 | public virtual double Price() 6 | { 7 | return 1.45; 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /scala/build.sbt: -------------------------------------------------------------------------------- 1 | name := "scala" 2 | 3 | version := "0.1" 4 | 5 | scalaVersion := "2.13.1" 6 | 7 | libraryDependencies += "org.scalactic" %% "scalactic" % "3.0.8" 8 | libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.8" % "test" 9 | -------------------------------------------------------------------------------- /java/src/main/java/beverages/CoffeeWithMilkAndCream.java: -------------------------------------------------------------------------------- 1 | package beverages; 2 | 3 | public class CoffeeWithMilkAndCream extends Coffee { 4 | @Override 5 | public double price() { 6 | return super.price() + 0.25; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /dotnet-core/Beverages/TeaWithMilk.cs: -------------------------------------------------------------------------------- 1 | namespace Beverages 2 | { 3 | public class TeaWithMilk : Tea 4 | { 5 | public override double Price() 6 | { 7 | return base.Price() + 0.10; 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /dotnet-core/Beverages/CoffeeWithMilk.cs: -------------------------------------------------------------------------------- 1 | namespace Beverages 2 | { 3 | public class CoffeeWithMilk : Coffee 4 | { 5 | public override double Price() 6 | { 7 | return base.Price() + 0.10; 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /dotnet-core/Beverages/HotChocolateWithCream.cs: -------------------------------------------------------------------------------- 1 | namespace Beverages 2 | { 3 | public class HotChocolateWithCream : HotChocolate 4 | { 5 | public override double Price() 6 | { 7 | return 1.45 + 0.15; 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /dotnet-core/Beverages/CoffeeWithMilkAndCream.cs: -------------------------------------------------------------------------------- 1 | namespace Beverages 2 | { 3 | public class CoffeeWithMilkAndCream : Coffee 4 | { 5 | public override double Price() 6 | { 7 | return base.Price() + 0.25; 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-decorator/Beverages/Classes/Supplements/NoExtra.cs: -------------------------------------------------------------------------------- 1 | using Beverages.Interfaces.Beverages; 2 | 3 | namespace Beverages.Classes.Supplements 4 | { 5 | public class NoExtra : Beverage 6 | { 7 | public double Price() 8 | { 9 | return 0.0; 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-composition/Beverages/Beverages.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netcoreapp2.2 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-decorator/Beverages/Classes/Beverages/Tea.cs: -------------------------------------------------------------------------------- 1 | using Beverages.Interfaces.Beverages; 2 | 3 | namespace Beverages.Classes.Beverages 4 | { 5 | public class Tea : Drink 6 | { 7 | public Tea() : base() { } 8 | public Tea(Beverage beverage) : base(beverage) { } 9 | 10 | protected override double DrinkPrice() 11 | { 12 | return 1.5; 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-decorator/Beverages/Classes/Beverages/Coffee.cs: -------------------------------------------------------------------------------- 1 | using Beverages.Interfaces.Beverages; 2 | 3 | namespace Beverages.Classes.Beverages 4 | { 5 | public class Coffee : Drink 6 | { 7 | public Coffee() : base() { } 8 | public Coffee(Beverage beverage) : base(beverage) { } 9 | 10 | protected override double DrinkPrice() 11 | { 12 | return 1.2; 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-decorator/Beverages/Classes/Beverages/HotChocolate.cs: -------------------------------------------------------------------------------- 1 | using Beverages.Interfaces.Beverages; 2 | 3 | namespace Beverages.Classes.Beverages 4 | { 5 | public class HotChocolate : Drink 6 | { 7 | public HotChocolate() : base() { } 8 | public HotChocolate(Beverage beverage) : base(beverage) { } 9 | 10 | protected override double DrinkPrice() 11 | { 12 | return 1.45; 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-decorator/Beverages/Classes/Supplements/Milk.cs: -------------------------------------------------------------------------------- 1 | using Beverages.Classes.Beverages; 2 | using Beverages.Interfaces.Beverages; 3 | 4 | namespace Beverages.Classes.Supplements 5 | { 6 | public class Milk : Drink 7 | { 8 | public Milk() : base() { } 9 | public Milk(Beverage drink) : base(drink) { } 10 | 11 | protected override double DrinkPrice() 12 | { 13 | return 0.1; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-decorator/Beverages/Classes/Supplements/Cream.cs: -------------------------------------------------------------------------------- 1 | using Beverages.Classes.Beverages; 2 | using Beverages.Interfaces.Beverages; 3 | 4 | namespace Beverages.Classes.Supplements 5 | { 6 | public class Cream : Drink 7 | { 8 | public Cream() : base() { } 9 | public Cream(Beverage drink) : base(drink) { } 10 | 11 | protected override double DrinkPrice() 12 | { 13 | return 0.15; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-decorator/Beverages/Classes/Supplements/Cinnamon.cs: -------------------------------------------------------------------------------- 1 | using Beverages.Classes.Beverages; 2 | using Beverages.Interfaces.Beverages; 3 | 4 | namespace Beverages.Classes.Supplements 5 | { 6 | public class Cinnamon : Drink 7 | { 8 | public Cinnamon() : base() { } 9 | public Cinnamon(Beverage drink) : base(drink) { } 10 | 11 | protected override double DrinkPrice() 12 | { 13 | return 0.05; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-decorator/Beverages/Beverages.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netcoreapp2.2 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /dotnet-core/Beverages.Test/Beverages.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netcoreapp2.2 5 | 6 | false 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-decorator/Beverages.Test/Beverages.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netcoreapp2.2 5 | 6 | false 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-composition/Beverages.Test/Beverages.Tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netcoreapp2.2 5 | 6 | false 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-decorator/Beverages/Classes/Beverages/Drink.cs: -------------------------------------------------------------------------------- 1 | using Beverages.Classes.Supplements; 2 | using Beverages.Interfaces.Beverages; 3 | 4 | namespace Beverages.Classes.Beverages 5 | { 6 | public class Drink : Beverage 7 | { 8 | private Beverage _drink; 9 | 10 | public Drink() => _drink = new NoExtra(); 11 | 12 | public Drink(Beverage drink) => _drink = drink; 13 | 14 | public static Drink With(Beverage beverage) => new Drink(beverage); 15 | 16 | public double Price() => _drink.Price() + DrinkPrice(); 17 | 18 | protected virtual double DrinkPrice() => 0.0; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Custom 2 | /bin/ 3 | target 4 | .idea 5 | *.iml 6 | *.swp 7 | *.*~ 8 | project.lock.json 9 | .DS_Store 10 | *.pyc 11 | nupkg/ 12 | 13 | # C# (Visual Studio Code) 14 | .vscode 15 | 16 | .idea 17 | 18 | *.suo 19 | *.user 20 | *.userosscache 21 | *.sln.docstates 22 | 23 | [Dd]ebug/ 24 | [Dd]ebugPublic/ 25 | [Rr]elease/ 26 | [Rr]eleases/ 27 | x64/ 28 | x86/ 29 | build/ 30 | bld/ 31 | [Bb]in/ 32 | [Oo]bj/ 33 | [Oo]ut/ 34 | msbuild.log 35 | msbuild.err 36 | msbuild.wrn 37 | 38 | .vs/ 39 | 40 | # Java Specific 41 | 42 | *.project 43 | *.class 44 | *.log 45 | *.ctxt 46 | .mtj.tmp/ 47 | .settings/ 48 | 49 | *.jar 50 | *.war 51 | *.nar 52 | *.ear 53 | *.zip 54 | *.tar.gz 55 | *.rar 56 | 57 | hs_err_pid* 58 | .classpath 59 | 60 | #scala specific 61 | scala/target/ 62 | scala/project/target/ 63 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-composition/Beverages/Beverage.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using System.Collections.Generic; 3 | using Beverages.Enums; 4 | 5 | namespace Beverages 6 | { 7 | public class Beverage 8 | { 9 | public double BasePrice { get; set; } 10 | public Dictionary SupplementTypes { get; set; } 11 | 12 | public Beverage(double basePrice) 13 | { 14 | BasePrice = basePrice; 15 | SupplementTypes = new Dictionary(); 16 | } 17 | 18 | public void AddSupplementType(SupplementType supplementType, double supplementPrice) 19 | { 20 | SupplementTypes[supplementType] = supplementPrice; 21 | } 22 | 23 | public double Price() 24 | { 25 | return BasePrice + SupplementTypes.Sum(x => x.Value); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /java/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | katas-java 4 | beverages_prices 5 | 0.0.1-SNAPSHOT 6 | 7 | 8 | UTF-8 9 | 1.8 10 | 1.8 11 | 12 | 13 | 14 | 15 | org.hamcrest 16 | hamcrest-all 17 | 1.3 18 | 19 | 20 | 21 | junit 22 | junit 23 | 4.12 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /scala/src/test/scala/BeveragesPricingTest.scala: -------------------------------------------------------------------------------- 1 | import org.scalatest.FunSuite 2 | import org.scalatest.Matchers._ 3 | 4 | 5 | class BeveragesPricingTest extends FunSuite { 6 | 7 | test("computes coffee price"){ 8 | val coffee = new Coffee 9 | coffee.price() should be (1.20 +- 0.0001) 10 | } 11 | 12 | test("computes tea price"){ 13 | val tea = new Tea 14 | tea.price() should be (1.50 +- 0.0001) 15 | } 16 | 17 | test("computes hot chocolate price"){ 18 | val hotChocolate = new HotChocolate 19 | hotChocolate.price() should be (1.45 +- 0.0001) 20 | } 21 | 22 | test("computes tea with milk price"){ 23 | val teaWithMilk = new TeaWithMilk 24 | teaWithMilk.price() should be (1.60 +- 0.0001) 25 | } 26 | 27 | test("computes coffee with milk price"){ 28 | val coffeeWithMilk = new CoffeeWithMilk 29 | coffeeWithMilk.price() should be (1.30 +- 0.0001) 30 | } 31 | 32 | test("computes coffee with milk and cream price"){ 33 | val coffeeWithMilkAndCream = new CoffeeWithMilkAndCream 34 | coffeeWithMilkAndCream.price() should be (1.45 +- 0.0001) 35 | } 36 | 37 | test("computes hot chocolate with cream price"){ 38 | val hotChocolateWithCream = new HotChocolateWithCream 39 | hotChocolateWithCream.price() should be (1.60 +- 0.0001) 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /dotnet-core/Beverages.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Beverages", "Beverages\Beverages.csproj", "{BC309905-F680-4F17-8C19-A44B9D3C6CA7}" 5 | EndProject 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Beverages.Tests", "Beverages.Test\Beverages.Tests.csproj", "{672B0662-6E36-4C44-8A86-1FD4FCC28BD8}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {BC309905-F680-4F17-8C19-A44B9D3C6CA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {BC309905-F680-4F17-8C19-A44B9D3C6CA7}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {BC309905-F680-4F17-8C19-A44B9D3C6CA7}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {BC309905-F680-4F17-8C19-A44B9D3C6CA7}.Release|Any CPU.Build.0 = Release|Any CPU 18 | {672B0662-6E36-4C44-8A86-1FD4FCC28BD8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 19 | {672B0662-6E36-4C44-8A86-1FD4FCC28BD8}.Debug|Any CPU.Build.0 = Debug|Any CPU 20 | {672B0662-6E36-4C44-8A86-1FD4FCC28BD8}.Release|Any CPU.ActiveCfg = Release|Any CPU 21 | {672B0662-6E36-4C44-8A86-1FD4FCC28BD8}.Release|Any CPU.Build.0 = Release|Any CPU 22 | EndGlobalSection 23 | EndGlobal 24 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-decorator/Beverages.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Beverages", "Beverages\Beverages.csproj", "{BC309905-F680-4F17-8C19-A44B9D3C6CA7}" 5 | EndProject 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Beverages.Tests", "Beverages.Test\Beverages.Tests.csproj", "{672B0662-6E36-4C44-8A86-1FD4FCC28BD8}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {BC309905-F680-4F17-8C19-A44B9D3C6CA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {BC309905-F680-4F17-8C19-A44B9D3C6CA7}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {BC309905-F680-4F17-8C19-A44B9D3C6CA7}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {BC309905-F680-4F17-8C19-A44B9D3C6CA7}.Release|Any CPU.Build.0 = Release|Any CPU 18 | {672B0662-6E36-4C44-8A86-1FD4FCC28BD8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 19 | {672B0662-6E36-4C44-8A86-1FD4FCC28BD8}.Debug|Any CPU.Build.0 = Debug|Any CPU 20 | {672B0662-6E36-4C44-8A86-1FD4FCC28BD8}.Release|Any CPU.ActiveCfg = Release|Any CPU 21 | {672B0662-6E36-4C44-8A86-1FD4FCC28BD8}.Release|Any CPU.Build.0 = Release|Any CPU 22 | EndGlobalSection 23 | EndGlobal 24 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-composition/Beverages.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Beverages", "Beverages\Beverages.csproj", "{BC309905-F680-4F17-8C19-A44B9D3C6CA7}" 5 | EndProject 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Beverages.Tests", "Beverages.Test\Beverages.Tests.csproj", "{672B0662-6E36-4C44-8A86-1FD4FCC28BD8}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {BC309905-F680-4F17-8C19-A44B9D3C6CA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {BC309905-F680-4F17-8C19-A44B9D3C6CA7}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {BC309905-F680-4F17-8C19-A44B9D3C6CA7}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {BC309905-F680-4F17-8C19-A44B9D3C6CA7}.Release|Any CPU.Build.0 = Release|Any CPU 18 | {672B0662-6E36-4C44-8A86-1FD4FCC28BD8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 19 | {672B0662-6E36-4C44-8A86-1FD4FCC28BD8}.Debug|Any CPU.Build.0 = Debug|Any CPU 20 | {672B0662-6E36-4C44-8A86-1FD4FCC28BD8}.Release|Any CPU.ActiveCfg = Release|Any CPU 21 | {672B0662-6E36-4C44-8A86-1FD4FCC28BD8}.Release|Any CPU.Build.0 = Release|Any CPU 22 | EndGlobalSection 23 | EndGlobal 24 | -------------------------------------------------------------------------------- /dotnet-core/Beverages.Test/BeveragesPricingTest.cs: -------------------------------------------------------------------------------- 1 | using Xunit; 2 | 3 | namespace Beverages.Test 4 | { 5 | public class BeveragesPricingTest 6 | { 7 | [Fact] 8 | public void ComputesCoffeePrice() 9 | { 10 | var coffee = new Coffee(); 11 | Assert.Equal(1.20, coffee.Price(), 3); 12 | } 13 | 14 | [Fact] 15 | public void ComputesTeaPrice() 16 | { 17 | var tea = new Tea(); 18 | Assert.Equal(1.50, tea.Price(), 3); 19 | } 20 | 21 | [Fact] 22 | public void ComputesHotChocolatePrice() 23 | { 24 | var hotChocolate = new HotChocolate(); 25 | Assert.Equal(1.45, hotChocolate.Price(), 3); 26 | } 27 | 28 | [Fact] 29 | public void ComputesTeaWithMilkPrice() 30 | { 31 | var teaWithMilk = new TeaWithMilk(); 32 | Assert.Equal(1.60, teaWithMilk.Price(), 3); 33 | } 34 | 35 | [Fact] 36 | public void ComputesCoffeeWithMilkPrice() 37 | { 38 | var coffeeWithMilk = new CoffeeWithMilk(); 39 | Assert.Equal(1.30, coffeeWithMilk.Price(), 3); 40 | } 41 | 42 | [Fact] 43 | public void ComputesCoffeeWithMilkAndCreamPrice() 44 | { 45 | var coffeeWithMilkAndCream = new CoffeeWithMilkAndCream(); 46 | Assert.Equal(1.45, coffeeWithMilkAndCream.Price(), 3); 47 | } 48 | 49 | [Fact] 50 | public void ComputesHotChocolateWithCreamPrice() 51 | { 52 | var hotChocolateWithCream = new HotChocolateWithCream(); 53 | Assert.Equal(1.60, hotChocolateWithCream.Price(), 3); 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /java/src/test/java/unit_tests/BeveragesPricingTest.java: -------------------------------------------------------------------------------- 1 | package unit_tests; 2 | 3 | import beverages.*; 4 | import org.junit.Test; 5 | 6 | import static org.hamcrest.CoreMatchers.is; 7 | import static org.hamcrest.MatcherAssert.assertThat; 8 | import static org.hamcrest.Matchers.closeTo; 9 | 10 | public class BeveragesPricingTest { 11 | @Test 12 | public void computes_coffee_price() { 13 | Beverage coffee = new Coffee(); 14 | assertThat(coffee.price(), is(closeTo(1.20, 0.001))); 15 | } 16 | 17 | @Test 18 | public void computes_tea_price() { 19 | Beverage tea = new Tea(); 20 | assertThat(tea.price(), is(closeTo(1.50, 0.001))); 21 | } 22 | 23 | @Test 24 | public void computes_hot_chocolate_price() { 25 | Beverage hotChocolate = new HotChocolate(); 26 | assertThat(hotChocolate.price(), is(closeTo(1.45, 0.001))); 27 | } 28 | 29 | @Test 30 | public void computes_tea_with_milk_price() { 31 | Tea teaWithMilk = new TeaWithMilk(); 32 | assertThat(teaWithMilk.price(), is(closeTo(1.60, 0.001))); 33 | } 34 | 35 | @Test 36 | public void computes_coffee_with_milk_price() { 37 | Coffee coffeeWithMilk = new CoffeeWithMilk(); 38 | assertThat(coffeeWithMilk.price(), is(closeTo(1.30, 0.001))); 39 | } 40 | 41 | @Test 42 | public void computes_coffee_with_milk_and_cream_price() { 43 | Coffee coffeeWithMilkAndCream = new CoffeeWithMilkAndCream(); 44 | assertThat(coffeeWithMilkAndCream.price(), is(closeTo(1.45, 0.001))); 45 | } 46 | 47 | @Test 48 | public void computes_hot_chocolate_with_cream_price() { 49 | HotChocolateWithCream hotChocolateWithCream = new HotChocolateWithCream(); 50 | assertThat(hotChocolateWithCream.price(), is(closeTo(1.60, 0.001))); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-decorator/Beverages/Factories/BeverageFactory.cs: -------------------------------------------------------------------------------- 1 | using Beverages.Classes.Beverages; 2 | using Beverages.Classes.Supplements; 3 | using Beverages.Interfaces.Beverages; 4 | using static Beverages.Classes.Beverages.Drink; 5 | 6 | namespace Beverages.Factories 7 | { 8 | public class BeverageFactory 9 | { 10 | 11 | public static Beverage CreateCoffee() 12 | { 13 | return new Coffee(); 14 | } 15 | 16 | public static Beverage CreateCoffeeWithCinnamon() { 17 | return new Coffee(new Cinnamon()); 18 | } 19 | 20 | public static Beverage CreateCoffeeWithMilk() { 21 | return new Coffee(new Milk()); 22 | } 23 | 24 | public static Beverage CreateCoffeeWithMilkAndCinnamon() { 25 | return new Coffee(new Milk(With(new Cinnamon()))); 26 | } 27 | 28 | public static Beverage CreateCoffeeWithMilkAndCream() { 29 | return new Coffee(new Milk(With(new Cream()))); 30 | } 31 | 32 | public static Beverage CreateCoffeeWithMilkCreamAndCinnamon() { 33 | return new Coffee(new Milk(With(new Cream(With(new Cinnamon()))))); 34 | } 35 | 36 | public static Beverage CreateHotChocolate() { 37 | return new HotChocolate(); 38 | } 39 | 40 | public static Beverage CreateHotChocolateWithCinnamon() { 41 | return new HotChocolate(new Cinnamon()); 42 | } 43 | 44 | public static Beverage CreateHotChocolateWithCream() { 45 | return new HotChocolate(new Cream()); 46 | } 47 | 48 | public static Beverage CreateHotChocolateWithCreamAndCinnamon() { 49 | return new HotChocolate(new Cream(With(new Cinnamon()))); 50 | } 51 | 52 | public static Beverage CreateTea() { 53 | return new Tea(); 54 | } 55 | 56 | public static Beverage CreateTeaWithCinnamon() { 57 | return new Tea(new Cinnamon()); 58 | } 59 | 60 | public static Beverage CreateTeaWithMilk() { 61 | return new Tea(new Milk()); 62 | } 63 | 64 | public static Beverage CreateTeaWithMilkAndCinnamon() { 65 | return new Tea(new Milk(With(new Cinnamon()))); 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Beverages pricing refactoring kata 2 | 3 | ## Objetivo 4 | Este proyecto calcula los precios de las bebidas ofrecidas en nuestra cafetería. 5 | 6 | Quisiéramos que añadieras un suplemento opcional de canela a todo el catálogo existente de bebidas. 7 | Este suplemento tendra un precio de 0.05€. 8 | 9 | 10 | ## Consejo / Pista 11 | Quizá quieras refactorizar el código primero. 12 | 13 | ## Proyectos base 14 | 15 | El repositorio contiene dos proyectos base sobre los que se puede realizar la kata (uno en Java y otro en .NET Core con C#). 16 | Además se proporcionan otras plantillas en otros lenguajes. Animamos a quien quiera colaborar con una plantilla que no dude en hacerlo. 17 | 18 | ### .NET Core 19 | 20 | El proyecto esta realizado en .NET Core 2.2, por lo que necesitarás tener instalado el SDK correspondiente ([descarga](https://dotnet.microsoft.com/download)). No obstante, puedes usar otra versión de .NET Core si lo deseas. 21 | 22 | La solución consta de dos proyectos: 23 | - `Beverages`: proyecto de libreria con las clases principales. 24 | - `Beverages.Tests`: proyecto con test unitarios sobre las clases del proyecto `Beverages`. Para los test se utiliza xUnit. 25 | 26 | 27 | Para ejecutar los test, basta con ejecutar en consola el comando `dotnet test` en la ruta de la solución. 28 | 29 | La solución se puede abrir con los IDE habituales. 30 | 31 | 32 | ### Java 33 | 34 | El proyecto esta realizado en Java 1.8 ([descarga](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)) con Maven ([descarga](https://maven.apache.org/download.cgi)), por lo que necesitarás tener instalada la versión de Java correspondiente y Maven en tu equipo. 35 | 36 | El proyecto consta de dos paquetes: 37 | - `Package beverages`: contiene las clases principales. 38 | 39 | - `Package unit_tests`: contiene los test unitarios sobre las clases del paquete anterior. Para los test se utiliza JUnit. 40 | 41 | Para ejecutar los test, basta con ejecutar en consola el comando `mvn test` en la ruta donde se ubica el fichero `pom.xml`. 42 | 43 | El proyecto se puede abrir con los IDE habituales. 44 | 45 | 46 | ### Otros lenguajes 47 | 48 | Existen plantillas proporcionadas por colaboradores en otro lenguajes como Scala, con las que también podeís realizar la kata. 49 | No dudeis en abrir una PR si quereis contribuir con plantillas en otros lenguajes. 50 | 51 | ## Soluciones 52 | 53 | En el repositorio hemos habilitado una carpeta `solutions` en las que podeís aportar vuestras soluciones que hayáis implementado en la kata y asi compartir y discutir diferentes aproximaciones/soluciones. 54 | 55 | Cualquiera puede clonar el repositorio, crear una nueva carpeta con su solución dentro de la carpeta correspondiente (`dotnet-core`, `java`, `scala` u otra si os atreveis con otro lenguaje 😜) y posteriormente abrir una PR contra este repositorio. Os animamos a subir vuestra solución o comentar las soluciones de otros. 56 | 57 | ***Nota**: es importante que cada solución este en una carpeta nueva y con un nombre no existente todavía.* 58 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-composition/Beverages/Factories/BeverageFactory.cs: -------------------------------------------------------------------------------- 1 | using Beverages.Enums; 2 | 3 | namespace Beverages.Factories 4 | { 5 | public class BeverageFactory 6 | { 7 | 8 | public static Beverage CreateCoffee() 9 | { 10 | return new Beverage(1.2); 11 | } 12 | 13 | public static Beverage CreateCoffeeWithCinnamon() 14 | { 15 | var beverage = new Beverage(1.2); 16 | beverage.AddSupplementType(SupplementType.Cinnamon, 0.05); 17 | return beverage; 18 | } 19 | 20 | public static Beverage CreateCoffeeWithMilk() 21 | { 22 | var beverage = new Beverage(1.2); 23 | beverage.AddSupplementType(SupplementType.Milk, 0.10); 24 | return beverage; 25 | } 26 | 27 | public static Beverage CreateCoffeeWithMilkAndCinnamon() 28 | { 29 | var beverage = new Beverage(1.2); 30 | beverage.AddSupplementType(SupplementType.Milk, 0.10); 31 | beverage.AddSupplementType(SupplementType.Cinnamon, 0.05); 32 | return beverage; 33 | } 34 | 35 | public static Beverage CreateCoffeeWithMilkAndCream() 36 | { 37 | var beverage = new Beverage(1.2); 38 | beverage.AddSupplementType(SupplementType.Milk, 0.10); 39 | beverage.AddSupplementType(SupplementType.Cream, 0.15); 40 | return beverage; 41 | } 42 | 43 | public static Beverage CreateCoffeeWithMilkCreamAndCinnamon() 44 | { 45 | var beverage = new Beverage(1.2); 46 | beverage.AddSupplementType(SupplementType.Milk, 0.10); 47 | beverage.AddSupplementType(SupplementType.Cream, 0.15); 48 | beverage.AddSupplementType(SupplementType.Cinnamon, 0.05); 49 | return beverage; 50 | } 51 | 52 | public static Beverage CreateHotChocolate() 53 | { 54 | return new Beverage(1.45); 55 | } 56 | 57 | public static Beverage CreateHotChocolateWithCinnamon() 58 | { 59 | var beverage = new Beverage(1.45); 60 | beverage.AddSupplementType(SupplementType.Cinnamon, 0.05); 61 | return beverage; 62 | } 63 | 64 | public static Beverage CreateHotChocolateWithCream() 65 | { 66 | var beverage = new Beverage(1.45); 67 | beverage.AddSupplementType(SupplementType.Cream, 0.15); 68 | return beverage; 69 | } 70 | 71 | public static Beverage CreateHotChocolateWithCreamAndCinnamon() 72 | { 73 | var beverage = new Beverage(1.45); 74 | beverage.AddSupplementType(SupplementType.Cream, 0.15); 75 | beverage.AddSupplementType(SupplementType.Cinnamon, 0.05); 76 | return beverage; 77 | } 78 | 79 | public static Beverage CreateTea() 80 | { 81 | return new Beverage(1.5); 82 | } 83 | 84 | public static Beverage CreateTeaWithCinnamon() 85 | { 86 | var beverage = new Beverage(1.5); 87 | beverage.AddSupplementType(SupplementType.Cinnamon, 0.05); 88 | return beverage; 89 | } 90 | 91 | public static Beverage CreateTeaWithMilk() 92 | { 93 | var beverage = new Beverage(1.5); 94 | beverage.AddSupplementType(SupplementType.Milk, 0.10); 95 | return beverage; 96 | } 97 | 98 | public static Beverage CreateTeaWithMilkAndCinnamon() 99 | { 100 | var beverage = new Beverage(1.5); 101 | beverage.AddSupplementType(SupplementType.Milk, 0.10); 102 | beverage.AddSupplementType(SupplementType.Cinnamon, 0.05); 103 | return beverage; 104 | } 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-decorator/Beverages.Test/BeveragesPricingTest.cs: -------------------------------------------------------------------------------- 1 | using Beverages.Factories; 2 | using Xunit; 3 | 4 | namespace Beverages.Test 5 | { 6 | public class BeveragesPricingTest 7 | { 8 | [Fact] 9 | public void ComputesCoffeePrice() 10 | { 11 | var coffee = BeverageFactory.CreateCoffee(); 12 | Assert.Equal(1.20, coffee.Price(), 3); 13 | } 14 | 15 | [Fact] 16 | public void ComputesTeaPrice() 17 | { 18 | var tea = BeverageFactory.CreateTea(); 19 | Assert.Equal(1.50, tea.Price(), 3); 20 | } 21 | 22 | [Fact] 23 | public void ComputesHotChocolatePrice() 24 | { 25 | var hotChocolate = BeverageFactory.CreateHotChocolate(); 26 | Assert.Equal(1.45, hotChocolate.Price(), 3); 27 | } 28 | 29 | [Fact] 30 | public void ComputesTeaWithMilkPrice() 31 | { 32 | var teaWithMilk = BeverageFactory.CreateTeaWithMilk(); 33 | Assert.Equal(1.60, teaWithMilk.Price(), 3); 34 | } 35 | 36 | [Fact] 37 | public void ComputesCoffeeWithMilkPrice() 38 | { 39 | var coffeeWithMilk = BeverageFactory.CreateCoffeeWithMilk(); 40 | Assert.Equal(1.30, coffeeWithMilk.Price(), 3); 41 | } 42 | 43 | [Fact] 44 | public void ComputesCoffeeWithMilkAndCreamPrice() 45 | { 46 | var coffeeWithMilkAndCream = 47 | BeverageFactory.CreateCoffeeWithMilkAndCream(); 48 | Assert.Equal(1.45, coffeeWithMilkAndCream.Price(), 3); 49 | } 50 | 51 | [Fact] 52 | public void ComputesHotChocolateWithCreamPrice() 53 | { 54 | var hotChocolateWithCream = 55 | BeverageFactory.CreateHotChocolateWithCream(); 56 | Assert.Equal(1.60, hotChocolateWithCream.Price(), 3); 57 | } 58 | 59 | [Fact] 60 | public void ComputesCoffeeWithCinnamonPrice() 61 | { 62 | var coffee = BeverageFactory.CreateCoffeeWithCinnamon(); 63 | Assert.Equal(1.25, coffee.Price(), 3); 64 | } 65 | 66 | [Fact] 67 | public void ComputesTeaWithCinnamonPrice() 68 | { 69 | var tea = BeverageFactory.CreateTeaWithCinnamon(); 70 | Assert.Equal(1.55, tea.Price(), 3); 71 | } 72 | 73 | [Fact] 74 | public void ComputesHotChocolateWithCinnamonPrice() 75 | { 76 | var hotChocolate = 77 | BeverageFactory.CreateHotChocolateWithCinnamon(); 78 | Assert.Equal(1.50, hotChocolate.Price(), 3); 79 | } 80 | 81 | [Fact] 82 | public void ComputesTeaWithMilkAndCinnamonPrice() 83 | { 84 | var teaWithMilk = 85 | BeverageFactory.CreateTeaWithMilkAndCinnamon(); 86 | Assert.Equal(1.65, teaWithMilk.Price(), 3); 87 | } 88 | 89 | [Fact] 90 | public void ComputesCoffeeWithMilkAndCinnamonPrice() 91 | { 92 | var coffeeWithMilk = 93 | BeverageFactory.CreateCoffeeWithMilkAndCinnamon(); 94 | Assert.Equal(1.35, coffeeWithMilk.Price(), 3); 95 | } 96 | 97 | [Fact] 98 | public void ComputesCoffeeWithMilkCreamAndCinnamonPrice() 99 | { 100 | var coffeeWithMilkAndCream = 101 | BeverageFactory.CreateCoffeeWithMilkCreamAndCinnamon(); 102 | Assert.Equal(1.50, coffeeWithMilkAndCream.Price(), 3); 103 | } 104 | 105 | [Fact] 106 | public void ComputesHotChocolateWithCreamAndCinnamonPrice() 107 | { 108 | var hotChocolateWithCream = 109 | BeverageFactory.CreateHotChocolateWithCreamAndCinnamon(); 110 | Assert.Equal(1.65, hotChocolateWithCream.Price(), 3); 111 | } 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /solutions/dotnet-core/piraces-composition/Beverages.Test/BeveragesPricingTest.cs: -------------------------------------------------------------------------------- 1 | using Beverages.Factories; 2 | using Xunit; 3 | 4 | namespace Beverages.Test 5 | { 6 | public class BeveragesPricingTest 7 | { 8 | [Fact] 9 | public void ComputesCoffeePrice() 10 | { 11 | var coffee = BeverageFactory.CreateCoffee(); 12 | Assert.Equal(1.20, coffee.Price(), 3); 13 | } 14 | 15 | [Fact] 16 | public void ComputesTeaPrice() 17 | { 18 | var tea = BeverageFactory.CreateTea(); 19 | Assert.Equal(1.50, tea.Price(), 3); 20 | } 21 | 22 | [Fact] 23 | public void ComputesHotChocolatePrice() 24 | { 25 | var hotChocolate = BeverageFactory.CreateHotChocolate(); 26 | Assert.Equal(1.45, hotChocolate.Price(), 3); 27 | } 28 | 29 | [Fact] 30 | public void ComputesTeaWithMilkPrice() 31 | { 32 | var teaWithMilk = BeverageFactory.CreateTeaWithMilk(); 33 | Assert.Equal(1.60, teaWithMilk.Price(), 3); 34 | } 35 | 36 | [Fact] 37 | public void ComputesCoffeeWithMilkPrice() 38 | { 39 | var coffeeWithMilk = BeverageFactory.CreateCoffeeWithMilk(); 40 | Assert.Equal(1.30, coffeeWithMilk.Price(), 3); 41 | } 42 | 43 | [Fact] 44 | public void ComputesCoffeeWithMilkAndCreamPrice() 45 | { 46 | var coffeeWithMilkAndCream = 47 | BeverageFactory.CreateCoffeeWithMilkAndCream(); 48 | Assert.Equal(1.45, coffeeWithMilkAndCream.Price(), 3); 49 | } 50 | 51 | [Fact] 52 | public void ComputesHotChocolateWithCreamPrice() 53 | { 54 | var hotChocolateWithCream = 55 | BeverageFactory.CreateHotChocolateWithCream(); 56 | Assert.Equal(1.60, hotChocolateWithCream.Price(), 3); 57 | } 58 | 59 | [Fact] 60 | public void ComputesCoffeeWithCinnamonPrice() 61 | { 62 | var coffee = BeverageFactory.CreateCoffeeWithCinnamon(); 63 | Assert.Equal(1.25, coffee.Price(), 3); 64 | } 65 | 66 | [Fact] 67 | public void ComputesTeaWithCinnamonPrice() 68 | { 69 | var tea = BeverageFactory.CreateTeaWithCinnamon(); 70 | Assert.Equal(1.55, tea.Price(), 3); 71 | } 72 | 73 | [Fact] 74 | public void ComputesHotChocolateWithCinnamonPrice() 75 | { 76 | var hotChocolate = 77 | BeverageFactory.CreateHotChocolateWithCinnamon(); 78 | Assert.Equal(1.50, hotChocolate.Price(), 3); 79 | } 80 | 81 | [Fact] 82 | public void ComputesTeaWithMilkAndCinnamonPrice() 83 | { 84 | var teaWithMilk = 85 | BeverageFactory.CreateTeaWithMilkAndCinnamon(); 86 | Assert.Equal(1.65, teaWithMilk.Price(), 3); 87 | } 88 | 89 | [Fact] 90 | public void ComputesCoffeeWithMilkAndCinnamonPrice() 91 | { 92 | var coffeeWithMilk = 93 | BeverageFactory.CreateCoffeeWithMilkAndCinnamon(); 94 | Assert.Equal(1.35, coffeeWithMilk.Price(), 3); 95 | } 96 | 97 | [Fact] 98 | public void ComputesCoffeeWithMilkCreamAndCinnamonPrice() 99 | { 100 | var coffeeWithMilkAndCream = 101 | BeverageFactory.CreateCoffeeWithMilkCreamAndCinnamon(); 102 | Assert.Equal(1.50, coffeeWithMilkAndCream.Price(), 3); 103 | } 104 | 105 | [Fact] 106 | public void ComputesHotChocolateWithCreamAndCinnamonPrice() 107 | { 108 | var hotChocolateWithCream = 109 | BeverageFactory.CreateHotChocolateWithCreamAndCinnamon(); 110 | Assert.Equal(1.65, hotChocolateWithCream.Price(), 3); 111 | } 112 | } 113 | } 114 | --------------------------------------------------------------------------------