summaryrefslogtreecommitdiff
path: root/tests/swiss.epd
diff options
context:
space:
mode:
authorScott Gasch <[email protected]>2026-09-16 00:08:27 -0700
committerScott Gasch <[email protected]>2026-09-16 00:08:27 -0700
commitb91c8453f3fe21c8ccd3568923d8e39141c9c945 (patch)
treeb908fea282ecd4075744590d3dfc88ffa903d943 /tests/swiss.epd
parentc0ac3d7845f60c7f6f2c3bfc306ceb0e4ac045ba (diff)
Add search self-tests (hash consistency, QSearch sanity) and a native EPD parser (`epd` command + ParseEpdRecord), fixing a silent-corruption bug in convert_epd.pl that broke every Black-to-move EPD conversion.
testsearch.c: TestSearchHashConsistency exercises the hash table through real search (repeat-with-warm-table and shallow-then-deep agreement) rather than synthetic store/probe calls. TestQSearchSanity checks termination and a node-count ceiling; its own header documents that the TEST=1 self-test build doesn't define PERF_COUNTERS, so it checks whole-search node count rather than the qsearch-only counter. A planned null-move zugzwang test was dropped in favor of tests/zugzwang.epd (best-move outcome, not an internal counter) after the three classic literature positions turned out not to structurally reach this engine's verification-search code path on this build. fen.c/script.c/command.c: new `epd <file>` command reads raw EPD directly via ParseEpdRecord, reusing ScriptCommand's existing suite-reporting machinery (factored into _ProcessSuiteLine/_PrintSuiteReport). Replaces the need for tests/convert_epd.pl, which had a real bug: its bm/am regex's [^b]+ filler breaks on any Black-to-move record (side-to-move field is literally "b"), and unscoped $fen/$id/$solution globals meant a failed match silently duplicated the previous record instead of erroring. tests/ep_to_epd.pl converts the existing setboard/solution/avoid/id/go suites back to real EPD; cross-checked ecm_ringers.ep_ via `script` against ecm_ringers.epd via `epd` -- byte-identical node counts and solve stats. Added .epd siblings for every genuine tactical suite in tests/. Added src/TESTING_PLAN.md: full audit of test*.c coverage gaps (dead SEE oracle, unwired eval/recognizer tests, zero hash-table correctness coverage, thin search self-tests) with a prioritized plan for closing them. Co-Authored-By: Claude Sonnet 5 <[email protected]>
Diffstat (limited to 'tests/swiss.epd')
-rw-r--r--tests/swiss.epd60
1 files changed, 60 insertions, 0 deletions
diff --git a/tests/swiss.epd b/tests/swiss.epd
new file mode 100644
index 0000000..36bf03f
--- /dev/null
+++ b/tests/swiss.epd
@@ -0,0 +1,60 @@
+r2qr1k1/pp3pbp/2n3p1/1N1p4/2P2Pb1/5N2/PP1QBPPP/2KR3R w - - am cxd5; id "ST3_05 - Koenigssicherheit";
+r2qr1k1/pp3pbp/2n3p1/1N1p4/2P2Pb1/5N2/PP1QBPPP/2KR3R w - - am cxd5; id "ST3_06 - Koenigssicherheit";
+2kr1nr1/pbp1qp2/1p2pn1p/8/3Pp2Q/P1P3N1/2PBBPPP/R3K2R w KQ - am O-O; id "ST3_07 - Koenigssicherheit";
+2kr1nr1/pbp1qp2/1p2pn1p/8/3Pp2Q/P1P3N1/2PBBPPP/R3K2R w KQ - am O-O; id "ST3_08 - Koenigssicherheit";
+2kr1nr1/pbp1qp2/1p2pn1p/8/3Pp2Q/P1P3N1/2PBBPPP/R3K2R w KQ - am O-O; id "ST3_09 - Koenigssicherheit";
+2kr1nr1/pbp1qp2/1p2pn1p/8/3Pp2Q/P1P3N1/2PBBPPP/R3K2R w KQ - am O-O; id "ST3_10 - Trojaner";
+2kr1nr1/pbp1qp2/1p2pn1p/8/3Pp2Q/P1P3N1/2PBBPPP/R3K2R w KQ - am O-O; id "ST3_11 - Trojaner";
+2kr1nr1/pbp1qp2/1p2pn1p/8/3Pp2Q/P1P3N1/2PBBPPP/R3K2R w KQ - am O-O; id "ST3_12 - Vergifteter Bauer";
+2kr1nr1/pbp1qp2/1p2pn1p/8/3Pp2Q/P1P3N1/2PBBPPP/R3K2R w KQ - am O-O; id "ST3_13 - Vergifteter Bauer";
+3r1rk1/4bppp/p1pq1n2/3p1P2/4p2B/2N5/PPP1QPPP/R3R1K1 w - - am Qxa6; id "ST3_14 - Vergifteter Bauer";
+r2q1r1k/1p2b1pp/p3Bn2/3N4/P2pP3/4p3/1PP3PP/R2Q1RK1 w - - am Qxd4; id "ST3_15 - Vergifteter Bauer";
+r2q1r1k/1p2b1pp/p3Bn2/3N4/P2pP3/4p3/1PP3PP/R2Q1RK1 w - - am Qxd4; id "ST3_16 - Vergifteter Bauer";
+r2q1r1k/1p2b1pp/p3Bn2/3N4/P2pP3/4p3/1PP3PP/R2Q1RK1 w - - am Qxd4; id "ST3_17 - Vergifteter Bauer";
+r2q1r1k/1p2b1pp/p3Bn2/3N4/P2pP3/4p3/1PP3PP/R2Q1RK1 w - - am Qxd4; id "ST3_18 - Vergifteter Bauer";
+r1bq1rk1/ppp1n1bp/3p4/3Ppnp1/2P1N3/1Q4BP/PP1NBPP1/R3K2R w KQ - am Nxg5; id "ST3_19 - Vergifteter Bauer";
+rn2r1k1/p1pq2pp/bp2p3/5p2/2PPQ3/B1PB4/P4PPP/R3K2R w KQ f6 am Qxa8; id "ST3_20 - Dame vs Tuerme";
+rn2r1k1/p1pq2pp/bp2p3/5p2/2PPQ3/B1PB4/P4PPP/R3K2R w KQ f6 am Qxa8; id "ST3_21 - Dame vs Tuerme";
+rn2r1k1/p1pq2pp/bp2p3/5p2/2PPQ3/B1PB4/P4PPP/R3K2R w KQ f6 am Qxa8; id "ST3_22 - Laeuferopfer";
+rn2r1k1/p1pq2pp/bp2p3/5p2/2PPQ3/B1PB4/P4PPP/R3K2R w KQ f6 am Qxa8; id "ST3_23 - Laeuferopfer";
+rn2r1k1/p1pq2pp/bp2p3/5p2/2PPQ3/B1PB4/P4PPP/R3K2R w KQ f6 am Qxa8; id "ST3_24 - Springeropfer";
+rn2r1k1/p1pq2pp/bp2p3/5p2/2PPQ3/B1PB4/P4PPP/R3K2R w KQ f6 am Qxa8; id "ST3_25 - Springeropfer";
+r5k1/1qr1bpp1/3pb1n1/4p1Pp/Np2P2P/1P1B1P2/P1P1Q3/BK1R3R w - - am Qe3; id "ST3_26 - Qualitaetsopfer";
+rn2kb1r/pp3p1p/2p2np1/3p1b2/3q1B2/1QN5/PP1NPPPP/R3KB1R w KQkq - am Qxb7; id "ST3_27 - Qualitaetsopfer";
+rn2kb1r/pp3p1p/2p2np1/3p1b2/3q1B2/1QN5/PP1NPPPP/R3KB1R w KQkq - am Qxb7; id "ST3_28 - Qualitaetsopfer";
+rn2kb1r/pp3p1p/2p2np1/3p1b2/3q1B2/1QN5/PP1NPPPP/R3KB1R w KQkq - am Qxb7; id "ST3_29 - Verteidigung";
+rn2kb1r/pp3p1p/2p2np1/3p1b2/3q1B2/1QN5/PP1NPPPP/R3KB1R w KQkq - am Qxb7; id "ST3_30 - Verteidigung";
+rn2kb1r/pp3p1p/2p2np1/3p1b2/3q1B2/1QN5/PP1NPPPP/R3KB1R w KQkq - am Qxb7; id "ST3_31 - Verteidigung";
+rn2kb1r/pp3p1p/2p2np1/3p1b2/3q1B2/1QN5/PP1NPPPP/R3KB1R w KQkq - am Qxb7; id "ST3_32 - Verteidigung";
+rn2kb1r/pp3p1p/2p2np1/3p1b2/3q1B2/1QN5/PP1NPPPP/R3KB1R w KQkq - am Qxb7; id "ST3_33 - Verteidigung";
+2r1qrk1/p3b1pp/4b3/1pP5/PQpP1p2/4B3/4BPPP/R4RK1 w - - am Bd2; id "ST3_34 - Verteidigung";
+1r5r/4qp1k/pn2p1b1/4P3/P4Q2/1R5P/1P2NPP1/3R2K1 w - - am Nd4 Qg4; id "ST3_35 - Verteidigung";
+r1bqkb1r/ppp2p1p/2n3p1/3np1NQ/2B5/8/PPPP1PPP/RNB1K2R w KQkq - am Qf3; id "ST3_36 - Verteidigung";
+N4bk1/5pp1/6qp/2n5/6b1/6P1/PP3KBP/2R1Q3 w - - am Qe3; id "ST3_37 - Verteidigung";
+4rrk1/q6p/8/p2P1p2/2PbB3/8/PPQ2N1P/5RK1 w - - am Bd3; id "ST3_38 - Verteidigung";
+2kr1b1r/pp1b3p/1qn1pp2/3p3n/2pPP1p1/2P2NB1/PPBN1PPP/RQ2K2R w KQ - am Nh4; id "ST3_39 - Verteidigung";
+3r1rk1/2q3p1/8/1p1bp3/8/PP4P1/4Q2P/R1B1R1K1 w - - am Bg5; id "ST3_40 - Verteidigung";
+1r2r1k1/Nb1n1ppp/4q3/8/2p1n3/P4Q2/BB3PPP/1R1R2K1 w - - am Nb5; id "ST3_41 - Verteidigung";
+r2qr1k1/pp3pp1/5n1p/2pPn3/2b5/1QP1B1PP/P3NPB1/R3R1K1 w - - am Qa3; id "ST3_42 - Verteidigung";
+r2qr1k1/pp3pp1/5n1p/2pPn3/2b5/1QP1B1PP/P3NPB1/R3R1K1 w - - am Qa3; id "ST3_43 - Verteidigung";
+r2qr1k1/pp3pp1/5n1p/2pPn3/2b5/1QP1B1PP/P3NPB1/R3R1K1 w - - am Qa3; id "ST3_44 - Endspiel B vs B";
+r2qr1k1/pp3pp1/5n1p/2pPn3/2b5/1QP1B1PP/P3NPB1/R3R1K1 w - - am Qa3; id "ST3_45 - Endspiel B vs B";
+r2qr1k1/pp3pp1/5n1p/2pPn3/2b5/1QP1B1PP/P3NPB1/R3R1K1 w - - am Qa3; id "ST3_46 - Endspiel B vs S";
+r2qr1k1/pp3pp1/5n1p/2pPn3/2b5/1QP1B1PP/P3NPB1/R3R1K1 w - - am Qa3; id "ST3_47 - Endspiel D vs D";
+r2qr1k1/pp3pp1/5n1p/2pPn3/2b5/1QP1B1PP/P3NPB1/R3R1K1 w - - am Qa3; id "ST3_48 - Endspiel D vs D";
+r2qr1k1/pp3pp1/5n1p/2pPn3/2b5/1QP1B1PP/P3NPB1/R3R1K1 w - - am Qa3; id "ST3_49 - Endspiel D&T vs D&T";
+r2qr1k1/pp3pp1/5n1p/2pPn3/2b5/1QP1B1PP/P3NPB1/R3R1K1 w - - am Qa3; id "ST3_50 - Endspiel L vs B";
+8/8/2p1K1p1/2k5/p7/P4BpP/1Pb3P1/8 w - - am Kd7; id "ST3_51 - Endspiel L vs L";
+8/8/2p1K1p1/2k5/p7/P4BpP/1Pb3P1/8 w - - am Kd7; id "ST3_52 - Endspiel L vs L";
+8/8/2p1K1p1/2k5/p7/P4BpP/1Pb3P1/8 w - - am Kd7; id "ST3_53 - Endspiel L vs L";
+6k1/4b3/4p1p1/8/6pP/4PN2/5K2/8 w - - am Ng5; id "ST3_54 - Endspiel S vs L";
+6k1/4b3/4p1p1/8/6pP/4PN2/5K2/8 w - - am Ng5; id "ST3_55 - Endspiel S&B vs L&S";
+6k1/4b3/4p1p1/8/6pP/4PN2/5K2/8 w - - am Ng5; id "ST3_56 - Endspiel T vs T";
+8/4k3/1R6/5p1p/3K1Pp1/P5r1/1P6/8 w - - am Rh6; id "ST3_57 - Endspiel T vs T";
+8/4k3/1R6/5p1p/3K1Pp1/P5r1/1P6/8 w - - am Rh6; id "ST3_58 - Endspiel T vs T";
+8/4k3/1R6/5p1p/3K1Pp1/P5r1/1P6/8 w - - am Rh6; id "ST3_59 - Endspiel T vs T";
+2r5/1R3PK1/p7/7p/8/1pk4P/8/8 w - - am f8=Q; id "ST3_60 - Endspiel T vs T";
+2r5/1R3PK1/p7/7p/8/1pk4P/8/8 w - - am f8=Q; id "ST3_61 - Endspiel T vs T";
+2r5/1R3PK1/p7/7p/8/1pk4P/8/8 w - - am f8=Q; id "ST3_62 - Endspiel T&L vs T&L";
+8/3b1p2/3Pk3/R1K4p/8/6r1/8/2B5 w - - am Ra3; id "ST3_63 - Endspiel T&L vs T&L";
+8/3b1p2/3Pk3/R1K4p/8/6r1/8/2B5 w - - am Ra3; id "ST3_64 - Endspiel T&L vs T&S";