public void GetWinnerSide_QueensMoved15TimesWithTaking_NoDraw()
        {
            //  Arrange
            var playerCheckersFirstPlayer = new List <CheckerModel> {
                new CheckerModel(0, 0, PieceType.Queen, Side.White)
            };
            var playerCheckersSecondPlayer = new List <CheckerModel> {
                new CheckerModel(7, 1, PieceType.Queen, Side.Black)
            };
            DataProvider dataProvider   = new DataProvider(playerCheckersFirstPlayer, playerCheckersSecondPlayer);
            var          mainPlayer     = new MainPlayer(dataProvider, Side.White);
            var          robotPlayer    = new RobotPlayer(dataProvider, Side.Black);
            var          actionsHistory = new Stack <HistoryMove>(GetHistoryActionsWithTaking(playerCheckersFirstPlayer.Single(), playerCheckersSecondPlayer.Single()));

            //  Act
            mainPlayer.CalculateNeighbors();
            robotPlayer.CalculateNeighbors();
            mainPlayer.CalculateAvailablePaths();
            robotPlayer.CalculateAvailablePaths();
            var  gameStatusChecker = new GameStatusChecker(mainPlayer, robotPlayer, actionsHistory);
            Side winnerSide        = gameStatusChecker.GetWinnerSide();

            //  Assert
            Assert.AreEqual(Side.None, winnerSide);
        }
        public void Checker_ConvertsTakeCheckerAndActsAsQueen_ShouldTakeSecondChecker()
        {
            //  Arrange
            var mainPlayCheckers = new List <CheckerModel>()
            {
                new CheckerModel(5, 5, PieceType.Checker, Side.White),
            };
            var secondPlayerCheckers = new List <CheckerModel>()
            {
                new CheckerModel(4, 6, PieceType.Checker, Side.Black),
                new CheckerModel(1, 5, PieceType.Checker, Side.Black),
            };
            DataProvider dataProvider = new DataProvider(mainPlayCheckers, secondPlayerCheckers);
            var          mainPlayer   = new MainPlayer(dataProvider, Side.White);
            var          robotPlayer  = new RobotPlayer(dataProvider, Side.Black);
            var          emptyPlayer  = new EmptyUserPlayer(dataProvider);
            var          game         = new RussianCheckers.Core.Game(mainPlayer, robotPlayer, emptyPlayer, dataProvider);

            //  Act
            game.ReCalculateNeighborsAndPaths();

            //  Assert
            var availablePaths = mainPlayer.CalculateAvailablePaths();

            Assert.IsTrue(availablePaths.Any(x => x.Last.Value.Column == 0 && x.Last.Value.Row == 4));
        }
        public void CalculateAvailableForQueen_SameBehaviorAsChecker_ShouldBe_23()
        {
            //  Arrange
            var mainPlayCheckers = new List <CheckerModel>()
            {
                new CheckerModel(4, 2, PieceType.Queen, Side.White),
            };
            var secondPlayerCheckers = new List <CheckerModel>()
            {
                new CheckerModel(3, 3, PieceType.Checker, Side.Black),
                new CheckerModel(5, 3, PieceType.Checker, Side.Black),
                new CheckerModel(3, 5, PieceType.Checker, Side.Black),
                new CheckerModel(5, 5, PieceType.Checker, Side.Black),
                new CheckerModel(1, 5, PieceType.Checker, Side.Black),
                new CheckerModel(5, 1, PieceType.Checker, Side.Black),
            };
            DataProvider dataProvider = new DataProvider(mainPlayCheckers, secondPlayerCheckers);
            var          mainPlayer   = new MainPlayer(dataProvider, Side.White);
            var          robotPlayer  = new RobotPlayer(dataProvider, Side.Black);
            var          emptyPlayer  = new EmptyUserPlayer(dataProvider);
            var          game         = new RussianCheckers.Core.Game(mainPlayer, robotPlayer, emptyPlayer, dataProvider);

            //  Act
            game.ReCalculateNeighborsAndPaths();

            //  Assert
            var availablePaths = mainPlayer.CalculateAvailablePaths();

            Assert.AreEqual(23, availablePaths.Count());
        }
        public void CalculateAvailablePaths_Returns_Paths_MaxIs_9()
        {
            //  Arrange
            var mainPlayCheckers = new List <CheckerModel>()
            {
                new CheckerModel(4, 2, PieceType.Checker, Side.White),
            };
            var secondPlayerCheckers = new List <CheckerModel>()
            {
                new CheckerModel(3, 3, PieceType.Checker, Side.Black),
                new CheckerModel(5, 3, PieceType.Checker, Side.Black),
                new CheckerModel(3, 5, PieceType.Checker, Side.Black),
                new CheckerModel(5, 5, PieceType.Checker, Side.Black),
                new CheckerModel(1, 5, PieceType.Checker, Side.Black),
            };

            DataProvider dataProvider = new DataProvider(mainPlayCheckers, secondPlayerCheckers);

            var mainPlayer  = new MainPlayer(dataProvider, Side.White);
            var robotPlayer = new RobotPlayer(dataProvider, Side.Black);
            var emptyPlayer = new EmptyUserPlayer(dataProvider);

            //  Act
            var game = new RussianCheckers.Core.Game(mainPlayer, robotPlayer, emptyPlayer, dataProvider);

            game.ReCalculateNeighborsAndPaths();
            var availablePathsForWhite = mainPlayer.CalculateAvailablePaths();

            //  Assert
            Assert.AreEqual(9, availablePathsForWhite.Max(x => x.Count));
        }
        public void CalculateAvailableForQueen_ThreeBlackCheckers_Should_Have_5_Paths()
        {
            //  Arrange
            var mainPlayCheckers = new List <CheckerModel> {
                new CheckerModel(4, 6, PieceType.Queen, Side.White)
            };
            var secondPlayerCheckers = new List <CheckerModel>()
            {
                new CheckerModel(2, 4, PieceType.Checker, Side.Black),
                new CheckerModel(1, 1, PieceType.Checker, Side.Black),
                new CheckerModel(6, 4, PieceType.Checker, Side.Black),
            };
            DataProvider dataProvider = new DataProvider(mainPlayCheckers, secondPlayerCheckers);
            var          mainPlayer   = new MainPlayer(dataProvider, Side.White);
            var          robotPlayer  = new RobotPlayer(dataProvider, Side.Black);
            var          emptyPlayer  = new EmptyUserPlayer(dataProvider);
            var          game         = new RussianCheckers.Core.Game(mainPlayer, robotPlayer, emptyPlayer, dataProvider);

            //  Act
            game.ReCalculateNeighborsAndPaths();

            //  Assert
            var availablePaths = mainPlayer.CalculateAvailablePaths();

            Assert.AreEqual(5, availablePaths.Count());
        }
        public void GetWinnerSide_WhitePlayerHasNoAvailableMoves_BlackPlayerVictory()
        {
            //  Arrange
            var playerCheckersFirstPlayer = new List <CheckerModel> {
                new CheckerModel(0, 6, PieceType.Checker, Side.White)
            };
            var playerCheckersSecondPlayer = new List <CheckerModel> {
                new CheckerModel(1, 7, PieceType.Checker, Side.Black)
            };
            DataProvider dataProvider = new DataProvider(playerCheckersFirstPlayer, playerCheckersSecondPlayer);
            var          mainPlayer   = new MainPlayer(dataProvider, Side.White);
            var          robotPlayer  = new RobotPlayer(dataProvider, Side.Black);

            //  Act
            mainPlayer.CalculateNeighbors();
            robotPlayer.CalculateNeighbors();
            mainPlayer.CalculateAvailablePaths();
            robotPlayer.CalculateAvailablePaths();
            var  gameStatusChecker = new GameStatusChecker(mainPlayer, robotPlayer, new Stack <HistoryMove>());
            Side winnerSide        = gameStatusChecker.GetWinnerSide();

            //  Assert
            Assert.AreEqual(Side.Black, winnerSide);
        }