From 41ba3e544746281efa98b093fd811510b71a0a4c Mon Sep 17 00:00:00 2001 From: aa89227 Date: Tue, 2 Apr 2024 22:10:38 +0800 Subject: [PATCH] feat: add test of CanStartGame and CannotStartGame Co-authored-by: Rick Su Co-authored-by: miku3920 --- ChineseCheckers.sln | 10 ++++ .../ChineseCheckers.Domain.csproj | 13 ++++ src/ChineseCheckers.Domain/Game.cs | 28 +++++++++ src/ChineseCheckers.Domain/Player.cs | 6 ++ .../ChineseCheckers.Tests.csproj | 1 + tests/ChineseCheckers.Tests/StartGameTest.cs | 59 +++++++++++++++++++ 6 files changed, 117 insertions(+) create mode 100644 src/ChineseCheckers.Domain/ChineseCheckers.Domain.csproj create mode 100644 src/ChineseCheckers.Domain/Game.cs create mode 100644 src/ChineseCheckers.Domain/Player.cs create mode 100644 tests/ChineseCheckers.Tests/StartGameTest.cs diff --git a/ChineseCheckers.sln b/ChineseCheckers.sln index d7a6e8f..716ed1a 100644 --- a/ChineseCheckers.sln +++ b/ChineseCheckers.sln @@ -17,6 +17,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ChineseCheckers.Web", "src\ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ChineseCheckers.Tests", "tests\ChineseCheckers.Tests\ChineseCheckers.Tests.csproj", "{07C57EBD-0711-4F4A-A438-18F95CE7393D}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChineseCheckers.Domain", "src\ChineseCheckers.Domain\ChineseCheckers.Domain.csproj", "{50647B55-A7DC-456F-941A-51957FEEB148}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -43,6 +45,10 @@ Global {07C57EBD-0711-4F4A-A438-18F95CE7393D}.Debug|Any CPU.Build.0 = Debug|Any CPU {07C57EBD-0711-4F4A-A438-18F95CE7393D}.Release|Any CPU.ActiveCfg = Release|Any CPU {07C57EBD-0711-4F4A-A438-18F95CE7393D}.Release|Any CPU.Build.0 = Release|Any CPU + {50647B55-A7DC-456F-941A-51957FEEB148}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {50647B55-A7DC-456F-941A-51957FEEB148}.Debug|Any CPU.Build.0 = Debug|Any CPU + {50647B55-A7DC-456F-941A-51957FEEB148}.Release|Any CPU.ActiveCfg = Release|Any CPU + {50647B55-A7DC-456F-941A-51957FEEB148}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -53,5 +59,9 @@ Global {55A8D52B-432B-477F-84F7-3C2565B922EC} = {072D3C5D-A113-45B6-86D6-EF5C54ECA984} {0D1D26B1-A598-4942-B009-847E26A42A67} = {072D3C5D-A113-45B6-86D6-EF5C54ECA984} {07C57EBD-0711-4F4A-A438-18F95CE7393D} = {4370858E-DFB5-4590-AE4D-270098CCAB79} + {50647B55-A7DC-456F-941A-51957FEEB148} = {072D3C5D-A113-45B6-86D6-EF5C54ECA984} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {613C01CF-175B-4931-9732-C7B2185B03B2} EndGlobalSection EndGlobal diff --git a/src/ChineseCheckers.Domain/ChineseCheckers.Domain.csproj b/src/ChineseCheckers.Domain/ChineseCheckers.Domain.csproj new file mode 100644 index 0000000..3c4bab0 --- /dev/null +++ b/src/ChineseCheckers.Domain/ChineseCheckers.Domain.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/src/ChineseCheckers.Domain/Game.cs b/src/ChineseCheckers.Domain/Game.cs new file mode 100644 index 0000000..0a38611 --- /dev/null +++ b/src/ChineseCheckers.Domain/Game.cs @@ -0,0 +1,28 @@ +namespace ChineseCheckers.Domain; + +public class Game +{ + public bool IsStarted { get; private set; } + private readonly List _players = []; + + public Game() + { + } + + public void AddPlayer(Player player) + { + _players.Add(player); + } + + public void Start() + { + // 在這裡實作遊戲開始的邏輯 + // 例如,初始化遊戲板、發放棋子等等 + IsStarted = _players.Count is 2 or 3 or 4 or 6; + + if (IsStarted == false) + { + // TODO: throw domain exception + } + } +} diff --git a/src/ChineseCheckers.Domain/Player.cs b/src/ChineseCheckers.Domain/Player.cs new file mode 100644 index 0000000..9fc68bc --- /dev/null +++ b/src/ChineseCheckers.Domain/Player.cs @@ -0,0 +1,6 @@ +namespace ChineseCheckers.Domain; + +public class Player(string name) +{ + public string Name { get; private set; } = name; +} diff --git a/tests/ChineseCheckers.Tests/ChineseCheckers.Tests.csproj b/tests/ChineseCheckers.Tests/ChineseCheckers.Tests.csproj index 25a4cb6..9dd5036 100644 --- a/tests/ChineseCheckers.Tests/ChineseCheckers.Tests.csproj +++ b/tests/ChineseCheckers.Tests/ChineseCheckers.Tests.csproj @@ -19,6 +19,7 @@ + diff --git a/tests/ChineseCheckers.Tests/StartGameTest.cs b/tests/ChineseCheckers.Tests/StartGameTest.cs new file mode 100644 index 0000000..baa8558 --- /dev/null +++ b/tests/ChineseCheckers.Tests/StartGameTest.cs @@ -0,0 +1,59 @@ +using ChineseCheckers.Domain; + +namespace ChineseCheckers.Tests; + +[TestClass] +public class StartGameTest +{ + [Description(""" + Given: 2 players + When: Start game + Then: Game is started + """)] + [TestMethod] + [DataRow(2)] + [DataRow(3)] + [DataRow(4)] + [DataRow(6)] + public void CanStartGame(int playerCount) + { + // Arrange + var game = new Game(); + for (var i = 0; i < playerCount; i++) + { + game.AddPlayer(new Player($"Player {i}")); + } + + // Act + game.Start(); + + // Assert + Assert.IsTrue(game.IsStarted); + } + + + [Description(""" + Given: 1 player + When: Start game + Then: Game is not started + """)] + [TestMethod] + [DataRow(1)] + [DataRow(5)] + [DataRow(7)] + public void CannotStartGame(int playerCount) + { + // Arrange + var game = new Game(); + for (var i = 0; i < playerCount; i++) + { + game.AddPlayer(new Player($"Player {i}")); + } + + // Act + game.Start(); + + // Assert + Assert.IsFalse(game.IsStarted); + } +}