#include "unittest.h" #include "board.h" int main() { { start_test_section("Bitboards"); unit_test(pop_count(0b01110) == 3, "Pop count of 01110 is 3"); } { start_test_section("Default FEN string"); Board board = parse_FEN("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"); unit_test(pop_count(board.pieces[PAWN] | board.pieces[PAWN | BLACK]) == 16, "There are 16 pawns total"); unit_test(pop_count(board.pieces[ROOK]) == 2, "There are 2 white rooks"); // TODO unit_test(board.side == WHITE, "Side to move is white"); unit_test(board.castling_rights == 0, "Both sides can castle"); unit_test(board.en_passant_square == 0, "No en passant move is avaialble"); } { start_test_section("Test knight attacks"); Bitboard attacks[64]; precompute_knight_attack_table(attacks); int max_attacks = 0; for (int i = 0; i < 64; i++) { int attack_count = pop_count(attacks[i]); if (attack_count > max_attacks) max_attacks = attack_count; } unit_test(max_attacks == 8, "Max amount of knight attacks should be 8"); unit_test( attacks[b7] == ((BIT << d8) | (BIT << d6) | (BIT << c5) | (BIT << a5)), "Knight on b7 attacks only d8, d6, c5, a5" ); } { start_test_section("Test king attacks"); Bitboard attacks[64]; precompute_king_attack_table(attacks); int max_attacks = 0; for (int i = 0; i < 64; i++) { int attack_count = pop_count(attacks[i]); if (attack_count > max_attacks) max_attacks = attack_count; } unit_test(max_attacks == 8, "Max amount of king attacks should be 8"); { U64 bit = 1; unit_test( attacks[h2] == ((BIT << h1) | (BIT << g1) | (BIT << g2) | (BIT << g3) | (BIT << h3)), "King on h2 attacks only h1, g1, g2, g3, h3" ); } } report(); return 0; }