build: omit named test source operands
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user