import-namespace.js (3687B)
1 // |jit-test| 2 // Test importing module namespaces 3 4 "use strict"; 5 6 load(libdir + "asserts.js"); 7 load(libdir + "iteration.js"); 8 9 function parseAndEvaluate(source) { 10 let m = parseModule(source); 11 moduleLink(m); 12 return moduleEvaluate(m); 13 } 14 15 function testHasNames(names, expected) { 16 assertEq(names.length, expected.length); 17 expected.forEach(function(name) { 18 assertEq(names.includes(name), true); 19 }); 20 } 21 22 function testEqualArrays(actual, expected) { 23 assertEq(Array.isArray(actual), true); 24 assertEq(Array.isArray(expected), true); 25 assertEq(actual.length, expected.length); 26 for (let i = 0; i < expected.length; i++) { 27 assertEq(actual[i], expected[i]); 28 } 29 } 30 31 let a = registerModule('a', parseModule( 32 `// Reflection methods should return these exports alphabetically sorted. 33 export var b = 2; 34 export var a = 1;` 35 )); 36 37 let b = registerModule('b', parseModule( 38 `import * as ns from 'a'; 39 export { ns }; 40 export var x = ns.a + ns.b;` 41 )); 42 43 moduleLink(b); 44 moduleEvaluate(b); 45 testHasNames(getModuleEnvironmentNames(b), ["ns", "x"]); 46 let ns = getModuleEnvironmentValue(b, "ns"); 47 testHasNames(Object.keys(ns), ["a", "b"]); 48 assertEq(ns.a, 1); 49 assertEq(ns.b, 2); 50 assertEq(ns.c, undefined); 51 assertEq(getModuleEnvironmentValue(b, "x"), 3); 52 53 // Test module namespace internal methods as defined in 9.4.6 54 assertEq(Object.getPrototypeOf(ns), null); 55 assertEq(Reflect.setPrototypeOf(ns, null), true); 56 assertEq(Reflect.setPrototypeOf(ns, Object.prototype), false); 57 assertThrowsInstanceOf(() => Object.setPrototypeOf(ns, {}), TypeError); 58 assertThrowsInstanceOf(function() { ns.foo = 1; }, TypeError); 59 assertEq(Object.isExtensible(ns), false); 60 Object.preventExtensions(ns); 61 let desc = Object.getOwnPropertyDescriptor(ns, "a"); 62 assertEq(desc.value, 1); 63 assertEq(desc.writable, true); 64 assertEq(desc.enumerable, true); 65 assertEq(desc.configurable, false); 66 assertEq(typeof desc.get, "undefined"); 67 assertEq(typeof desc.set, "undefined"); 68 assertThrowsInstanceOf(function() { ns.a = 1; }, TypeError); 69 delete ns.foo; 70 assertThrowsInstanceOf(function() { delete ns.a; }, TypeError); 71 72 // Test @@toStringTag property 73 desc = Object.getOwnPropertyDescriptor(ns, Symbol.toStringTag); 74 assertEq(desc.value, "Module"); 75 assertEq(desc.writable, false); 76 assertEq(desc.enumerable, false); 77 assertEq(desc.configurable, false); 78 assertEq(typeof desc.get, "undefined"); 79 assertEq(typeof desc.set, "undefined"); 80 assertEq(Object.prototype.toString.call(ns), "[object Module]"); 81 82 // Test [[OwnPropertyKeys]] internal method. 83 testEqualArrays(Reflect.ownKeys(ns), ["a", "b", Symbol.toStringTag]); 84 testEqualArrays(Object.getOwnPropertyNames(ns), ["a", "b"]); 85 testEqualArrays(Object.getOwnPropertySymbols(ns), [Symbol.toStringTag]); 86 87 // Test cyclic namespace import and access in module evaluation. 88 let c = registerModule('c', 89 parseModule("export let c = 1; import * as ns from 'd'; let d = ns.d;")); 90 let d = registerModule('d', 91 parseModule("export let d = 2; import * as ns from 'c'; let c = ns.c;")); 92 moduleLink(c); 93 moduleLink(d); 94 moduleEvaluate(c) 95 .then(r => { 96 // We expect the evaluation to throw, so we should not reach this. 97 assertEq(false, true) 98 }) 99 .catch(e => { 100 assertEq(e instanceof ReferenceError, true) 101 }); 102 103 // Test cyclic namespace import. 104 let e = registerModule('e', 105 parseModule("export let e = 1; import * as ns from 'f'; export function f() { return ns.f }")); 106 let f = registerModule('f', 107 parseModule("export let f = 2; import * as ns from 'e'; export function e() { return ns.e }")); 108 moduleLink(e); 109 moduleLink(f); 110 moduleEvaluate(e); 111 moduleEvaluate(f); 112 assertEq(e.namespace.f(), 2); 113 assertEq(f.namespace.e(), 1); 114 drainJobQueue();