using Data; using Model.Dice; using Model.Dice.Faces; using Model.Games; using Model.Players; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Xunit; namespace Tests.Model_UTs.Games { public class GameTest { private readonly MasterOfCeremonies stubMasterOfCeremonies = new Stub().LoadApp()?.Result; 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 IEnumerable DICE_1, DICE_2; public GameTest() { IEnumerable diceGroups = stubMasterOfCeremonies.DiceGroupManager.GetAll()?.Result; DICE_1 = diceGroups.First().Dice; DICE_2 = diceGroups.Last().Dice; } [Fact] public void TestNamePropertyGet() { // Arrange Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE_1); // 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_1); 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_1); // Assert Assert.Throws(action); } [Fact] public async Task TestGetHistory() { // Arrange IEnumerable> diceNFaces = (await stubMasterOfCeremonies.GameManager.GetAll()) .First() .GetHistory() .First().DiceNFaces; Turn turn1 = Turn.CreateWithSpecifiedTime(new(1, 2, 3), PLAYER_1, diceNFaces); Turn turn2 = Turn.CreateWithSpecifiedTime(new(1, 2, 3), 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_1, 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_2); // Act IEnumerable actual = game.Dice; IEnumerable expected = DICE_2; // Assert Assert.Equal(expected, actual); } [Fact] public async Task TestPerformTurnDoesAddOneTurnAsync() { // Arrange Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE_1); await game.PlayerManager.Add(PLAYER_1); await game.PlayerManager.Add(PLAYER_2); int n = 5; Player currentPlayer; for (int i = 0; i < n; i++) { currentPlayer = await game.GetWhoPlaysNow(); game.PerformTurn(currentPlayer); await game.PrepareNextPlayer(currentPlayer); } // Act int actual = game.GetHistory().Count; int expected = n; // Assert Assert.Equal(expected, actual); } [Fact] public async Task TestGetWhoPlaysNowWhenValidThenCorrectAsync() { // Arrange Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE_1); await game.PlayerManager.Add(PLAYER_1); await game.PlayerManager.Add(PLAYER_2); // Act Player actual = await game.GetWhoPlaysNow(); Player expected = PLAYER_1; await game.PrepareNextPlayer(actual); Player actual2 = await game.GetWhoPlaysNow(); Player expected2 = PLAYER_2; // Assert Assert.Equal(expected, actual); Assert.Equal(expected2, actual2); } [Fact] public void TestGetWhoPlaysNowWhenInvalidThenException() { // Arrange Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE_1); // Act async Task actionAsync() => await game.GetWhoPlaysNow(); // on an empty collection of players // Assert Assert.ThrowsAsync(actionAsync); } [Fact] public void TestPrepareNextPlayerWhenEmptyThenException() { // Arrange Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE_1); // Act async Task actionAsync() => await game.PrepareNextPlayer(PLAYER_1); // on an empty collection of players // Assert Assert.ThrowsAsync(actionAsync); } [Fact] public void TestPrepareNextPlayerWhenNullThenException() { // Arrange Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE_2); game.PlayerManager.Add(PLAYER_1); // Act async Task actionAsync() => await game.PrepareNextPlayer(null); // Assert Assert.ThrowsAsync(actionAsync); } [Fact] public void TestPrepareNextPlayerWhenNonExistentThenException() { // Arrange Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE_1); game.PlayerManager.Add(PLAYER_2); // Act async Task actionAsync() => await game.PrepareNextPlayer(PLAYER_3); // Assert Assert.ThrowsAsync(actionAsync); } [Fact] public async Task TestPrepareNextPlayerWhenValidThenCorrectWithSeveralPlayersAsync() { // Arrange Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE_2); await game.PlayerManager.Add(PLAYER_1); await game.PlayerManager.Add(PLAYER_2); // Act Player expected = PLAYER_2; Assert.Equal(PLAYER_1, await game.GetWhoPlaysNow()); await game.PrepareNextPlayer(PLAYER_1); Player actual = await game.GetWhoPlaysNow(); // Assert Assert.Equal(expected, actual); } [Fact] public async Task TestPrepareNextPlayerWhenValidThenCorrectWithOnePlayerAsync() { // Arrange Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE_1); await game.PlayerManager.Add(PLAYER_1); // Act Player expected = PLAYER_1; Assert.Equal(PLAYER_1, await game.GetWhoPlaysNow()); await game.PrepareNextPlayer(PLAYER_1); Player actual = await game.GetWhoPlaysNow(); // Assert Assert.Equal(expected, actual); } [Fact] public async Task TestAddPlayerToGameAsync() { // Arrange Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE_2); // Act Player expected = PLAYER_1; Player actual = await game.PlayerManager.Add(PLAYER_1); // Assert Assert.Equal(expected, actual); } [Fact] public async Task TestGetPlayersFromGameAsync() { // Arrange Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE_1); // Act Assert.Empty(await game.PlayerManager.GetAll()); await game.PlayerManager.Add(PLAYER_1); // Assert Assert.Single(await game.PlayerManager.GetAll()); } [Fact] public async Task TestUpdatePlayerInGameAsync() { // Arrange Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE_2); await game.PlayerManager.Add(PLAYER_1); // Act Player expected = PLAYER_2; Player actual = await game.PlayerManager.Update(PLAYER_1, PLAYER_2); // Assert Assert.Equal(expected, actual); } [Fact] public async Task TestRemovePlayerFromGameAsync() { // Arrange Game game = new(name: GAME_NAME, playerManager: new PlayerManager(), dice: DICE_1); await game.PlayerManager.Add(PLAYER_1); await game.PlayerManager.Add(PLAYER_2); game.PlayerManager.Remove(PLAYER_1); // Act IEnumerable expected = new List() { PLAYER_2 }.AsEnumerable(); IEnumerable actual = await game.PlayerManager.GetAll(); // Assert Assert.Equal(expected, actual); } } }