test: prove ordinary import binding modes
This commit is contained in:
@@ -7906,9 +7906,11 @@ fn runtimepath(relative: str) str = {
|
||||
|
||||
let wirebody: str = strings.concat(
|
||||
"package wire;\n",
|
||||
"export type Thing = i32;\n",
|
||||
"export fn value() i32 = { return 42; };\n");
|
||||
let cablebody: str = strings.concat(
|
||||
"package cable;\n",
|
||||
"export type Thing = i32;\n",
|
||||
"export fn value() i32 = { return 42; };\n");
|
||||
let codecfile: str = strings.concat(codec, "/codec.ww");
|
||||
writefile(codecfile, wirebody);
|
||||
@@ -7918,12 +7920,16 @@ fn runtimepath(relative: str) str = {
|
||||
writefile(commitappfile, strings.concat(
|
||||
"package main;\nimport commit.codec;\n",
|
||||
"fn main() i32 = { return wire.value(); };\n"));
|
||||
writefile(strings.concat(bridge, "/bridge.ww"), strings.concat(
|
||||
"package bridge;\nimport acme.codec;\n",
|
||||
// WW retains its direct-import bare-declaration convenience. It is
|
||||
// useful here because changing only the dependency declaration leaves
|
||||
// this source unchanged while still forcing its action to reconsider.
|
||||
"export fn bridged() i32 = { return value(); };\n"));
|
||||
let bridgefile: str = strings.concat(bridge, "/bridge.ww");
|
||||
let stablebridgebody: str = strings.concat(
|
||||
"package bridge;\nimport stable acme.codec;\n",
|
||||
"export type BridgedThing = stable.Thing;\n",
|
||||
"export fn bridged() i32 = { return stable.value(); };\n");
|
||||
let steadybridgebody: str = strings.concat(
|
||||
"package bridge;\nimport steady acme.codec;\n",
|
||||
"export type BridgedThing = steady.Thing;\n",
|
||||
"export fn bridged() i32 = { return steady.value(); };\n");
|
||||
writefile(bridgefile, stablebridgebody);
|
||||
writefile(strings.concat(direct, "/main.ww"), strings.concat(
|
||||
"package main;\nimport acme.codec;\n",
|
||||
"fn main() i32 = { return wire.value(); };\n"));
|
||||
@@ -7936,17 +7942,17 @@ fn runtimepath(relative: str) str = {
|
||||
writefile(strings.concat(scopetwo, "/two.ww"),
|
||||
"package same;\nexport fn value() i32 = { return 22; };\n");
|
||||
writefile(strings.concat(scoped, "/a.ww"), strings.concat(
|
||||
"package main;\nimport scope.one;\n",
|
||||
"fn left() i32 = { return same.value(); };\n"));
|
||||
"package main;\nimport shared scope.one;\n",
|
||||
"fn left() i32 = { return shared.value(); };\n"));
|
||||
writefile(strings.concat(scoped, "/b.ww"), strings.concat(
|
||||
"package main;\nimport scope.two;\n",
|
||||
"fn right() i32 = { return same.value(); };\n"));
|
||||
"package main;\nimport shared scope.two;\n",
|
||||
"fn right() i32 = { return shared.value(); };\n"));
|
||||
writefile(strings.concat(scoped, "/main.ww"),
|
||||
"package main;\nfn main() i32 = { return left() + right(); };\n");
|
||||
|
||||
writefile(strings.concat(repeated, "/a.ww"), strings.concat(
|
||||
"package main;\nimport acme.codec;\n",
|
||||
"fn first() i32 = { return wire.value(); };\n"));
|
||||
"package main;\nimport stable acme.codec;\n",
|
||||
"fn first() i32 = { return stable.value(); };\n"));
|
||||
writefile(strings.concat(repeated, "/b.ww"), strings.concat(
|
||||
"package main;\nimport acme.codec;\n",
|
||||
"fn second() i32 = { return wire.value(); };\n"));
|
||||
@@ -7990,26 +7996,26 @@ fn runtimepath(relative: str) str = {
|
||||
"package main;\nimport domain.main;\n",
|
||||
"fn main() i32 = { return utility.value(); };\n"));
|
||||
writefile(strings.concat(programuser, "/main.ww"), strings.concat(
|
||||
"package main;\nimport domain.program;\n",
|
||||
"fn main() i32 = { return main.value(); };\n"));
|
||||
"package main;\nimport stable domain.program;\n",
|
||||
"fn main() i32 = { return stable.value(); };\n"));
|
||||
|
||||
writefile(strings.concat(testhelper, "/helper.ww"),
|
||||
"package helper;\nexport fn value() i32 = { return 1; };\n");
|
||||
writefile(strings.concat(testcodec, "/codec.ww"), wirebody);
|
||||
writefile(strings.concat(testcodec, "/internal_test.ww"), strings.concat(
|
||||
"package wire;\nimport testonly.helper;\n",
|
||||
"package wire;\nimport assist testonly.helper;\n",
|
||||
"@test fn internal_name_uses_declaration() void = {\n",
|
||||
" assert(value() + helper.value() == 43);\n};\n"));
|
||||
" assert(value() + assist.value() == 43);\n};\n"));
|
||||
writefile(strings.concat(testcodec, "/external_test.ww"), strings.concat(
|
||||
"package wire_test;\nimport testpkg.codec;\n",
|
||||
"package wire_test;\nimport prod testpkg.codec;\n",
|
||||
"@test fn external_name_uses_declaration() void = {\n",
|
||||
" assert(wire.value() == 42);\n};\n"));
|
||||
" assert(prod.value() == 42);\n};\n"));
|
||||
|
||||
writefile(strings.concat(vendored, "/codec.ww"),
|
||||
"package cable;\nexport fn value() i32 = { return 13; };\n");
|
||||
writefile(strings.concat(vendorclient, "/a.ww"), strings.concat(
|
||||
"package main;\nimport short.codec;\n",
|
||||
"fn vendora() i32 = { return cable.value(); };\n"));
|
||||
"package main;\nimport stable short.codec;\n",
|
||||
"fn vendora() i32 = { return stable.value(); };\n"));
|
||||
writefile(strings.concat(vendorclient, "/b.ww"), strings.concat(
|
||||
"package main;\nimport short.codec;\n",
|
||||
"fn vendorb() i32 = { return cable.value(); };\n"));
|
||||
@@ -8080,6 +8086,7 @@ fn runtimepath(relative: str) str = {
|
||||
let scopedtraceref: str = "";
|
||||
let repeatedtraceref: str = "";
|
||||
let changedtraceref: str = "";
|
||||
let aliastraceref: str = "";
|
||||
let commitfailref: str = "";
|
||||
let commitpreflightref: str = "";
|
||||
let commitbindingref: str = "";
|
||||
@@ -8090,6 +8097,7 @@ fn runtimepath(relative: str) str = {
|
||||
let si: i32 = 0;
|
||||
for (si < stages.len) {
|
||||
rewritefile(codecfile, wirebody);
|
||||
rewritefile(bridgefile, stablebridgebody);
|
||||
rewritefile(commitcodecfile, wirebody);
|
||||
rewritefile(commitappfile, strings.concat(
|
||||
"package main;\nimport commit.codec;\n",
|
||||
@@ -8313,7 +8321,8 @@ fn runtimepath(relative: str) str = {
|
||||
expectexit(&out, 0);
|
||||
let repeatedunit: str = readfile(strings.concat(works[si],
|
||||
"/cmd.repeated.unit.ww"));
|
||||
assert(occurrences(repeatedunit, "import acme.codec;") == 2);
|
||||
assert(occurrences(repeatedunit, "import stable acme.codec;") == 1);
|
||||
assert(occurrences(repeatedunit, "import acme.codec;") == 1);
|
||||
let repeatedtrace: str = readfile(traces[si]);
|
||||
let repeatedline: str = linecontaining(repeatedtrace,
|
||||
"cmd.repeated.unit.new");
|
||||
@@ -8427,7 +8436,7 @@ fn runtimepath(relative: str) str = {
|
||||
let externalunit: str = readfile(strings.concat(testwork,
|
||||
"/testpkg.codec_test-external-test.unit.ww"));
|
||||
assert(!has(productionunit, "testonly.helper"));
|
||||
assert(has(internalunit, "import testonly.helper;"));
|
||||
assert(has(internalunit, "import assist testonly.helper;"));
|
||||
assert(!has(externalunit, "testonly.helper"));
|
||||
assert(has(externalunit, "package wire_test;"));
|
||||
assert(os.exists(strings.concat(testwork,
|
||||
@@ -8475,7 +8484,8 @@ fn runtimepath(relative: str) str = {
|
||||
expectexit(&out, 0);
|
||||
let vendorunit: str = readfile(strings.concat(works[si],
|
||||
"/vend.client.unit.ww"));
|
||||
assert(occurrences(vendorunit, "import short.codec;") == 2);
|
||||
assert(occurrences(vendorunit, "import stable short.codec;") == 1);
|
||||
assert(occurrences(vendorunit, "import short.codec;") == 1);
|
||||
assert(has(vendorunit, strings.concat(
|
||||
"//ww:import-map short.codec vend.vendor.short.codec ",
|
||||
hexbytes(vendored), "\n")));
|
||||
@@ -8498,9 +8508,9 @@ fn runtimepath(relative: str) str = {
|
||||
vendorrun, (30i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 13);
|
||||
|
||||
// Build the bare-import bridge and its command, establish a no-op warm
|
||||
// rebuild, then change only the dependency's declared name. The direct
|
||||
// importer is reconsidered; its unchanged export stops propagation.
|
||||
// A stable explicit alias survives a dependency declared-name change.
|
||||
// Canonicalized exported type references keep the bridge interface
|
||||
// unchanged, so reconsideration stops after the direct importer.
|
||||
rewritefile(traces[si], "");
|
||||
let appav: []str = [driver(stages[si]), "build", "-w", works[si],
|
||||
"-I", source, "-o", appbins[si], app];
|
||||
@@ -8511,6 +8521,13 @@ fn runtimepath(relative: str) str = {
|
||||
runcommand(root, strings.concat("name-app-run-", stages[si]), apprun,
|
||||
(30i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 42);
|
||||
let stablebridgewwi: str = readfile(strings.concat(works[si],
|
||||
"/acme.bridge.wwi"));
|
||||
assert(has(stablebridgewwi,
|
||||
"import __wwi_61636d652e636f646563 acme.codec;\n"));
|
||||
assert(has(stablebridgewwi,
|
||||
"export type BridgedThing = __wwi_61636d652e636f646563.Thing;\n"));
|
||||
assert(!has(stablebridgewwi, "stable.Thing"));
|
||||
rewritefile(traces[si], "");
|
||||
runcommandenv(root, strings.concat("name-app-warm-", stages[si]), appav,
|
||||
env, (120i64 * (time.second: i64)): time.duration, &out);
|
||||
@@ -8534,10 +8551,34 @@ fn runtimepath(relative: str) str = {
|
||||
"/acme.codec.wwi"));
|
||||
assert(has(renamedwwi, "//ww:module acme.codec\npackage cable;\n"));
|
||||
assert(!has(renamedwwi, "package wire;"));
|
||||
assert(same(stablebridgewwi, readfile(strings.concat(works[si],
|
||||
"/acme.bridge.wwi"))));
|
||||
runcommand(root, strings.concat("name-app-renamed-run-", stages[si]),
|
||||
apprun, (30i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 42);
|
||||
|
||||
// Editing only the local alias rebuilds its owning source action. It
|
||||
// cannot rename canonical exports or force the downstream command.
|
||||
rewritefile(bridgefile, steadybridgebody);
|
||||
rewritefile(traces[si], "");
|
||||
runcommandenv(root, strings.concat("name-app-alias-edit-", stages[si]),
|
||||
appav, env, (120i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 0);
|
||||
let aliastrace: str = readfile(traces[si]);
|
||||
assert(occurrences(aliastrace, "\n") == 1);
|
||||
assert(occurrences(aliastrace, "/acme.bridge.unit.new") == 1);
|
||||
assert(!has(aliastrace, "/acme.codec.unit.new"));
|
||||
assert(!has(aliastrace, "/cmd.app.unit.new"));
|
||||
assert(same(stablebridgewwi, readfile(strings.concat(works[si],
|
||||
"/acme.bridge.wwi"))));
|
||||
let nalias: str = normalizedtrace(aliastrace,
|
||||
strings.concat(works[si], "/"), appbins[si]);
|
||||
if (si == 0) { aliastraceref = strings.dup(nalias); }
|
||||
else { assert(same(aliastraceref, nalias)); };
|
||||
runcommand(root, strings.concat("name-app-alias-edit-run-", stages[si]),
|
||||
apprun, (30i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 42);
|
||||
|
||||
// New semantic artifacts and binaries are byte-identical across the
|
||||
// independently cold Cstage and WWstage work roots.
|
||||
ari = 0;
|
||||
@@ -8567,6 +8608,272 @@ fn runtimepath(relative: str) str = {
|
||||
clean(root);
|
||||
};
|
||||
|
||||
@test fn explicit_import_alias_binding_modes() void = {
|
||||
let root: str = fresh();
|
||||
let source: str = strings.concat(root, "/source");
|
||||
let one: str = strings.concat(source, "/pkg/one");
|
||||
let two: str = strings.concat(source, "/pkg/two");
|
||||
let positives: []str = ["default", "alias", "reuse", "repeatok",
|
||||
"repeatedfiles"];
|
||||
let negatives: []str = ["barefn", "baretype", "baredef", "bareconst",
|
||||
"barevar", "aliasbad", "aliasleak", "repeatdup", "aliasdup",
|
||||
"defaultalias", "declcollision", "unusedalias", "blankalias"];
|
||||
let dirs: []str = [one, two];
|
||||
let i: i32 = 0;
|
||||
for (i < positives.len) {
|
||||
append(dirs, strings.concat(source, "/cmd/", positives[i]));
|
||||
i += 1;
|
||||
};
|
||||
i = 0;
|
||||
for (i < negatives.len) {
|
||||
append(dirs, strings.concat(source, "/cmd/", negatives[i]));
|
||||
i += 1;
|
||||
};
|
||||
i = 0;
|
||||
for (i < dirs.len) { mkdirall(dirs[i]); i += 1; };
|
||||
|
||||
writefile(strings.concat(one, "/one.ww"), strings.concat(
|
||||
"package wire;\n",
|
||||
"export fn value() i32 = { return 11; };\n",
|
||||
"export type Thing = i32;\n",
|
||||
"export def DEFINED: i32 = 13;\n",
|
||||
"export const CONSTANT: i32 = 17;\n",
|
||||
"export let VARIABLE: i32 = 19;\n"));
|
||||
writefile(strings.concat(two, "/two.ww"),
|
||||
"package cable;\nexport fn value() i32 = { return 29; };\n");
|
||||
let defaultbody: str = strings.concat(
|
||||
"package main;\nimport pkg.one;\n",
|
||||
"fn typed(v: wire.Thing) i32 = { return v: i32; };\n",
|
||||
"fn main() i32 = { return wire.value() + wire.DEFINED + ",
|
||||
"wire.CONSTANT + wire.VARIABLE + typed(23); };\n");
|
||||
writefile(strings.concat(source, "/cmd/default/main.ww"), defaultbody);
|
||||
writefile(strings.concat(source, "/cmd/alias/main.ww"), strings.concat(
|
||||
"package main;\nimport stable pkg.one;\n",
|
||||
"fn typed(v: stable.Thing) i32 = { return v: i32; };\n",
|
||||
"fn main() i32 = { return stable.value() + stable.DEFINED + ",
|
||||
"stable.CONSTANT + stable.VARIABLE + typed(23); };\n"));
|
||||
writefile(strings.concat(source, "/cmd/reuse/a.ww"), strings.concat(
|
||||
"package main;\nimport shared pkg.one;\n",
|
||||
"fn left() i32 = { return shared.value(); };\n"));
|
||||
writefile(strings.concat(source, "/cmd/reuse/b.ww"), strings.concat(
|
||||
"package main;\nimport shared pkg.two;\n",
|
||||
"fn right() i32 = { return shared.value(); };\n"));
|
||||
writefile(strings.concat(source, "/cmd/reuse/main.ww"),
|
||||
"package main;\nfn main() i32 = { return left() + right(); };\n");
|
||||
writefile(strings.concat(source, "/cmd/repeatok/main.ww"), strings.concat(
|
||||
"package main;\nimport pkg.one;\nimport first pkg.one;\n",
|
||||
"import second pkg.one;\n",
|
||||
"fn main() i32 = { return wire.value() + first.value() + ",
|
||||
"second.value(); };\n"));
|
||||
writefile(strings.concat(source, "/cmd/repeatedfiles/a.ww"), strings.concat(
|
||||
"package main;\nimport left pkg.one;\n",
|
||||
"fn first() i32 = { return left.value(); };\n"));
|
||||
writefile(strings.concat(source, "/cmd/repeatedfiles/b.ww"), strings.concat(
|
||||
"package main;\nimport right pkg.one;\n",
|
||||
"fn second() i32 = { return right.value(); };\n"));
|
||||
writefile(strings.concat(source, "/cmd/repeatedfiles/main.ww"),
|
||||
"package main;\nfn main() i32 = { return first() + second(); };\n");
|
||||
|
||||
let bareexprs: []str = ["value()", "take(7)", "DEFINED", "CONSTANT",
|
||||
"VARIABLE"];
|
||||
let barenames: []str = ["barefn", "baretype", "baredef", "bareconst",
|
||||
"barevar"];
|
||||
i = 0;
|
||||
for (i < barenames.len) {
|
||||
let pre: str = "";
|
||||
if (i == 1) { pre = "fn take(v: Thing) i32 = { return v: i32; };\n"; };
|
||||
writefile(strings.concat(source, "/cmd/", barenames[i], "/main.ww"),
|
||||
strings.concat("package main;\nimport pkg.one;\n", pre,
|
||||
"fn main() i32 = { return ", bareexprs[i], "; };\n"));
|
||||
i += 1;
|
||||
};
|
||||
writefile(strings.concat(source, "/cmd/aliasbad/main.ww"), strings.concat(
|
||||
"package main;\nimport stable pkg.one;\n",
|
||||
"fn bad(v: wire.Thing) i32 = { return v: i32; };\n",
|
||||
"fn declared() i32 = { return wire.value(); };\n",
|
||||
"fn leaf() i32 = { return one.value(); };\n",
|
||||
"fn bare() i32 = { return value(); };\n",
|
||||
"fn main() i32 = { return stable.value(); };\n"));
|
||||
writefile(strings.concat(source, "/cmd/aliasleak/a.ww"), strings.concat(
|
||||
"package main;\nimport stable pkg.one;\n",
|
||||
"fn anchor() i32 = { return stable.value(); };\n"));
|
||||
writefile(strings.concat(source, "/cmd/aliasleak/b.ww"),
|
||||
"package main;\nfn leaked() i32 = { return stable.value(); };\n");
|
||||
writefile(strings.concat(source, "/cmd/aliasleak/main.ww"),
|
||||
"package main;\nfn main() i32 = { return leaked(); };\n");
|
||||
writefile(strings.concat(source, "/cmd/repeatdup/main.ww"), strings.concat(
|
||||
"package main;\nimport pkg.one;\nimport pkg.one;\n",
|
||||
"fn main() i32 = { return wire.value(); };\n"));
|
||||
writefile(strings.concat(source, "/cmd/aliasdup/main.ww"), strings.concat(
|
||||
"package main;\nimport stable pkg.one;\nimport stable pkg.two;\n",
|
||||
"fn main() i32 = { return stable.value(); };\n"));
|
||||
writefile(strings.concat(source, "/cmd/defaultalias/main.ww"), strings.concat(
|
||||
"package main;\nimport pkg.one;\nimport wire pkg.two;\n",
|
||||
"fn main() i32 = { return wire.value(); };\n"));
|
||||
writefile(strings.concat(source, "/cmd/declcollision/main.ww"), strings.concat(
|
||||
"package main;\nimport stable pkg.one;\n",
|
||||
"fn stable() i32 = { return 0; };\n",
|
||||
"fn main() i32 = { return stable(); };\n"));
|
||||
writefile(strings.concat(source, "/cmd/unusedalias/main.ww"),
|
||||
"package main;\nimport stable pkg.one;\nfn main() i32 = { return 0; };\n");
|
||||
writefile(strings.concat(source, "/cmd/blankalias/main.ww"),
|
||||
"package main;\nimport _ pkg.one;\nfn main() i32 = { return 0; };\n");
|
||||
|
||||
let stages: []str = ["ww", "ww_ww"];
|
||||
let expected: []i32 = [83, 83, 40, 33, 22];
|
||||
let binaryrefs: []str = ["", "", "", "", ""];
|
||||
let diagrefs: []str = ["", "", "", "", "", "", "", "", "",
|
||||
"", "", "", ""];
|
||||
let needles: []str = ["undefined: value", "unknown type 'Thing'",
|
||||
"undefined: DEFINED", "undefined: CONSTANT", "undefined: VARIABLE",
|
||||
"unknown type 'wire.Thing'", "package 'stable' is not directly imported",
|
||||
"wire redeclared in this block", "stable redeclared in this block",
|
||||
"wire redeclared in this block",
|
||||
"stable already declared through import of package stable",
|
||||
"\"pkg.one\" imported as stable and not used",
|
||||
"blank import alias _ is not implemented"];
|
||||
let exactdiags: []str = [
|
||||
strings.concat(
|
||||
"$WORK/cmd.barefn.unit.new:3:1: error: \"pkg.one\" imported as wire and not used\n",
|
||||
"$WORK/cmd.barefn.unit.new:4:26: error: undefined: value\n",
|
||||
"ww: w6c failed for cmd.barefn\n"),
|
||||
strings.concat(
|
||||
"$WORK/cmd.baretype.unit.new:3:1: error: \"pkg.one\" imported as wire and not used\n",
|
||||
"$WORK/cmd.baretype.unit.new:4:12: error: unknown type 'Thing'\n",
|
||||
"ww: w6c failed for cmd.baretype\n"),
|
||||
strings.concat(
|
||||
"$WORK/cmd.baredef.unit.new:3:1: error: \"pkg.one\" imported as wire and not used\n",
|
||||
"$WORK/cmd.baredef.unit.new:4:26: error: undefined: DEFINED\n",
|
||||
"ww: w6c failed for cmd.baredef\n"),
|
||||
strings.concat(
|
||||
"$WORK/cmd.bareconst.unit.new:3:1: error: \"pkg.one\" imported as wire and not used\n",
|
||||
"$WORK/cmd.bareconst.unit.new:4:26: error: undefined: CONSTANT\n",
|
||||
"ww: w6c failed for cmd.bareconst\n"),
|
||||
strings.concat(
|
||||
"$WORK/cmd.barevar.unit.new:3:1: error: \"pkg.one\" imported as wire and not used\n",
|
||||
"$WORK/cmd.barevar.unit.new:4:26: error: undefined: VARIABLE\n",
|
||||
"ww: w6c failed for cmd.barevar\n"),
|
||||
"", "",
|
||||
strings.concat(
|
||||
"$WORK/cmd.repeatdup.unit.new:4:1: error: wire redeclared in this block\n",
|
||||
"\t$WORK/cmd.repeatdup.unit.new:3:1: other declaration of wire\n",
|
||||
"$WORK/cmd.repeatdup.unit.new:4:1: error: \"pkg.one\" imported as wire and not used\n",
|
||||
"ww: w6c failed for cmd.repeatdup\n"),
|
||||
strings.concat(
|
||||
"$WORK/cmd.aliasdup.unit.new:4:1: error: stable redeclared in this block\n",
|
||||
"\t$WORK/cmd.aliasdup.unit.new:3:1: other declaration of stable\n",
|
||||
"$WORK/cmd.aliasdup.unit.new:4:1: error: \"pkg.two\" imported as stable and not used\n",
|
||||
"ww: w6c failed for cmd.aliasdup\n"),
|
||||
strings.concat(
|
||||
"$WORK/cmd.defaultalias.unit.new:4:1: error: wire redeclared in this block\n",
|
||||
"\t$WORK/cmd.defaultalias.unit.new:3:1: other declaration of wire\n",
|
||||
"$WORK/cmd.defaultalias.unit.new:4:1: error: \"pkg.two\" imported as wire and not used\n",
|
||||
"ww: w6c failed for cmd.defaultalias\n"),
|
||||
strings.concat(
|
||||
"$WORK/cmd.declcollision.unit.new:3:1: error: \"pkg.one\" imported as stable and not used\n",
|
||||
"$WORK/cmd.declcollision.unit.new:4:1: error: stable already declared through import of package stable (\"pkg.one\")\n",
|
||||
"\t$WORK/cmd.declcollision.unit.new:3:1: other declaration of stable\n",
|
||||
"ww: w6c failed for cmd.declcollision\n"),
|
||||
strings.concat(
|
||||
"$WORK/cmd.unusedalias.unit.new:3:1: error: \"pkg.one\" imported as stable and not used\n",
|
||||
"ww: w6c failed for cmd.unusedalias\n"),
|
||||
strings.concat(source,
|
||||
"/cmd/blankalias/main.ww:2:8: error: blank import alias _ is not implemented\n"),
|
||||
];
|
||||
let si: i32 = 0;
|
||||
for (si < stages.len) {
|
||||
let work: str = strings.concat(root, "/work-", stages[si]);
|
||||
let rejectwork: str = strings.concat(root, "/reject-", stages[si]);
|
||||
mkdirall(work); mkdirall(rejectwork);
|
||||
i = 0;
|
||||
for (i < positives.len) {
|
||||
let target: str = strings.concat(source, "/cmd/", positives[i]);
|
||||
let binary: str = strings.concat(root, "/", stages[si], "-",
|
||||
positives[i]);
|
||||
let av: []str = [driver(stages[si]), "build", "-w", work, "-I",
|
||||
source, "-o", binary, target];
|
||||
let out: commandout;
|
||||
runcommand(root, strings.concat("alias-positive-", stages[si], "-",
|
||||
positives[i]), av,
|
||||
(120i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 0);
|
||||
let runav: []str = [binary];
|
||||
runcommand(root, strings.concat("alias-positive-run-", stages[si],
|
||||
"-", positives[i]), runav,
|
||||
(30i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, expected[i]);
|
||||
let bytes: str = readfile(binary);
|
||||
if (si == 0) { binaryrefs[i] = strings.dup(bytes); }
|
||||
else { assert(same(binaryrefs[i], bytes)); };
|
||||
i += 1;
|
||||
};
|
||||
let aliasunit: str = readfile(strings.concat(work, "/cmd.alias.unit.ww"));
|
||||
assert(has(aliasunit, "import stable pkg.one;"));
|
||||
let aliaswwi: str = readfile(strings.concat(work, "/cmd.alias.wwi"));
|
||||
assert(has(aliaswwi, "import __wwi_706b672e6f6e65 pkg.one;"));
|
||||
assert(!has(aliaswwi, "import stable"));
|
||||
assert(os.exists(strings.concat(work, "/pkg.one.a")));
|
||||
assert(!os.exists(strings.concat(work, "/stable.a")));
|
||||
let repeatunit: str = readfile(strings.concat(work,
|
||||
"/cmd.repeatok.unit.ww"));
|
||||
assert(occurrences(repeatunit, "pkg.one;") == 3);
|
||||
let repeatedunit: str = readfile(strings.concat(work,
|
||||
"/cmd.repeatedfiles.unit.ww"));
|
||||
assert(occurrences(repeatedunit, "pkg.one;") == 2);
|
||||
|
||||
i = 0;
|
||||
for (i < negatives.len) {
|
||||
let target: str = strings.concat(source, "/cmd/", negatives[i]);
|
||||
let binary: str = strings.concat(root, "/reject-bin-", stages[si],
|
||||
"-", negatives[i]);
|
||||
let av: []str = [driver(stages[si]), "build", "-w", rejectwork,
|
||||
"-I", source, "-o", binary, target];
|
||||
let out: commandout;
|
||||
runcommand(root, strings.concat("alias-negative-", stages[si], "-",
|
||||
negatives[i]), av,
|
||||
(120i64 * (time.second: i64)): time.duration, &out);
|
||||
expectexit(&out, 1);
|
||||
assert(has(out.stderr, needles[i]));
|
||||
if (i == 5) {
|
||||
assert(has(out.stderr, "undefined: wire"));
|
||||
assert(has(out.stderr, "undefined: one"));
|
||||
assert(has(out.stderr, "undefined: value"));
|
||||
};
|
||||
if (i < 5) {
|
||||
let unusedpos: i32 = pos(out.stderr,
|
||||
"\"pkg.one\" imported as wire and not used");
|
||||
let namepos: i32 = pos(out.stderr, needles[i]);
|
||||
assert(unusedpos >= 0 && namepos > unusedpos);
|
||||
};
|
||||
if (i == 7 || i == 8 || i == 9) {
|
||||
let redeclared: i32 = pos(out.stderr, "redeclared in this block");
|
||||
let unused: i32 = pos(out.stderr, "imported as");
|
||||
assert(redeclared >= 0 && unused > redeclared);
|
||||
};
|
||||
let normalized: str = normalizedtrace(out.stderr,
|
||||
strings.concat(rejectwork, "/"), binary);
|
||||
if (exactdiags[i].len > 0) {
|
||||
assert(same(normalized, exactdiags[i]));
|
||||
};
|
||||
if (si == 0) { diagrefs[i] = strings.dup(normalized); }
|
||||
else { assert(same(diagrefs[i], normalized)); };
|
||||
assert(!os.exists(binary));
|
||||
let action: str = strings.concat("cmd.", negatives[i]);
|
||||
let suffixes: []str = [".unit.ww", ".wwi", ".s", ".o", ".a",
|
||||
".unit.new", ".wwi.new", ".s.new", ".o.new", ".a.new"];
|
||||
let j: i32 = 0;
|
||||
for (j < suffixes.len) {
|
||||
assert(!os.exists(strings.concat(rejectwork, "/", action,
|
||||
suffixes[j])));
|
||||
j += 1;
|
||||
};
|
||||
i += 1;
|
||||
};
|
||||
si += 1;
|
||||
};
|
||||
clean(root);
|
||||
};
|
||||
|
||||
@test fn compile_artifact_naming() void = {
|
||||
let root: str = fresh();
|
||||
let pdir: str = strings.concat(root, "/pkg");
|
||||
|
||||
Reference in New Issue
Block a user