From 7a87731d9c8602c0cdb0f7822455f1f7398b6fdf Mon Sep 17 00:00:00 2001
From: Leonardo Balter <leonardo.balter@gmail.com>
Date: Wed, 6 Jan 2016 16:18:14 -0500
Subject: [PATCH] Add tests for Subclassing the built-in Array Object

---
 .../Array/contructor-calls-super.js           | 25 +++++++++++++
 test/language/subclassing/Array/length.js     | 37 +++++++++++++++++++
 .../subclassing/Array/regular-subclassing.js  | 33 +++++++++++++++++
 .../subclassing/Array/super-must-be-called.js | 32 ++++++++++++++++
 4 files changed, 127 insertions(+)
 create mode 100644 test/language/subclassing/Array/contructor-calls-super.js
 create mode 100644 test/language/subclassing/Array/length.js
 create mode 100644 test/language/subclassing/Array/regular-subclassing.js
 create mode 100644 test/language/subclassing/Array/super-must-be-called.js

diff --git a/test/language/subclassing/Array/contructor-calls-super.js b/test/language/subclassing/Array/contructor-calls-super.js
new file mode 100644
index 0000000000..0e1ae5d36f
--- /dev/null
+++ b/test/language/subclassing/Array/contructor-calls-super.js
@@ -0,0 +1,25 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 22.1.1
+description: Subclass constructor calling super() creates an Exotic Array object
+info: >
+  22.1.1 The Array Constructor
+
+  The Array constructor is designed to be subclassable. It may be used as the
+  value of an extends clause of a class definition. Subclass constructors that
+  intend to inherit the exotic Array behaviour must include a super call to the
+  Array constructor to initialize subclass instances that are exotic Array
+  objects.
+includes: [compareArray.js]
+---*/
+
+class Sub extends Array {
+  constructor(a, b) {
+    super(a, b);
+  }
+}
+
+var sub = new Sub(42, 'foo');
+
+assert(compareArray(sub, [42, 'foo']));
diff --git a/test/language/subclassing/Array/length.js b/test/language/subclassing/Array/length.js
new file mode 100644
index 0000000000..7bdefad315
--- /dev/null
+++ b/test/language/subclassing/Array/length.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 22.1.4.1
+description: >
+  Instances has the own property length
+info: >
+  22.1.4.1 length
+
+  The length property of an Array instance is a data property whose value is
+  always numerically greater than the name of every configurable own property
+  whose name is an array index.
+
+  The length property initially has the attributes { [[Writable]]: true,
+  [[Enumerable]]: false, [[Configurable]]: false }.
+includes: [propertyHelper.js]
+---*/
+
+class Ar extends Array {}
+
+var arr = new Ar('foo', 'bar');
+
+assert.sameValue(arr[0], 'foo');
+assert.sameValue(arr[1], 'bar');
+
+var arrDesc = Object.getOwnPropertyDescriptor(arr, 'length');
+
+assert.sameValue(arrDesc.writable, true);
+assert.sameValue(arrDesc.enumerable, false);
+assert.sameValue(arrDesc.configurable, false);
+
+assert.sameValue(arr[1], 'bar');
+
+arr.length = 1;
+
+assert.sameValue(arr[0], 'foo');
+assert.sameValue(arr[1], undefined);
diff --git a/test/language/subclassing/Array/regular-subclassing.js b/test/language/subclassing/Array/regular-subclassing.js
new file mode 100644
index 0000000000..e29564a362
--- /dev/null
+++ b/test/language/subclassing/Array/regular-subclassing.js
@@ -0,0 +1,33 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 22.1.1
+description: Subclassing Array
+info: >
+  22.1.1 The Array Constructor
+
+  The Array constructor is designed to be subclassable. It may be used as the
+  value of an extends clause of a class definition. (...)
+includes: [compareArray.js]
+---*/
+
+class Sub extends Array {}
+
+var a1 = new Sub(42, 'foo');
+
+assert.sameValue(a1.length, 2);
+assert.sameValue(a1[0], 42);
+assert.sameValue(a1[1], 'foo');
+
+a1.push(true);
+assert.sameValue(a1.length, 3, 'Array#push updates the length property');
+assert.sameValue(a1[0], 42);
+assert.sameValue(a1[1], 'foo');
+assert.sameValue(a1[2], true, 'Adds new item');
+
+var a2 = new Sub(7);
+assert.sameValue(a2.length, 7);
+
+var a3 = new Sub();
+assert(compareArray(a3, []));
+assert.sameValue(a3.length, 0);
diff --git a/test/language/subclassing/Array/super-must-be-called.js b/test/language/subclassing/Array/super-must-be-called.js
new file mode 100644
index 0000000000..328262a34d
--- /dev/null
+++ b/test/language/subclassing/Array/super-must-be-called.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 22.1.1
+description: Super need to be called to initialize internals
+info: >
+  22.1.1 The Array Constructor
+
+  ...
+
+  The Array constructor is designed to be subclassable. It may be used as the
+  value of an extends clause of a class definition. Subclass constructors that
+  intend to inherit the exotic Array behaviour must include a super call to the
+  Array constructor to initialize subclass instances that are exotic Array
+  objects.
+---*/
+
+class A extends Array {
+  constructor() {}
+}
+
+assert.throws(ReferenceError, function() {
+  new A();
+});
+
+class A2 extends Array {
+  constructor() {
+    super();
+  }
+}
+
+new A2();
-- 
GitLab