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

import "native_testing.dart";

// Test that native methods with unnamed* optional arguments are called with the
// number of arguments in the call site.  This is necessary because native
// methods can dispatch on the number of arguments.  Passing null or undefined
// as the last argument is not the same as passing one fewer argument.
//
// * Optional positional arguments are passed in the correct position, so
// require preceding arguments to be passed.

@Native("A")
class A {
  int foo(int x) native;
}

@Native("B")
class B {
  int foo([x, y, z]) native;
}

// TODO(sra): Add a case where the parameters have default values.  Wait until
// dart:html need non-null default values.

A makeA() native;
B makeB() native;

void setup() {
  JS('', r"""
(function(){
  function A() {}
  A.prototype.foo = function () { return arguments.length; };

  function B() {}
  B.prototype.foo = function () { return arguments.length; };

  self.makeA = function(){return new A()};
  self.makeB = function(){return new B()};

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

testDynamicContext() {
  var a = confuse(makeA());
  var b = confuse(makeB());

  Expect.throws(() => a.foo());
  Expect.equals(1, a.foo(10));
  Expect.throws(() => a.foo(10, 20));
  Expect.throws(() => a.foo(10, 20, 30));

  Expect.equals(0, b.foo());
  Expect.equals(1, b.foo(10));
  Expect.equals(2, b.foo(10, 20));
  Expect.equals(3, b.foo(10, 20, 30));

  Expect.throws(() => b.foo(10, 20, 30, 40));
}

testStaticContext() {
  A a = makeA();
  B b = makeB();

  Expect.throws(() => (a as dynamic).foo());
  Expect.equals(1, a.foo(10));
  Expect.throws(() => (a as dynamic).foo(10, 20));
  Expect.throws(() => (a as dynamic).foo(10, 20, 30));

  Expect.equals(0, b.foo());
  Expect.equals(1, b.foo(10));
  Expect.equals(2, b.foo(10, 20));
  Expect.equals(3, b.foo(10, 20, 30));

  Expect.throws(() => (b as dynamic).foo(10, 20, 30, 40));
}

main() {
  nativeTesting();
  setup();
  testDynamicContext();
  testStaticContext();
}
