add expected game result to test-real-pgn suite

Sun, 09 Aug 2026 14:34:23 +0200

author
Mike Becker <universe@uap-core.de>
date
Sun, 09 Aug 2026 14:34:23 +0200
changeset 171
09f18c3316f9
parent 170
bde99d803caf
child 172
ba1bf80d10cc

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'
     },

mercurial