public void TestInitializeGameState() { var gameStateTracker = new TrackIndividualGameState(); var gameState = gameStateTracker.InitializeGameState(); PlayerGameStateInitializationAssertions(gameState.FirstPlayerState); PlayerGameStateInitializationAssertions(gameState.SecondPlayerState); Assert.True(gameState.TimedOut == false); Assert.True(gameState.TimeElapsed == Constants.GamePlayParameters.TimeToShuffle + Constants.GamePlayParameters.TimeToDeal); Assert.True(gameState.MaxDuration >= TimeSpan.FromMinutes(Constants.GamePlayParameters.MinGameLengthInMinutes)); Assert.True(gameState.MaxDuration <= TimeSpan.FromMinutes(Constants.GamePlayParameters.MaxGameLengthInMinutes)); //make sure all cards are accounted for var allCards = gameState.FirstPlayerState.PlayPile.Cards.Concat(gameState.SecondPlayerState.PlayPile.Cards); foreach (var suit in new List <string> { Constants.Suits.Clubs, Constants.Suits.Diamonds, Constants.Suits.Hearts, Constants.Suits.Spades }) { foreach (var rank in new List <string> { "2", "3", "4", "5", "6", "7", "8", "9", "T", "J", "Q", "K", "A" }) { Assert.True(allCards.Where(item => item.Rank == rank && item.Suit == suit).Count() == 1); } } }
public void PlayerHasLostTestWhenStartingWithRealGameStates() { var objectUnderTest = new PlayWar(new Mock <ILogger <PlayWar> >().Object); var realGameState = new TrackIndividualGameState().InitializeGameState(); Assert.True(objectUnderTest.PlayerHasLost(realGameState.FirstPlayerState) == false); Assert.True(objectUnderTest.PlayerHasLost(realGameState.SecondPlayerState) == false); }
public void TestTimeOut() { var gameStateTracker = new TrackIndividualGameState(); var gameState = gameStateTracker.InitializeGameState(); gameState.Tick(TimeSpan.FromMinutes(Constants.GamePlayParameters.MaxGameLengthInMinutes)); Assert.True(gameState.TimedOut == true); }
public void TransitionTestNoTimePassesWithNoShuffling() { var objectUnderTest = new PlayWar(new Mock <ILogger <PlayWar> >().Object); var realGameState = new TrackIndividualGameState().InitializeGameState(); var timeElapsedSoFar = realGameState.TimeElapsed; objectUnderTest.Transition(realGameState); Assert.True(realGameState.TimeElapsed == timeElapsedSoFar); }
public void PlayTestWhenSimulationEndsAfterTwoTieGamesInARow() { var loggerDouble = new LoggerDouble <CoordinateGameplay>(); var gamePlayMock = new Mock <IPlayWar>(); var pointsCalculatorMock = new Mock <IPointsCalculator>(); var individualGameStateTrackerMock = new Mock <ITrackIndividualGameState>(); var timerMock = new Mock <IDateTime>(); var statsCompilerMock = new Mock <ICompileStats>(); var singleGameStatsMock = new Mock <ISingleGameStats>(); var dummyStart = new DateTime(year: 2011, month: 8, day: 23, hour: 16, minute: 0, second: 0); var dummySimulationEnd = new DateTime(year: 2011, month: 8, day: 23, hour: 16, minute: 0, second: 3); // 3 seconds later timerMock.SetupSequence(mock => mock.Now) .Returns(dummyStart) .Returns(dummySimulationEnd); // use a real game state to easily initialize a full deck var realGameState = new TrackIndividualGameState().InitializeGameState(); var fakeGameState = new Mock <ITrackIndividualGameState>(); var player1DummyState = realGameState.FirstPlayerState; var player2DummyState = realGameState.SecondPlayerState; fakeGameState.Setup(mock => mock.FirstPlayerState).Returns(player1DummyState); fakeGameState.Setup(mock => mock.SecondPlayerState).Returns(player2DummyState); fakeGameState.SetupSequence(mock => mock.TimeElapsed) .Returns(TimeSpan.FromMinutes(4)) // first game 4 minutes .Returns(TimeSpan.FromMinutes(4)) // but TimeElapsed is invoked ... .Returns(TimeSpan.FromMinutes(4)) // three times .Returns(TimeSpan.FromMinutes(7)) // second game 7 minutes .Returns(TimeSpan.FromMinutes(7)) // but TimeElapsed gets invoked ... .Returns(TimeSpan.FromMinutes(7)); // trhee times fakeGameState.Setup(mock => mock.Stats).Returns(singleGameStatsMock.Object); gamePlayMock.Setup(mock => mock.PlayerHasLost(It.IsAny <PlayerGameState>())).Returns(false); fakeGameState.SetupSequence(mock => mock.TimedOut) .Returns(false) .Returns(false) .Returns(true) .Returns(false) .Returns(true); individualGameStateTrackerMock.Setup(mock => mock.InitializeGameState()).Returns(fakeGameState.Object); pointsCalculatorMock.Setup(mock => mock.GetPoints(It.IsAny <List <Card> >())).Returns(48); // always return a tie var objectUnderTest = new CoordinateGameplay(loggerDouble, gamePlayMock.Object, pointsCalculatorMock.Object, individualGameStateTrackerMock.Object, timerMock.Object, statsCompilerMock.Object); var dummySimulationDuration = TimeSpan.FromMinutes(10); var dummyGameParams = new GameParameters { FirstPlayerName = "Isaac", SecondPlayerName = "Daddy", TotalLengthOfSimulation = dummySimulationDuration }; var result = objectUnderTest.Play(dummyGameParams); Assert.True(result.TotalSimulationTime == (dummySimulationEnd - dummyStart)); Assert.True(loggerDouble.DebugEntries.Count() == 8); Assert.True(loggerDouble.InformationEntries.Count() == 1); Assert.True(loggerDouble.HasBeenLogged(LogLevel.Debug, $"{ dummyGameParams.FirstPlayerName} has 0 wins, " + $"{dummyGameParams.SecondPlayerName} has 0 wins, 1 ties")); Assert.True(loggerDouble.HasBeenLogged(LogLevel.Debug, $"{ dummyGameParams.FirstPlayerName} has 0 wins, " + $"{dummyGameParams.SecondPlayerName} has 0 wins, 2 ties")); Assert.True(loggerDouble.HasBeenLogged(LogLevel.Debug, "This game is a tie.")); Assert.True(loggerDouble.HasBeenLogged(LogLevel.Debug, "Game has timed out after 240 seconds.")); Assert.True(loggerDouble.HasBeenLogged(LogLevel.Debug, "Game has timed out after 420 seconds.")); Assert.True(loggerDouble.HasBeenLogged(LogLevel.Information, "Simulation took 3 seconds...")); gamePlayMock.Verify(mock => mock.War(It.IsAny <ITrackIndividualGameState>(), It.IsAny <int>()), Times.Exactly(5)); gamePlayMock.Verify(mock => mock.Transition(It.IsAny <ITrackIndividualGameState>()), Times.Exactly(5)); pointsCalculatorMock.Verify(mock => mock.GetPoints(It.IsAny <List <Card> >()), Times.Exactly(4)); singleGameStatsMock.VerifySet(mock => mock.Winner = 0, Times.Exactly(2)); singleGameStatsMock.VerifySet(mock => mock.SimulationTime = It.IsAny <TimeSpan>(), Times.Exactly(2)); statsCompilerMock.Verify(mock => mock.UpdateStats(It.IsAny <ISimulationStats>(), It.IsAny <ISingleGameStats>()), Times.Exactly(2)); }
public void PlayTestWhenWithTimeoutButAWinner(int winner) { var loggerDouble = new LoggerDouble <CoordinateGameplay>(); var gamePlayMock = new Mock <IPlayWar>(); var pointsCalculatorMock = new Mock <IPointsCalculator>(); var individualGameStateTrackerMock = new Mock <ITrackIndividualGameState>(); var timerMock = new Mock <IDateTime>(); var statsCompilerMock = new Mock <ICompileStats>(); var singleGameStatsMock = new Mock <ISingleGameStats>(); // use a real game state to easily initialize a full deck var realGameState = new TrackIndividualGameState().InitializeGameState(); var fakeGameState = new Mock <ITrackIndividualGameState>(); var player1DummyState = realGameState.FirstPlayerState; var player2DummyState = realGameState.SecondPlayerState; fakeGameState.Setup(mock => mock.FirstPlayerState).Returns(player1DummyState); fakeGameState.Setup(mock => mock.SecondPlayerState).Returns(player2DummyState); var dummyDuration = TimeSpan.FromMinutes(10); fakeGameState.Setup(mock => mock.TimeElapsed).Returns(dummyDuration); gamePlayMock.Setup(mock => mock.PlayerHasLost(It.IsAny <PlayerGameState>())).Returns(false); fakeGameState.Setup(mock => mock.TimedOut).Returns(true); fakeGameState.Setup(mock => mock.Stats).Returns(singleGameStatsMock.Object); individualGameStateTrackerMock.Setup(mock => mock.InitializeGameState()).Returns(fakeGameState.Object); pointsCalculatorMock.SetupSequence(mock => mock.GetPoints(It.IsAny <List <Card> >())) .Returns(winner == 1 ? 49 : 47) .Returns(winner == 2 ? 49 : 47); var objectUnderTest = new CoordinateGameplay(loggerDouble, gamePlayMock.Object, pointsCalculatorMock.Object, individualGameStateTrackerMock.Object, timerMock.Object, statsCompilerMock.Object); var dummySimulationDuration = TimeSpan.FromMinutes(10); var dummyGameParams = new GameParameters { FirstPlayerName = "Isaac", SecondPlayerName = "Daddy", TotalLengthOfSimulation = dummySimulationDuration }; objectUnderTest.Play(dummyGameParams); Assert.True(loggerDouble.DebugEntries.Count() == 4); Assert.True(loggerDouble.InformationEntries.Count() == 1); Assert.True(loggerDouble.HasBeenLogged(LogLevel.Debug, $"{ dummyGameParams.FirstPlayerName} has {(winner == 1 ? 1 : 0)} wins, " + $"{dummyGameParams.SecondPlayerName} has {(winner == 2 ? 1 : 0)} wins, 0 ties")); Assert.True(loggerDouble.HasBeenLogged(LogLevel.Debug, $"Player {winner} has won this game!")); gamePlayMock.Verify(mock => mock.War(It.IsAny <ITrackIndividualGameState>(), It.IsAny <int>()), Times.Once()); gamePlayMock.Verify(mock => mock.Transition(It.IsAny <ITrackIndividualGameState>()), Times.Once()); pointsCalculatorMock.Verify(mock => mock.GetPoints(It.IsAny <List <Card> >()), Times.Exactly(2)); singleGameStatsMock.VerifySet(mock => mock.Winner = winner, Times.Once()); singleGameStatsMock.VerifySet(mock => mock.SimulationTime = It.IsAny <TimeSpan>(), Times.Once()); statsCompilerMock.Verify(mock => mock.UpdateStats(It.IsAny <ISimulationStats>(), It.IsAny <ISingleGameStats>()), Times.Once()); }