From 021d44822c295dae412364d8db125b78dfe0545a Mon Sep 17 00:00:00 2001
From: Leonardo Balter <leonardo.balter@gmail.com>
Date: Tue, 28 Jun 2016 18:05:12 -0300
Subject: [PATCH] Add tests for custom ctor returns on TypedArrays from and of

---
 .../custom-ctor-returns-other-instance.js     | 51 +++++++++++++++++++
 ...om-ctor-returns-smaller-instance-throws.js | 41 +++++++++++++++
 .../of/custom-ctor-returns-other-instance.js  | 32 ++++++++++++
 ...om-ctor-returns-smaller-instance-throws.js | 27 ++++++++++
 4 files changed, 151 insertions(+)
 create mode 100644 test/built-ins/TypedArrays/from/custom-ctor-returns-other-instance.js
 create mode 100644 test/built-ins/TypedArrays/from/custom-ctor-returns-smaller-instance-throws.js
 create mode 100644 test/built-ins/TypedArrays/of/custom-ctor-returns-other-instance.js
 create mode 100644 test/built-ins/TypedArrays/of/custom-ctor-returns-smaller-instance-throws.js

diff --git a/test/built-ins/TypedArrays/from/custom-ctor-returns-other-instance.js b/test/built-ins/TypedArrays/from/custom-ctor-returns-other-instance.js
new file mode 100644
index 0000000000..d5a631ad57
--- /dev/null
+++ b/test/built-ins/TypedArrays/from/custom-ctor-returns-other-instance.js
@@ -0,0 +1,51 @@
+// 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.2.2.1
+esid: sec-%typedarray%.from
+description: >
+  Custom constructor can return any TypedArray instance with higher or same
+  length
+info: |
+  %TypedArray%.from ( source [ , mapfn [ , thisArg ] ] )
+
+  ...
+  7. If usingIterator is not undefined, then
+    a. Let values be ? IterableToList(source, usingIterator).
+    b. Let len be the number of elements in values.
+    c. Let targetObj be ? TypedArrayCreate(C, «len»).
+  ...
+  10. Let len be ? ToLength(? Get(arrayLike, "length")).
+  11. Let targetObj be ? TypedArrayCreate(C, « len »).
+  ...
+includes: [testTypedArray.js]
+features: [Symbol.iterator]
+---*/
+
+var sourceItor = [1, 2];
+var sourceObj = {
+  length: 2
+};
+
+testWithTypedArrayConstructors(function(TA) {
+  var result;
+  var custom = new TA(2);
+  var ctor = function() {
+    return custom;
+  };
+
+  result = TypedArray.from.call(ctor, sourceItor);
+  assert.sameValue(result, custom, "using iterator, same length");
+
+  result = TypedArray.from.call(ctor, sourceObj);
+  assert.sameValue(result, custom, "not using iterator, same length");
+
+  custom = new TA(3);
+
+  result = TypedArray.from.call(ctor, sourceItor);
+  assert.sameValue(result, custom, "using iterator, higher length");
+
+  result = TypedArray.from.call(ctor, sourceObj);
+  assert.sameValue(result, custom, "not using iterator, higher length");
+});
diff --git a/test/built-ins/TypedArrays/from/custom-ctor-returns-smaller-instance-throws.js b/test/built-ins/TypedArrays/from/custom-ctor-returns-smaller-instance-throws.js
new file mode 100644
index 0000000000..00fb7bcf60
--- /dev/null
+++ b/test/built-ins/TypedArrays/from/custom-ctor-returns-smaller-instance-throws.js
@@ -0,0 +1,41 @@
+// 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.2.2.1
+esid: sec-%typedarray%.from
+description: >
+  Throws a TypeError if a custom `this` returns a smaller instance
+info: |
+  %TypedArray%.from ( source [ , mapfn [ , thisArg ] ] )
+
+  ...
+  7. If usingIterator is not undefined, then
+    a. Let values be ? IterableToList(source, usingIterator).
+    b. Let len be the number of elements in values.
+    c. Let targetObj be ? TypedArrayCreate(C, «len»).
+  ...
+  10. Let len be ? ToLength(? Get(arrayLike, "length")).
+  11. Let targetObj be ? TypedArrayCreate(C, « len »).
+  ...
+includes: [testTypedArray.js]
+features: [Symbol.iterator]
+---*/
+
+var sourceItor = [1, 2];
+var sourceObj = {
+  length: 2
+};
+
+testWithTypedArrayConstructors(function(TA) {
+  var ctor = function() {
+    return new TA(1);
+  };
+  assert.throws(TypeError, function() {
+    TA.from.call(ctor, sourceItor);
+  }, "source is using iterator");
+
+  assert.throws(TypeError, function() {
+    TA.from.call(ctor, sourceObj);
+  }, "source is not using iterator");
+});
diff --git a/test/built-ins/TypedArrays/of/custom-ctor-returns-other-instance.js b/test/built-ins/TypedArrays/of/custom-ctor-returns-other-instance.js
new file mode 100644
index 0000000000..5e7ee9b6e8
--- /dev/null
+++ b/test/built-ins/TypedArrays/of/custom-ctor-returns-other-instance.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.2.2.2
+esid: sec-%typedarray%.of
+description: >
+  Custom constructor can return any TypedArray instance with higher or same
+  length
+info: |
+  %TypedArray%.of ( ...items )
+
+  1. Let len be the actual number of arguments passed to this function.
+  ...
+  5. Let newObj be ? TypedArrayCreate(C, « len »).
+  ...
+includes: [testTypedArray.js]
+---*/
+
+testWithTypedArrayConstructors(function(TA) {
+  var result;
+  var custom = new TA(3);
+  var ctor = function() {
+    return custom;
+  };
+
+  result = TypedArray.of.call(ctor, 1, 2, 3);
+  assert.sameValue(result, custom, "using iterator, same length");
+
+  result = TypedArray.of.call(ctor, 1, 2);
+  assert.sameValue(result, custom, "using iterator, higher length");
+});
diff --git a/test/built-ins/TypedArrays/of/custom-ctor-returns-smaller-instance-throws.js b/test/built-ins/TypedArrays/of/custom-ctor-returns-smaller-instance-throws.js
new file mode 100644
index 0000000000..9cbe756375
--- /dev/null
+++ b/test/built-ins/TypedArrays/of/custom-ctor-returns-smaller-instance-throws.js
@@ -0,0 +1,27 @@
+// 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.2.2.2
+esid: sec-%typedarray%.of
+description: >
+  Throws a TypeError if a custom `this` returns a smaller instance
+info: |
+  %TypedArray%.of ( ...items )
+
+  1. Let len be the actual number of arguments passed to this function.
+  ...
+  5. Let newObj be ? TypedArrayCreate(C, « len »).
+  ...
+includes: [testTypedArray.js]
+---*/
+
+testWithTypedArrayConstructors(function(TA) {
+  var ctor = function() {
+    return new TA(1);
+  };
+
+  assert.throws(TypeError, function() {
+    TypedArray.of.call(ctor, 1, 2);
+  });
+});
-- 
GitLab