diff --git a/BuilderPattern.Tests/BuilderPattern.Tests.csproj b/BuilderPattern.Tests/BuilderPattern.Tests.csproj
new file mode 100644
index 0000000..a11459f
--- /dev/null
+++ b/BuilderPattern.Tests/BuilderPattern.Tests.csproj
@@ -0,0 +1,24 @@
+
+
+
+ net6.0
+ enable
+ enable
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BuilderPattern.Tests/BuilderTests.cs b/BuilderPattern.Tests/BuilderTests.cs
new file mode 100644
index 0000000..8385dd6
--- /dev/null
+++ b/BuilderPattern.Tests/BuilderTests.cs
@@ -0,0 +1,78 @@
+namespace BuilderPattern.Tests
+{
+ [TestFixture]
+ public class BuilderTests
+ {
+ [TestCaseSource(nameof(_sizeCases))]
+ public void AddSize_TwoBuilderCases_ReturnsInstanceOfHamburgerClassWithFilledSize(IBuilder builder, int expected)
+ {
+ // Arrange, Act
+ builder.Reset();
+ builder.AddSize();
+ var hamburger = builder.Build();
+
+ // Assert
+ Assert.Multiple(() =>
+ {
+ Assert.That(hamburger.Size, Is.EqualTo(expected));
+ Assert.That(hamburger.Shape, Is.Null);
+ Assert.That(hamburger.Ingredients, Is.Null);
+ });
+ }
+
+ [TestCaseSource(nameof(_shapeCases))]
+ public void AddShape_TwoBuilderCases_ReturnsInstanceOfHamburgerClassWithFilledShape(IBuilder builder, string expected)
+ {
+ // Arrange, Act
+ builder.Reset();
+ builder.AddShape();
+ var hamburger = builder.Build();
+
+ // Assert
+ Assert.Multiple(() =>
+ {
+ Assert.That(hamburger.Size, Is.Zero);
+ Assert.That(hamburger.Shape, Is.EqualTo(expected));
+ Assert.That(hamburger.Ingredients, Is.Null);
+ });
+ }
+
+ [TestCaseSource(nameof(_ingredientsCases))]
+ public void AddIngredients_TwoBuilderCases_ReturnsInstanceOfHamburgerClassWithFilledIngredients(IBuilder builder, string[] expected)
+ {
+ // Arrange, Act
+ builder.Reset();
+ builder.AddIngredients();
+ var hamburger = builder.Build();
+
+ // Assert
+ Assert.Multiple(() =>
+ {
+ Assert.That(hamburger.Size, Is.Zero);
+ Assert.That(hamburger.Shape, Is.Null);
+ Assert.That(hamburger.Ingredients, Is.EquivalentTo(expected));
+ });
+ }
+
+ private static readonly List _sizeCases =
+ new(new[]
+ {
+ new TestCaseData(new MyHamburgerBuilder(), 10),
+ new TestCaseData(new WifesHamburgerBuilder(), 6)
+ });
+
+ private static readonly List _shapeCases =
+ new(new[]
+ {
+ new TestCaseData(new MyHamburgerBuilder(), "Kite"),
+ new TestCaseData(new WifesHamburgerBuilder(), "Cuboid")
+ });
+
+ private static readonly List _ingredientsCases =
+ new(new[]
+ {
+ new TestCaseData(new MyHamburgerBuilder(), new string[] { "Bread", "Meat", "Tomato", "Salad", "Mayonnaise" }),
+ new TestCaseData(new WifesHamburgerBuilder(), new string[] { "Bread", "Salad" })
+ });
+ }
+}
diff --git a/BuilderPattern.Tests/DirectorTests.cs b/BuilderPattern.Tests/DirectorTests.cs
new file mode 100644
index 0000000..99d0924
--- /dev/null
+++ b/BuilderPattern.Tests/DirectorTests.cs
@@ -0,0 +1,41 @@
+using Moq;
+
+namespace BuilderPattern.Tests
+{
+ [TestFixture]
+ public class DirectorTests
+ {
+ private Cook _cook;
+ private Mock _builder;
+
+ [OneTimeSetUp]
+ public void SetUp()
+ {
+ _builder = new Mock();
+ _cook = new Cook(_builder.Object);
+ }
+
+ [Test]
+ public void ChangeBuilder_DeclareMyHamburgerBuilder_ReturnsHamburgerByWifesHamburgerBuilder()
+ {
+ // Arrange, Act
+ _cook.ChangeBuilder(new WifesHamburgerBuilder());
+
+ // Assert
+ _builder.Verify(s => s.Reset());
+ }
+
+ [Test]
+ public void Build_TwoBuilderCases_ReturnsFilledInstanceOfHamburgerClass()
+ {
+ // Arrange, Act
+ var actual = _cook.Build();
+
+ // Assert
+ _builder.Verify(s => s.AddIngredients());
+ _builder.Verify(s => s.AddShape());
+ _builder.Verify(s => s.AddSize());
+ _builder.Verify(s => s.Build());
+ }
+ }
+}
diff --git a/BuilderPattern.Tests/Usings.cs b/BuilderPattern.Tests/Usings.cs
new file mode 100644
index 0000000..cefced4
--- /dev/null
+++ b/BuilderPattern.Tests/Usings.cs
@@ -0,0 +1 @@
+global using NUnit.Framework;
\ No newline at end of file
diff --git a/DesignPatternsDotNetCore.sln b/DesignPatternsDotNetCore.sln
index 5f9a763..268e0a8 100644
--- a/DesignPatternsDotNetCore.sln
+++ b/DesignPatternsDotNetCore.sln
@@ -1,6 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.29920.165
+# Visual Studio Version 17
+VisualStudioVersion = 17.3.32825.248
MinimumVisualStudioVersion = 15.0.26124.0
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AdapterPattern", "AdapterPattern\AdapterPattern.csproj", "{79553F75-E8DC-4988-B511-A79CC6A9CDF7}"
EndProject
@@ -38,7 +38,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MediatorPattern", "Mediator
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BuilderPattern", "BuilderPattern\BuilderPattern.csproj", "{274786D8-2E30-40D7-81B5-DFA3872CF9B6}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProxyPattern", "ProxyPattern\ProxyPattern.csproj", "{0F8297F6-FA4F-44B6-BF99-0FF71ECCF87A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProxyPattern", "ProxyPattern\ProxyPattern.csproj", "{0F8297F6-FA4F-44B6-BF99-0FF71ECCF87A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BuilderPattern.Tests", "BuilderPattern.Tests\BuilderPattern.Tests.csproj", "{2B52592E-AA8A-4C2E-ADE8-BDA8942CDFFA}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -278,6 +280,18 @@ Global
{0F8297F6-FA4F-44B6-BF99-0FF71ECCF87A}.Release|x64.Build.0 = Release|Any CPU
{0F8297F6-FA4F-44B6-BF99-0FF71ECCF87A}.Release|x86.ActiveCfg = Release|Any CPU
{0F8297F6-FA4F-44B6-BF99-0FF71ECCF87A}.Release|x86.Build.0 = Release|Any CPU
+ {2B52592E-AA8A-4C2E-ADE8-BDA8942CDFFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2B52592E-AA8A-4C2E-ADE8-BDA8942CDFFA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2B52592E-AA8A-4C2E-ADE8-BDA8942CDFFA}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2B52592E-AA8A-4C2E-ADE8-BDA8942CDFFA}.Debug|x64.Build.0 = Debug|Any CPU
+ {2B52592E-AA8A-4C2E-ADE8-BDA8942CDFFA}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2B52592E-AA8A-4C2E-ADE8-BDA8942CDFFA}.Debug|x86.Build.0 = Debug|Any CPU
+ {2B52592E-AA8A-4C2E-ADE8-BDA8942CDFFA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2B52592E-AA8A-4C2E-ADE8-BDA8942CDFFA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2B52592E-AA8A-4C2E-ADE8-BDA8942CDFFA}.Release|x64.ActiveCfg = Release|Any CPU
+ {2B52592E-AA8A-4C2E-ADE8-BDA8942CDFFA}.Release|x64.Build.0 = Release|Any CPU
+ {2B52592E-AA8A-4C2E-ADE8-BDA8942CDFFA}.Release|x86.ActiveCfg = Release|Any CPU
+ {2B52592E-AA8A-4C2E-ADE8-BDA8942CDFFA}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE