From 02ceb624009d21e34355130b36a1350df75ea4cd Mon Sep 17 00:00:00 2001
From: Michael Ficarra <git@michael.ficarra.me>
Date: Fri, 5 Jan 2018 08:50:35 -0800
Subject: [PATCH] flatMap/flatten test improvements

---
 .../prototype/flatMap/array-like-objects.js   | 31 ++++++++++---------
 .../flatMap/bound-function-argument.js        |  8 ++---
 .../prototype/flatMap/depth-always-one.js     | 20 ++++--------
 .../flatMap/non-object-ctor-throws.js         |  7 ++---
 .../prototype/flatMap/thisArg-argument.js     | 14 ++++-----
 .../prototype/flatten/array-like-objects.js   | 29 +++++++++--------
 .../prototype/flatten/bound-function-call.js  |  6 ++--
 .../prototype/flatten/empty-array-elements.js | 11 +++----
 .../flatten/empty-object-elements.js          | 10 +++---
 .../non-numeric-depth-should-not-throw.js     | 12 +++----
 .../flatten/non-object-ctor-throws.js         |  7 ++---
 .../flatten/null-undefined-elements.js        | 12 +++----
 .../symbol-object-create-null-depth-throws.js |  9 ++----
 13 files changed, 80 insertions(+), 96 deletions(-)

diff --git a/test/built-ins/Array/prototype/flatMap/array-like-objects.js b/test/built-ins/Array/prototype/flatMap/array-like-objects.js
index dcb9f5c9ca..71da0aa6d8 100644
--- a/test/built-ins/Array/prototype/flatMap/array-like-objects.js
+++ b/test/built-ins/Array/prototype/flatMap/array-like-objects.js
@@ -7,27 +7,28 @@ description: >
 includes: [compareArray.js]
 ---*/
 
