public void TestCreateUIntMask() { var uciStream = new UciStream(); var mask = Bitwise.CreateUIntMask(7, 11); uciStream.WriteMessageLine(Bitwise.ToString(mask)); Assert.That(Bitwise.ToString(mask), Is.EqualTo("00000000_00000000_00001111_10000000")); }
public void TestStartPosition() { var uciStream = new UciStream(); var board = uciStream.Board; board.SetPosition(Board.StartPositionFen); uciStream.WriteMessageLine(board.ToString()); // Validate integrity of board and occupancy of every square. board.AssertIntegrity(); Assert.That(board.CurrentPosition.GetPiece(Square.a8), Is.EqualTo(Piece.BlackRook)); Assert.That(board.CurrentPosition.GetPiece(Square.b8), Is.EqualTo(Piece.BlackKnight)); Assert.That(board.CurrentPosition.GetPiece(Square.c8), Is.EqualTo(Piece.BlackBishop)); Assert.That(board.CurrentPosition.GetPiece(Square.d8), Is.EqualTo(Piece.BlackQueen)); Assert.That(board.CurrentPosition.GetPiece(Square.e8), Is.EqualTo(Piece.BlackKing)); Assert.That(board.CurrentPosition.GetPiece(Square.f8), Is.EqualTo(Piece.BlackBishop)); Assert.That(board.CurrentPosition.GetPiece(Square.g8), Is.EqualTo(Piece.BlackKnight)); Assert.That(board.CurrentPosition.GetPiece(Square.h8), Is.EqualTo(Piece.BlackRook)); var square = Square.a7; do { Assert.That(board.CurrentPosition.GetPiece(square), Is.EqualTo(Piece.BlackPawn)); square++; } while (square <= Square.h7); do { Assert.That(board.CurrentPosition.GetPiece(square), Is.EqualTo(Piece.None)); square++; } while (square <= Square.h3); do { Assert.That(board.CurrentPosition.GetPiece(square), Is.EqualTo(Piece.WhitePawn)); square++; } while (square <= Square.h2); Assert.That(board.CurrentPosition.GetPiece(Square.a1), Is.EqualTo(Piece.WhiteRook)); Assert.That(board.CurrentPosition.GetPiece(Square.b1), Is.EqualTo(Piece.WhiteKnight)); Assert.That(board.CurrentPosition.GetPiece(Square.c1), Is.EqualTo(Piece.WhiteBishop)); Assert.That(board.CurrentPosition.GetPiece(Square.d1), Is.EqualTo(Piece.WhiteQueen)); Assert.That(board.CurrentPosition.GetPiece(Square.e1), Is.EqualTo(Piece.WhiteKing)); Assert.That(board.CurrentPosition.GetPiece(Square.f1), Is.EqualTo(Piece.WhiteBishop)); Assert.That(board.CurrentPosition.GetPiece(Square.g1), Is.EqualTo(Piece.WhiteKnight)); Assert.That(board.CurrentPosition.GetPiece(Square.h1), Is.EqualTo(Piece.WhiteRook)); // Validate piece counts. Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhitePawns), Is.EqualTo(8)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhiteKnights), Is.EqualTo(2)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhiteBishops), Is.EqualTo(2)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhiteRooks), Is.EqualTo(2)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhiteQueens), Is.EqualTo(1)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhiteKing), Is.EqualTo(1)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackPawns), Is.EqualTo(8)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackKnights), Is.EqualTo(2)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackBishops), Is.EqualTo(2)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackRooks), Is.EqualTo(2)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackQueens), Is.EqualTo(1)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackKing), Is.EqualTo(1)); }
public void TestKingRingMasks() { // TODO: Assert in king ring mask tests. // King on e8. var uciStream = new UciStream(); var square = "e8"; var mask = Board.InnerRingMasks[Board.GetSquare(square)]; uciStream.WriteMessageLine($"King on {square} inner ring mask = "); uciStream.WriteMessageLine(Position.ToString(mask)); mask = Board.OuterRingMasks[Board.GetSquare(square)]; uciStream.WriteMessageLine($"King on {square} outer ring mask = "); uciStream.WriteMessageLine(Position.ToString(mask)); // King on c3. square = "c3"; mask = Board.InnerRingMasks[Board.GetSquare(square)]; uciStream.WriteMessageLine($"King on {square} inner ring mask = "); uciStream.WriteMessageLine(Position.ToString(mask)); mask = Board.OuterRingMasks[Board.GetSquare(square)]; uciStream.WriteMessageLine($"King on {square} outer ring mask = "); uciStream.WriteMessageLine(Position.ToString(mask)); }
public void TestBishopOnE7Moves() { var uciStream = new UciStream(); var board = uciStream.Board; board.SetPosition("rnbq1bnr/ppppkppp/4p3/8/8/BP6/P1PPPPPP/RN1QKBNR b KQ - 0 3"); var unoccupiedMovesMask = Board.BishopMoveMasks[Square.e7]; var expectedUnoccupiedMovesMask = 0ul; Bitwise.SetBit(ref expectedUnoccupiedMovesMask, Square.d8); Bitwise.SetBit(ref expectedUnoccupiedMovesMask, Square.f8); Bitwise.SetBit(ref expectedUnoccupiedMovesMask, Square.d6); Bitwise.SetBit(ref expectedUnoccupiedMovesMask, Square.f6); Bitwise.SetBit(ref expectedUnoccupiedMovesMask, Square.c5); Bitwise.SetBit(ref expectedUnoccupiedMovesMask, Square.g5); Bitwise.SetBit(ref expectedUnoccupiedMovesMask, Square.b4); Bitwise.SetBit(ref expectedUnoccupiedMovesMask, Square.h4); Bitwise.SetBit(ref expectedUnoccupiedMovesMask, Square.a3); var relevantMoveDestinations = unoccupiedMovesMask & PrecalculatedMoves.GetRelevantOccupancy(Square.e7, false); uciStream.WriteMessageLine("Relevant move destinations = "); uciStream.WriteMessageLine(Position.ToString(relevantMoveDestinations)); uciStream.WriteMessageLine(); ulong expectedRelevantMoveDestinations = 0; Bitwise.SetBit(ref expectedRelevantMoveDestinations, Square.d6); Bitwise.SetBit(ref expectedRelevantMoveDestinations, Square.f6); Bitwise.SetBit(ref expectedRelevantMoveDestinations, Square.c5); Bitwise.SetBit(ref expectedRelevantMoveDestinations, Square.g5); Bitwise.SetBit(ref expectedRelevantMoveDestinations, Square.b4); uciStream.WriteMessageLine("Expected relevant move destinations = "); uciStream.WriteMessageLine(Position.ToString(relevantMoveDestinations)); uciStream.WriteMessageLine(); Assert.That(relevantMoveDestinations, Is.EqualTo(expectedRelevantMoveDestinations)); Direction[] bishopDirections = { Direction.NorthEast, Direction.SouthEast, Direction.SouthWest, Direction.NorthWest }; var bishopDestinations = Board.CreateMoveDestinationsMask(Square.e7, board.CurrentPosition.Occupancy, bishopDirections); uciStream.WriteMessageLine("Bishop destinations = "); uciStream.WriteMessageLine(Position.ToString(bishopDestinations)); uciStream.WriteMessageLine(); var expectedBishopDestinations = 0ul; Bitwise.SetBit(ref expectedBishopDestinations, Square.d8); Bitwise.SetBit(ref expectedBishopDestinations, Square.f8); Bitwise.SetBit(ref expectedBishopDestinations, Square.d6); Bitwise.SetBit(ref expectedBishopDestinations, Square.f6); Bitwise.SetBit(ref expectedBishopDestinations, Square.c5); Bitwise.SetBit(ref expectedBishopDestinations, Square.g5); Bitwise.SetBit(ref expectedBishopDestinations, Square.b4); Bitwise.SetBit(ref expectedBishopDestinations, Square.h4); Bitwise.SetBit(ref expectedBishopDestinations, Square.a3); uciStream.WriteMessageLine("Expected bishop destinations = "); uciStream.WriteMessageLine(Position.ToString(expectedBishopDestinations)); uciStream.WriteMessageLine(); Assert.That(bishopDestinations, Is.EqualTo(expectedBishopDestinations)); var precalculatedBishopDestinations = Board.PrecalculatedMoves.GetBishopMovesMask(Square.e7, board.CurrentPosition.Occupancy); uciStream.WriteMessageLine("Precalculated bishop destinations = "); uciStream.WriteMessageLine(Position.ToString(precalculatedBishopDestinations)); uciStream.WriteMessageLine(); Assert.That(precalculatedBishopDestinations, Is.EqualTo(expectedBishopDestinations)); }
public void TestWac11Position() { var uciStream = new UciStream(); var board = uciStream.Board; board.SetPosition("r1b1kb1r/3q1ppp/pBp1pn2/8/Np3P2/5B2/PPP3PP/R2Q1RK1 w kq -"); uciStream.WriteMessageLine(board.ToString()); // Validate integrity of board and occupancy of every square. board.AssertIntegrity(); Assert.That(board.CurrentPosition.GetPiece(Square.a8), Is.EqualTo(Piece.BlackRook)); Assert.That(board.CurrentPosition.GetPiece(Square.b8), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.c8), Is.EqualTo(Piece.BlackBishop)); Assert.That(board.CurrentPosition.GetPiece(Square.d8), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.e8), Is.EqualTo(Piece.BlackKing)); Assert.That(board.CurrentPosition.GetPiece(Square.f8), Is.EqualTo(Piece.BlackBishop)); Assert.That(board.CurrentPosition.GetPiece(Square.g8), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.h8), Is.EqualTo(Piece.BlackRook)); Assert.That(board.CurrentPosition.GetPiece(Square.a7), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.b7), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.c7), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.d7), Is.EqualTo(Piece.BlackQueen)); Assert.That(board.CurrentPosition.GetPiece(Square.e7), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.f7), Is.EqualTo(Piece.BlackPawn)); Assert.That(board.CurrentPosition.GetPiece(Square.g7), Is.EqualTo(Piece.BlackPawn)); Assert.That(board.CurrentPosition.GetPiece(Square.h7), Is.EqualTo(Piece.BlackPawn)); Assert.That(board.CurrentPosition.GetPiece(Square.a6), Is.EqualTo(Piece.BlackPawn)); Assert.That(board.CurrentPosition.GetPiece(Square.b6), Is.EqualTo(Piece.WhiteBishop)); Assert.That(board.CurrentPosition.GetPiece(Square.c6), Is.EqualTo(Piece.BlackPawn)); Assert.That(board.CurrentPosition.GetPiece(Square.d6), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.e6), Is.EqualTo(Piece.BlackPawn)); Assert.That(board.CurrentPosition.GetPiece(Square.f6), Is.EqualTo(Piece.BlackKnight)); Assert.That(board.CurrentPosition.GetPiece(Square.g6), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.h6), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.a5), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.b5), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.c5), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.d5), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.e5), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.f5), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.g5), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.h5), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.a4), Is.EqualTo(Piece.WhiteKnight)); Assert.That(board.CurrentPosition.GetPiece(Square.b4), Is.EqualTo(Piece.BlackPawn)); Assert.That(board.CurrentPosition.GetPiece(Square.c4), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.d4), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.e4), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.f4), Is.EqualTo(Piece.WhitePawn)); Assert.That(board.CurrentPosition.GetPiece(Square.g4), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.h4), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.a3), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.b3), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.c3), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.d3), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.e3), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.f3), Is.EqualTo(Piece.WhiteBishop)); Assert.That(board.CurrentPosition.GetPiece(Square.g3), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.h3), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.a2), Is.EqualTo(Piece.WhitePawn)); Assert.That(board.CurrentPosition.GetPiece(Square.b2), Is.EqualTo(Piece.WhitePawn)); Assert.That(board.CurrentPosition.GetPiece(Square.c2), Is.EqualTo(Piece.WhitePawn)); Assert.That(board.CurrentPosition.GetPiece(Square.d2), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.e2), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.f2), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.g2), Is.EqualTo(Piece.WhitePawn)); Assert.That(board.CurrentPosition.GetPiece(Square.h2), Is.EqualTo(Piece.WhitePawn)); Assert.That(board.CurrentPosition.GetPiece(Square.a1), Is.EqualTo(Piece.WhiteRook)); Assert.That(board.CurrentPosition.GetPiece(Square.b1), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.c1), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.d1), Is.EqualTo(Piece.WhiteQueen)); Assert.That(board.CurrentPosition.GetPiece(Square.e1), Is.EqualTo(Piece.None)); Assert.That(board.CurrentPosition.GetPiece(Square.f1), Is.EqualTo(Piece.WhiteRook)); Assert.That(board.CurrentPosition.GetPiece(Square.g1), Is.EqualTo(Piece.WhiteKing)); Assert.That(board.CurrentPosition.GetPiece(Square.h1), Is.EqualTo(Piece.None)); // Validate piece counts. Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhitePawns), Is.EqualTo(6)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhiteKnights), Is.EqualTo(1)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhiteBishops), Is.EqualTo(2)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhiteRooks), Is.EqualTo(2)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhiteQueens), Is.EqualTo(1)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.WhiteKing), Is.EqualTo(1)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackPawns), Is.EqualTo(7)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackKnights), Is.EqualTo(1)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackBishops), Is.EqualTo(2)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackRooks), Is.EqualTo(2)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackQueens), Is.EqualTo(1)); Assert.That(Bitwise.CountSetBits(board.CurrentPosition.BlackKing), Is.EqualTo(1)); }