public void TestRenderMatchResultPlayerOneWinOnTies()
        {
            // Given
            var game = Match.GetInstance();

            game.StartNewGame();

            // When
            game.Update();

            var p1 = game.GetPlayer(1);

            p1.Lives = 0;
            p1.Kills = 10;
            p1.Ship.Destroy();

            var p2 = game.GetPlayer(2);

            p2.Lives = 0;
            p2.Kills = 10;
            p2.Ship.Destroy();
            game.Update();

            var summary = new SpaceInvadersRenderer().RenderSummary(game);

            // Then
            Assert.IsTrue(game.GameIsOver(), "Game did not end.");
            Assert.AreEqual(1, summary.Winner, "Winner was not set to 1.");
            Assert.AreEqual("Match was a tie, so player 1 wins by default.", summary.WinReason, "Win reason was incorrect.");
        }
        public void TestRenderMatchResultPlayerTwoWinKills()
        {
            // Given
            var game = Match.GetInstance();

            game.StartNewGame();

            // When
            game.Update();

            var p1 = game.GetPlayer(1);

            p1.Lives = 0;
            p1.Kills = 4;
            p1.Ship.Destroy();

            var p2 = game.GetPlayer(2);

            p2.Lives = 0;
            p2.Kills = 10;
            p2.Ship.Destroy();
            game.Update();

            var summary = new SpaceInvadersRenderer().RenderSummary(game);

            // Then
            Assert.IsTrue(game.GameIsOver(), "Game did not end.");
            Assert.AreEqual(2, summary.Winner, "Winner was not set to 2.");
            Assert.AreEqual("Player 2 had more kills than player 1.", summary.WinReason, "Win reason was incorrect.");
        }
        public void TestJsonDeserialization()
        {
            // Given
            CoordinateFlipper flipper;
            var game     = CreateInterestingGameState(out flipper);
            var renderer = new SpaceInvadersRenderer();

            var state   = renderer.Render(game).State;
            var mapReal = renderer.Render(game).Map;

            Debug.WriteLine("Map:");
            Debug.WriteLine(mapReal);

            // Prevent further shooting as that introduces randomness
            game.GetPlayer(1).AlienManager.TestPreventAllAliensShoot();
            game.GetPlayer(2).AlienManager.TestPreventAllAliensShoot();
            for (var i = 0; i < 5; i++)
            {
                game.Update();
                //Debug.WriteLine("");
                mapReal = renderer.Render(game).Map;
                //Debug.WriteLine(mapReal);
            }

            // When
            var match = JsonConvert.DeserializeObject <Match>(state,
                                                              new JsonSerializerSettings
            {
                Converters        = { new EntityConverter() },
                NullValueHandling = NullValueHandling.Ignore
            }
                                                              );

            Match.SetInstance(match);

            // Prevent further shooting as that introduces randomness
            var mapPredicted = renderer.Render(match).Map;

            match.GetPlayer(1).AlienManager.TestPreventAllAliensShoot();
            match.GetPlayer(2).AlienManager.TestPreventAllAliensShoot();
            for (var i = 0; i < 5 + 1; i++)
            {
                match.Update();
                //Debug.WriteLine("");
                mapPredicted = renderer.Render(game).Map;
                //Debug.WriteLine(mapPredicted);
            }

            Debug.WriteLine("");
            Debug.WriteLine("Map predicted:");
            Debug.WriteLine(mapPredicted);

            // Then
            Assert.AreEqual(mapReal, mapPredicted);
        }
        public void TestRenderMatchResultPlayerTwoWin()
        {
            // Given
            var game = Match.GetInstance();

            game.StartNewGame();

            // When
            game.Update();

            game.GetPlayer(1).Lives = 0;
            game.GetPlayer(1).Ship.Destroy();
            game.Update();

            var summary = new SpaceInvadersRenderer().RenderSummary(game);

            // Then
            Assert.IsTrue(game.GameIsOver(), "Game did not end.");
            Assert.AreEqual(2, summary.Winner, "Winner was not set to 2.");
            Assert.AreEqual("Player 1 ran out of lives.", summary.WinReason, "Win reason was incorrect.");
        }