// 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, "?"); };