lib misc+ww tests: hand-main plumbing -> assert (@test conversion B7)

toktest documents the per-row signalled pinpoint loss.
This commit is contained in:
2026-06-10 18:52:53 +09:00
parent eb891f4007
commit 3e2bf0612e
8 changed files with 797 additions and 858 deletions

View File

@@ -26,19 +26,6 @@ import io;
import memio;
import strings;
// Direct exit(2) binding rather than `use os;` — os exports
// read/write/close, mirroring memio's reasoning (task #7).
@symbol("rt_syscall") fn syscall1ww(num: i64, a: i64) i64;
fn doexit(code: i32) void = {
syscall1ww(60i64, code: i64);
};
// signalled — bumped by main before each test so a failing exit code
// pinpoints the offending case.
let signalled: i32 = 0;
fn fail() void = { doexit(signalled + 10); };
fn streq(a: str, b: str) bool = {
if (a.len != b.len) { return false; };
let i: i32 = 0;
@@ -68,10 +55,10 @@ fn streq(a: str, b: str) bool = {
let r: (void | getopt.error) = getopt.tryparse(&cmd, argv[0:3], helps[0:5]);
match (r) {
case void => {};
case let e: getopt.error => fail();
case let e: getopt.error => abort();
};
if (cmd.optslen != 4) { fail(); };
assert(!(cmd.optslen != 4));
// (wantflag, wantval) parallel arrays, indexed by option order.
let wantf: [4]u8;
@@ -84,13 +71,13 @@ fn streq(a: str, b: str) bool = {
let i: i32 = 0;
for (i < 4) {
let p: *getopt.option = &cmd.optsptr[i];
if ((p.flag: u8) != wantf[i]) { fail(); };
if (!streq(p.value, wantv[i])) { fail(); };
assert(!((p.flag: u8) != wantf[i]));
assert(!(!streq(p.value, wantv[i])));
i += 1;
};
if (cmd.argslen != 1) { fail(); };
if (!streq(cmd.argsptr[0], "files.txt")) { fail(); };
assert(!(cmd.argslen != 1));
assert(!(!streq(cmd.argsptr[0], "files.txt")));
getopt.finish(&cmd);
};
@@ -114,10 +101,10 @@ fn streq(a: str, b: str) bool = {
let r: (void | getopt.error) = getopt.tryparse(&cmd, argv[0:5], helps[0:3]);
match (r) {
case void => {};
case let e: getopt.error => fail();
case let e: getopt.error => abort();
};
if (cmd.optslen != 2) { fail(); };
assert(!(cmd.optslen != 2));
let wantf: [2]u8;
let wantv: [2]str;
@@ -127,13 +114,13 @@ fn streq(a: str, b: str) bool = {
let i: i32 = 0;
for (i < 2) {
let p: *getopt.option = &cmd.optsptr[i];
if ((p.flag: u8) != wantf[i]) { fail(); };
if (!streq(p.value, wantv[i])) { fail(); };
assert(!((p.flag: u8) != wantf[i]));
assert(!(!streq(p.value, wantv[i])));
i += 1;
};
if (cmd.argslen != 1) { fail(); };
if (!streq(cmd.argsptr[0], "-")) { fail(); };
assert(!(cmd.argslen != 1));
assert(!(!streq(cmd.argsptr[0], "-")));
getopt.finish(&cmd);
};
@@ -177,12 +164,12 @@ fn streq(a: str, b: str) bool = {
let r: (void | getopt.error) = getopt.tryparse(&cmd, argv, helps[0:2]);
match (r) {
case void => {};
case let e: getopt.error => fail();
case let e: getopt.error => abort();
};
if (cmd.optslen != wantopts[i]) { fail(); };
if (cmd.argslen != wantargs[i]) { fail(); };
assert(!(cmd.optslen != wantopts[i]));
assert(!(cmd.argslen != wantargs[i]));
if (cmd.argslen > 0) {
if (!streq(cmd.argsptr[0], wantarg0[i])) { fail(); };
assert(!(!streq(cmd.argsptr[0], wantarg0[i])));
};
getopt.finish(&cmd);
i += 1;
@@ -204,18 +191,18 @@ fn streq(a: str, b: str) bool = {
let r: (void | getopt.error) = getopt.tryparse(&cmd, argv[0:2], helps[0:2]);
match (r) {
case void => {};
case let e: getopt.error => fail();
case let e: getopt.error => abort();
};
if (cmd.optslen != 3) { fail(); };
assert(!(cmd.optslen != 3));
let i: i32 = 0;
for (i < 3) {
let p: *getopt.option = &cmd.optsptr[i];
if ((p.flag: u8) != ('v': u8)) { fail(); };
if (p.value.len != 0) { fail(); };
assert(!((p.flag: u8) != ('v': u8)));
assert(!(p.value.len != 0));
i += 1;
};
if (cmd.argslen != 0) { fail(); };
assert(!(cmd.argslen != 0));
getopt.finish(&cmd);
};
@@ -257,13 +244,13 @@ fn streq(a: str, b: str) bool = {
let r: (void | getopt.error) = getopt.tryparse(&cmd, argv, helps[0:2]);
match (r) {
case void => {};
case let e: getopt.error => fail();
case let e: getopt.error => abort();
};
if (cmd.optslen != wantopts[i]) { fail(); };
if (cmd.argslen != wantargs[i]) { fail(); };
assert(!(cmd.optslen != wantopts[i]));
assert(!(cmd.argslen != wantargs[i]));
// First positional is always the bare "-" in these rows.
if (cmd.argslen > 0) {
if (!streq(cmd.argsptr[0], "-")) { fail(); };
assert(!(!streq(cmd.argsptr[0], "-")));
};
getopt.finish(&cmd);
i += 1;
@@ -307,11 +294,11 @@ fn streq(a: str, b: str) bool = {
let cmd: getopt.command;
let r: (void | getopt.error) = getopt.tryparse(&cmd, argv, helps[0:3]);
match (r) {
case void => fail();
case void => abort();
case let e: getopt.error => {
if ((e.kind: i32) != wantk[i]) { fail(); };
if ((e.flag: u8) != wantf[i]) { fail(); };
if (!streq(e.name, "prog")) { fail(); };
assert(!((e.kind: i32) != wantk[i]));
assert(!((e.flag: u8) != wantf[i]));
assert(!(!streq(e.name, "prog")));
};
};
getopt.finish(&cmd);
@@ -340,7 +327,7 @@ fn streq(a: str, b: str) bool = {
e.flag = flags[i]: rune;
e.name = names[i];
let s: str = getopt.strerror(&e);
if (!streq(s, wants[i])) { fail(); };
assert(!(!streq(s, wants[i])));
i += 1;
};
};
@@ -381,12 +368,12 @@ fn streq(a: str, b: str) bool = {
let r: (void | getopt.error) = getopt.tryparse(&cmd, argv, helps[0:2]);
match (r) {
case void => {};
case let e: getopt.error => fail();
case let e: getopt.error => abort();
};
if (cmd.optslen != 0) { fail(); };
if (cmd.argslen != wantargs[i]) { fail(); };
assert(!(cmd.optslen != 0));
assert(!(cmd.argslen != wantargs[i]));
if (cmd.argslen > 0) {
if (!streq(cmd.argsptr[0], wantarg0[i])) { fail(); };
assert(!(!streq(cmd.argsptr[0], wantarg0[i])));
};
getopt.finish(&cmd);
i += 1;
@@ -439,10 +426,10 @@ fn streq(a: str, b: str) bool = {
hs.cap = hcnt[i];
match (getopt.printusage(h, names[i], hs)) {
case void => {};
case let e: io.error => fail();
case let e: io.error => abort();
};
let got: str = memio.string(&ms);
if (!streq(got, wants[i])) { fail(); };
assert(!(!streq(got, wants[i])));
i += 1;
};
};
@@ -482,24 +469,24 @@ fn streq(a: str, b: str) bool = {
let h: io.handle = s: io.handle;
match (getopt.printhelp(h, names[i], helps[0:hcnt[i]])) {
case void => {};
case let e: io.error => fail();
case let e: io.error => abort();
};
let got: str = memio.string(&ms);
if (!streq(got, wants[i])) { fail(); };
assert(!(!streq(got, wants[i])));
i += 1;
};
};
export fn main() i32 = {
signalled = 1; flagcluster();
signalled = 2; paramflag();
signalled = 3; separator();
signalled = 4; repeatedflag();
signalled = 5; baredash();
signalled = 6; errortable();
signalled = 7; strerrortext();
signalled = 8; nooptionsbare();
signalled = 9; printusage_cases();
signalled = 10; printhelp_cases();
flagcluster();
paramflag();
separator();
repeatedflag();
baredash();
errortable();
strerrortext();
nooptionsbare();
printusage_cases();
printhelp_cases();
return 0;
};