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);
        }
 /// <summary>
 /// Initialize a new instance of the GameEngine class
 /// </summary>
 public GameEngine(Player player)
 {
     this.Player = player;
     this.PuzzleField = PuzzleField.GetInstance(MatrixSize); // using Singleton design pattern
     this.CommandManager = new CommandManager();
     this.PuzzleFieldManager = new PuzzleFieldManager(this.PuzzleField);
     this.ShuffleStrategy = new RandomShuffle();
     this.IsGameOver = false;
     this.TopPlayers = new List<Player>();
 }
        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 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 call StartTheGame() method of GameEngine class.
 /// </summary>
 public static void Main()
 {
     Player currentPlayer = new Player();
     GameEngine gameEngine = new GameEngine(currentPlayer);
     gameEngine.StartTheGame();
 }
        /// <summary>
        /// This method add new top player in top players rank list at end of the game.
        /// </summary>
        /// <param name="inputOfPlayerName">Name of the player.</param>
        private void AddNewTopPlayer(Player currentPlayer)
        {
            this.TopPlayers.Add(currentPlayer);
            this.TopPlayers.Sort((a, b) => a.TotalMoves.CompareTo(b.TotalMoves));

            if (this.TopPlayers.Count == 4)
            {
                this.TopPlayers.RemoveAt(3);
            }
        }
 public void ShouldReturnTrue_DefineCommandsMethodTest()
 {
     Player testPlayer = new Player();
     GameEngine testEngine = new GameEngine(testPlayer);
     List<Player> testTopPlayers = new List<Player>();
 }