Files
ww/lib/ww/asttest.ww
Hojun-Cho 2338ea5d59 ww: lib tests run via -T test mode; bare mains retired (closes @test conversion)
'ww test' gains the istest build path (-T injection in build_one/
buildone) and do_test/dotest accept -I, mirroring do_run - both twins.
The 35 converted lib tests drop their interim bare mains (-T
synthesizes the entry from @test fns and rejects a user main); their
35 C run-drivers flip 'ww run' -> 'ww test'; 989_lib_byteid compiles
lib tests under -T (8 user-main probe fixtures stay non-T, gated on
the fixture field). Abort-on-first-failure stands until the deferred
record-and-continue harness lands with the multi-package arc.
2026-06-10 20:45:46 +09:00

103 lines
3.3 KiB
Plaintext

// asttest — functional-equivalence pin for [[nkname]] after the
// if-ladder → switch fold (struct fold S2). Run with
// `ww run lib/ww/asttest.ww`.
//
// nkname is checked against every nkind value (the full ladder the
// switch replaced) plus the out-of-band fallback ("?"). A failing row
// aborts via the assert/abort builtin (task #5 @test conversion).
// `package main` + bare `import ast` mirrors wwdump (the external
// astprint consumer).
package main;
import ast;
fn checkname(k: nkind, want: str) void = {
assert(!(nkname(k) != want));
};
// One row per nkind value — same string the if-ladder returned. The
// final row pins the unknown-kind fallback ("?").
@test fn nkname_cases() void = {
checkname(nkind.N_NONE, "none");
checkname(nkind.N_INTLIT, "int");
checkname(nkind.N_FLOATLIT, "float");
checkname(nkind.N_STRLIT, "str");
checkname(nkind.N_RUNELIT, "rune");
checkname(nkind.N_TRUE, "true");
checkname(nkind.N_FALSE, "false");
checkname(nkind.N_NIL, "nil");
checkname(nkind.N_IDENT, "id");
checkname(nkind.N_BIN, "bin");
checkname(nkind.N_UN, "un");
checkname(nkind.N_CALL, "call");
checkname(nkind.N_INDEX, "index");
checkname(nkind.N_DOT, "dot");
checkname(nkind.N_CAST, "cast");
checkname(nkind.N_STRUCTLIT, "structlit");
checkname(nkind.N_ARRLIT, "arrlit");
checkname(nkind.N_FIELD, "field");
checkname(nkind.N_ASSIGN, "assign");
checkname(nkind.N_ALLOC, "alloc");
checkname(nkind.N_FREE, "free");
checkname(nkind.N_RECV, "recv");
checkname(nkind.N_SLICE, "slice");
checkname(nkind.N_SPREAD, "spread");
checkname(nkind.N_BLOCK, "block");
checkname(nkind.N_EXPRSTMT, "exprstmt");
checkname(nkind.N_LET, "let");
checkname(nkind.N_RETURN, "return");
checkname(nkind.N_IF, "if");
checkname(nkind.N_FOR, "for");
checkname(nkind.N_FORRANGE, "forrange");
checkname(nkind.N_DEFER, "defer");
checkname(nkind.N_BREAK, "break");
checkname(nkind.N_CONTINUE, "continue");
checkname(nkind.N_SWITCH, "switch");
checkname(nkind.N_CASE, "case");
checkname(nkind.N_FILE, "file");
checkname(nkind.N_USE, "use");
checkname(nkind.N_DEF, "def");
checkname(nkind.N_TYPEDECL, "typedecl");
checkname(nkind.N_FNDECL, "fn");
checkname(nkind.N_PARAM, "param");
checkname(nkind.N_TNAME, "tname");
checkname(nkind.N_TPTR, "tptr");
checkname(nkind.N_TSLICE, "tslice");
checkname(nkind.N_TARRAY, "tarray");
checkname(nkind.N_TFN, "tfn");
checkname(nkind.N_TSTRUCT, "tstruct");
checkname(nkind.N_TFIELD, "tfield");
checkname(nkind.N_TCHAN, "tchan");
checkname(nkind.N_ATTR, "attr");
checkname(nkind.N_TTUPLE, "ttuple");
checkname(nkind.N_TTAGGED, "ttagged");
checkname(nkind.N_TUPLE, "tuple");
checkname(nkind.N_MATCH, "match");
checkname(nkind.N_MCASE, "mcase");
checkname(nkind.N_TRYPROP, "tryprop");
checkname(nkind.N_TRYUNW, "tryunw");
checkname(nkind.N_MLET, "mlet");
checkname(nkind.N_MASSIGN, "massign");
checkname(nkind.N_TYPETEST, "typetest");
checkname(nkind.N_TYPEASSERT, "typeassert");
checkname(nkind.N_VOIDLIT, "voidlit");
checkname(nkind.N_TBANG, "tbang");
checkname(nkind.N_YIELD, "yield");
checkname(nkind.N_TENUM, "tenum");
checkname(nkind.N_TENUMMEMBER, "tenummember");
checkname(nkind.N_TPARAM, "tparam");
checkname(nkind.N_LAST, "last");
// Unknown kind → the post-switch fallback. N_LAST is the highest
// named value (68); 69 is out of band, exercising the "?" tail.
checkname(69: nkind, "?");
};