constructor.any.js (3371B)
1 // META: global=window,dedicatedworker,jsshell,shadowrealm 2 // META: script=/wasm/jsapi/assertions.js 3 // META: script=/wasm/jsapi/memory/assertions.js 4 5 test(() => { 6 assert_function_name(WebAssembly.Memory, "Memory", "WebAssembly.Memory"); 7 }, "name"); 8 9 test(() => { 10 assert_function_length(WebAssembly.Memory, 1, "WebAssembly.Memory"); 11 }, "length"); 12 13 test(() => { 14 assert_throws_js(TypeError, () => new WebAssembly.Memory()); 15 }, "No arguments"); 16 17 test(() => { 18 const argument = { "initial": 0 }; 19 assert_throws_js(TypeError, () => WebAssembly.Memory(argument)); 20 }, "Calling"); 21 22 test(() => { 23 const invalidArguments = [ 24 undefined, 25 null, 26 false, 27 true, 28 "", 29 "test", 30 Symbol(), 31 1, 32 NaN, 33 {}, 34 ]; 35 for (const invalidArgument of invalidArguments) { 36 assert_throws_js(TypeError, 37 () => new WebAssembly.Memory(invalidArgument), 38 `new Memory(${format_value(invalidArgument)})`); 39 } 40 }, "Invalid descriptor argument"); 41 42 test(() => { 43 assert_throws_js(TypeError, () => new WebAssembly.Memory({ "initial": undefined })); 44 }, "Undefined initial value in descriptor"); 45 46 const outOfRangeValues = [ 47 NaN, 48 Infinity, 49 -Infinity, 50 -1, 51 0x100000000, 52 0x1000000000, 53 ]; 54 55 for (const value of outOfRangeValues) { 56 test(() => { 57 assert_throws_js(TypeError, () => new WebAssembly.Memory({ "initial": value })); 58 }, `Out-of-range initial value in descriptor: ${format_value(value)}`); 59 60 test(() => { 61 assert_throws_js(TypeError, () => new WebAssembly.Memory({ "initial": 0, "maximum": value })); 62 }, `Out-of-range maximum value in descriptor: ${format_value(value)}`); 63 } 64 65 test(() => { 66 assert_throws_js(RangeError, () => new WebAssembly.Memory({ "initial": 10, "maximum": 9 })); 67 }, "Initial value exceeds maximum"); 68 69 test(() => { 70 const proxy = new Proxy({}, { 71 has(o, x) { 72 assert_unreached(`Should not call [[HasProperty]] with ${x}`); 73 }, 74 get(o, x) { 75 // Due to the requirement not to supply both minimum and initial, we need to ignore one of them. 76 switch (x) { 77 case "shared": 78 return false; 79 case "initial": 80 case "maximum": 81 return 0; 82 default: 83 return undefined; 84 } 85 }, 86 }); 87 new WebAssembly.Memory(proxy); 88 }, "Proxy descriptor"); 89 90 test(() => { 91 const order = []; 92 93 new WebAssembly.Memory({ 94 get maximum() { 95 order.push("maximum"); 96 return { 97 valueOf() { 98 order.push("maximum valueOf"); 99 return 1; 100 }, 101 }; 102 }, 103 104 get initial() { 105 order.push("initial"); 106 return { 107 valueOf() { 108 order.push("initial valueOf"); 109 return 1; 110 }, 111 }; 112 }, 113 }); 114 115 assert_array_equals(order, [ 116 "initial", 117 "initial valueOf", 118 "maximum", 119 "maximum valueOf", 120 ]); 121 }, "Order of evaluation for descriptor"); 122 123 test(() => { 124 const argument = { "initial": 0 }; 125 const memory = new WebAssembly.Memory(argument); 126 assert_Memory(memory, { "size": 0 }); 127 }, "Zero initial"); 128 129 test(() => { 130 const argument = { "initial": 4 }; 131 const memory = new WebAssembly.Memory(argument); 132 assert_Memory(memory, { "size": 4 }); 133 }, "Non-zero initial"); 134 135 test(() => { 136 const argument = { "initial": 0 }; 137 const memory = new WebAssembly.Memory(argument, {}); 138 assert_Memory(memory, { "size": 0 }); 139 }, "Stray argument");