public void CheckMoveValidityInputEmpty()
        {
            BalloonsEngine game = new BalloonsEngine(5, 10);
            bool result = game.CheckMoveValidity(string.Empty);

            Assert.AreEqual(false, result, "Invalid input cell!");
        }
        /// <summary>
        /// Executes a command from a predefined set of commands or breaks if invalid command.
        /// </summary>
        /// <param name="game">Instace of the BalloonsEngine class.</param>
        /// <param name="command">User input command to execute.</param>
        private static void ExecuteCommand(BalloonsEngine game, string command)
        {
            switch (command)
            {
                case "restart":
                    Console.WriteLine();
                    PrintIntroMessage();
                    game.RestartGame();
                    Console.WriteLine(game.FieldOutput());
                    break;

                case "top":
                    Console.WriteLine(game.GenerateChart());
                    break;

                case "exit":
                    PrintExitMessage();
                    break;

                default:
                    if (game.CheckMoveValidity(command))
                    {
                        ProcessMove(command, game);
                    }
                    else
                    {
                        PrintInvalidCommandMessage();
                    }

                    break;
            }
        }
        public void CheckMoveValidityInput49()
        {
            BalloonsEngine game = new BalloonsEngine(5, 10);
            bool result = game.CheckMoveValidity("4 9");

            Assert.AreEqual(true, result, "Invalid input cell!");
        }
        /// <summary>
        /// Executes a command from a predefined set of commands or breaks if invalid command.
        /// </summary>
        /// <param name="game">Instace of the BalloonsEngine class.</param>
        /// <param name="command">User input command to execute.</param>
        private static void ExecuteCommand(BalloonsEngine game, string command)
        {
            switch (command)
            {
            case "restart":
                Console.WriteLine();
                PrintIntroMessage();
                game.RestartGame();
                Console.WriteLine(game.FieldOutput());
                break;

            case "top":
                Console.WriteLine(game.GenerateChart());
                break;

            case "exit":
                PrintExitMessage();
                break;

            default:
                if (game.CheckMoveValidity(command))
                {
                    ProcessMove(command, game);
                }
                else
                {
                    PrintInvalidCommandMessage();
                }

                break;
            }
        }
        public static int[,] GenerateFieldShim(BalloonsEngine game, int row, int col)
        {
            expectedRow = row;
            expectedCol = col;

            return GetFieldFromXML(row, col);
        }
        public void ChartPlacementAfter5()
        {
            BalloonsEngine game = new BalloonsEngine(5, 10);
            game.UserMoves = 5;
            for (int i = 0; i < 5; i++)
            {
                game.UserMoves++;
                game.RecordHighscore(i.ToString(), game.ChartPlaceIndex());
            }

            game.UserMoves = 1;
            game.RecordHighscore("FirstPlace", game.ChartPlaceIndex());

            StringBuilder expectedBuilder = new StringBuilder();
            expectedBuilder.AppendLine("---------TOP FIVE CHART-----------");
            expectedBuilder.AppendFormat("{2}. {0} with {1} moves.\n", "FirstPlace", 1, 1);
            for (int i = 2; i <= 5; i++)
            {
                expectedBuilder.AppendFormat("{2}. {0} with {1} moves.\n", (i - 2).ToString(), i + 4, i);
            }

            expectedBuilder.AppendLine("----------------------------------");

            Assert.AreEqual(expectedBuilder.ToString(), game.GenerateChart());
        }
        public void CheckMoveValidityInputNegativeNum()
        {
            BalloonsEngine game = new BalloonsEngine(5, 10);
            bool result = game.CheckMoveValidity("-2 -1");

            Assert.AreEqual(false, result, "Invalid input cell!");
        }
        public void FieldOutputLength()
        {
            BalloonsEngine game = new BalloonsEngine(5, 10);
            string outputField = game.FieldOutput();

            Assert.AreEqual(217, outputField.Length);
        }
        public void CheckIfWinningOutputTrue()
        {
            BalloonsEngine game = new BalloonsEngine(5, 10);

            TestUtils.PopAllBalloons(game);
            bool result = game.CheckIfWinning();

            Assert.AreEqual(true, result);
        }
        public void CheckIfWinningOutputFalse()
        {
            BalloonsEngine game = new BalloonsEngine(5, 10);
            game.TryPopBalloons(2, 6);
            game.TryPopBalloons(1, 8);
            bool result = game.CheckIfWinning();

            Assert.AreEqual(false, result);
        }
        public void GenerateChartOutputWithoutTop()
        {
            BalloonsEngine game = new BalloonsEngine(5, 10);
            game.TryPopBalloons(2, 6);
            string result = game.GenerateChart();

            StringBuilder expectedResult = new StringBuilder();
            expectedResult.AppendLine("The scoreboard is empty.");

            Assert.AreEqual(expectedResult.ToString(), result);
        }
 public static void PopAllBalloons(BalloonsEngine game)
 {
     for (int i = 0; i < game.FieldRows; i++)
     {
         for (int j = 0; j < game.FieldColumns; j++)
         {
             game.TryPopBalloons(i, j);
             game.UserMoves++;
             game.CollapseRows();
         }
     }
 }
        /// <summary>
        /// The entry point of the program.
        /// </summary>
        static void Main(string[] args)
        {
            string userInput = string.Empty;

            BalloonsEngine game = new BalloonsEngine(5, 10);

            PrintIntroMessage();
            Console.WriteLine(game.FieldOutput());

            while (userInput != "exit")
            {
                PrintMoveMessage();
                userInput = GetInput();

                ExecuteCommand(game, userInput);
            }
        }
        public void GenerateChartOutputWithTop()
        {
            BalloonsEngine game = new BalloonsEngine(5, 10);

            TestUtils.PopAllBalloons(game);
            int place = game.ChartPlaceIndex();
            string result = string.Empty;
            if (place != -1)
            {
                game.RecordHighscore("Bunny", place);
                result = game.GenerateChart();
            }

            StringBuilder expectedResult = new StringBuilder();
            expectedResult.AppendLine("---------TOP FIVE CHART-----------");
            expectedResult.AppendFormat("{2}. {0} with {1} moves.\n", "Bunny", game.UserMoves, 1);
            expectedResult.AppendLine("----------------------------------");

            Assert.AreEqual(expectedResult.ToString(), result);
        }
        public void PopFirstRowAndCol()
        {
            using (ShimsContext.Create())
            {
                BalloonsEngine game = new BalloonsEngine(0, 0);

                ShimBalloonsEngine.AllInstances.GeneratePlayFieldInt32Int32
                = (game1, x, y) => TestUtils.GenerateFieldShim(game, 5, 10);

                TestUtils.FileName("01.AllOnesInput.xml");
                game = new BalloonsEngine(5, 10);
                game.TryPopBalloons(0, 0);

                int[,] gameField = (int[,])typeof(BalloonsEngine).GetField("playField", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(game);
                int[,] expectedOutput = TestUtils.GetExpectedOutput();

                bool valuesAreEqual = TestUtils.CheckPlayFields(gameField, expectedOutput);

                Assert.AreEqual(valuesAreEqual, true, "First row and col of balloons weren't popped.");
            }
        }
        public void CollapseRows()
        {
            using (ShimsContext.Create())
            {
                BalloonsEngine game = new BalloonsEngine(0, 0);

                ShimBalloonsEngine.AllInstances.GeneratePlayFieldInt32Int32
                = (game1, x, y) => TestUtils.GenerateFieldShim(game, 5, 10);

                TestUtils.FileName("07.CollapseInput.xml");
                game = new BalloonsEngine(5, 10);
                game.CollapseRows();

                int[,] gameField = (int[,])typeof(BalloonsEngine).GetField("playField", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(game);
                int[,] expectedOutput = TestUtils.GetExpectedOutput();

                bool valuesAreEqual = TestUtils.CheckPlayFields(gameField, expectedOutput);

                Assert.AreEqual(valuesAreEqual, true);
            }
        }
        /// <summary>
        /// Processes the move entered by the player.
        /// </summary>
        /// <param name="userInput">Row and column of the move.</param>
        /// <param name="game">Instace of the BalloonsEngine class.</param>
        private static void ProcessMove(string userInput, BalloonsEngine game)
        {
            int userRow, userColumn;

            userRow    = ConvertCharToInt(userInput[0]);
            userColumn = ConvertCharToInt(userInput[2]);

            if (!game.TryPopBalloons(userRow, userColumn))
            {
                PrintIllegalMoveMessage();
            }

            game.UserMoves++;
            game.CollapseRows();

            if (game.CheckIfWinning())
            {
                Console.WriteLine(game.FieldOutput());
                Console.WriteLine("Congratulations! You popped all baloons in {0} moves.", game.UserMoves);

                int place = game.ChartPlaceIndex();
                if (place != -1)
                {
                    Console.WriteLine("Please enter your name for the top scoreboard: ");
                    string username = Console.ReadLine();
                    game.RecordHighscore(username, place);
                    Console.WriteLine(game.GenerateChart());
                }
                else
                {
                    Console.WriteLine("Game Over!");
                    Console.WriteLine(game.GenerateChart());
                }

                game.RestartGame();
            }

            Console.WriteLine(game.FieldOutput());
        }
        public void ChartPlaceIndexOutput()
        {
            BalloonsEngine game = new BalloonsEngine(5, 10);

            TestUtils.PopAllBalloons(game);
            int placeResult = game.ChartPlaceIndex();
            if (placeResult != -1)
            {
                game.RecordHighscore("Bunny", placeResult);
            }
            game.RestartGame();

            TestUtils.PopAllBalloons(game);
            placeResult = game.ChartPlaceIndex();
            if (placeResult != -1)
            {
                game.RecordHighscore("Sunny", placeResult);
            }
            game.RestartGame();
            TestUtils.PopAllBalloons(game);
            placeResult = game.ChartPlaceIndex();

            Assert.AreEqual(2, placeResult);
        }
 public void CheckMoveValidityInputNull()
 {
     BalloonsEngine game = new BalloonsEngine(5, 10);
     game.CheckMoveValidity(null);
 }
        public void FieldOutputRestartGame()
        {
            BalloonsEngine game = new BalloonsEngine(5, 10);
            game.TryPopBalloons(2, 5);
            game.TryPopBalloons(4, 1);
            int outputFieldLength = game.FieldOutput().Length;
            game.RestartGame();
            int outputFieldLengthAfterRestart = game.FieldOutput().Length;

            Assert.AreEqual(outputFieldLength, outputFieldLengthAfterRestart);
        }
        public void TryPopBalloonsOutputFalse()
        {
            BalloonsEngine game = new BalloonsEngine(5, 10);
            game.TryPopBalloons(0, 7);
            bool result = game.TryPopBalloons(0, 7);

            Assert.AreEqual(false, result);
        }
        public void TryPopBalloonsOutputTrue()
        {
            BalloonsEngine game = new BalloonsEngine(5, 10);
            bool result = game.TryPopBalloons(1, 2);

            Assert.AreEqual(true, result);
        }
        /// <summary>
        /// Processes the move entered by the player.
        /// </summary>
        /// <param name="userInput">Row and column of the move.</param>
        /// <param name="game">Instace of the BalloonsEngine class.</param>
        private static void ProcessMove(string userInput, BalloonsEngine game)
        {
            int userRow, userColumn;
            userRow = ConvertCharToInt(userInput[0]);
            userColumn = ConvertCharToInt(userInput[2]);

            if (!game.TryPopBalloons(userRow, userColumn))
            {
                PrintIllegalMoveMessage();
            }

            game.UserMoves++;
            game.CollapseRows();

            if (game.CheckIfWinning())
            {
                Console.WriteLine(game.FieldOutput());
                Console.WriteLine("Congratulations! You popped all baloons in {0} moves.", game.UserMoves);

                int place = game.ChartPlaceIndex();
                if (place != -1)
                {
                    Console.WriteLine("Please enter your name for the top scoreboard: ");
                    string username = Console.ReadLine();
                    game.RecordHighscore(username, place);
                    Console.WriteLine(game.GenerateChart());
                }
                else
                {
                    Console.WriteLine("Game Over!");
                    Console.WriteLine(game.GenerateChart());
                }

                game.RestartGame();
            }

            Console.WriteLine(game.FieldOutput());
        }
        public void FieldOutputLengthAfterMove()
        {
            BalloonsEngine game = new BalloonsEngine(5, 10);
            game.TryPopBalloons(0, 0);
            game.TryPopBalloons(4, 9);
            string outputField = game.FieldOutput();

            Assert.AreEqual(217, outputField.Length);
        }
        /// <summary>
        /// The entry point of the program.
        /// </summary>
        static void Main(string[] args)
        {
            string userInput = string.Empty;

            BalloonsEngine game = new BalloonsEngine(5, 10);

            PrintIntroMessage();
            Console.WriteLine(game.FieldOutput());

            while (userInput != "exit")
            {
                PrintMoveMessage();
                userInput = GetInput();

                ExecuteCommand(game, userInput);
            }
        }
        public void PopFourthRowAndNinthCol()
        {
            using (ShimsContext.Create())
            {
                BalloonsEngine game = new BalloonsEngine(0, 0);

                ShimBalloonsEngine.AllInstances.GeneratePlayFieldInt32Int32
                = (game1, x, y) => TestUtils.GenerateFieldShim(game, 5, 10);

                TestUtils.FileName("04.AllOnesInput.xml");
                game = new BalloonsEngine(5, 10);
                game.TryPopBalloons(4, 9);
                game.CollapseRows();

                int[,] gameField = (int[,])typeof(BalloonsEngine).GetField("playField", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(game);
                int[,] expectedOutput = TestUtils.GetExpectedOutput();

                bool valuesAreEqual = TestUtils.CheckPlayFields(gameField, expectedOutput);

                Assert.AreEqual(valuesAreEqual, true, "Fourth row and 9th col didn't pop and collapse properly.");
            }
        }