// META: global=window,dedicatedworker,jsshell
// META: script=/wasm/jsapi/assertions.js
// META: script=/wasm/jsapi/wasm-module-builder.js

let emptyModuleBinary;
setup(() => {
  emptyModuleBinary = new WasmModuleBuilder().toBuffer();
});

test(() => {
  class _Module extends WebAssembly.Module {}
  let module = new _Module(emptyModuleBinary);
  assert_true(module instanceof _Module, "_Module instanceof _Module");
  assert_true(module instanceof WebAssembly.Module, "_Module instanceof WebAssembly.Module");
}, "_Module");

test(() => {
  class _Instance extends WebAssembly.Instance {}
  let instance = new _Instance(new WebAssembly.Module(emptyModuleBinary));
  assert_true(instance instanceof _Instance, "_Instance instanceof _Instance");
  assert_true(instance instanceof WebAssembly.Instance, "_Instance instanceof WebAssembly.Instance");
}, "_Instance");

test(() => {
  class _Memory extends WebAssembly.Memory {}
  let memory = new _Memory({initial: 0, maximum: 1});
  assert_true(memory instanceof _Memory, "_Memory instanceof _Memory");
  assert_true(memory instanceof WebAssembly.Memory, "_Memory instanceof WebAssembly.Memory");
}, "_Memory");

test(() => {
  class _Table extends WebAssembly.Table {}
  let table = new _Table({initial: 0, element: "anyfunc"});
  assert_true(table instanceof _Table, "_Table instanceof _Table");
  assert_true(table instanceof WebAssembly.Table, "_Table instanceof WebAssembly.Table");
}, "_Table");

test(() => {
  class _Global extends WebAssembly.Global {}
  let global = new _Global({value: "i32", mutable: false}, 0);
  assert_true(global instanceof _Global, "_Global instanceof _Global");
  assert_true(global instanceof WebAssembly.Global, "_Global instanceof WebAssembly.Global");
}, "_Global");
