From 4d07c3ffc12aaa5d79becf2c4e0181f613b8ec6c Mon Sep 17 00:00:00 2001 From: Alexis DRAI Date: Sun, 25 Sep 2022 13:05:51 +0200 Subject: [PATCH 1/4] :white_check_mark: Set up instances for UTs --- Sources/Model/Games/Game.cs | 1 + Sources/Tests/Model_UTs/GameTest.cs | 61 +++++++++++++++++++++++++++++ Sources/Tests/Model_UTs/TurnTest.cs | 3 -- 3 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 Sources/Tests/Model_UTs/GameTest.cs diff --git a/Sources/Model/Games/Game.cs b/Sources/Model/Games/Game.cs index 0134cc4..5dbc893 100644 --- a/Sources/Model/Games/Game.cs +++ b/Sources/Model/Games/Game.cs @@ -56,6 +56,7 @@ namespace Model.Games /// /// the group of dice used for this game /// + public IEnumerable> Dice => dice; private readonly IEnumerable> dice; /// diff --git a/Sources/Tests/Model_UTs/GameTest.cs b/Sources/Tests/Model_UTs/GameTest.cs new file mode 100644 index 0000000..f9b3317 --- /dev/null +++ b/Sources/Tests/Model_UTs/GameTest.cs @@ -0,0 +1,61 @@ +using Model.Dice.Faces; +using Model.Dice; +using Model.Games; +using Model.Players; +using Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tests.Model_UTs +{ + public class GameTest + { + + private static readonly string GAME_NAME = "my game"; + + private static readonly Player PLAYER_1 = new("Alice"), PLAYER_2 = new("Bob"), PLAYER_3 = new("Clyde"); + + private readonly static NumberDieFace[] FACES_1 = new NumberDieFace[] + { + new(1), + new(2), + new(3), + new(4) + }; + + private readonly static ImageDieFace[] FACES_2 = new ImageDieFace[] + { + new(10), + new(20), + new(30), + new(40) + }; + + private readonly static ColorDieFace[] FACES_3 = new ColorDieFace[] + { + new(1000), + new(2000), + new(3000), + new(4000) + }; + + private static readonly AbstractDie NUM = new NumberDie(FACES_1), IMG = new ImageDie(FACES_2), CLR = new ColorDie(FACES_3); + + private static readonly IEnumerable> dice = + new List>() { NUM, IMG, CLR } + .AsEnumerable(); + + public GameTest() + { + + Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: dice); + + game.AddPlayerToGame(PLAYER_1); + game.AddPlayerToGame(PLAYER_2); + game.AddPlayerToGame(PLAYER_3); + } + } +} diff --git a/Sources/Tests/Model_UTs/TurnTest.cs b/Sources/Tests/Model_UTs/TurnTest.cs index 6760780..7b3927f 100644 --- a/Sources/Tests/Model_UTs/TurnTest.cs +++ b/Sources/Tests/Model_UTs/TurnTest.cs @@ -50,14 +50,11 @@ namespace Tests.Model_UTs new(412) }; - private readonly AbstractDie NUM1 = new NumberDie(FACES1); private readonly AbstractDie NUM2 = new NumberDie(FACES2); private readonly AbstractDie IMG1 = new ImageDie(FACES3); private readonly AbstractDie CLR1 = new ColorDie(FACES4); - - public TurnTest() { DICE_N_FACES = new() From f0e74ae5176a6ec63540cc56746e60259d22cbe2 Mon Sep 17 00:00:00 2001 From: Alexis DRAI Date: Sun, 25 Sep 2022 15:21:17 +0200 Subject: [PATCH 2/4] :construction: WIP --- Sources/Model/Games/Game.cs | 7 +- Sources/Tests/Model_UTs/GameTest.cs | 146 ++++++++++++++++++++++++++-- 2 files changed, 143 insertions(+), 10 deletions(-) diff --git a/Sources/Model/Games/Game.cs b/Sources/Model/Games/Game.cs index 5dbc893..d77284e 100644 --- a/Sources/Model/Games/Game.cs +++ b/Sources/Model/Games/Game.cs @@ -35,7 +35,7 @@ namespace Model.Games /// /// references the position in list of the current player, for a given game. /// - private int nextIndex = 0; + private int nextIndex; /// /// the turns that have been done so far @@ -70,9 +70,10 @@ namespace Model.Games public Game(string name, IManager playerManager, IEnumerable> dice, IEnumerable turns) { Name = name; - this.turns = turns.ToList() ?? new List(); + this.turns = turns is null ? new List() : turns.ToList(); this.playerManager = playerManager; this.dice = dice; + this.nextIndex = 0; } /// @@ -92,7 +93,7 @@ namespace Model.Games public void PerformTurn(Player player) { Turn turn = Turn.CreateWithDefaultTime( - new Player(player), //using a copy so that next lines can't "change history" + player, ThrowAll() ); turns.Add(turn); diff --git a/Sources/Tests/Model_UTs/GameTest.cs b/Sources/Tests/Model_UTs/GameTest.cs index f9b3317..f38054a 100644 --- a/Sources/Tests/Model_UTs/GameTest.cs +++ b/Sources/Tests/Model_UTs/GameTest.cs @@ -8,6 +8,9 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Xunit; +using static System.Collections.Specialized.BitVector32; +using System.Diagnostics; namespace Tests.Model_UTs { @@ -18,9 +21,13 @@ namespace Tests.Model_UTs private static readonly Player PLAYER_1 = new("Alice"), PLAYER_2 = new("Bob"), PLAYER_3 = new("Clyde"); + private readonly static NumberDieFace FACE_NUM = new(1); + private readonly static ImageDieFace FACE_IMG = new(10); + private readonly static ColorDieFace FACE_CLR = new(1000); + private readonly static NumberDieFace[] FACES_1 = new NumberDieFace[] { - new(1), + FACE_NUM, new(2), new(3), new(4) @@ -28,7 +35,7 @@ namespace Tests.Model_UTs private readonly static ImageDieFace[] FACES_2 = new ImageDieFace[] { - new(10), + FACE_IMG, new(20), new(30), new(40) @@ -36,7 +43,7 @@ namespace Tests.Model_UTs private readonly static ColorDieFace[] FACES_3 = new ColorDieFace[] { - new(1000), + FACE_CLR, new(2000), new(3000), new(4000) @@ -44,18 +51,143 @@ namespace Tests.Model_UTs private static readonly AbstractDie NUM = new NumberDie(FACES_1), IMG = new ImageDie(FACES_2), CLR = new ColorDie(FACES_3); - private static readonly IEnumerable> dice = + private static readonly IEnumerable> DICE = new List>() { NUM, IMG, CLR } .AsEnumerable(); - public GameTest() + [Fact] + public void TestNamePropertyGet() + { + // Arrange + Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE); + + // Act + string actual = game.Name; + + // Assert + Assert.Equal(GAME_NAME, actual); + } + + [Fact] + public void TestNamePropertySetWhenValidThenCorrect() + { + // Arrange + Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE); + string expected = "shitty marmot"; + + + // Act + game.Name = expected; + string actual = game.Name; + + // Assert + Assert.Equal(expected, actual); + } + + [Theory] + [InlineData("")] + [InlineData(null)] + [InlineData(" ")] + public void TestNamePropertySetWhenInvalidThenException(string name) + { + // Arrange + Game game; + + // Act + void action() => game = new(name: name, playerManager: new PlayerManager(), dice: DICE); + + // Assert + Assert.Throws(action); + } + + [Fact] + public void TestGetHistory() { + // Arrange + Dictionary, AbstractDieFace> diceNFaces = new() + { + { CLR, FACE_CLR }, + { IMG, FACE_IMG }, + { NUM, FACE_NUM } + }; - Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: dice); + Turn turn1 = Turn.CreateWithDefaultTime(PLAYER_1, diceNFaces); + Turn turn2 = Turn.CreateWithDefaultTime(PLAYER_2, diceNFaces); // yeah they rolled the same + IEnumerable expected = new List() { turn1, turn2 }; + + // Act + Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE, expected); + IEnumerable actual = game.GetHistory(); + + // Assert + Assert.Equal(expected, actual); + } + + [Fact] + public void TestDicePropertyGet() + { + // Arrange + Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE); + + + // Act + IEnumerable> actual = game.Dice; + IEnumerable> expected = DICE; + + // Assert + Assert.Equal(expected, actual); + } + + [Fact] + public void TestGetWhoPlaysNow() + { + // Arrange + Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE); game.AddPlayerToGame(PLAYER_1); game.AddPlayerToGame(PLAYER_2); - game.AddPlayerToGame(PLAYER_3); + + // Act + Player actual = game.GetWhoPlaysNow(); + Player expected = PLAYER_1; + + game.PrepareNextPlayer(actual); + + Player actual2 = game.GetWhoPlaysNow(); + Player expected2 = PLAYER_2; + + // Assert + Assert.Equal(expected, actual); + + Assert.Equal(expected2, actual2); + } + + [Fact] + public void TestPerformTurnDoesAddOneTurn() + { + // Arrange + Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE); + game.AddPlayerToGame(PLAYER_1); + game.AddPlayerToGame(PLAYER_2); + + int n = 5; + + IEnumerable players = game.GetPlayersFromGame(); + Debug.WriteLine(players); + + for (int i = 0; i < n; i++) + { + Player currentPlayer = game.GetWhoPlaysNow(); + game.PerformTurn(currentPlayer); + game.PrepareNextPlayer(currentPlayer); + } + + // Act + int actual = game.GetHistory().Count(); + int expected = n; + + // Assert + Assert.Equal(expected, actual); } } } From 2ea6feec0d652865be4e6249ebdb82d22d6cbafd Mon Sep 17 00:00:00 2001 From: Alexis DRAI Date: Sun, 25 Sep 2022 16:25:32 +0200 Subject: [PATCH 3/4] =?UTF-8?q?=E2=9C=85=20Add=20UTs=20for=20Game,=20:bug:?= =?UTF-8?q?=20debug=20nextIndex?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sources/Model/Games/Game.cs | 21 ++-- Sources/Tests/Model_UTs/GameTest.cs | 169 ++++++++++++++++++++++++++-- 2 files changed, 168 insertions(+), 22 deletions(-) diff --git a/Sources/Model/Games/Game.cs b/Sources/Model/Games/Game.cs index d77284e..96dfbbf 100644 --- a/Sources/Model/Games/Game.cs +++ b/Sources/Model/Games/Game.cs @@ -97,7 +97,6 @@ namespace Model.Games ThrowAll() ); turns.Add(turn); - nextIndex++; } /// @@ -111,7 +110,6 @@ namespace Model.Games { throw new MemberAccessException("you are exploring an empty collection\nthis should not have happened"); } - return playerManager.GetAll().ElementAt(nextIndex); } @@ -136,7 +134,6 @@ namespace Model.Games { throw new ArgumentException("param could not be found in this collection\n did you forget to add it?", nameof(current)); } - if (playerManager.GetAll().Last() == current) { // if we've reached the last player, we need the index to loop back around @@ -190,16 +187,20 @@ namespace Model.Games public override string ToString() { StringBuilder sb = new(); - sb.AppendFormat("Game: {0}===========\n" + - "{1} are playing. {2} is next.\n" + - "Log:\n", - Name, - playerManager.GetAll().ToString(), - GetWhoPlaysNow()); + sb.Append($"Game: {Name}"); + + sb.Append("\nPlayers:"); + foreach (Player player in GetPlayersFromGame()) + { + sb.Append($" {player.ToString()}"); + } + + sb.Append($"\nNext: {GetWhoPlaysNow()}"); + sb.Append("\nLog:\n"); foreach (Turn turn in this.turns) { - sb.Append("\t" + turn.ToString()); + sb.Append($"\t{turn.ToString()}\n"); } return sb.ToString(); diff --git a/Sources/Tests/Model_UTs/GameTest.cs b/Sources/Tests/Model_UTs/GameTest.cs index f38054a..2e51799 100644 --- a/Sources/Tests/Model_UTs/GameTest.cs +++ b/Sources/Tests/Model_UTs/GameTest.cs @@ -140,7 +140,38 @@ namespace Tests.Model_UTs } [Fact] - public void TestGetWhoPlaysNow() + public void TestPerformTurnDoesAddOneTurn() + { + // Arrange + Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE); + game.AddPlayerToGame(PLAYER_1); + game.AddPlayerToGame(PLAYER_2); + + int n = 5; + + IEnumerable players = game.GetPlayersFromGame(); + Debug.WriteLine(players); + + Player currentPlayer; + for (int i = 0; i < n; i++) + { + currentPlayer = game.GetWhoPlaysNow(); + game.PerformTurn(currentPlayer); + game.PrepareNextPlayer(currentPlayer); + } + + Debug.WriteLine(game); + + // Act + int actual = game.GetHistory().Count(); + int expected = n; + + // Assert + Assert.Equal(expected, actual); + } + + [Fact] + public void TestGetWhoPlaysNowWhenValidThenCorrect() { // Arrange Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE); @@ -163,28 +194,142 @@ namespace Tests.Model_UTs } [Fact] - public void TestPerformTurnDoesAddOneTurn() + public void TestGetWhoPlaysNowWhenInvalidThenException() + { + // Arrange + Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE); + + // Act + void action() => game.GetWhoPlaysNow(); // on an empty collection of players + + // Assert + Assert.Throws(action); + } + + [Fact] + public void TestPrepareNextPlayerWhenEmptyThenException() + { + // Arrange + Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE); + + // Act + void action() => game.PrepareNextPlayer(PLAYER_1); // on an empty collection of players + + // Assert + Assert.Throws(action); + } + + [Fact] + public void TestPrepareNextPlayerWhenNullThenException() + { + // Arrange + Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE); + game.AddPlayerToGame(PLAYER_1); + + // Act + void action() => game.PrepareNextPlayer(null); + + // Assert + Assert.Throws(action); + } + + [Fact] + public void TestPrepareNextPlayerWhenNonExistentThenException() + { + // Arrange + Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE); + game.AddPlayerToGame(PLAYER_2); + + // Act + void action() => game.PrepareNextPlayer(PLAYER_3); + + // Assert + Assert.Throws(action); + } + + [Fact] + public void TestPrepareNextPlayerWhenValidThenCorrectWithSeveralPlayers() { // Arrange Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE); game.AddPlayerToGame(PLAYER_1); game.AddPlayerToGame(PLAYER_2); - int n = 5; + // Act + Player expected = PLAYER_2; - IEnumerable players = game.GetPlayersFromGame(); - Debug.WriteLine(players); + Assert.Equal(PLAYER_1, game.GetWhoPlaysNow()); + game.PrepareNextPlayer(PLAYER_1); - for (int i = 0; i < n; i++) + Player actual = game.GetWhoPlaysNow(); + + // Assert + Assert.Equal(expected, actual); + } + + [Fact] + public void TestPrepareNextPlayerWhenValidThenCorrectWithOnePlayer() + { + // Arrange + Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE); + game.AddPlayerToGame(PLAYER_1); + + // Act + Player expected = PLAYER_1; + + Assert.Equal(PLAYER_1, game.GetWhoPlaysNow()); + game.PrepareNextPlayer(PLAYER_1); + + Player actual = game.GetWhoPlaysNow(); + + // Assert + Assert.Equal(expected, actual); + } + + [Fact] + public void TestToString() + { + // Arrange + DateTime dateTime = DateTime.UtcNow; + + List turns = new() { - Player currentPlayer = game.GetWhoPlaysNow(); - game.PerformTurn(currentPlayer); - game.PrepareNextPlayer(currentPlayer); - } + Turn.CreateWithSpecifiedTime(dateTime, PLAYER_1, new() + { + {NUM, new NumberDieFace(4)}, + {IMG, new ImageDieFace(40)}, + {CLR, new ColorDieFace("A00FA0")}, + }), + Turn.CreateWithSpecifiedTime(dateTime, PLAYER_2, new() + { + {NUM, new NumberDieFace(3)}, + {IMG, new ImageDieFace(20)}, + {CLR, new ColorDieFace("A00BB8")}, + }), + }; + + Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE, turns: turns); + game.AddPlayerToGame(PLAYER_1); + game.AddPlayerToGame(PLAYER_2); // Act - int actual = game.GetHistory().Count(); - int expected = n; + string[] dateTimeString = dateTime.ToString("s", System.Globalization.CultureInfo.InvariantCulture).Split("T"); + + string date = dateTimeString[0]; + string time = dateTimeString[1]; + + string expected = + "Game: my game" + + "\nPlayers: Alice Bob" + + "\nNext: Alice" + + "\nLog:" + + "\n\t" + date + " " + time + " -- Alice rolled: 4 Assets/images/40 #A00FA0" + + "\n\t" + date + " " + time + " -- Bob rolled: 3 Assets/images/20 #A00BB8" + + "\n"; + string actual = game.ToString(); + + Debug.WriteLine("expected:\n" + expected); + Debug.WriteLine("actual:\n" + actual); // Assert Assert.Equal(expected, actual); From ff4d6eab9bb98aaa14d53993f5198b7801c7f0e6 Mon Sep 17 00:00:00 2001 From: Alexis DRAI Date: Sun, 25 Sep 2022 16:53:57 +0200 Subject: [PATCH 4/4] =?UTF-8?q?=E2=9C=85=20Finish=20tests=20and=20fix=20#3?= =?UTF-8?q?0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sources/Tests/Model_UTs/GameTest.cs | 60 +++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/Sources/Tests/Model_UTs/GameTest.cs b/Sources/Tests/Model_UTs/GameTest.cs index 2e51799..abd259b 100644 --- a/Sources/Tests/Model_UTs/GameTest.cs +++ b/Sources/Tests/Model_UTs/GameTest.cs @@ -286,6 +286,66 @@ namespace Tests.Model_UTs Assert.Equal(expected, actual); } + [Fact] + public void TestAddPlayerToGame() + { + // Arrange + Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE); + + // Act + Player expected = PLAYER_1; + Player actual = game.AddPlayerToGame(PLAYER_1); + + // Assert + Assert.Equal(expected, actual); + } + + [Fact] + public void TestGetPlayersFromGame() + { + // Arrange + Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE); + + // Act + Assert.Empty(game.GetPlayersFromGame()); + game.AddPlayerToGame(PLAYER_1); + + // Assert + Assert.Single(game.GetPlayersFromGame()); + } + + [Fact] + public void TestUpdatePlayerInGame() + { + // Arrange + Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE); + game.AddPlayerToGame(PLAYER_1); + + // Act + Player expected = PLAYER_2; + Player actual = game.UpdatePlayerInGame(PLAYER_1, PLAYER_2); + + // Assert + Assert.Equal(expected, actual); + } + + [Fact] + public void TestRemovePlayerFromGame() + { + // Arrange + Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE); + game.AddPlayerToGame(PLAYER_1); + game.AddPlayerToGame(PLAYER_2); + game.RemovePlayerFromGame(PLAYER_1); + + // Act + IEnumerable expected = new List() { PLAYER_2 }.AsEnumerable(); + IEnumerable actual = game.GetPlayersFromGame(); + + // Assert + Assert.Equal(expected, actual); + } + [Fact] public void TestToString() {