From c46f5ff4b7ffd14c2bd878ad0c5151ee45493431 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Bargull?= <andre.bargull@gmail.com>
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");
-- 
GitLab