diff --git a/src/all_moves_functions.cpp b/src/all_moves_functions.cpp index b918e79..72e1d89 100644 --- a/src/all_moves_functions.cpp +++ b/src/all_moves_functions.cpp @@ -51,21 +51,39 @@ void _add_if_not_blocked(int pos, int from, std::vector *pns, std::array *pns, std::array *board, Color color_of_piece, Color color_of_opposite, int en_passant){ - if (is_valid_position(pos) && (_xy_is_color(pos, board, color_of_opposite) || - pos == en_passant)){ - pns->push_back(make_move(from, pos)); +void _pawn_diag_add_if_not_blocked(int pos, int from, std::vector *pns, std::array *board, Color color_of_piece, Color color_of_opposite, int en_passant, int promoting){ + if (is_valid_position(pos)){ + if (_xy_is_color(pos, board, color_of_opposite)){ + if (promoting){ + if (color_of_piece == Color::WHITE){ + pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::W_KNIGHT)); + pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::W_BISHOP)); + pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::W_ROOK)); + pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::W_QUEEN)); + } else { + pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::B_KNIGHT)); + pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::B_BISHOP)); + pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::B_ROOK)); + pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::B_QUEEN)); + } + } else { + pns->push_back(make_move(from, pos)); + } + } else if (pos == en_passant){ + pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::NONE, 1)); + } } } + // This is a specialized functions for the pawn's inability to take going forward. // Notice the lack of push_backion where there usually is when (x,y) is a different color. -void _pawn_add_if_not_blocked(int pos, int from, std::vector *pns, std::array *board, Color color_of_piece, Color color_of_opposite, bool *is_not_blocked){ +void _pawn_add_if_not_blocked(int pos, int from, std::vector *pns, std::array *board, Color color_of_piece, Color color_of_opposite, bool *is_not_blocked, bool double_move){ if (*is_not_blocked){ if ((*board)[pos] != PieceType::NONE || (*board)[pos] == PieceType::INV){ *is_not_blocked = false; } else { - pns->push_back(make_move(from, pos)); + double_move?pns->push_back(make_move(from, pos, PieceType::NONE, PieceType::NONE, PieceType::NONE, 1)):pns->push_back(make_move(from, pos)); } } } @@ -159,14 +177,16 @@ void _get_all_moves_pawn(int pos, std::vector *pns, std::array en_passant_flags = {0, 1}; + CHECK(get_to_squares(en_pass_moves) == EN_PASSANT_TEST_MOVES); + CHECK(get_en_passant_flags(en_pass_moves) == en_passant_flags); CHECK(get_to_squares(get_all_moves(NO_EN_PASSANT_TEST_POS, NO_EN_PASSANT_TEST_BOARD)) == NO_EN_PASSANT_TEST_MOVES); } + +TEST_CASE("Test for pawn promotions.", "[get_all_moves]"){ + auto prom_moves = get_all_moves(PROM_PAWN_POS, PROM_PAWN_BOARD); + CHECK(get_to_squares(prom_moves) == PROM_PAWN_MOVES); + CHECK(get_promoted_pieces(prom_moves) == PROM_PAWN_PROMS); + auto bprom_moves = get_all_moves(PROM_BPAWN_POS, PROM_BPAWN_BOARD); + CHECK(get_to_squares(bprom_moves) == PROM_BPAWN_MOVES); + CHECK(get_promoted_pieces(bprom_moves) == PROM_BPAWN_PROMS); +} diff --git a/tests/valid_moves.h b/tests/valid_moves.h index 703fa17..73f12b2 100644 --- a/tests/valid_moves.h +++ b/tests/valid_moves.h @@ -170,6 +170,56 @@ const std::array EN_PASSANT_TEST_BOARD = { const std::vector EN_PASSANT_TEST_MOVES = { D6, E6 }; +// Test pawn promotion +const int PROM_PAWN_POS = G7; +const std::array PROM_PAWN_BOARD = { + INV, INV, INV, INV, INV, INV, INV, INV, INV, INV, + INV, INV, INV, INV, INV, INV, INV, INV, INV, INV, + INV, B_ROOK, B_KNIGHT, B_BISHOP, B_QUEEN, B_KING, B_BISHOP, B_KNIGHT, B_ROOK,INV, + INV, B_PAWN, B_PAWN, B_PAWN, NONE, B_PAWN, B_PAWN, W_PAWN, B_PAWN,INV, + INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,INV, + INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,INV, + INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,INV, + INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,INV, + INV, W_PAWN, W_PAWN, W_PAWN, NONE, W_PAWN, W_PAWN, W_PAWN, W_PAWN,INV, + INV, W_ROOK, W_KNIGHT, W_BISHOP, W_QUEEN, W_KING, W_BISHOP, W_KNIGHT, W_ROOK, INV, + INV, INV, INV, INV, INV, INV, INV, INV, INV, INV, + INV, INV, INV, INV, INV, INV, INV, INV, INV, INV +}; +const std::vector PROM_PAWN_MOVES = { + H8, H8, H8, H8, + F8, F8, F8, F8 +}; +const std::vector PROM_PAWN_PROMS = { + W_KNIGHT, W_BISHOP, W_ROOK, W_QUEEN, + W_KNIGHT, W_BISHOP, W_ROOK, W_QUEEN +}; + +// Black pawn promotion +const int PROM_BPAWN_POS = B2; +const std::array PROM_BPAWN_BOARD = { + INV, INV, INV, INV, INV, INV, INV, INV, INV, INV, + INV, INV, INV, INV, INV, INV, INV, INV, INV, INV, + INV, B_ROOK, B_KNIGHT, B_BISHOP, B_QUEEN, B_KING, B_BISHOP, B_KNIGHT, B_ROOK,INV, + INV, B_PAWN, B_PAWN, B_PAWN, NONE, B_PAWN, B_PAWN, B_PAWN, B_PAWN,INV, + INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,INV, + INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,INV, + INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,INV, + INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,INV, + INV, W_PAWN, B_PAWN, W_PAWN, NONE, W_PAWN, W_PAWN, W_PAWN, W_PAWN,INV, + INV, W_ROOK, W_KNIGHT, W_BISHOP, W_QUEEN, W_KING, W_BISHOP, W_KNIGHT, W_ROOK, INV, + INV, INV, INV, INV, INV, INV, INV, INV, INV, INV, + INV, INV, INV, INV, INV, INV, INV, INV, INV, INV +}; +const std::vector PROM_BPAWN_MOVES = { + C1, C1, C1, C1, + A1, A1, A1, A1 +}; + +const std::vector PROM_BPAWN_PROMS = { + B_KNIGHT, B_BISHOP, B_ROOK, B_QUEEN, + B_KNIGHT, B_BISHOP, B_ROOK, B_QUEEN +}; const int NO_EN_PASSANT_TEST_POS = D5; const std::array NO_EN_PASSANT_TEST_BOARD = { @@ -187,3 +237,27 @@ const std::array NO_EN_PASSANT_TEST_BOARD = { INV, INV, INV, INV, INV, INV, INV, INV, INV, INV }; const std::vector NO_EN_PASSANT_TEST_MOVES = {D6}; + +// Castling tests +const int CASTLING_POS = E1; +const std::array CASTLING_BOARD = { + INV, INV, INV, INV, INV, INV, INV, INV, INV, INV, + INV, INV, INV, INV, INV, INV, INV, INV, INV, INV, + INV, B_ROOK, NONE, NONE, NONE, B_KING, NONE, NONE, B_ROOK, INV, + INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, INV, + INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, INV, + INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, INV, + INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, INV, + INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, INV, + INV, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, INV, + INV, W_ROOK, NONE, NONE, NONE, W_KING, NONE, NONE, W_ROOK, INV, + INV, INV, INV, INV, INV, INV, INV, INV, INV, INV, + INV, INV, INV, INV, INV, INV, INV, INV, INV, INV +}; + +// Should NOT inclde D7 +const std::vector CASTLING_MOVES = { + D1, D2, E2, F2, F1, + C1, G1 +}; +