public void ShouldPrintSampleScoreboardMessage_TopCommandTest()
        {
            Player firstPlayer = new Player();
            firstPlayer.Name = "Pesho";
            firstPlayer.TotalMoves = 4;
            GameEngine testEngine = new GameEngine(firstPlayer);
            List<Player> topPlayersScores = new List<Player>();

            Player secondPlayer=new Player();
            secondPlayer.Name = "Spiro";
            secondPlayer.TotalMoves = 6;

            topPlayersScores.Add(firstPlayer);
            topPlayersScores.Add(secondPlayer);

            ICommand topCommand = new TopCommand(topPlayersScores);
            using (var writer = new StringWriter())
            {
                Console.SetOut(writer);
                testEngine.CommandManager.Proceed(topCommand);

                writer.Flush();

                string result = writer.GetStringBuilder().ToString();
                string expected = "\nScoreboard:\r\nPesho by 4\r\nSpiro by 6\r\n\r\n";
                Assert.AreEqual(expected, result);
            }
        }
        public void ShouldReturnTrue_IsGameOver_ExitCommandTest()
        {
            Player testPlayer =new Player();
            GameEngine testEngine = new GameEngine(testPlayer);
            ICommand exitCommand = new ExitCommand(testEngine);
            testEngine.CommandManager.Proceed(exitCommand);

            Assert.IsTrue(testEngine.IsGameOver);
        }
        public void ShouldReturnTrue_RestartCommandTest_ChangeCountTotalMoves()
        {
            Player testPlayer = new Player();
            GameEngine testEngine = new GameEngine(testPlayer);
            testEngine.Player.TotalMoves = 2;
            ICommand restartCommand = new RestartCommand(testEngine);
            testEngine.CommandManager.Proceed(restartCommand);

            Assert.IsTrue(testEngine.Player.TotalMoves == 0);
        }
        public void PrintTheGameFieldTest()
        {
            GameEngine gameEngine = new GameEngine(new Player());

            using (var writer = new StringWriter())
            {
                Console.SetOut(writer);
                ConsolePrinter.PrintTheGameField(gameEngine.PuzzleField);

                writer.Flush();

                string result = writer.GetStringBuilder().ToString();
                string expected = " -------------\r\n|  1  2  3  4 |\r\n|  5  6  7  8 |\r\n|  9 10 11 12 |\r\n| 13 14 15    |\r\n -------------\r\n";
                Assert.AreEqual(expected, result);
            }
        }
        public void ShouldPrintEmptyScoreboardMessage_TopCommandTest()
        {
            Player testPlayer = new Player();
            GameEngine testEngine = new GameEngine(testPlayer);
            List<Player> topPlayersScores = new List<Player>();
            ICommand topCommand = new TopCommand(topPlayersScores);
            using (var writer = new StringWriter())
            {
                Console.SetOut(writer);
                testEngine.CommandManager.Proceed(topCommand);

                writer.Flush();

                string result = writer.GetStringBuilder().ToString();
                string expected = "\nScoreboard:\r\nEmpty Scoreboard! :)\r\n\r\n";
                Assert.AreEqual(expected, result);
            }
        }
        public void ShouldPrintFinalMessage_ExitCommandTest()
        {
            Player testPlayer = new Player();
            GameEngine testEngine = new GameEngine(testPlayer);
            ICommand exitCommand = new ExitCommand(testEngine);

            using (var writer = new StringWriter())
            {
                Console.SetOut(writer);
                testEngine.CommandManager.Proceed(exitCommand);

                writer.Flush();

                string result = writer.GetStringBuilder().ToString();
                string expected = "Good bye!\r\n";
                Assert.AreEqual(expected, result);
            }
        }
        public void ShouldReturnTrue_CheckIsIncreaseTotalMovesOfPlayer()
        {
            Player testPlayer = new Player();
            GameEngine testEngine = new GameEngine(testPlayer);
            var oldIn = Console.In;
            Console.SetIn(new StringReader("5\r\nexit"));
            string result = String.Empty;
            using (var writer = new StringWriter())
            {
                Console.SetOut(writer);
                testEngine.StartTheGame();

                writer.Flush();

                result = writer.GetStringBuilder().ToString();
            }
            Console.SetIn(oldIn);
            int expectedPlayerMoves = 1;
            string expectedMessage = "Illegal move!\r\nEnter a number to move: Good bye!\r\n";
            string resultString = result.Substring(result.Length - 50);
            Assert.IsTrue(expectedPlayerMoves == testPlayer.TotalMoves || expectedMessage == resultString);

        }
 /// <summary>
 /// This method get the instance of current engine.
 /// </summary>
 /// <param name="engine">Currently initialised engine.</param>
 public ExitCommand(GameEngine engine)
 {
     this.GameEngine = engine;
 }
 /// <summary>
 /// This method call StartTheGame() method of GameEngine class.
 /// </summary>
 public static void Main()
 {
     Player currentPlayer = new Player();
     GameEngine gameEngine = new GameEngine(currentPlayer);
     gameEngine.StartTheGame();
 }
 public void ShouldReturnTrue_DefineCommandsMethodTest()
 {
     Player testPlayer = new Player();
     GameEngine testEngine = new GameEngine(testPlayer);
     List<Player> testTopPlayers = new List<Player>();
 }