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

// Tests positional and optional arguments for various JS objects.

@JS()
library js_parameters_test;

import 'package:js/js.dart';
import 'package:expect/expect.dart';

@JS()
external void eval(String code);

@JS()
class Foo {
  external factory Foo();
  external singleArg(a);
  external singlePositionalArg([dynamic a]);
  external mixedPositionalArgs(a, [dynamic b]);
}

@JS()
class Bar {
  external static singleArg(a);
  external static singlePositionalArg([dynamic a]);
  external static mixedPositionalArgs(a, [dynamic b]);
}

external singleArg(a);
external singlePositionalArg([dynamic a]);
external mixedPositionalArgs(a, [dynamic b]);

main() {
  eval(r"""
    function Foo() {}
    Foo.prototype.singleArg = function(a) {
      return a;
    }
    Foo.prototype.singlePositionalArg = singleArg;
    Foo.prototype.mixedPositionalArgs = function(a, b) {
      if (arguments.length == 0) return a;
      return arguments[arguments.length - 1];
    }

    var Bar = {
      singleArg: function(a) {
        return a;
      },
      singlePositionalArg: singleArg,
      mixedPositionalArgs: function(a, b) {
        if (arguments.length == 0) return a;
        return arguments[arguments.length - 1];
      },
    };

    function singleArg(a) {
      return a;
    }
    var singlePositionalArg = singleArg;
    function mixedPositionalArgs(a, b) {
      if (arguments.length == 0) return a;
      return arguments[arguments.length - 1];
    }
  """);

  var foo = Foo();
  Expect.equals(foo.singleArg(2), 2);
  Expect.equals(foo.singlePositionalArg(2), 2);
  Expect.equals(foo.singlePositionalArg(), null);
  Expect.equals(foo.mixedPositionalArgs(3), 3);
  Expect.equals(foo.mixedPositionalArgs(3, 4), 4);

  Expect.equals(Bar.singleArg(2), 2);
  Expect.equals(Bar.singlePositionalArg(2), 2);
  Expect.equals(Bar.singlePositionalArg(), null);
  Expect.equals(Bar.mixedPositionalArgs(3), 3);
  Expect.equals(Bar.mixedPositionalArgs(3, 4), 4);

  Expect.equals(singleArg(2), 2);
  Expect.equals(singlePositionalArg(2), 2);
  Expect.equals(singlePositionalArg(), null);
  Expect.equals(mixedPositionalArgs(3), 3);
  Expect.equals(mixedPositionalArgs(3, 4), 4);
}
