public void Deserialize_ShouldSetBoardState_WhenValidStringGiven()
        {
            const string  FenString = "pQ4N1/3k3R/1r4n1/KbBbBppP/8/8/q7/7n";
            FenSerializer ser       = new FenSerializer();
            BoardState    actual;
            BoardState    expected = BoardState.Empty
                                     .SetPiece(MoveParser.ParseSquare("a8"), SquareContents.Black | SquareContents.Pawn)
                                     .SetPiece(MoveParser.ParseSquare("b8"), SquareContents.White | SquareContents.Queen)
                                     .SetPiece(MoveParser.ParseSquare("g8"), SquareContents.White | SquareContents.Knight)

                                     .SetPiece(MoveParser.ParseSquare("d7"), SquareContents.Black | SquareContents.King)
                                     .SetPiece(MoveParser.ParseSquare("h7"), SquareContents.White | SquareContents.Rook)

                                     .SetPiece(MoveParser.ParseSquare("b6"), SquareContents.Black | SquareContents.King)
                                     .SetPiece(MoveParser.ParseSquare("g6"), SquareContents.Black | SquareContents.Knight)

                                     .SetPiece(MoveParser.ParseSquare("a5"), SquareContents.White | SquareContents.King)
                                     .SetPiece(MoveParser.ParseSquare("b5"), SquareContents.Black | SquareContents.Bishop)
                                     .SetPiece(MoveParser.ParseSquare("c5"), SquareContents.White | SquareContents.Bishop)
                                     .SetPiece(MoveParser.ParseSquare("d5"), SquareContents.Black | SquareContents.Bishop)
                                     .SetPiece(MoveParser.ParseSquare("e5"), SquareContents.White | SquareContents.Bishop)
                                     .SetPiece(MoveParser.ParseSquare("f5"), SquareContents.Black | SquareContents.Pawn)
                                     .SetPiece(MoveParser.ParseSquare("g5"), SquareContents.Black | SquareContents.Pawn)
                                     .SetPiece(MoveParser.ParseSquare("h5"), SquareContents.White | SquareContents.Pawn)

                                     .SetPiece(MoveParser.ParseSquare("a2"), SquareContents.Black | SquareContents.Queen)
                                     .SetPiece(MoveParser.ParseSquare("h1"), SquareContents.Black | SquareContents.Knight);

            // Act
            actual = ser.Deserialize(FenString);

            Assert.That(expected.AllPieces, Is.EqualTo(actual.AllPieces));
            Assert.That(expected.WhitePieces, Is.EqualTo(actual.WhitePieces));
            Assert.That(expected.BlackPieces, Is.EqualTo(actual.BlackPieces));
        }
        public void Deserialize_ShouldThrowException_WhenTooLong()
        {
            var fenString = new string('0', 80);

            var serializer = new FenSerializer();

            Assert.That(() => serializer.Deserialize(fenString), Throws.ArgumentException);
        }
Exemple #3
0
        public void King_UnableMoveIntoPawnMovementPath(string fen, string move)
        {
            var serializer = new FenSerializer();
            var board      = serializer.Deserialize(fen);
            var game       = new Game(board, PieceColor.Black);

            var result = game.Move(move);

            Assert.That(result, Is.EqualTo(ErrorCondition.InvalidMovement));
        }
        public void Serialize_ShouldSerializeCorrectPosition()
        {
            var defaultFen = FenSerializer.DefaultValue;
            var board      = BoardState.DefaultPositions;

            var serializer = new FenSerializer();

            var actualValue = serializer.Serialize(board);

            Assert.AreEqual(defaultFen, actualValue);
        }
Exemple #5
0
        public AttackState Move_DetectsAttackState_ForPromotion(string position, string move)
        {
            var fen   = new FenSerializer();
            var board = fen.Deserialize(position);
            var game  = new Game(board, PieceColor.White);

            var error = game.Move(move);

            Assert.That(error, Is.EqualTo(ErrorCondition.None));

            return(game.AttackState);
        }
Exemple #6
0
        public void PawnPromotion_WillDetectCheckmate()
        {
            const string fen  = "rnb1kbnr/pppp1ppp/8/8/4q3/1P5P/P1PP1Kp1/RNBQ1BNR";
            const string move = "gxh1=N#";

            var fenBoard = new FenSerializer().Deserialize(fen);
            var game     = new Game(fenBoard, PieceColor.Black);

            var result = game.Move(move);

            Assert.That(result, Is.EqualTo(ErrorCondition.None));
            Assert.That(game.AttackState, Is.EqualTo(AttackState.Checkmate));
        }
Exemple #7
0
        public void GetValidMoves_DetectsWhenOnEdge(string position, string targetSq, string expectedSq)
        {
            var fen   = new FenSerializer();
            var board = fen.Deserialize(position);

            var target     = MoveParser.ParseSquare(targetSq);
            var targetMask = BitTranslator.TranslateToBit(target.File, target.Rank);

            var validMovesMask = MoveGenerator.GetBishopMovements(targetMask, board);
            var validMoves     = BitTranslator.TranslateToSquares(validMovesMask);

            var expected = MoveParser.ParseSquare(expectedSq);

            Assert.That(validMoves, Does.Contain(expected));
        }
Exemple #8
0
        public void PawnPromotion_WillClearPawnFromFinalSquare()
        {
            const string fen  = "rnb1kbnr/pppp1ppp/8/8/4q3/1P5P/P1PP1Kp1/RNBQ1BNR";
            const string move = "gxh1=N#";

            var fenBoard = new FenSerializer().Deserialize(fen);
            var game     = new Game(fenBoard, PieceColor.Black);

            var result = game.Move(move);

            var board = game.CurrentState.Board;

            var targetSquare = BitTranslator.TranslateToBit('h', 1);

            Assert.That(board.Pawns & targetSquare, Is.EqualTo(0));
            Assert.That(board.Knights & targetSquare, Is.EqualTo(targetSquare));

            Assert.That(board.WhitePieces & targetSquare, Is.EqualTo(0));
            Assert.That(board.BlackPieces & targetSquare, Is.EqualTo(targetSquare));
        }
        public async Task ReplayedGameMatchesExpectedFEN(string scenario)
        {
            var pgnSerializer = new PGNSerializer();

            using var stream = ResourceHelpers.GetEmbeddedPGNStream(scenario);
            var pgn = await pgnSerializer.DeserializeAsync(new StreamReader(stream));

            var expectedFen = Scenarios.FinalPositions[scenario];

            var game = new Game();

            foreach (var move in pgn.Moves)
            {
                var result = game.Move(move);
                Warn.If(result, Is.Not.EqualTo(ErrorCondition.None), $"Unexpected result for move {move}");
            }

            var fenSerializer = new FenSerializer();
            var actualFen     = fenSerializer.Serialize(game.CurrentState.Board);

            Assert.That(actualFen, Is.EqualTo(expectedFen));
        }
        public void Deserialize_ShouldThrowException_WhenInvalid(string fenString, string expectedMessage)
        {
            var serializer = new FenSerializer();

            Assert.That(() => serializer.Deserialize(fenString), Throws.InvalidOperationException.With.Message.EqualTo(expectedMessage));
        }
        public void Deserialize_ShouldThrowException_WhenEmpty()
        {
            var serializer = new FenSerializer();

            Assert.That(() => serializer.Deserialize(string.Empty), Throws.ArgumentNullException);
        }