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);
+}
