lib/regex: rehome private-touching @tests to in-package regex_whitebox.ww

White-box @tests move into a colocated 'package regex' file (Hare
+test.ha analogue; #6 non-T drop plays the build-tag role), black-box
@tests stay in package regex_test — Go's foo/foo_test split. The
wb/ stub driver is documented-temporary scaffolding: a same-dir
importer file-resolves to regex.ww before dir-enumeration, so only a
different-dir import bundles the whitebox sibling (task #33 retires
it). CLAUDE.md rule-9 carve-out updated (#5 closed, gate was #6).
This commit is contained in:
2026-06-11 09:32:44 +09:00
parent b9c4562135
commit 4c52660bab
6 changed files with 853 additions and 769 deletions

View File

@@ -85,6 +85,10 @@ static const struct ent ents[] = {
{ .fixture = "lib/memio/memiotest.ww", .mode = M_ID },
{ .fixture = "lib/os/ostest.ww", .mode = M_ID },
{ .fixture = "lib/regex/regex_test.ww", .mode = M_ID },
/* in-package white-box half (#9): the wb/ driver dir-resolves
* `import regex` and bundles lib/regex/regex_whitebox.ww (package
* regex), so this fixture byte-ids the moved engine probes. */
{ .fixture = "lib/regex/wb/regex_test.ww", .mode = M_ID },
{ .fixture = "lib/strconv/test/ftostest.ww", .mode = M_ID },
/* graduated from #59.10 DIVERGE by the #62 float-literal fold fix
* (wwstage lexer now folds through strconv.stof64, matching

View File

@@ -1,14 +1,17 @@
/*
* 989_regex_run — execute the lib/regex @test fixture (fold-1 data
* model + fold-2a compile() + fold-2b tranche-A scaffolding) under
* the C-side `ww run` driver and assert exit 0.
* 989_regex_run — execute BOTH lib/regex @test halves under the C-side
* `ww test` driver and assert exit 0:
* 1. lib/regex/regex_test.ww — BLACK-BOX, package regex_test.
* 2. lib/regex/wb/regex_test.ww — the WHITE-BOX driver (#9): its
* `import regex` dir-resolves and bundles lib/regex/regex_whitebox.ww
* (package regex), so -T collects the in-package engine probes.
* Both are main-less @test files; -T synthesizes the entry, runs the
* fork-per-test record-and-continue harness, and exits nonzero iff any
* @test fails.
*
* Sibling to 984_base64_run / 989_sha256_run (9xx is full so this
* shares the 989 prefix — the `short` name keys the binary, cf the
* 949_* / 989_sha256 precedent). regex_test.ww carries its own
* `export fn main()` that drives the data-model @test fns and signals
* which case failed via the exit code, so this file is a thin wrapper
* — no @test scanning, no synthetic main generation.
* 949_* / 989_sha256 precedent).
*/
#include <stdio.h>
#include <stdlib.h>
@@ -39,20 +42,26 @@ main(void)
char cwd[1024];
if (getcwd(cwd, sizeof cwd) == NULL) return 1;
const char *src = "lib/regex/regex_test.ww";
char path[1024], cmd[2048];
snprintf(path, sizeof path, "%s/%s", cwd, src);
/* timeout 180 per repo convention (732/775; test/run does not
* bound runtime): the fold-2c zero-length findall rows turn a
* regression of the ha:946-952 rune-advancement guard into an
* infinite loop (frees are no-ops, so OOM is the only other
* exit) — timeout converts the hang into a loud 124. */
snprintf(cmd, sizeof cmd, "timeout 180 %s/ww test %s", bin, path);
int rc = runwait(cmd);
if (rc != 0) {
fprintf(stderr, "regex_run FAIL: %s exited %d\n", src, rc);
return 1;
const char *srcs[] = {
"lib/regex/regex_test.ww",
"lib/regex/wb/regex_test.ww",
};
for (size_t i = 0; i < sizeof srcs / sizeof srcs[0]; i++) {
const char *src = srcs[i];
char path[1024], cmd[2048];
snprintf(path, sizeof path, "%s/%s", cwd, src);
/* timeout 180 per repo convention (732/775; test/run does not
* bound runtime): the fold-2c zero-length findall rows turn a
* regression of the ha:946-952 rune-advancement guard into an
* infinite loop (frees are no-ops, so OOM is the only other
* exit) — timeout converts the hang into a loud 124. */
snprintf(cmd, sizeof cmd, "timeout 180 %s/ww test %s", bin, path);
int rc = runwait(cmd);
if (rc != 0) {
fprintf(stderr, "regex_run FAIL: %s exited %d\n", src, rc);
return 1;
}
printf("regex_run: %s ok\n", src);
}
printf("regex_run: %s ok\n", src);
return 0;
}