| // META: global=jsshell |
| // META: script=/wasm/jsapi/assertions.js |
| |
| function test_operations(object, object_name, operations) { |
| for (const [name, length] of operations) { |
| test(() => { |
| const propdesc = Object.getOwnPropertyDescriptor(object, name); |
| assert_equals(typeof propdesc, "object"); |
| assert_true(propdesc.writable, "writable"); |
| assert_true(propdesc.enumerable, "enumerable"); |
| assert_true(propdesc.configurable, "configurable"); |
| assert_equals(propdesc.value, WebAssembly[name]); |
| }, `${object_name}.${name}`); |
| |
| test(() => { |
| assert_function_name(object[name], name, `${object_name}.${name}`); |
| }, `${object_name}.${name}: name`); |
| |
| test(() => { |
| assert_function_length(object[name], length, `${object_name}.${name}`); |
| }, `${object_name}.${name}: length`); |
| } |
| } |
| |
| function test_attributes(object, object_name, attributes) { |
| for (const [name, mutable] of attributes) { |
| test(() => { |
| const propdesc = Object.getOwnPropertyDescriptor(object, name); |
| assert_equals(typeof propdesc, "object"); |
| assert_true(propdesc.enumerable, "enumerable"); |
| assert_true(propdesc.configurable, "configurable"); |
| }, `${object_name}.${name}`); |
| |
| test(() => { |
| const propdesc = Object.getOwnPropertyDescriptor(object, name); |
| assert_equals(typeof propdesc, "object"); |
| assert_equals(typeof propdesc.get, "function"); |
| assert_function_name(propdesc.get, "get " + name, `getter for "${name}"`); |
| assert_function_length(propdesc.get, 0, `getter for "${name}"`); |
| }, `${object_name}.${name}: getter`); |
| |
| test(() => { |
| const propdesc = Object.getOwnPropertyDescriptor(object, name); |
| assert_equals(typeof propdesc, "object"); |
| if (mutable) { |
| assert_equals(typeof propdesc.set, "function"); |
| assert_function_name(propdesc.set, "set " + name, `setter for "${name}"`); |
| assert_function_length(propdesc.set, 1, `setter for "${name}"`); |
| } else { |
| assert_equals(typeof propdesc.set, "undefined"); |
| } |
| }, `${object_name}.${name}: setter`); |
| } |
| } |
| |
| test(() => { |
| const propdesc = Object.getOwnPropertyDescriptor(this, "WebAssembly"); |
| assert_equals(typeof propdesc, "object"); |
| assert_true(propdesc.writable, "writable"); |
| assert_false(propdesc.enumerable, "enumerable"); |
| assert_true(propdesc.configurable, "configurable"); |
| assert_equals(propdesc.value, this.WebAssembly); |
| }, "WebAssembly: property descriptor"); |
| |
| test(() => { |
| assert_throws(new TypeError(), () => WebAssembly()); |
| }, "WebAssembly: calling"); |
| |
| test(() => { |
| assert_throws(new TypeError(), () => new WebAssembly()); |
| }, "WebAssembly: constructing"); |
| |
| const interfaces = [ |
| "Module", |
| "Instance", |
| "Memory", |
| "Table", |
| "Global", |
| "CompileError", |
| "LinkError", |
| "RuntimeError", |
| ]; |
| |
| for (const name of interfaces) { |
| test(() => { |
| const propdesc = Object.getOwnPropertyDescriptor(WebAssembly, name); |
| assert_equals(typeof propdesc, "object"); |
| assert_true(propdesc.writable, "writable"); |
| assert_false(propdesc.enumerable, "enumerable"); |
| assert_true(propdesc.configurable, "configurable"); |
| assert_equals(propdesc.value, WebAssembly[name]); |
| }, `WebAssembly.${name}: property descriptor`); |
| |
| test(() => { |
| const interface_object = WebAssembly[name]; |
| const propdesc = Object.getOwnPropertyDescriptor(interface_object, "prototype"); |
| assert_equals(typeof propdesc, "object"); |
| assert_false(propdesc.writable, "writable"); |
| assert_false(propdesc.enumerable, "enumerable"); |
| assert_false(propdesc.configurable, "configurable"); |
| }, `WebAssembly.${name}: prototype`); |
| |
| test(() => { |
| const interface_object = WebAssembly[name]; |
| const interface_prototype_object = interface_object.prototype; |
| const propdesc = Object.getOwnPropertyDescriptor(interface_prototype_object, "constructor"); |
| assert_equals(typeof propdesc, "object"); |
| assert_true(propdesc.writable, "writable"); |
| assert_false(propdesc.enumerable, "enumerable"); |
| assert_true(propdesc.configurable, "configurable"); |
| assert_equals(propdesc.value, interface_object); |
| }, `WebAssembly.${name}: prototype.constructor`); |
| } |
| |
| test_operations(WebAssembly, "WebAssembly", [ |
| ["validate", 1], |
| ["compile", 1], |
| ["instantiate", 1], |
| ]); |
| |
| |
| test_operations(WebAssembly.Module, "WebAssembly.Module", [ |
| ["exports", 1], |
| ["imports", 1], |
| ["customSections", 2], |
| ]); |
| |
| |
| test_attributes(WebAssembly.Instance.prototype, "WebAssembly.Instance", [ |
| ["exports", false], |
| ]); |
| |
| |
| test_operations(WebAssembly.Memory.prototype, "WebAssembly.Memory", [ |
| ["grow", 1], |
| ]); |
| |
| test_attributes(WebAssembly.Memory.prototype, "WebAssembly.Memory", [ |
| ["buffer", false], |
| ]); |
| |
| |
| test_operations(WebAssembly.Table.prototype, "WebAssembly.Table", [ |
| ["grow", 1], |
| ["get", 1], |
| ["set", 2], |
| ]); |
| |
| test_attributes(WebAssembly.Table.prototype, "WebAssembly.Table", [ |
| ["length", false], |
| ]); |
| |
| |
| test_operations(WebAssembly.Global.prototype, "WebAssembly.Global", [ |
| ["valueOf", 0], |
| ]); |
| |
| test_attributes(WebAssembly.Global.prototype, "WebAssembly.Global", [ |
| ["value", true], |
| ]); |