summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/modules/module-evaluation.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/modules/module-evaluation.js')
-rw-r--r--js/src/jit-test/tests/modules/module-evaluation.js125
1 files changed, 125 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/modules/module-evaluation.js b/js/src/jit-test/tests/modules/module-evaluation.js
new file mode 100644
index 0000000000..64b64c51a2
--- /dev/null
+++ b/js/src/jit-test/tests/modules/module-evaluation.js
@@ -0,0 +1,125 @@
+// |jit-test| --enable-top-level-await;
+// Exercise ModuleEvaluation() concrete method.
+
+load(libdir + "asserts.js");
+
+async function parseAndEvaluate(source) {
+ let m = parseModule(source);
+ m.declarationInstantiation();
+ await m.evaluation();
+ return m;
+}
+
+// Check the evaluation of an empty module succeeds.
+(async () => {
+ await parseAndEvaluate("");
+})();
+
+(async () => {
+ // Check that evaluation returns evaluation promise,
+ // and promise is always the same.
+ let m = parseModule("1");
+ m.declarationInstantiation();
+ assertEq(typeof m.evaluation(), "object");
+ assertEq(m.evaluation() instanceof Promise, true);
+ assertEq(m.evaluation(), m.evaluation());
+ await m.evaluation();
+})();
+
+(async () => {
+ // Check top level variables are initialized by evaluation.
+ let m = parseModule("export var x = 2 + 2;");
+ assertEq(typeof getModuleEnvironmentValue(m, "x"), "undefined");
+ m.declarationInstantiation();
+ await m.evaluation();
+ assertEq(getModuleEnvironmentValue(m, "x"), 4);
+})();
+
+(async () => {
+ let m = parseModule("export let x = 2 * 3;");
+ m.declarationInstantiation();
+ await m.evaluation();
+ assertEq(getModuleEnvironmentValue(m, "x"), 6);
+})();
+
+// Set up a module to import from.
+let a = registerModule('a',
+ parseModule(`var x = 1;
+ export { x };
+ export default 2;
+ export function f(x) { return x + 1; }`));
+
+(async () => {
+ // Check we can evaluate top level definitions.
+ await parseAndEvaluate("var foo = 1;");
+ await parseAndEvaluate("let foo = 1;");
+ await parseAndEvaluate("const foo = 1");
+ await parseAndEvaluate("function foo() {}");
+ await parseAndEvaluate("class foo { constructor() {} }");
+
+ // Check we can evaluate all module-related syntax.
+ await parseAndEvaluate("export var foo = 1;");
+ await parseAndEvaluate("export let foo = 1;");
+ await parseAndEvaluate("export const foo = 1;");
+ await parseAndEvaluate("var x = 1; export { x };");
+ await parseAndEvaluate("export default 1");
+ await parseAndEvaluate("export default function() {};");
+ await parseAndEvaluate("export default function foo() {};");
+ await parseAndEvaluate("import a from 'a';");
+ await parseAndEvaluate("import { x } from 'a';");
+ await parseAndEvaluate("import * as ns from 'a';");
+ await parseAndEvaluate("export * from 'a'");
+ await parseAndEvaluate("export default class { constructor() {} };");
+ await parseAndEvaluate("export default class foo { constructor() {} };");
+})();
+
+(async () => {
+ // Test default import
+ let m = parseModule("import a from 'a'; export { a };")
+ m.declarationInstantiation();
+ await m.evaluation()
+ assertEq(getModuleEnvironmentValue(m, "a"), 2);
+})();
+
+(async () => {
+ // Test named import
+ let m = parseModule("import { x as y } from 'a'; export { y };")
+ m.declarationInstantiation();
+ await m.evaluation();
+ assertEq(getModuleEnvironmentValue(m, "y"), 1);
+})();
+
+(async () => {
+ // Call exported function
+ let m = parseModule("import { f } from 'a'; export let x = f(3);")
+ m.declarationInstantiation();
+ await m.evaluation();
+ assertEq(getModuleEnvironmentValue(m, "x"), 4);
+})();
+
+(async () => {
+ // Test importing an indirect export
+ registerModule('b', parseModule("export { x as z } from 'a';"));
+ let m = await parseAndEvaluate("import { z } from 'b'; export { z }");
+ assertEq(getModuleEnvironmentValue(m, "z"), 1);
+})();
+
+(async () => {
+ // Test cyclic dependencies
+ registerModule('c1', parseModule("export var x = 1; export {y} from 'c2'"));
+ registerModule('c2', parseModule("export var y = 2; export {x} from 'c1'"));
+ let m = await parseAndEvaluate(`import { x as x1, y as y1 } from 'c1';
+ import { x as x2, y as y2 } from 'c2';
+ export let z = [x1, y1, x2, y2]`);
+ assertDeepEq(getModuleEnvironmentValue(m, "z"), [1, 2, 1, 2]);
+})();
+
+(async () => {
+ // Import access in functions
+ let m = await parseModule("import { x } from 'a'; function f() { return x; }")
+ m.declarationInstantiation();
+ m.evaluation();
+ let f = getModuleEnvironmentValue(m, "f");
+ assertEq(f(), 1);
+})();
+drainJobQueue();