// 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 throwing exceptions from an imported function.

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

void main() {
  // void fn() {
  //   a();
  //   b();
  // }
  var data = Uint8List.fromList([
    0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0x60,
    0x00, 0x00, 0x02, 0x11, 0x02, 0x03, 0x65, 0x6e, 0x76, 0x01, 0x61, 0x00,
    0x00, 0x03, 0x65, 0x6e, 0x76, 0x01, 0x62, 0x00, 0x00, 0x03, 0x02, 0x01,
    0x00, 0x04, 0x05, 0x01, 0x70, 0x01, 0x01, 0x01, 0x05, 0x03, 0x01, 0x00,
    0x02, 0x06, 0x08, 0x01, 0x7f, 0x01, 0x41, 0x80, 0x88, 0x04, 0x0b, 0x07,
    0x0f, 0x02, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, 0x02,
    0x66, 0x6e, 0x00, 0x02, 0x0a, 0x10, 0x01, 0x0e, 0x00, 0x10, 0x80, 0x80,
    0x80, 0x80, 0x00, 0x10, 0x81, 0x80, 0x80, 0x80, 0x00, 0x0b,
  ]);

  bool called_b = false;
  var thrownException = Exception("Hello exception!");
  var inst = WasmModule(data).instantiate().addFunction("env", "a", () {
    throw thrownException;
  }).addFunction("env", "b", () {
    called_b = true;
  }).build();
  var fn = inst.lookupFunction("fn");
  Expect.throws(() => fn(), (Exception e) => e == thrownException);
  Expect.isFalse(called_b);

  bool called_a = false;
  inst = WasmModule(data).instantiate().addFunction("env", "a", () {
    called_a = true;
  }).addFunction("env", "b", () {
    called_b = true;
  }).build();
  fn = inst.lookupFunction("fn");
  fn();
  Expect.isTrue(called_a);
  Expect.isTrue(called_b);
}
