Mechanical sweep of all .sx sources, plan docs, and tests/expected snapshots for the sx language rename (s8/s16/s32/s64 -> i8/i16/i32/i64). Verified: tools/run_tests.sh 23/23. Note: the ios-sim build has 2 pre-existing 'restart' dot-call errors from the sx opt-in UFCS change (sx a47ea14) — independent of this rename (present pre-sweep); migrated in the follow-up commit.
122 lines
3.3 KiB
Plaintext
122 lines
3.3 KiB
Plaintext
// Match-detection golden: run `find_matches` over several HAND-CRAFTED boards
|
|
// and snapshot the matched-cell set for each. Every board is built explicitly
|
|
// (no seeded init) on a checkerboard O/G background — which is itself run-free,
|
|
// since adjacent cells always differ — with the runs under test painted in the
|
|
// other gem colours. For each scene the board and its matched-cell dump are
|
|
// printed, and the matched-cell count is asserted independently of the dump.
|
|
#import "modules/std.sx";
|
|
#import "board.sx";
|
|
t :: #import "test.sx";
|
|
|
|
// Inverse of `gem_char`: map a gem character back to its Gem so each board can
|
|
// be written as a human-readable grid of GEM_CHARS.
|
|
char_to_gem :: (c: u8) -> Gem {
|
|
for 0..GEM_COUNT (i) {
|
|
if GEM_CHARS[i] == c { return cast(Gem) i; }
|
|
}
|
|
.red
|
|
}
|
|
|
|
// Build a scene: load an 8x8 board from `rows` (top row first, each exactly
|
|
// BOARD_COLS gem characters), detect matches, print board + matched dump, and
|
|
// assert the matched-cell count.
|
|
scene :: (name: string, rows: []string, want_count: i64) {
|
|
b : Board = ---;
|
|
for 0..BOARD_ROWS (row) {
|
|
line := rows[row];
|
|
for 0..BOARD_COLS (col) {
|
|
b.set(col, row, char_to_gem(line[col]));
|
|
}
|
|
}
|
|
|
|
m := find_matches(@b);
|
|
print("== {} ==\n", name);
|
|
out(board_dump(@b));
|
|
out("--\n");
|
|
out(dump_matches(@b, @m));
|
|
|
|
t.expect(m.count() == want_count, name);
|
|
}
|
|
|
|
main :: () -> i32 {
|
|
// Single horizontal 3-run (row 3, cols 2-4).
|
|
scene("horizontal-3", .[
|
|
"OGOGOGOG",
|
|
"GOGOGOGO",
|
|
"OGOGOGOG",
|
|
"GORRROGO",
|
|
"OGOGOGOG",
|
|
"GOGOGOGO",
|
|
"OGOGOGOG",
|
|
"GOGOGOGO",
|
|
], 3);
|
|
|
|
// Single vertical 3-run (col 5, rows 2-4).
|
|
scene("vertical-3", .[
|
|
"OGOGOGOG",
|
|
"GOGOGOGO",
|
|
"OGOGOBOG",
|
|
"GOGOGBGO",
|
|
"OGOGOBOG",
|
|
"GOGOGOGO",
|
|
"OGOGOGOG",
|
|
"GOGOGOGO",
|
|
], 3);
|
|
|
|
// Multiple disjoint runs: horizontal R (row 1, cols 0-2), horizontal P
|
|
// (row 5, cols 2-4), vertical Y (col 6, rows 4-6).
|
|
scene("disjoint-runs", .[
|
|
"OGOGOGOG",
|
|
"RRROGOGO",
|
|
"OGOGOGOG",
|
|
"GOGOGOGO",
|
|
"OGOGOGYG",
|
|
"GOPPPOYO",
|
|
"OGOGOGYG",
|
|
"GOGOGOGO",
|
|
], 9);
|
|
|
|
// A length-5 horizontal run (row 1, cols 1-5) and a length-4 vertical run
|
|
// (col 7, rows 2-5).
|
|
scene("len4-and-len5", .[
|
|
"OGOGOGOG",
|
|
"GRRRRRGO",
|
|
"OGOGOGOB",
|
|
"GOGOGOGB",
|
|
"OGOGOGOB",
|
|
"GOGOGOGB",
|
|
"OGOGOGOG",
|
|
"GOGOGOGO",
|
|
], 9);
|
|
|
|
// Intersecting shapes, shared cell counted once: an L (R horizontal row 1
|
|
// cols 1-3 meeting R vertical col 1 rows 1-3 at the corner (1,1)) and a T
|
|
// (Y horizontal row 5 cols 3-5 meeting Y vertical col 4 rows 5-7 at the
|
|
// mid/top cell (4,5)).
|
|
scene("L-and-T", .[
|
|
"OGOGOGOG",
|
|
"GRRRGOGO",
|
|
"OROGOGOG",
|
|
"GRGOGOGO",
|
|
"OGOGOGOG",
|
|
"GOGYYYGO",
|
|
"OGOGYGOG",
|
|
"GOGOYOGO",
|
|
], 10);
|
|
|
|
// No matches: the bare checkerboard, every adjacent pair differs.
|
|
scene("no-matches", .[
|
|
"OGOGOGOG",
|
|
"GOGOGOGO",
|
|
"OGOGOGOG",
|
|
"GOGOGOGO",
|
|
"OGOGOGOG",
|
|
"GOGOGOGO",
|
|
"OGOGOGOG",
|
|
"GOGOGOGO",
|
|
], 0);
|
|
|
|
print("ok: match detection over hand-crafted boards\n");
|
|
return 0;
|
|
}
|