Sun, 09 Aug 2026 14:34:23 +0200
add expected game result to test-real-pgn suite
| src/chess/rules.h | file | annotate | diff | comparison | revisions | |
| test/test-real-pgn.c | file | annotate | diff | comparison | revisions |
--- a/src/chess/rules.h Thu Aug 06 16:11:37 2026 +0200 +++ b/src/chess/rules.h Sun Aug 09 14:34:23 2026 +0200 @@ -144,6 +144,7 @@ bool checkmate; bool stalemate; bool threefold; + /** flag is only set when players agreed on remis */ bool remis; bool wresign; bool bresign;
--- a/test/test-real-pgn.c Thu Aug 06 16:11:37 2026 +0200 +++ b/test/test-real-pgn.c Sun Aug 09 14:34:23 2026 +0200 @@ -36,6 +36,30 @@ const char pgn_data[150][1500]; +/* we have no clock info here, resign also includes running out of clock */ +enum expected_result { + EXPECTED_WRESIGN, + EXPECTED_BRESIGN, + EXPECTED_CHECKMATE, + EXPECTED_STALEMATE, + EXPECTED_THREEFOLD, + EXPECTED_NOMATERIAL, +}; + +static CX_TEST_SUBROUTINE(verify_expected_result, + const GameState *gs, enum expected_result rs) { + CX_TEST_ASSERT(gs->wresign == (rs == EXPECTED_WRESIGN)); + CX_TEST_ASSERT(gs->bresign == (rs == EXPECTED_BRESIGN)); + CX_TEST_ASSERT(gs->stalemate == (rs == EXPECTED_STALEMATE)); + CX_TEST_ASSERT(gs->checkmate == (rs == EXPECTED_CHECKMATE)); + CX_TEST_ASSERT(gs->threefold == (rs == EXPECTED_THREEFOLD)); + CX_TEST_ASSERT(!gs->remis); /* no draw offers in example games */ + // TODO: implement insufficient material detection + + const Move *last_move = &gs->moves[gs->movecount-1]; + CX_TEST_ASSERT((last_move->checkmate == 1) == (rs == EXPECTED_CHECKMATE)); +} + static CX_TEST(test_real_pgn) { static unsigned index = 0; ++index; @@ -43,35 +67,14 @@ // TODO: fix that we need an initialized game state for parsing PGNs gamestate_init(&gamestate); CX_TEST_DO { - int result = parse_pgn(pgn_data[index-1], &gamestate); + const enum expected_result rs = pgn_data[index-1][0]; + const char *pgn = pgn_data[index-1]+1; + int result = parse_pgn(pgn, &gamestate); char msg[64]; sprintf(msg, "failed to parse game%03u.pgn: code %d, pos: %zu", index, result, pgn_error_position()); CX_TEST_ASSERTM(result == pgn_no_error, msg); - } - gamestate_cleanup(&gamestate); -} - -static CX_TEST_SUBROUTINE(test_real_pgn_stalemate_sub, - GameState *gamestate, int game) { - // TODO: fix that we need an initialized game state for parsing PGNs - gamestate_init(gamestate); - CX_TEST_ASSERT(0 == parse_pgn(pgn_data[game-1], gamestate)); - CX_TEST_ASSERT(gamestate->stalemate); - CX_TEST_ASSERT(!gamestate->wresign); - CX_TEST_ASSERT(!gamestate->bresign); - CX_TEST_ASSERT(!gamestate->checkmate); - CX_TEST_ASSERT(!gamestate->remis); - CX_TEST_ASSERT(!gamestate->threefold); - gamestate_cleanup(gamestate); -} - -static CX_TEST(test_real_pgn_stalemate) { - GameState gamestate; - CX_TEST_DO { - /* the below mentioned games end in stalemate position */ - CX_TEST_CALL_SUBROUTINE(test_real_pgn_stalemate_sub, &gamestate, 128); - CX_TEST_CALL_SUBROUTINE(test_real_pgn_stalemate_sub, &gamestate, 146); + CX_TEST_CALL_SUBROUTINE(verify_expected_result, &gamestate, rs); } gamestate_cleanup(&gamestate); } @@ -81,608 +84,757 @@ for (unsigned i = 0 ; i < 150 ; i++) { cx_test_register(suite, test_real_pgn); } - cx_test_register(suite, test_real_pgn_stalemate); return suite; } const char pgn_data[150][1500] = { { + EXPECTED_WRESIGN, #embed "data/game001.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game002.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game003.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game004.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game005.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game006.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game007.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game008.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game009.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game010.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game011.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game012.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game013.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game014.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game015.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game016.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game017.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game018.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game019.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game020.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game021.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game022.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game023.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game024.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game025.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game026.pgn" , '\0' }, { + EXPECTED_THREEFOLD, #embed "data/game027.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game028.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game029.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game030.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game031.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game032.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game033.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game034.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game035.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game036.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game037.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game038.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game039.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game040.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game041.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game042.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game043.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game044.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game045.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game046.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game047.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game048.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game049.pgn" , '\0' }, { + EXPECTED_THREEFOLD, #embed "data/game050.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game051.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game052.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game053.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game054.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game055.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game056.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game057.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game058.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game059.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game060.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game061.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game062.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game063.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game064.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game065.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game066.pgn" , '\0' }, { + EXPECTED_THREEFOLD, #embed "data/game067.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game068.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game069.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game070.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game071.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game072.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game073.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game074.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game075.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game076.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game077.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game078.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game079.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game080.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game081.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game082.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game083.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game084.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game085.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game086.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game087.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game088.pgn" , '\0' }, { + EXPECTED_NOMATERIAL, #embed "data/game089.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game090.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game091.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game092.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game093.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game094.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game095.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game096.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game097.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game098.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game099.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game100.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game101.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game102.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game103.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game104.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game105.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game106.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game107.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game108.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game109.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game110.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game111.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game112.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game113.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game114.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game115.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game116.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game117.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game118.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game119.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game120.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game121.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game122.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game123.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game124.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game125.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game126.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game127.pgn" , '\0' }, { + EXPECTED_STALEMATE, #embed "data/game128.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game129.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game130.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game131.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game132.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game133.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game134.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game135.pgn" , '\0' }, { + EXPECTED_CHECKMATE, #embed "data/game136.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game137.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game138.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game139.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game140.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game141.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game142.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game143.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game144.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game145.pgn" , '\0' }, { + EXPECTED_STALEMATE, #embed "data/game146.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game147.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game148.pgn" , '\0' }, { + EXPECTED_WRESIGN, #embed "data/game149.pgn" , '\0' }, { + EXPECTED_BRESIGN, #embed "data/game150.pgn" , '\0' },