// Copyright (c) 2012, 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.

// Test that exception unwrapping handle cases like ({foo:null}).foo().

import "native_testing.dart";

typedef void MyFunctionType();

@Native("A")
class A {
  setClosure(MyFunctionType? f) native;
  check(MyFunctionType? f) native;
  invoke() native;
}

makeA() native;

void setup() {
  JS('', r"""
(function(){
function A() {}
  A.prototype.setClosure = function(f) { this.f = f; };
  A.prototype.check = function(f) { return this.f === f; };
  A.prototype.invoke = function() { return this.f(); };
  self.makeA = function(){return new A()};

  self.nativeConstructor(A);
})()""");
  applyTestExtensions(['A']);
}

main() {
  nativeTesting();
  setup();
  A a = makeA();
  a.setClosure(null);
  Expect.isTrue(a.check(null));
  bool caughtException = false;
  try {
    a.invoke();
  } on NoSuchMethodError catch (e) {
    print(e);
    caughtException = true;
  }
  Expect.isTrue(caughtException);
}
