Index: test/mjsunit/strong/function-arity.js |
diff --git a/test/mjsunit/strong/function-arity.js b/test/mjsunit/strong/function-arity.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..869126ad3593b8256c6fec9613f289916994a6d5 |
--- /dev/null |
+++ b/test/mjsunit/strong/function-arity.js |
@@ -0,0 +1,248 @@ |
+// Copyright 2015 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Flags: --strong-mode --harmony_arrow_functions --harmony-reflect |
+ |
+(function NoArguments() { |
+ 'use strong'; |
+ |
+ function checkNoArguments(f) { |
+ f(); |
+ f(1); |
+ f(1, 2); |
+ f(undefined); |
+ f.call(undefined); |
rossberg
2015/05/05 14:26:20
Perhaps add f.call() and f.apply() (here and elsew
arv (Not doing code reviews)
2015/05/05 16:46:29
Done.
|
+ f.call(undefined, 1); |
+ f.call(undefined, 1, 2); |
+ f.call(undefined, undefined); |
+ f.apply(undefined); |
+ f.apply(undefined, []); |
+ f.apply(undefined, [1]); |
+ f.apply(undefined, [1, 2]); |
+ f.apply(undefined, [undefined]); |
rossberg
2015/05/05 14:26:20
Also add tests for .bind, %Call, %Apply, %_CallFun
arv (Not doing code reviews)
2015/05/05 16:46:29
Your wish is my command.
Done.
If you can think
rossberg
2015/05/05 16:51:56
Oh, and super calls. :)
|
+ } |
+ |
+ function f() {} |
+ function* g() {} |
+ let a = () => 42; |
+ |
+ checkNoArguments(f); |
+ checkNoArguments(g); |
+ checkNoArguments(a); |
+ |
+})(); |
+ |
+ |
+(function NoArgumentsMethod() { |
+ 'use strong'; |
+ |
+ function checkNoArguments(object) { |
+ object.m(); |
+ object.m(1); |
+ object.m(1, 2); |
+ object.m(undefined); |
+ object.m.call(object); |
+ object.m.call(object, 1); |
+ object.m.call(object, 1, 2); |
+ object.m.call(object, undefined); |
+ object.m.apply(object); |
+ object.m.apply(object, []); |
+ object.m.apply(object, [1]); |
+ object.m.apply(object, [1, 2]); |
+ object.m.apply(object, [undefined]); |
+ } |
+ |
+ class C { |
+ m() {} |
+ } |
+ let obj = { |
+ m() {} |
+ }; |
+ |
+ checkNoArguments(new C()); |
+ checkNoArguments(obj); |
+})(); |
+ |
+ |
+(function NoArgumentsConstructor() { |
+ 'use strong'; |
+ |
+ class C { |
+ constructor() {} |
+ } |
+ |
+ new C(); |
+ new C(1); |
+ new C(1, 2); |
+ new C(undefined); |
+ Reflect.construct(C, []); |
+ Reflect.construct(C, [1]); |
+ Reflect.construct(C, [1, 2]); |
+ Reflect.construct(C, [undefined]); |
+})(); |
+ |
+ |
+(function OneArgument() { |
+ 'use strong'; |
+ |
+ function checkOneArgument(fun) { |
+ assertThrows(function() { fun(); }, TypeError); |
+ fun(1); |
+ fun(1, 2); |
+ fun(undefined); |
+ assertThrows(function() { fun.call(undefined); }, TypeError); |
+ fun.call(undefined, 1); |
+ fun.call(undefined, 1, 2); |
+ fun.call(undefined, undefined); |
+ assertThrows(function() { fun.apply(undefined); }, TypeError); |
+ assertThrows(function() { fun.apply(undefined, []); }, TypeError); |
+ fun.apply(undefined, [1]); |
+ fun.apply(undefined, [1, 2]); |
+ fun.apply(undefined, [undefined]); |
+ } |
+ |
+ function f(x) {} |
+ function* g(x) {} |
+ let a = (x) => {}; |
+ |
+ checkOneArgument(f); |
+ checkOneArgument(g); |
+ checkOneArgument(a); |
+})(); |
+ |
+ |
+(function OneArgumentMethod() { |
+ 'use strong'; |
+ |
+ function checkOneArgument(object) { |
+ assertThrows(function() { object.m(); }, TypeError); |
+ object.m(1); |
+ object.m(1, 2); |
+ object.m(undefined); |
+ assertThrows(function() { object.m.call(undefined); }, TypeError); |
+ object.m.call(object, 1); |
+ object.m.call(object, 1, 2); |
+ object.m.call(object, undefined); |
+ assertThrows(function() { object.m.apply(object); }, TypeError); |
+ assertThrows(function() { object.m.apply(object, []); }, TypeError); |
+ object.m.apply(object, [1]); |
+ object.m.apply(object, [1, 2]); |
+ object.m.apply(object, [undefined]); |
+ } |
+ |
+ class C { |
+ m(x) {} |
+ } |
+ let obj = { |
+ m(x) {} |
+ }; |
+ |
+ checkOneArgument(new C()); |
+ checkOneArgument(obj); |
+})(); |
+ |
+ |
+(function OneArgumentConstructor() { |
+ 'use strong'; |
+ |
+ class C { |
+ constructor(x) {} |
+ } |
+ |
+ assertThrows(function() { new C(); }, TypeError); |
+ new C(1); |
+ new C(1, 2); |
+ new C(undefined); |
+ assertThrows(function() { Reflect.construct(C); }, TypeError); |
+ assertThrows(function() { Reflect.construct(C, []); }, TypeError); |
+ Reflect.construct(C, [1]); |
+ Reflect.construct(C, [1, 2]); |
+ Reflect.construct(C, [undefined]); |
+})(); |
+ |
+ |
+(function TwoArguments() { |
+ 'use strong'; |
+ |
+ function checkTwoArguments(fun) { |
+ assertThrows(function() { fun(); }, TypeError); |
+ assertThrows(function() { fun(1); }, TypeError); |
+ fun(1, 2); |
+ fun(1, 2, 3); |
+ assertThrows(function() { fun(undefined); }, TypeError); |
+ assertThrows(function() { fun.call(undefined); }, TypeError); |
+ assertThrows(function() { fun.call(undefined, 1); }, TypeError); |
+ fun.call(undefined, 1, 2); |
+ fun.call(undefined, 1, 2, 3); |
+ assertThrows(function() { fun.call(undefined, undefined); }, TypeError); |
+ assertThrows(function() { fun.apply(undefined); }, TypeError); |
+ assertThrows(function() { fun.apply(undefined, []); }, TypeError); |
+ assertThrows(function() { fun.apply(undefined, [1]); }, TypeError); |
+ fun.apply(undefined, [1, 2]); |
+ fun.apply(undefined, [1, 2, 3]); |
+ assertThrows(function() { fun.apply(undefined, [undefined]); }, TypeError); |
+ } |
+ |
+ function f(x, y) {} |
+ function* g(x, y) {} |
+ let a = (x, y) => {}; |
+ |
+ checkTwoArguments(f); |
+ checkTwoArguments(g); |
+ checkTwoArguments(a); |
+})(); |
+ |
+ |
+(function TwoArgumentsMethod() { |
+ 'use strong'; |
+ |
+ function checkTwoArguments(object) { |
+ assertThrows(function() { object.m(); }, TypeError); |
+ assertThrows(function() { object.m(1); }, TypeError); |
+ object.m(1, 2); |
+ object.m(1, 2, 3); |
+ assertThrows(function() { object.m(undefined); }, TypeError); |
+ assertThrows(function() { object.m.call(object); }, TypeError); |
+ assertThrows(function() { object.m.call(object, 1); }, TypeError); |
+ object.m.call(object, 1, 2); |
+ object.m.call(object, 1, 2, 3); |
+ assertThrows(function() { object.m.call(object, undefined); }, TypeError); |
+ assertThrows(function() { object.m.apply(object); }, TypeError); |
+ assertThrows(function() { object.m.apply(object, []); }, TypeError); |
+ assertThrows(function() { object.m.apply(object, [1]); }, TypeError); |
+ object.m.apply(object, [1, 2]); |
+ object.m.apply(object, [1, 2, 3]); |
+ assertThrows(function() { object.m.apply(object, [undefined]); }, TypeError); |
+ } |
+ |
+ class C { |
+ m(x, y) {} |
+ } |
+ let obj = { |
+ m(x, y) {} |
+ }; |
+ |
+ checkTwoArguments(new C()); |
+ checkTwoArguments(obj); |
+})(); |
+ |
+ |
+(function TwoArgumentsConstructor() { |
+ 'use strong'; |
+ |
+ class C { |
+ constructor(x, y) {} |
+ } |
+ |
+ assertThrows(function() { new C(); }, TypeError); |
+ assertThrows(function() { new C(1); }, TypeError); |
+ new C(1, 2); |
+ new C(1, 2, 3); |
+ assertThrows(function() { new C(undefined); }, TypeError); |
+ assertThrows(function() { Reflect.construct(C, []); }, TypeError); |
+ assertThrows(function() { Reflect.construct(C, [1]); }, TypeError); |
+ Reflect.construct(C, [1, 2]); |
+ Reflect.construct(C, [1, 2, 3]); |
+ assertThrows(function() { Reflect.construct(C, [undefined]); }, TypeError); |
+})(); |