// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// @dart = 2.9

// Test errors thrown by function imports.

import "package:expect/expect.dart";
import "package:wasm/wasm.dart";
import "dart:typed_data";

void main() {
  // This module expects a function import like:
  // int64_t someFn(int32_t a, int64_t b, float c, double d);
  var data = Uint8List.fromList([
    0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x0c, 0x02, 0x60,
    0x04, 0x7f, 0x7e, 0x7d, 0x7c, 0x01, 0x7e, 0x60, 0x00, 0x00, 0x02, 0x0e,
    0x01, 0x03, 0x65, 0x6e, 0x76, 0x06, 0x73, 0x6f, 0x6d, 0x65, 0x46, 0x6e,
    0x00, 0x00, 0x03, 0x02, 0x01, 0x01, 0x04, 0x05, 0x01, 0x70, 0x01, 0x01,
    0x01, 0x05, 0x03, 0x01, 0x00, 0x02, 0x06, 0x08, 0x01, 0x7f, 0x01, 0x41,
    0x80, 0x88, 0x04, 0x0b, 0x07, 0x11, 0x02, 0x06, 0x6d, 0x65, 0x6d, 0x6f,
    0x72, 0x79, 0x02, 0x00, 0x04, 0x62, 0x6c, 0x61, 0x68, 0x00, 0x01, 0x0a,
    0x1d, 0x01, 0x1b, 0x00, 0x41, 0x01, 0x42, 0x02, 0x43, 0x00, 0x00, 0x40,
    0x40, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x10, 0x80,
    0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b,
  ]);

  var mod = WasmModule(data);

  // Valid instantiation.
  var inst = mod
      .instantiate()
      .addFunction("env", "someFn", (int a, int b, num c, double d) => 123)
      .build();

  // Missing imports.
  Expect.throws(() => mod.instantiate().build(),
      (Exception e) => "$e".contains("Missing import"));

  // Wrong kind of import.
  Expect.throws(
      () => mod.instantiate().addMemory(false, "env", "someFn", mod.createMemory(10)),
      (Exception e) => "$e".contains("Import is not a memory"));

  // Wrong namespace.
  Expect.throws(
      () => mod
          .instantiate()
          .addFunction("foo", "someFn", (int a, int b, num c, double d) => 123)
          .build(),
      (Exception e) => "$e".contains("Import not found"));

  // Wrong name.
  Expect.throws(
      () => mod
          .instantiate()
          .addFunction("env", "otherFn", (int a, int b, num c, double d) => 123)
          .build(),
      (Exception e) => "$e".contains("Import not found"));

  // Already filled.
  Expect.throws(
      () => mod
          .instantiate()
          .addFunction("env", "someFn", (int a, int b, num c, double d) => 123)
          .addFunction("env", "someFn", (int a, int b, num c, double d) => 456)
          .build(),
      (Exception e) => "$e".contains("Import already filled"));
}
