build: omit named test source operands

This commit is contained in:
2026-08-22 21:53:10 +09:00
parent 3922f1c34e
commit 2e5451a601
13 changed files with 1666 additions and 21 deletions

View File

@@ -100,6 +100,40 @@ imports_to_str(const char *src, int *errs, const char **pkg)
return buf;
}
static char *
header_to_str(const char *src, size_t len, int *errs, const char **pkg)
{
Arena *a = newarena();
Lex l;
Parser p;
lexinit(&l, a, "header.ww", src, len);
parserinit(&p, a, &l);
Node *n = parsepackageheader(&p);
*errs = p.errs + l.errs;
*pkg = n->module ? strdup(n->module) : NULL;
char *buf = NULL;
size_t outlen = 0;
FILE *f = open_memstream(&buf, &outlen);
if (f != NULL) {
astprint(f, n);
fclose(f);
}
freearena(a);
return buf;
}
static int
header_errors(const char *src)
{
int errs;
const char *pkg;
char *got = header_to_str(src, strlen(src), &errs, &pkg);
free((void *)pkg);
free(got);
return errs;
}
static int
must_import_shape(const char *src, int imports_only, const char *binding,
const char *path, const char *alias)
@@ -300,6 +334,119 @@ main(void)
free((void *)pkg);
free(got);
}
{
const char *src =
"package main;\n"
"import zed;\n"
"import stable alpha.beta;\n"
"fn body() void = {};\n";
int errs;
const char *pkg;
char *got = header_to_str(src, strlen(src), &errs, &pkg);
if (errs != 0 || pkg == NULL || strcmp(pkg, "main") != 0
|| got == NULL || strstr(got, "(use \"zed\"") == NULL
|| strstr(got, "(use \"stable\"") == NULL
|| strstr(got, "body") != NULL) {
fputs("package-header parse mismatch\n", stderr);
fail++;
}
free((void *)pkg);
free(got);
}
{
const char *src =
"package main;\n"
"\xff";
int errs;
const char *pkg;
char *got = header_to_str(src, strlen(src), &errs, &pkg);
if (errs != 0 || pkg == NULL || strcmp(pkg, "main") != 0
|| got == NULL) {
fputs("package-header observed the first malformed UTF-8 body byte\n",
stderr);
fail++;
}
free((void *)pkg);
free(got);
}
{
const char src[] =
"package main;\n"
"import alpha;\n"
"\xef\xbb\xbf";
int errs;
const char *pkg;
char *got = header_to_str(src, sizeof src - 1, &errs, &pkg);
if (errs != 0 || pkg == NULL || strcmp(pkg, "main") != 0
|| got == NULL || strstr(got, "(use \"alpha\"") == NULL) {
fputs("package-header observed the first body BOM\n", stderr);
fail++;
}
free((void *)pkg);
free(got);
}
{
const char src[] = "package main;\n\0fn body() void = {};\n";
int errs;
const char *pkg;
char *got = header_to_str(src, sizeof src - 1, &errs, &pkg);
if (errs == 0) {
fputs("package-header ignored a reached NUL boundary byte\n",
stderr);
fail++;
}
free((void *)pkg);
free(got);
}
if (header_errors("package main;\n/* unterminated") == 0) {
fputs("package-header accepted unterminated header trivia\n", stderr);
fail++;
}
{
const char *src =
"package main;\n"
"/* between */ import alpha; // after\n"
"import beta;\n"
"\xff";
int errs;
const char *pkg;
char *got = header_to_str(src, strlen(src), &errs, &pkg);
if (errs != 0 || got == NULL
|| strstr(got, "(use \"alpha\"") == NULL
|| strstr(got, "(use \"beta\"") == NULL) {
fputs("package-header comment/import boundary mismatch\n", stderr);
fail++;
}
free((void *)pkg);
free(got);
}
{
int errs;
const char *pkg;
char *got = header_to_str(
"package main;\nimported body;\nimport late;\n",
strlen("package main;\nimported body;\nimport late;\n"),
&errs, &pkg);
if (errs != 0 || got == NULL || strstr(got, "late") != NULL) {
fputs("package-header mistook an ordinary identifier for import\n",
stderr);
fail++;
}
free((void *)pkg);
free(got);
}
if (header_errors("package ;\n") == 0) {
fputs("package-header accepted a malformed package clause\n", stderr);
fail++;
}
if (header_errors("package main;\nimport ;\n") == 0) {
fputs("package-header accepted a malformed import\n", stderr);
fail++;
}
if (header_errors("package main\nfn body() void = {};\n") == 0) {
fputs("package-header accepted a missing package semicolon\n", stderr);
fail++;
}
{
int errs;
const char *pkg;
@@ -333,6 +480,6 @@ main(void)
fprintf(stderr, "%d parse tests failed\n", fail);
return 1;
}
printf("parse: %d/%d ok + 14 shape ok\n", n, n);
printf("parse: %d/%d ok + 14 shape + 10 header ok\n", n, n);
return 0;
}