// Copyright 2018 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Flags: --experimental-wasm-bigint

load("test/mjsunit/wasm/wasm-module-builder.js");

(function TestWasmI64ToJSBigInt() {
  let builder = new WasmModuleBuilder();

  builder
    .addFunction("fn", kSig_l_v) // () -> i64
    .addBody([
      kExprI64Const, 0x3,
    ])
    .exportFunc();

  let module = builder.instantiate();

  assertEquals(typeof module.exports.fn(), "bigint");
  assertEquals(module.exports.fn(), 3n);
})();

(function TestJSBigIntToWasmI64Global() {
  let builder = new WasmModuleBuilder();

  let a_global_index = builder
    .addImportedGlobal("mod", "a", kWasmI64);

  let b_global_index = builder
    .addImportedGlobal("mod", "b", kWasmI64);

  builder
    .addExportOfKind('a', kExternalGlobal, a_global_index)
    .addExportOfKind('b', kExternalGlobal, b_global_index)

  let module = builder.instantiate({
    mod: {
      a: 1n,
      b: 2n ** 63n,
    }
  });

  assertEquals(module.exports.a.value, 1n);
  assertEquals(module.exports.b.value, - (2n ** 63n));
})();

(function TestJSBigIntGlobalImportInvalidType() {
  let builder = new WasmModuleBuilder();
  builder.addImportedGlobal("mod", "a", kWasmI64);
  assertThrows(() => builder.instantiate({mod: { a: {} } }), WebAssembly.LinkError);
})();

(function TestJSBigIntToWasmI64MutableGlobal() {
  let builder = new WasmModuleBuilder();

  let a_global_index = builder
    .addImportedGlobal("mod", "a", kWasmI64, /* mutable = */ true)

  builder
    .addExportOfKind('a', kExternalGlobal, a_global_index);

  // as non object
  let fn = () => builder.instantiate({
    mod: {
      a: 1n,
    }
  });

  assertThrows(fn, WebAssembly.LinkError);

  // as WebAssembly.Global object
  let module = builder.instantiate({
    mod: {
      a: new WebAssembly.Global({ value: "i64", mutable: true }, 1n),
    }
  });

  assertEquals(module.exports.a.value, 1n);
})();

(function TestJSBigIntToWasmI64Identity() {
  let builder = new WasmModuleBuilder();

  builder
    .addFunction("f", kSig_l_l) // i64 -> i64
    .addBody([
      kExprLocalGet, 0,
    ])
    .exportFunc();

  let module = builder.instantiate();
  let f = module.exports.f;

  assertEquals(f(0n), 0n);
  assertEquals(f(123n), 123n);
  assertEquals(f(-123n), -123n);

  assertEquals(f("5"), 5n);

  assertThrows(() => f(5), TypeError);
})();

(function TestJSBigIntToWasmI64Projection() {
  let builder = new WasmModuleBuilder();

  builder
    .addFunction("f", kSig_l_ll) // i64 -> i64
    .addBody([
      kExprLocalGet, 1,
    ])
    .exportFunc();

  let module = builder.instantiate();
  let f = module.exports.f;

  assertEquals(f(1n, 0n), 0n);
  assertEquals(f(1n, 123n), 123n);
  assertEquals(f(1n, -123n), -123n);

  assertEquals(f(1n, "5"), 5n);

  assertThrows(() => f(1n, 5), TypeError);
})();

(function TestI64Global() {
  let argument = { "value": "i64", "mutable": true };
  let global = new WebAssembly.Global(argument);

  assertEquals(global.value, 0n); // initial value

  global.value = 123n;
  assertEquals(global.valueOf(), 123n);

  global.value = 2n ** 63n;
  assertEquals(global.valueOf(), - (2n ** 63n));
})();

(function TestI64GlobalValueOf() {
  let argument = { "value": "i64" };

  // as literal
  let global = new WebAssembly.Global(argument, {
    valueOf() {
      return 123n;
    }
  });
  assertEquals(global.value, 123n);

  // as string
  let global2 = new WebAssembly.Global(argument, {
    valueOf() {
      return "321";
    }
  });
  assertEquals(global2.value, 321n);
})();

(function TestInvalidValtypeGlobalErrorMessage() {
  let argument = { "value": "some string" };
  assertThrows(() => new WebAssembly.Global(argument), TypeError);

  try {
    new WebAssembly.Global(argument);
  } catch (e) {
    assertContains("'value' must be a WebAssembly type", e.message);
  }
})();

(function TestGlobalI64ValueWrongType() {
  let argument = { "value": "i64" };
  assertThrows(() => new WebAssembly.Global(argument, 666), TypeError);
})();

(function TestGlobalI64SetWrongType() {
  let argument = { "value": "i64", "mutable": true };
  let global = new WebAssembly.Global(argument);

  assertThrows(() => global.value = 1, TypeError);
})();

(function TestFuncParamF64PassingBigInt() {
  let builder = new WasmModuleBuilder();

  builder
      .addFunction("f", kSig_v_d) // f64 -> ()
      .addBody([])
      .exportFunc();

  let module = builder.instantiate();

  assertThrows(() => module.exports.f(123n), TypeError);
})();
