Files
ww/test/wcc/989_regex_run.c
Hojun-Cho 4c52660bab 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).
2026-06-11 09:32:44 +09:00

68 lines
2.1 KiB
C

/*
* 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).
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
static int
runwait(const char *cmd)
{
int rc = system(cmd);
if (rc == -1) return -1;
if (WIFEXITED(rc)) return WEXITSTATUS(rc);
return 1;
}
int
main(void)
{
const char *bin = getenv("BIN");
if (!bin) bin = "out/bin";
char absbin[1024];
if (bin[0] != '/') {
char cwd[1024];
if (getcwd(cwd, sizeof cwd) == NULL) return 1;
snprintf(absbin, sizeof absbin, "%s/%s", cwd, bin);
bin = absbin;
}
char cwd[1024];
if (getcwd(cwd, sizeof cwd) == NULL) 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);
}
return 0;
}