-function takesTwoParams(a, b) {
-  return Array.prototype.flatMap.call(arguments, function(ele) { return ele * 2});
+function getArgumentsObject() {
+  return arguments;
 }
 
-var actual = takesTwoParams(1,[2]);
-var expected = [2, 4];
+function double(e) {
+  return [e * 2];
+}
 
-assert(compareArray(actual, expected), 'arguments array like object');
+var a = getArgumentsObject(1, 2);
+var actual = [].flatMap.call(a, double);
+assert.compareArray(actual, [2, 4], 'arguments objects');
 
 var a = {
-  "length": 1,
-  "0": 1
+  length: 1,
+  0: 1,
 };
-
-actual = Array.prototype.flatMap.call(a, function(ele) { return ele * 2});
-assert.sameValue(JSON.stringify(actual), JSON.stringify(['2']), 'array like objects');
+var actual = [].flatMap.call(a, double);
+assert.compareArray(actual, [2], 'array-like objects');
 
 var a = {
-  "length": undefined,
-  "0": 1
+  length: void 0,
+  0: 1,
 };
-
-actual = Array.prototype.flatMap.call(a, function(ele) { return ele * 2});
-assert.sameValue(JSON.stringify(actual), JSON.stringify([]), 'array like objects');
+var actual = [].flatMap.call(a, double);
+assert.compareArray(actual, [], 'array-like objects; undefined length');
diff --git a/test/built-ins/Array/prototype/flatMap/bound-function-argument.js b/test/built-ins/Array/prototype/flatMap/bound-function-argument.js
index b85b9aaa3d..ef6762656c 100644
--- a/test/built-ins/Array/prototype/flatMap/bound-function-argument.js
+++ b/test/built-ins/Array/prototype/flatMap/bound-function-argument.js
@@ -3,11 +3,9 @@
 /*---
 esid: sec-array.prototype.flatMap
 description: >
-    Behavior when array is depth more than 1
+    Behavior when given a bound function
 includes: [compareArray.js]
 ---*/
 
-var a = [void 0,[void 0]];
-var flattenMap = [].flatMap.bind(a, function() {});
-
-assert.compareArray(a.flatMap(flattenMap), [undefined, undefined, undefined, undefined]);
+var a = [0, 0];
+assert.compareArray(a.flatMap(function(){ return this; }.bind([1, 2])), [1, 2, 1, 2]);
diff --git a/test/built-ins/Array/prototype/flatMap/depth-always-one.js b/test/built-ins/Array/prototype/flatMap/depth-always-one.js
index 624392c2dc..f22fe97065 100644
--- a/test/built-ins/Array/prototype/flatMap/depth-always-one.js
+++ b/test/built-ins/Array/prototype/flatMap/depth-always-one.js
@@ -7,18 +7,10 @@ description: >
 includes: [compareArray.js]
 ---*/
 
-assert(compareArray([1, [2]].flatMap(function(ele) {
-  return ele * 2;
-}), [2, 4]), 'array depth is 1');
+assert.compareArray([1, 2].flatMap(function(e) {
+  return [e, e * 2];
+}), [1, 2, 2, 4], 'array depth is 1');
 
-assert(compareArray([1, [2], [[3]]].flatMap(function(ele) {
-  return ele * 2;
-}), [2, 4, 6]), 'array depth is more than 1');
-
-var actual = [1, [2], [3, [3]]].flatMap(function(ele) {
-  return ele * 2;
-});
-
-assert.sameValue(actual[0], 2);
-assert.sameValue(actual[1], 4);
-assert(isNaN(actual[2]));
+assert.compareArray([1, 2, 3].flatMap(function(ele) {
+  return [[ele * 2]];
+}), [[2], [4], [6]], 'array depth is more than 1');
diff --git a/test/built-ins/Array/prototype/flatMap/non-object-ctor-throws.js b/test/built-ins/Array/prototype/flatMap/non-object-ctor-throws.js
index 962bd16fb4..ccbb0a6288 100644
--- a/test/built-ins/Array/prototype/flatMap/non-object-ctor-throws.js
+++ b/test/built-ins/Array/prototype/flatMap/non-object-ctor-throws.js
@@ -8,25 +8,24 @@ description: >
 ---*/
 
 var a = [];
-
 a.constructor = null;
 assert.throws(TypeError, function() {
   a.flatMap();
 }, 'null value');
 
-a = [];
+var a = [];
 a.constructor = 1;
 assert.throws(TypeError, function() {
   a.flatMap();
 }, 'number value');
 
-a = [];
+var a = [];
 a.constructor = 'string';
 assert.throws(TypeError, function() {
   a.flatMap();
 }, 'string value');
 
-a = [];
+var a = [];
 a.constructor = true;
 assert.throws(TypeError, function() {
   a.flatMap();
diff --git a/test/built-ins/Array/prototype/flatMap/thisArg-argument.js b/test/built-ins/Array/prototype/flatMap/thisArg-argument.js
index 097ec0c872..a2217e6fb8 100644
--- a/test/built-ins/Array/prototype/flatMap/thisArg-argument.js
+++ b/test/built-ins/Array/prototype/flatMap/thisArg-argument.js
@@ -10,11 +10,11 @@ includes: [compareArray.js]
 
 "use strict";
 
-var a;
+var a = {};
 
-assert(compareArray([1].flatMap(function() { return this}, "TestString"), ["TestString"]));
-assert(compareArray([1].flatMap(function() { return this}, 1), [1]));
-assert(compareArray([1].flatMap(function() { return this}, null), [null]));
-assert(compareArray([1].flatMap(function() { return this}, true), [true]));
-assert(compareArray([1].flatMap(function() { return this}, a = {}), [a]));
-assert(compareArray([1].flatMap(function() { return this}, void 0), [undefined]));
+assert(compareArray([1].flatMap(function() { return [this]; }, "TestString"), ["TestString"]));
+assert(compareArray([1].flatMap(function() { return [this]; }, 1), [1]));
+assert(compareArray([1].flatMap(function() { return [this]; }, null), [null]));
+assert(compareArray([1].flatMap(function() { return [this]; }, true), [true]));
+assert(compareArray([1].flatMap(function() { return [this]; }, a), [a]));
+assert(compareArray([1].flatMap(function() { return [this]; }, void 0), [undefined]));
diff --git a/test/built-ins/Array/prototype/flatten/array-like-objects.js b/test/built-ins/Array/prototype/flatten/array-like-objects.js
index d4a210444b..bda75f3785 100644
--- a/test/built-ins/Array/prototype/flatten/array-like-objects.js
+++ b/test/built-ins/Array/prototype/flatten/array-like-objects.js
@@ -7,25 +7,24 @@ description: >
 includes: [compareArray.js]
 ---*/
 
-function takesTwoParams(a, b) {
-  return Array.prototype.flatten.call(arguments);
+function getArgumentsObject() {
+  return arguments;
 }
 
-var actual = takesTwoParams(1,[2]);
-var expected = [1, 2];
-
-assert(compareArray(actual, expected), 'arguments array like object');
+var a = getArgumentsObject([1], [2]);
+var actual = [].flatten.call(a);
+assert.compareArray(actual, [1, 2], 'arguments objects');
 
 var a = {
-  "length": 1,
-  "0": 'a'
+  length: 1,
+  0: [1],
 };
+var actual = [].flatten.call(a);
+assert.compareArray(actual, [1], 'array-like objects');
 
-actual = Array.prototype.flatten.call(a);
-assert.sameValue(JSON.stringify(actual), JSON.stringify(['a']), 'array like objects');
-
-a = {
-  "length": undefined,
-  "0": 'a'
+var a = {
+  length: undefined,
+  0: [1],
 };
-assert.sameValue(JSON.stringify(actual), JSON.stringify([]), 'array like objects undefined length');
+var actual = [].flatten.call(a);
+assert.compareArray(actual, [], 'array-like objects; undefined length');
diff --git a/test/built-ins/Array/prototype/flatten/bound-function-call.js b/test/built-ins/Array/prototype/flatten/bound-function-call.js
index e456ba0318..16e830cd7e 100644
--- a/test/built-ins/Array/prototype/flatten/bound-function-call.js
+++ b/test/built-ins/Array/prototype/flatten/bound-function-call.js
@@ -7,7 +7,7 @@ description: >
 includes: [compareArray.js]
 ---*/
 
-var a = [1,[1]];
-var flattenIt = [].flatten.bind(a);
+var a = [[0],[1]];
+var actual = [].flatten.bind(a)();
 
-assert(compareArray(flattenIt(), [1, 1]), 'bound functions');
+assert.compareArray(actual, [0, 1], 'bound flatten');
diff --git a/test/built-ins/Array/prototype/flatten/empty-array-elements.js b/test/built-ins/Array/prototype/flatten/empty-array-elements.js
index ebcf785869..9fa2b782bc 100644
--- a/test/built-ins/Array/prototype/flatten/empty-array-elements.js
+++ b/test/built-ins/Array/prototype/flatten/empty-array-elements.js
@@ -7,9 +7,8 @@ description: >
 includes: [compareArray.js]
 ---*/
 
-var a;
-assert(compareArray([].flatten([[]]), []));
-assert(compareArray(Array.prototype.flatten.call([[], []]), []));
-assert(compareArray(Array.prototype.flatten.call([[], [1]]), [1]));
-assert(compareArray(Array.prototype.flatten.call([[], [1, a = []]]), [1, a]));
-assert.sameValue(JSON.stringify(Array.prototype.flatten.call([{}, []])), JSON.stringify([{}]));
+var a = {};
+assert.compareArray([].flatten(), []);
+assert.compareArray([[], []].flatten(), []);
+assert.compareArray([[], [1]].flatten(), [1]);
+assert.compareArray([[], [1, a]].flatten(), [1, a]);
diff --git a/test/built-ins/Array/prototype/flatten/empty-object-elements.js b/test/built-ins/Array/prototype/flatten/empty-object-elements.js
index 6bc6086c81..a3fb3c809f 100644
--- a/test/built-ins/Array/prototype/flatten/empty-object-elements.js
+++ b/test/built-ins/Array/prototype/flatten/empty-object-elements.js
@@ -6,7 +6,9 @@ description: >
     arrays with empty object elements
 ---*/
 
-assert.sameValue(JSON.stringify(Array.prototype.flatten.call([{}])), JSON.stringify([{}]));
-assert.sameValue(JSON.stringify(Array.prototype.flatten.call([{}, [{}]])), JSON.stringify([{}, {}]));
-assert.sameValue(JSON.stringify(Array.prototype.flatten.call([[{null: {}}], [{}]])), JSON.stringify([{null: {}}, {}]));
-assert.sameValue(JSON.stringify(Array.prototype.flatten.call([[{null: null}], [{}]])), JSON.stringify([{null: null}, {}]));
+var a = {}, b = {};
+
+assert.compareArrays([a].flatten(), [a]);
+assert.compareArrays([a, [b]].flatten(), [a, b]);
+assert.compareArrays([[a], b].flatten(), [a, b]);
+assert.compareArrays([[a], [b]].flatten(), [a, b]);
diff --git a/test/built-ins/Array/prototype/flatten/non-numeric-depth-should-not-throw.js b/test/built-ins/Array/prototype/flatten/non-numeric-depth-should-not-throw.js
index 52f0892464..b43925ee12 100644
--- a/test/built-ins/Array/prototype/flatten/non-numeric-depth-should-not-throw.js
+++ b/test/built-ins/Array/prototype/flatten/non-numeric-depth-should-not-throw.js
@@ -16,27 +16,27 @@ var actual = a.flatten(depthNum);
 assert(compareArray(actual, expected), 'non integral string depthNum');
 
 // object type depthNum is converted to 0
-depthNum = {};
+var depthNum = {};
 var actual = a.flatten(depthNum);
 assert(compareArray(actual, expected), 'object type depthNum');
 
 // negative infinity depthNum is converted to 0
-depthNum = Number.NEGATIVE_INFINITY;
+var depthNum = Number.NEGATIVE_INFINITY;
 var actual = a.flatten(depthNum);
 assert(compareArray(actual, expected), 'negative infinity depthNum');
 
 // positive zero depthNum is converted to 0
-depthNum = +0;
+var depthNum = +0;
 var actual = a.flatten(depthNum);
 assert(compareArray(actual, expected), 'positive zero depthNum');
 
 // negative zero depthNum is converted to 0
-depthNum = -0;
+var depthNum = -0;
 var actual = a.flatten(depthNum);
 assert(compareArray(actual, expected), 'negative zero depthNum');
 
 // integral string depthNum is converted to an integer
-depthNum = '1';
+var depthNum = '1';
 var actual = a.flatten(depthNum);
-expected = [1, 2]
+var expected = [1, 2]
 assert(compareArray(actual, expected), 'integral string depthNum');
diff --git a/test/built-ins/Array/prototype/flatten/non-object-ctor-throws.js b/test/built-ins/Array/prototype/flatten/non-object-ctor-throws.js
index 853ee8cd78..633f50750c 100644
--- a/test/built-ins/Array/prototype/flatten/non-object-ctor-throws.js
+++ b/test/built-ins/Array/prototype/flatten/non-object-ctor-throws.js
@@ -8,25 +8,24 @@ description: >
 ---*/
 
 var a = [];
-
 a.constructor = null;
 assert.throws(TypeError, function() {
   a.flatten();
 }, 'null value');
 
-a = [];
+var a = [];
 a.constructor = 1;
 assert.throws(TypeError, function() {
   a.flatten();
 }, 'number value');
 
-a = [];
+var a = [];
 a.constructor = 'string';
 assert.throws(TypeError, function() {
   a.flatten();
 }, 'string value');
 
-a = [];
+var a = [];
 a.constructor = true;
 assert.throws(TypeError, function() {
   a.flatten();
diff --git a/test/built-ins/Array/prototype/flatten/null-undefined-elements.js b/test/built-ins/Array/prototype/flatten/null-undefined-elements.js
index 247be9a8a6..3ac425002c 100644
--- a/test/built-ins/Array/prototype/flatten/null-undefined-elements.js
+++ b/test/built-ins/Array/prototype/flatten/null-undefined-elements.js
@@ -6,10 +6,10 @@ description: >
     arrays with null, and undefined
 includes: [compareArray.js]
 ---*/
-var a;
+var a = [void 0];
 
-assert(compareArray(Array.prototype.flatten.call([1, null, void 0]), [1, null, undefined]));
-assert(compareArray(Array.prototype.flatten.call([1,[null, void 0]]), [1, null, undefined]));
-assert(compareArray(Array.prototype.flatten.call([[null, void 0], [null, void 0]]), [null, undefined, null, undefined]));
-assert(compareArray(Array.prototype.flatten.call([1,[null, a = [void 0]]], 1), [1, null, a]));
-assert(compareArray(Array.prototype.flatten.call([1,[null, [void 0]]], 2), [1, null, undefined]));
+assert(compareArray([1, null, void 0].flatten(), [1, null, undefined]));
+assert(compareArray([1,[null, void 0]].flatten(), [1, null, undefined]));
+assert(compareArray([[null, void 0], [null, void 0]].flatten(), [null, undefined, null, undefined]));
+assert(compareArray([1,[null, a]].flatten(1), [1, null, a]));
+assert(compareArray([1,[null, a]].flatten(2), [1, null, undefined]));
diff --git a/test/built-ins/Array/prototype/flatten/symbol-object-create-null-depth-throws.js b/test/built-ins/Array/prototype/flatten/symbol-object-create-null-depth-throws.js
index b12046925d..38cfd65625 100644
--- a/test/built-ins/Array/prototype/flatten/symbol-object-create-null-depth-throws.js
+++ b/test/built-ins/Array/prototype/flatten/symbol-object-create-null-depth-throws.js
@@ -6,16 +6,11 @@ description: >
     if the argument is a Symbol or Object null, it throws exception
 ---*/
 
-var a = [];
-var depthNum = Symbol();
-
 assert.throws(TypeError, function() {
-  a.flatten(depthNum);
+  [].flatten(Symbol());
 }, 'symbol value');
 
-depthNum = Object.create(null);
-
 assert.throws(TypeError, function() {
-  a.flatten(depthNum);
+  [].flatten(Object.create(null));
 }, 'object create null');
 
-- 
GitLab