Skip to content

Commit

Permalink
[test] Add JS API tests for boundary casts
Browse files Browse the repository at this point in the history
Mostly tests the ToWebAssemblyValue metafunction
  • Loading branch information
takikawa committed Sep 20, 2023
1 parent 771f4ef commit 4d4624e
Showing 1 changed file with 200 additions and 0 deletions.
200 changes: 200 additions & 0 deletions test/js-api/gc/casts.tentative.any.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
// META: global=window,dedicatedworker,jsshell
// META: script=/wasm/jsapi/wasm-module-builder.js

let exports = {};
setup(() => {
const builder = new WasmModuleBuilder();
const structIndex = builder.addStruct([makeField(kWasmI32, true)]);
const arrayIndex = builder.addArray(kWasmI32, true);
const structIndex2 = builder.addStruct([makeField(kWasmF32, true)]);
const arrayIndex2 = builder.addArray(kWasmF32, true);
const funcIndex = builder.addType({ params: [], results: [] });

const anyRef = wasmRefType(kWasmAnyRef);
const eqRef = wasmRefType(kWasmEqRef);
const structRef = wasmRefType(kWasmStructRef);
const arrayRef = wasmRefType(kWasmArrayRef);
const i31Ref = wasmRefType(kWasmI31Ref);
const funcRef = wasmRefType(kWasmFuncRef);

builder
.addFunction("anyArg", makeSig_v_x(anyRef))
.addBody([])
.exportFunc();

builder
.addFunction("eqArg", makeSig_v_x(eqRef))
.addBody([])
.exportFunc();

builder
.addFunction("structArg", makeSig_v_x(structRef))
.addBody([])
.exportFunc();

builder
.addFunction("arrayArg", makeSig_v_x(arrayRef))
.addBody([])
.exportFunc();

builder
.addFunction("i31Arg", makeSig_v_x(i31Ref))
.addBody([])
.exportFunc();

builder
.addFunction("funcArg", makeSig_v_x(funcRef))
.addBody([])
.exportFunc();

builder
.addFunction("concreteStructArg", makeSig_v_x(wasmRefType(structIndex)))
.addBody([])
.exportFunc();

builder
.addFunction("concreteArrayArg", makeSig_v_x(wasmRefType(arrayIndex)))
.addBody([])
.exportFunc();

builder
.addFunction("concreteFuncArg", makeSig_v_x(wasmRefType(funcIndex)))
.addBody([])
.exportFunc();

builder
.addFunction("makeStruct", makeSig_r_v(wasmRefType(structIndex)))
.addBody([...wasmI32Const(42),
...GCInstr(kExprStructNew), structIndex])
.exportFunc();

builder
.addFunction("makeArray", makeSig_r_v(wasmRefType(arrayIndex)))
.addBody([...wasmI32Const(5), ...wasmI32Const(42),
...GCInstr(kExprArrayNew), arrayIndex])
.exportFunc();

builder
.addFunction("makeStruct2", makeSig_r_v(wasmRefType(structIndex2)))
.addBody([...wasmF32Const(42),
...GCInstr(kExprStructNew), structIndex2])
.exportFunc();

builder
.addFunction("makeArray2", makeSig_r_v(wasmRefType(arrayIndex2)))
.addBody([...wasmF32Const(42), ...wasmI32Const(5),
...GCInstr(kExprArrayNew), arrayIndex2])
.exportFunc();

builder
.addFunction("testFunc", funcIndex)
.addBody([])
.exportFunc();

const buffer = builder.toBuffer();
const module = new WebAssembly.Module(buffer);
const instance = new WebAssembly.Instance(module, {});
exports = instance.exports;
});

test(() => {
exports.anyArg(exports.makeStruct());
exports.anyArg(exports.makeArray());
exports.anyArg(42);
exports.anyArg(42n);
exports.anyArg("foo");
exports.anyArg({});
exports.anyArg(() => {});
assert_throws_js(TypeError, () => exports.anyArg(exports.testFunc));
}, "anyref casts");

test(() => {
exports.eqArg(exports.makeStruct());
exports.eqArg(exports.makeArray());
exports.eqArg(42);
assert_throws_js(TypeError, () => exports.eqArg(42n));
assert_throws_js(TypeError, () => exports.eqArg("foo"));
assert_throws_js(TypeError, () => exports.eqArg({}));
assert_throws_js(TypeError, () => exports.eqArg(exports.testFunc));
assert_throws_js(TypeError, () => exports.eqArg(() => {}));
}, "eqref casts");

