160 lines
5 KiB
JavaScript
160 lines
5 KiB
JavaScript
// META: global=window,dedicatedworker,jsshell,shadowrealm
|
|
// 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, object[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_js(TypeError, () => WebAssembly());
|
|
}, "WebAssembly: calling");
|
|
|
|
test(() => {
|
|
assert_throws_js(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", 1],
|
|
]);
|
|
|
|
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],
|
|
]);
|