From c46f5ff4b7ffd14c2bd878ad0c5151ee45493431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Bargull?= Date: Tue, 1 Mar 2016 19:13:43 +0100 Subject: [PATCH] Increase coverage for %ThrowTypeError% --- test/built-ins/ThrowTypeError/extensible.js | 17 +++++++++++ .../ThrowTypeError/forbidden-arguments.js | 30 +++++++++++++++++++ .../ThrowTypeError/forbidden-caller.js | 30 +++++++++++++++++++ test/built-ins/ThrowTypeError/frozen.js | 19 ++++++++++++ test/built-ins/ThrowTypeError/is-function.js | 17 +++++++++++ test/built-ins/ThrowTypeError/length.js | 22 ++++++++++++++ test/built-ins/ThrowTypeError/name.js | 17 +++++++++++ test/built-ins/ThrowTypeError/prototype.js | 24 +++++++++++++++ .../ThrowTypeError/throws-type-error.js | 20 +++++++++++++ .../unique-per-realm-function-proto.js | 24 +++++++++++++++ .../unique-per-realm-non-simple.js | 27 +++++++++++++++++ .../unique-per-realm-unmapped-args.js | 28 +++++++++++++++++ 12 files changed, 275 insertions(+) create mode 100755 test/built-ins/ThrowTypeError/extensible.js create mode 100755 test/built-ins/ThrowTypeError/forbidden-arguments.js create mode 100755 test/built-ins/ThrowTypeError/forbidden-caller.js create mode 100755 test/built-ins/ThrowTypeError/frozen.js create mode 100755 test/built-ins/ThrowTypeError/is-function.js create mode 100755 test/built-ins/ThrowTypeError/length.js create mode 100755 test/built-ins/ThrowTypeError/name.js create mode 100755 test/built-ins/ThrowTypeError/prototype.js create mode 100755 test/built-ins/ThrowTypeError/throws-type-error.js create mode 100755 test/built-ins/ThrowTypeError/unique-per-realm-function-proto.js create mode 100755 test/built-ins/ThrowTypeError/unique-per-realm-non-simple.js create mode 100755 test/built-ins/ThrowTypeError/unique-per-realm-unmapped-args.js diff --git a/test/built-ins/ThrowTypeError/extensible.js b/test/built-ins/ThrowTypeError/extensible.js new file mode 100755 index 0000000000..907181662b --- /dev/null +++ b/test/built-ins/ThrowTypeError/extensible.js @@ -0,0 +1,17 @@ +// Copyright (C) 2016 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%throwtypeerror% +description: > + %ThrowTypeError% is not extensible. +info: > + %ThrowTypeError% ( ) + + The value of the [[Extensible]] internal slot of a %ThrowTypeError% + function is false. +---*/ + +var ThrowTypeError = Object.getOwnPropertyDescriptor(function(){ "use strict"; return arguments; }(), "callee").get; + +assert.sameValue(Object.isExtensible(ThrowTypeError), false); diff --git a/test/built-ins/ThrowTypeError/forbidden-arguments.js b/test/built-ins/ThrowTypeError/forbidden-arguments.js new file mode 100755 index 0000000000..133bac4733 --- /dev/null +++ b/test/built-ins/ThrowTypeError/forbidden-arguments.js @@ -0,0 +1,30 @@ +// Copyright (C) 2016 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%throwtypeerror% +description: > + %ThrowTypeError% does not have an own "arguments" property. +info: > + %ThrowTypeError% ( ) + + The %ThrowTypeError% intrinsic is an anonymous built-in function + object that is defined once for each realm. + + 16.2 Forbidden Extensions + + Other than as defined in this specification, ECMAScript Function + objects defined using syntactic constructors in strict mode code + must not be created with own properties named "caller" or + "arguments" other than those that are created by applying the + AddRestrictedFunctionProperties abstract operation (9.2.7) to + the function. [...] Built-in functions, strict mode functions + created using the Function constructor, generator functions + created using the Generator constructor, and functions created + using the bind method also must not be created with such own + properties. +---*/ + +var ThrowTypeError = Object.getOwnPropertyDescriptor(function(){ "use strict"; return arguments; }(), "callee").get; + +assert.sameValue(Object.prototype.hasOwnProperty.call(ThrowTypeError, "arguments"), false); diff --git a/test/built-ins/ThrowTypeError/forbidden-caller.js b/test/built-ins/ThrowTypeError/forbidden-caller.js new file mode 100755 index 0000000000..5f895ede93 --- /dev/null +++ b/test/built-ins/ThrowTypeError/forbidden-caller.js @@ -0,0 +1,30 @@ +// Copyright (C) 2016 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%throwtypeerror% +description: > + %ThrowTypeError% does not have an own "caller" property. +info: > + %ThrowTypeError% ( ) + + The %ThrowTypeError% intrinsic is an anonymous built-in function + object that is defined once for each realm. + + 16.2 Forbidden Extensions + + Other than as defined in this specification, ECMAScript Function + objects defined using syntactic constructors in strict mode code + must not be created with own properties named "caller" or + "arguments" other than those that are created by applying the + AddRestrictedFunctionProperties abstract operation (9.2.7) to + the function. [...] Built-in functions, strict mode functions + created using the Function constructor, generator functions + created using the Generator constructor, and functions created + using the bind method also must not be created with such own + properties. +---*/ + +var ThrowTypeError = Object.getOwnPropertyDescriptor(function(){ "use strict"; return arguments; }(), "callee").get; + +assert.sameValue(Object.prototype.hasOwnProperty.call(ThrowTypeError, "caller"), false); diff --git a/test/built-ins/ThrowTypeError/frozen.js b/test/built-ins/ThrowTypeError/frozen.js new file mode 100755 index 0000000000..79537e650f --- /dev/null +++ b/test/built-ins/ThrowTypeError/frozen.js @@ -0,0 +1,19 @@ +// Copyright (C) 2016 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%throwtypeerror% +description: > + The integrity level of %ThrowTypeError% is "frozen". +info: > + %ThrowTypeError% ( ) + + The value of the [[Extensible]] internal slot of a %ThrowTypeError% + function is false. + The length property of a %ThrowTypeError% function has the attributes + { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }. +---*/ + +var ThrowTypeError = Object.getOwnPropertyDescriptor(function(){ "use strict"; return arguments; }(), "callee").get; + +assert.sameValue(Object.isFrozen(ThrowTypeError), true); diff --git a/test/built-ins/ThrowTypeError/is-function.js b/test/built-ins/ThrowTypeError/is-function.js new file mode 100755 index 0000000000..158cc197c0 --- /dev/null +++ b/test/built-ins/ThrowTypeError/is-function.js @@ -0,0 +1,17 @@ +// Copyright (C) 2016 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%throwtypeerror% +description: > + %ThrowTypeError% is a function object. +info: > + %ThrowTypeError% ( ) + + The %ThrowTypeError% intrinsic is an anonymous built-in function + object that is defined once for each realm. +---*/ + +var ThrowTypeError = Object.getOwnPropertyDescriptor(function(){ "use strict"; return arguments; }(), "callee").get; + +assert.sameValue(typeof ThrowTypeError, "function"); diff --git a/test/built-ins/ThrowTypeError/length.js b/test/built-ins/ThrowTypeError/length.js new file mode 100755 index 0000000000..2b95e56a60 --- /dev/null +++ b/test/built-ins/ThrowTypeError/length.js @@ -0,0 +1,22 @@ +// Copyright (C) 2016 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%throwtypeerror% +description: > + %ThrowTypeError%.length is 0. +info: > + %ThrowTypeError% ( ) + + The length property of a %ThrowTypeError% function has the attributes + { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }. +includes: [propertyHelper.js] +---*/ + +var ThrowTypeError = Object.getOwnPropertyDescriptor(function(){ "use strict"; return arguments; }(), "callee").get; + +assert.sameValue(ThrowTypeError.length, 0); + +verifyNotEnumerable(ThrowTypeError, "length"); +verifyNotWritable(ThrowTypeError, "length"); +verifyNotConfigurable(ThrowTypeError, "length"); diff --git a/test/built-ins/ThrowTypeError/name.js b/test/built-ins/ThrowTypeError/name.js new file mode 100755 index 0000000000..4c92ed0ae4 --- /dev/null +++ b/test/built-ins/ThrowTypeError/name.js @@ -0,0 +1,17 @@ +// Copyright (C) 2016 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%throwtypeerror% +description: > + %ThrowTypeError% is an anonymous function. +info: > + %ThrowTypeError% ( ) + + The %ThrowTypeError% intrinsic is an anonymous built-in function + object that is defined once for each Realm. +---*/ + +var ThrowTypeError = Object.getOwnPropertyDescriptor(function(){ "use strict"; return arguments; }(), "callee").get; + +assert.sameValue(Object.prototype.hasOwnProperty.call(ThrowTypeError, "name"), false); diff --git a/test/built-ins/ThrowTypeError/prototype.js b/test/built-ins/ThrowTypeError/prototype.js new file mode 100755 index 0000000000..829adf95b0 --- /dev/null +++ b/test/built-ins/ThrowTypeError/prototype.js @@ -0,0 +1,24 @@ +// Copyright (C) 2016 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%throwtypeerror% +description: > + The value of the [[Prototype]] internal slot of %ThrowTypeError% is the + intrinsic object %FunctionPrototype%. +info: > + 8.2.2 CreateIntrinsics ( realmRec ) + + ... + 6. Let thrower be CreateBuiltinFunction(realmRec, throwerSteps, null). + 7. Set intrinsics.[[%ThrowTypeError%]] to thrower. + 8. Let noSteps be an empty sequence of algorithm steps. + 9. Let funcProto be CreateBuiltinFunction(realmRec, noSteps, objProto). + 10. Set intrinsics.[[%FunctionPrototype%]] to funcProto. + 11. Call thrower.[[SetPrototypeOf]](funcProto). + ... +---*/ + +var ThrowTypeError = Object.getOwnPropertyDescriptor(function(){ "use strict"; return arguments; }(), "callee").get; + +assert.sameValue(Object.getPrototypeOf(ThrowTypeError), Function.prototype); diff --git a/test/built-ins/ThrowTypeError/throws-type-error.js b/test/built-ins/ThrowTypeError/throws-type-error.js new file mode 100755 index 0000000000..59bed1e277 --- /dev/null +++ b/test/built-ins/ThrowTypeError/throws-type-error.js @@ -0,0 +1,20 @@ +// Copyright (C) 2016 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%throwtypeerror% +description: > + %ThrowTypeError% throws a TypeError when called. +info: > + %ThrowTypeError% ( ) + + When %ThrowTypeError% is called it performs the following steps: + + 1. Throw a TypeError exception. +---*/ + +var ThrowTypeError = Object.getOwnPropertyDescriptor(function(){ "use strict"; return arguments; }(), "callee").get; + +assert.throws(TypeError, function() { + ThrowTypeError(); +}); diff --git a/test/built-ins/ThrowTypeError/unique-per-realm-function-proto.js b/test/built-ins/ThrowTypeError/unique-per-realm-function-proto.js new file mode 100755 index 0000000000..149bac434c --- /dev/null +++ b/test/built-ins/ThrowTypeError/unique-per-realm-function-proto.js @@ -0,0 +1,24 @@ +// Copyright (C) 2016 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%throwtypeerror% +description: > + %ThrowTypeError% is defined once for each realm. +info: > + %ThrowTypeError% ( ) + + The %ThrowTypeError% intrinsic is an anonymous built-in function + object that is defined once for each realm. +---*/ + +var ThrowTypeError = Object.getOwnPropertyDescriptor(function(){ "use strict"; return arguments; }(), "callee").get; + +// Test with Function.prototype.arguments and Function.prototype.caller properties. +var argumentsDesc = Object.getOwnPropertyDescriptor(Function.prototype, "arguments"); +var callerDesc = Object.getOwnPropertyDescriptor(Function.prototype, "caller"); + +assert.sameValue(ThrowTypeError, argumentsDesc.get, "arguments.get"); +assert.sameValue(ThrowTypeError, argumentsDesc.set, "arguments.set"); +assert.sameValue(ThrowTypeError, callerDesc.set, "caller.set"); +assert.sameValue(ThrowTypeError, callerDesc.get, "caller.get"); diff --git a/test/built-ins/ThrowTypeError/unique-per-realm-non-simple.js b/test/built-ins/ThrowTypeError/unique-per-realm-non-simple.js new file mode 100755 index 0000000000..8566c0e412 --- /dev/null +++ b/test/built-ins/ThrowTypeError/unique-per-realm-non-simple.js @@ -0,0 +1,27 @@ +// Copyright (C) 2016 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%throwtypeerror% +description: > + %ThrowTypeError% is defined once for each realm. +info: > + %ThrowTypeError% ( ) + + The %ThrowTypeError% intrinsic is an anonymous built-in function + object that is defined once for each realm. +---*/ + +var ThrowTypeError = Object.getOwnPropertyDescriptor(function(){ "use strict"; return arguments; }(), "callee").get; + +// Test with unmapped arguments object from function with non-simple parameters list. +function nonSimple(a = 0) { + return arguments; +} +var unmappedCalleeDesc = Object.getOwnPropertyDescriptor(nonSimple(), "callee"); +var unmappedCallerDesc = Object.getOwnPropertyDescriptor(nonSimple(), "caller"); + +assert.sameValue(ThrowTypeError, unmappedCalleeDesc.get, "callee.get"); +assert.sameValue(ThrowTypeError, unmappedCalleeDesc.set, "callee.set"); +assert.sameValue(ThrowTypeError, unmappedCallerDesc.get, "caller.get"); +assert.sameValue(ThrowTypeError, unmappedCallerDesc.set, "caller.set"); diff --git a/test/built-ins/ThrowTypeError/unique-per-realm-unmapped-args.js b/test/built-ins/ThrowTypeError/unique-per-realm-unmapped-args.js new file mode 100755 index 0000000000..2640da55fd --- /dev/null +++ b/test/built-ins/ThrowTypeError/unique-per-realm-unmapped-args.js @@ -0,0 +1,28 @@ +// Copyright (C) 2016 André Bargull. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-%throwtypeerror% +description: > + %ThrowTypeError% is defined once for each realm. +info: > + %ThrowTypeError% ( ) + + The %ThrowTypeError% intrinsic is an anonymous built-in function + object that is defined once for each realm. +---*/ + +var ThrowTypeError = Object.getOwnPropertyDescriptor(function(){ "use strict"; return arguments; }(), "callee").get; + +// Test with unmapped arguments object from strict-mode function. +function strictFn() { + "use strict"; + return arguments; +} +var unmappedCalleeDesc = Object.getOwnPropertyDescriptor(strictFn(), "callee"); +var unmappedCallerDesc = Object.getOwnPropertyDescriptor(strictFn(), "caller"); + +assert.sameValue(ThrowTypeError, unmappedCalleeDesc.get, "callee.get"); +assert.sameValue(ThrowTypeError, unmappedCalleeDesc.set, "callee.set"); +assert.sameValue(ThrowTypeError, unmappedCallerDesc.get, "caller.get"); +assert.sameValue(ThrowTypeError, unmappedCallerDesc.set, "caller.set");