test(() => {
exports.structArg(exports.makeStruct());
assert_throws_js(TypeError, () => exports.structArg(exports.makeArray()));
assert_throws_js(TypeError, () => exports.structArg(42));
assert_throws_js(TypeError, () => exports.structArg(42n));
assert_throws_js(TypeError, () => exports.structArg("foo"));
assert_throws_js(TypeError, () => exports.structArg({}));
assert_throws_js(TypeError, () => exports.structArg(exports.testFunc));
assert_throws_js(TypeError, () => exports.structArg(() => {}));
}, "structref casts");

test(() => {
exports.arrayArg(exports.makeArray());
assert_throws_js(TypeError, () => exports.arrayArg(exports.makeStruct()));
assert_throws_js(TypeError, () => exports.arrayArg(42));
assert_throws_js(TypeError, () => exports.arrayArg(42n));
assert_throws_js(TypeError, () => exports.arrayArg("foo"));
assert_throws_js(TypeError, () => exports.arrayArg({}));
assert_throws_js(TypeError, () => exports.arrayArg(exports.testFunc));
assert_throws_js(TypeError, () => exports.arrayArg(() => {}));
}, "arrayref casts");

test(() => {
exports.i31Arg(42);
assert_throws_js(TypeError, () => exports.i31Arg(exports.makeStruct()));
assert_throws_js(TypeError, () => exports.i31Arg(exports.makeArray()));
assert_throws_js(TypeError, () => exports.i31Arg(42n));
assert_throws_js(TypeError, () => exports.i31Arg("foo"));
assert_throws_js(TypeError, () => exports.i31Arg({}));
assert_throws_js(TypeError, () => exports.i31Arg(exports.testFunc));
assert_throws_js(TypeError, () => exports.i31Arg(() => {}));
}, "i31ref casts");

test(() => {
exports.funcArg(exports.testFunc);
assert_throws_js(TypeError, () => exports.funcArg(exports.makeStruct()));
assert_throws_js(TypeError, () => exports.funcArg(exports.makeArray()));
assert_throws_js(TypeError, () => exports.funcArg(42));
assert_throws_js(TypeError, () => exports.funcArg(42n));
assert_throws_js(TypeError, () => exports.funcArg("foo"));
assert_throws_js(TypeError, () => exports.funcArg({}));
assert_throws_js(TypeError, () => exports.funcArg(() => {}));
}, "funcref casts");

test(() => {
exports.concreteStructArg(exports.makeStruct());
assert_throws_js(TypeError, () => exports.concreteStructArg(exports.makeStruct2()));
assert_throws_js(TypeError, () => exports.concreteStructArg(exports.makeArray()));
assert_throws_js(TypeError, () => exports.concreteStructArg(42));
assert_throws_js(TypeError, () => exports.concreteStructArg(42n));
assert_throws_js(TypeError, () => exports.concreteStructArg("foo"));
assert_throws_js(TypeError, () => exports.concreteStructArg({}));
assert_throws_js(TypeError, () => exports.concreteStructArg(exports.testFunc));
assert_throws_js(TypeError, () => exports.concreteStructArg(() => {}));
}, "concrete struct casts");

test(() => {
exports.concreteArrayArg(exports.makeArray());
assert_throws_js(TypeError, () => exports.concreteArrayArg(exports.makeArray2()));
assert_throws_js(TypeError, () => exports.concreteArrayArg(exports.makeStruct()));
assert_throws_js(TypeError, () => exports.concreteArrayArg(42));
assert_throws_js(TypeError, () => exports.concreteArrayArg(42n));
assert_throws_js(TypeError, () => exports.concreteArrayArg("foo"));
assert_throws_js(TypeError, () => exports.concreteArrayArg({}));
assert_throws_js(TypeError, () => exports.concreteArrayArg(exports.testFunc));
assert_throws_js(TypeError, () => exports.concreteArrayArg(() => {}));
}, "concrete array casts");

test(() => {
exports.concreteFuncArg(exports.testFunc);
assert_throws_js(TypeError, () => exports.concreteFuncArg(exports.makeArray()));
assert_throws_js(TypeError, () => exports.concreteFuncArg(exports.makeStruct()));
assert_throws_js(TypeError, () => exports.concreteFuncArg(42));
assert_throws_js(TypeError, () => exports.concreteFuncArg(42n));
assert_throws_js(TypeError, () => exports.concreteFuncArg("foo"));
assert_throws_js(TypeError, () => exports.concreteFuncArg({}));
assert_throws_js(TypeError, () => exports.concreteFuncArg(exports.eqArg));
assert_throws_js(TypeError, () => exports.concreteFuncArg(() => {}));
}, "concrete func casts");

0 comments on commit 4d4624e

Please sign in to comment.