// 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.

import "native_testing.dart";

typedef void Callback0();
typedef void Callback1(arg1);
typedef void Callback2(arg1, arg2);

@Native("A")
class A {
  foo1(Callback1 closure, [arg1 = 0]) native;
  foo2(Callback2 closure, [arg1 = 0, arg2 = 1]) native;
}

A makeA() native;

void setup() {
  JS('', r"""
(function(){
  function A() {}
  A.prototype.foo1 = function(closure, arg1) { return closure(arg1); };
  A.prototype.foo2 = function(closure, arg1, arg2) {
    return closure(arg1, arg2);
  };
  makeA = function(){return new A()};
  self.nativeConstructor(A);
})()""");
}

main() {
  nativeTesting();
  setup();
  var a = makeA();
  // Statically known receiver type calls.
  Expect.equals(43, a.foo1((arg1) => arg1, 43));
  Expect.equals(0, a.foo1((arg1) => arg1));

  Expect.equals(44, a.foo2((arg1, arg2) => arg1 + arg2, 21, 23));
  Expect.equals(22, a.foo2((arg1, arg2) => arg1 + arg2, 21));

  // Dynamic calls.
  Expect.equals(43, confuse(a).foo1((arg1) => arg1, 43));
  Expect.equals(0, confuse(a).foo1((arg1) => arg1));

  Expect.equals(44, confuse(a).foo2((arg1, arg2) => arg1 + arg2, 21, 23));
  Expect.equals(22, confuse(a).foo2((arg1, arg2) => arg1 + arg2, 21));
}
