[package:js] Add JS test for function parameters

Adds tests for JS objects with functions with positional and
optional parameters. It does not include named arguments as those
should be statically disallowed.

Change-Id: I24acadc8160d3515bb79b00dc6ab28b528e2b039
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/148221
Commit-Queue: Srujan Gaddam <srujzs@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
diff --git a/tests/lib/js/parameters_test.dart b/tests/lib/js/parameters_test.dart
new file mode 100644
index 0000000..9123efe
--- /dev/null
+++ b/tests/lib/js/parameters_test.dart
@@ -0,0 +1,86 @@
+// 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.
+
+// 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);
+}
diff --git a/tests/lib_2/js/parameters_test.dart b/tests/lib_2/js/parameters_test.dart
new file mode 100644
index 0000000..4a65a6b
--- /dev/null
+++ b/tests/lib_2/js/parameters_test.dart
@@ -0,0 +1,86 @@
+// 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.
+
+// 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);
+}