public void GetLegalMoves_Should_ReturnAllLegalMoves(string fen, string from, string moves)
        {
            //	Arrange
            SUT board = new SUT(fen);
            List <ChessMove> legalMoves;
            List <string>    expectedMoves = new List <string>();

            //	Act
            foreach (string move in moves.Split(new char[] { ',' }))
            {
                expectedMoves.Add(move);
            }
            legalMoves = board.GetLegalMoves();

            //	Assert
            Assert.AreEqual(expectedMoves.Count, legalMoves.Count);
            foreach (ChessMove legalMove in legalMoves)
            {
                if (from == legalMove.From.AlgebraicNotation)
                {
                    bool found = false;
                    foreach (string expectedMove in expectedMoves)
                    {
                        if (expectedMove == legalMove.To.AlgebraicNotation)
                        {
                            found = true; break;
                        }
                    }
                    Assert.IsTrue(found);
                }
            }
        }
        public void GetLegalMoves_Should_ReturnEmptyList()
        {
            //	Arrange
            SUT board = new SUT("8/4p3/p3k3/P2R1R2/4K1p1/6P1/8/8 b - - 0 1");
            List <ChessMove> legalMoves;

            //	Act
            legalMoves = board.GetLegalMoves();

            //	Assert
            Assert.AreEqual(0, legalMoves.Count);
        }
        public void GetLegalMoves_Should_ReturnAllLegalMovesForInitialPosition()
        {
            //	Arrange
            SUT board = new SUT();
            List <ChessMove> legalMoves;

            //	Act
            legalMoves = board.GetLegalMoves();

            //	Assert
            Assert.AreEqual(20, legalMoves.Count);
        }
        public void GetMoveHistory_Should_Return_AllTheMoves()
        {
            //	Arrange
            SUT board = new SUT();
            List <ChessMove> playedMoves = new List <ChessMove>();

            ChessMove[]      moveHistory;
            int              moveCount  = 0;
            List <ChessMove> legalMoves = board.GetLegalMoves();

            System.Random randomizer = new System.Random(System.DateTime.Now.Second);

            //	Act
            do
            {
                var moveIndex = randomizer.Next(0, legalMoves.Count);
                board.Move(legalMoves[moveIndex]);
                playedMoves.Add(legalMoves[moveIndex]);

                legalMoves = board.GetLegalMoves();
                moveCount++;
            } while (legalMoves.Count > 0 && moveCount < 30);
            moveHistory = board.GetMoveHistory();

            //	Assert
            Assert.IsNotNull(moveHistory);
            Assert.AreEqual(playedMoves.Count, moveHistory.Length);
            for (int i = 0; i < moveHistory.Length; i++)
            {
                Assert.AreEqual(moveHistory[i].CapturedPiece, playedMoves[i].CapturedPiece);
                Assert.IsTrue(moveHistory[i].From == playedMoves[i].From);
                Assert.IsTrue(moveHistory[i].To == playedMoves[i].To);
                Assert.AreEqual(moveHistory[i].IsValid, playedMoves[i].IsValid);
                Assert.AreEqual(moveHistory[i].MoveKind, playedMoves[i].MoveKind);
                Assert.AreEqual(moveHistory[i].MovingPiece.Kind, playedMoves[i].MovingPiece.Kind);
                Assert.AreEqual(moveHistory[i].PromotedTo, playedMoves[i].PromotedTo);
                Assert.AreEqual(moveHistory[i].IllegalReason, playedMoves[i].IllegalReason);
            }
        }
        public void LegalMoves_Should_ReturnQueenSideCastle()
        {
            //	Arrange
            SUT board = new SUT("rnbqk2r/pppp1ppp/3b1n2/4p3/8/8/8/R3K3 w Qkq - 0 1");
            List <ChessMove> legalMoves;

            //	Act
            legalMoves = board.GetLegalMoves();

            //	Assert
            Assert.AreEqual(15, legalMoves.Count);
            bool found = false;

            foreach (ChessMove chessMove in legalMoves)
            {
                if (chessMove.MoveKind == ChessMoveType.QSide_Castle)
                {
                    found = true;
                }
            }
            Assert.IsTrue(found);
        }