From 49237f30de6d9d4d7eed5bf6af91ad47a18851d0 Mon Sep 17 00:00:00 2001 From: Jordan Harband Date: Thu, 18 May 2023 23:09:11 -0700 Subject: [PATCH] Convert Array.prototype.group tests to Object.groupBy tests --- features.txt | 2 +- .../Array/prototype/group/array-like.js | 32 ---------- .../Array/prototype/group/callback-arg.js | 35 ----------- .../Array/prototype/group/callback-throws.js | 24 -------- .../Array/prototype/group/emptyList.js | 28 --------- .../Array/prototype/group/evenOdd.js | 30 ---------- .../Array/prototype/group/get-throws.js | 31 ---------- .../Array/prototype/group/invalid-callback.js | 29 --------- .../Array/prototype/group/invalid-object.js | 28 --------- .../prototype/group/invalid-property-key.js | 28 --------- .../Array/prototype/group/length-throw.js | 36 ----------- .../built-ins/Array/prototype/group/length.js | 26 -------- test/built-ins/Array/prototype/group/name.js | 25 -------- .../Array/prototype/group/null-prototype.js | 27 --------- .../Array/prototype/group/sparse-array.js | 36 ----------- .../Array/prototype/group/this-arg-strict.js | 57 ------------------ .../Array/prototype/group/this-arg.js | 60 ------------------- .../Array/prototype/group/toPropertyKey.js | 37 ------------ test/built-ins/Object/groupBy/callback-arg.js | 32 ++++++++++ .../Object/groupBy/callback-throws.js | 25 ++++++++ test/built-ins/Object/groupBy/emptyList.js | 27 +++++++++ test/built-ins/Object/groupBy/evenOdd.js | 22 +++++++ .../group => Object/groupBy}/groupLength.js | 17 +++--- .../Object/groupBy/invalid-callback.js | 29 +++++++++ .../Object/groupBy/invalid-iterable.js | 34 +++++++++++ .../Object/groupBy/invalid-property-key.js | 31 ++++++++++ .../Object/groupBy/iterator-next-throws.js | 31 ++++++++++ test/built-ins/Object/groupBy/length.js | 25 ++++++++ test/built-ins/Object/groupBy/name.js | 25 ++++++++ .../Object/groupBy/null-prototype.js | 27 +++++++++ .../built-ins/Object/groupBy/toPropertyKey.js | 36 +++++++++++ 31 files changed, 353 insertions(+), 579 deletions(-) delete mode 100644 test/built-ins/Array/prototype/group/array-like.js delete mode 100644 test/built-ins/Array/prototype/group/callback-arg.js delete mode 100644 test/built-ins/Array/prototype/group/callback-throws.js delete mode 100644 test/built-ins/Array/prototype/group/emptyList.js delete mode 100644 test/built-ins/Array/prototype/group/evenOdd.js delete mode 100644 test/built-ins/Array/prototype/group/get-throws.js delete mode 100644 test/built-ins/Array/prototype/group/invalid-callback.js delete mode 100644 test/built-ins/Array/prototype/group/invalid-object.js delete mode 100644 test/built-ins/Array/prototype/group/invalid-property-key.js delete mode 100644 test/built-ins/Array/prototype/group/length-throw.js delete mode 100644 test/built-ins/Array/prototype/group/length.js delete mode 100644 test/built-ins/Array/prototype/group/name.js delete mode 100644 test/built-ins/Array/prototype/group/null-prototype.js delete mode 100644 test/built-ins/Array/prototype/group/sparse-array.js delete mode 100644 test/built-ins/Array/prototype/group/this-arg-strict.js delete mode 100644 test/built-ins/Array/prototype/group/this-arg.js delete mode 100644 test/built-ins/Array/prototype/group/toPropertyKey.js create mode 100644 test/built-ins/Object/groupBy/callback-arg.js create mode 100644 test/built-ins/Object/groupBy/callback-throws.js create mode 100644 test/built-ins/Object/groupBy/emptyList.js create mode 100644 test/built-ins/Object/groupBy/evenOdd.js rename test/built-ins/{Array/prototype/group => Object/groupBy}/groupLength.js (50%) create mode 100644 test/built-ins/Object/groupBy/invalid-callback.js create mode 100644 test/built-ins/Object/groupBy/invalid-iterable.js create mode 100644 test/built-ins/Object/groupBy/invalid-property-key.js create mode 100644 test/built-ins/Object/groupBy/iterator-next-throws.js create mode 100644 test/built-ins/Object/groupBy/length.js create mode 100644 test/built-ins/Object/groupBy/name.js create mode 100644 test/built-ins/Object/groupBy/null-prototype.js create mode 100644 test/built-ins/Object/groupBy/toPropertyKey.js diff --git a/features.txt b/features.txt index de9b10f44b..a193406c8d 100644 --- a/features.txt +++ b/features.txt @@ -63,7 +63,7 @@ ShadowRealm # https://github.com/tc39/proposal-array-find-from-last array-find-from-last -# Array.prototype.group & Array.prototype.groupToMap +# Array.groupBy & Map.groupBy # https://github.com/tc39/proposal-array-grouping array-grouping diff --git a/test/built-ins/Array/prototype/group/array-like.js b/test/built-ins/Array/prototype/group/array-like.js deleted file mode 100644 index 42a7b085ae..0000000000 --- a/test/built-ins/Array/prototype/group/array-like.js +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2021 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-array.prototype.group -description: Array.prototype.group iterates array-like up to length -info: | - 22.1.3.14 Array.prototype.group ( callbackfn [ , thisArg ] ) - - ... - - 2. Let len be ? LengthOfArrayLike(O). - ... - 4. Let k be 0. - ... - 6. Repeat, while k < len - - ... -includes: [compareArray.js] -features: [array-grouping] ----*/ - -const arrayLike = {0: 1, 1: 2, 2: 3, 3: 4, length: 3 }; - -let calls = 0; - -const obj = Array.prototype.group.call(arrayLike, function (i) { calls++; return i % 2 === 0 ? 'even' : 'odd'; }); - -assert.sameValue(calls, 3, 'only calls length times'); -assert.compareArray(Object.keys(obj), ['odd', 'even']); -assert.compareArray(obj['even'], [2]); -assert.compareArray(obj['odd'], [1, 3]); diff --git a/test/built-ins/Array/prototype/group/callback-arg.js b/test/built-ins/Array/prototype/group/callback-arg.js deleted file mode 100644 index 5d38d65df7..0000000000 --- a/test/built-ins/Array/prototype/group/callback-arg.js +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2021 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-array.prototype.group -description: Array.prototype.group calls function with correct arguments -info: | - 22.1.3.14 Array.prototype.group ( callbackfn [ , thisArg ] ) - - ... - - 6. Repeat, while k < len - - a. Let Pk be ! ToString(𝔽(k)). - b. Let kValue be ? Get(O, Pk). - c. Let propertyKey be ? ToPropertyKey(? Call(callbackfn, thisArg, « kValue, 𝔽(k), O »)). - d. Perform ! AddValueToKeyedGroup(groups, propertyKey, kValue). - e. Set k to k + 1. - ... -features: [array-grouping] ----*/ - - -const arr = [-0, 0, 1, 2, 3]; - -let calls = 0; - -const map = arr.group(function (n, i, testArr) { - calls++; - assert.sameValue(n, arr[i], "selected element aligns with index"); - assert.sameValue(testArr, arr, "original array is passed as final argument"); - return null; -}); - -assert.sameValue(calls, 5, 'called for all 5 elements'); diff --git a/test/built-ins/Array/prototype/group/callback-throws.js b/test/built-ins/Array/prototype/group/callback-throws.js deleted file mode 100644 index 785a7b74a3..0000000000 --- a/test/built-ins/Array/prototype/group/callback-throws.js +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2021 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-array.prototype.group -description: Array.prototype.group errors when return value cannot be converted to a property key. -info: | - 22.1.3.14 Array.prototype.group ( callbackfn [ , thisArg ] ) - - ... - - 6. Repeat, while k < len - c. Let propertyKey be ? ToPropertyKey(? Call(callbackfn, thisArg, « kValue, 𝔽(k), O »)). - - ... -features: [array-grouping] ----*/ - -assert.throws(Test262Error, function() { - const array = [1]; - array.group(function() { - throw new Test262Error('throw in callback'); - }) -}); diff --git a/test/built-ins/Array/prototype/group/emptyList.js b/test/built-ins/Array/prototype/group/emptyList.js deleted file mode 100644 index 366c12d08d..0000000000 --- a/test/built-ins/Array/prototype/group/emptyList.js +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2021 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-array.prototype.group -description: Callback is not called and object is not populated if the array is empty -info: | - 22.1.3.14 Array.prototype.group ( callbackfn [ , thisArg ] ) - - ... - - 8. For each Record { [[Key]], [[Elements]] } g of groups, do - - a. Let elements be ! CreateArrayFromList(g.[[Elements]]). - b. Perform ! CreateDataPropertyOrThrow(obj, g.[[Key]], elements). - - ... -features: [array-grouping] ----*/ - -const original = []; - -const obj = original.group(function () { - throw new Test262Error('callback function should not be called') -}); - -assert.notSameValue(original, obj, 'group returns a object'); -assert.sameValue(Object.keys(obj).length, 0); diff --git a/test/built-ins/Array/prototype/group/evenOdd.js b/test/built-ins/Array/prototype/group/evenOdd.js deleted file mode 100644 index 6d22cb6940..0000000000 --- a/test/built-ins/Array/prototype/group/evenOdd.js +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2021 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-array.prototype.group -description: Array.prototype.group populates object with correct keys and values -info: | - 22.1.3.14 Array.prototype.group ( callbackfn [ , thisArg ] ) - - ... - - 8. For each Record { [[Key]], [[Elements]] } g of groups, do - - a. Let elements be ! CreateArrayFromList(g.[[Elements]]). - b. Perform ! CreateDataPropertyOrThrow(obj, g.[[Key]], elements). - - ... -includes: [compareArray.js] -features: [array-grouping] ----*/ - -const array = [1, 2, 3]; - -const obj = array.group(function (i) { - return i % 2 === 0 ? 'even' : 'odd'; -}); - -assert.compareArray(Object.keys(obj), ['odd', 'even']); -assert.compareArray(obj['even'], [2]); -assert.compareArray(obj['odd'], [1, 3]); diff --git a/test/built-ins/Array/prototype/group/get-throws.js b/test/built-ins/Array/prototype/group/get-throws.js deleted file mode 100644 index d9182c661d..0000000000 --- a/test/built-ins/Array/prototype/group/get-throws.js +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2021 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-array.prototype.group -description: Array.prototype.group errors when accessing a getter throws. -info: | - 22.1.3.14 Array.prototype.group ( callbackfn [ , thisArg ] ) - - ... - - 6. Repeat, while k < len - a. Let Pk be ! ToString(𝔽(k)). - b. Let kValue be ? Get(O, Pk). - - ... -features: [array-grouping] ----*/ - -assert.throws(Test262Error, function() { - const arrayLike = Object.defineProperty({ - length: 1, - }, '0', { - get: function() { - throw new Test262Error('no element for you'); - } - }); - Array.prototype.group.call(arrayLike, function() { - return 'key'; - }); -}); diff --git a/test/built-ins/Array/prototype/group/invalid-callback.js b/test/built-ins/Array/prototype/group/invalid-callback.js deleted file mode 100644 index ee5253c21d..0000000000 --- a/test/built-ins/Array/prototype/group/invalid-callback.js +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2021 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-array.prototype.group -description: Array.prototype.group called with non-callable throws TypeError -info: | - 22.1.3.14 Array.prototype.group ( callbackfn [ , thisArg ] ) - - ... - - 3. If IsCallable(callbackfn) is false, throw a TypeError exception. - - ... -features: [array-grouping] ----*/ - - -assert.throws(TypeError, function() { - [].group(null) -}, "null callback throws TypeError"); - -assert.throws(TypeError, function() { - [].group(undefined) -}, "undefined callback throws TypeError"); - -assert.throws(TypeError, function() { - [].group({}) -}, "object callback throws TypeError"); diff --git a/test/built-ins/Array/prototype/group/invalid-object.js b/test/built-ins/Array/prototype/group/invalid-object.js deleted file mode 100644 index 244377832a..0000000000 --- a/test/built-ins/Array/prototype/group/invalid-object.js +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2021 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-array.prototype.group -description: Array.prototype.group applied to null/undefined throws a TypeError -info: | - 22.1.3.14 Array.prototype.group ( callbackfn [ , thisArg ] ) - - ... - - 1. Let O be ? ToObject(this value). - - ... -features: [array-grouping] ----*/ - -const throws = function() { - throw new Test262Error('callback function should not be called') -}; - -assert.throws(TypeError, function() { - Array.prototype.group.call(undefined, throws); -}, 'undefined this value'); - -assert.throws(TypeError, function() { - Array.prototype.group.call(undefined, throws); -}, 'null this value'); diff --git a/test/built-ins/Array/prototype/group/invalid-property-key.js b/test/built-ins/Array/prototype/group/invalid-property-key.js deleted file mode 100644 index ce92006f1d..0000000000 --- a/test/built-ins/Array/prototype/group/invalid-property-key.js +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2021 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-array.prototype.group -description: Array.prototype.group errors when return value cannot be converted to a property key. -info: | - 22.1.3.14 Array.prototype.group ( callbackfn [ , thisArg ] ) - - ... - - 6. Repeat, while k < len - c. Let propertyKey be ? ToPropertyKey(? Call(callbackfn, thisArg, « kValue, 𝔽(k), O »)). - - ... -features: [array-grouping] ----*/ - -assert.throws(Test262Error, function() { - const array = [1]; - array.group(function() { - return { - toString() { - throw new Test262Error('not a property key'); - } - }; - }) -}); diff --git a/test/built-ins/Array/prototype/group/length-throw.js b/test/built-ins/Array/prototype/group/length-throw.js deleted file mode 100644 index e3d1747e12..0000000000 --- a/test/built-ins/Array/prototype/group/length-throw.js +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2021 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-array.prototype.group -description: Array.prototype.group errors when array-like's length can't be coerced. -info: | - 22.1.3.14 Array.prototype.group ( callbackfn [ , thisArg ] ) - - ... - - 2. Let len be ? LengthOfArrayLike(O). - - ... -features: [array-grouping] ----*/ - -assert.throws(Test262Error, function() { - const arrayLike = Object.defineProperty({}, 'length', { - get: function() { - throw new Test262Error('no length for you'); - } - }); - Array.prototype.group.call(arrayLike, function() { - return 'key'; - }); -}); - -assert.throws(TypeError, function() { - const arrayLike = { - length: 1n, - }; - Array.prototype.group.call(arrayLike, function() { - return 'key'; - }); -}); diff --git a/test/built-ins/Array/prototype/group/length.js b/test/built-ins/Array/prototype/group/length.js deleted file mode 100644 index ea4896c73d..0000000000 --- a/test/built-ins/Array/prototype/group/length.js +++ /dev/null @@ -1,26 +0,0 @@ - -// Copyright (c) 2021 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-array.prototype.group -description: Array.prototype.group property length descriptor -info: | - 22.1.3.14 Array.prototype.group ( callbackfn [ , thisArg ] ) - - ... - - 17 ECMAScript Standard Built-in Objects - - ... - -includes: [propertyHelper.js] -features: [array-grouping] ----*/ - -verifyProperty(Array.prototype.group, "length", { - value: 1, - enumerable: false, - writable: false, - configurable: true -}); diff --git a/test/built-ins/Array/prototype/group/name.js b/test/built-ins/Array/prototype/group/name.js deleted file mode 100644 index 26ea6e395e..0000000000 --- a/test/built-ins/Array/prototype/group/name.js +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2021 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-array.prototype.group -description: Array.prototype.group property name descriptor -info: | - 22.1.3.14 Array.prototype.group ( callbackfn [ , thisArg ] ) - - ... - - 17 ECMAScript Standard Built-in Objects - - ... - -includes: [propertyHelper.js] -features: [array-grouping] ----*/ - -verifyProperty(Array.prototype.group, "name", { - value: "group", - enumerable: false, - writable: false, - configurable: true -}); diff --git a/test/built-ins/Array/prototype/group/null-prototype.js b/test/built-ins/Array/prototype/group/null-prototype.js deleted file mode 100644 index c977ee39e4..0000000000 --- a/test/built-ins/Array/prototype/group/null-prototype.js +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2021 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-array.prototype.group -description: Array.prototype.group returns a null prototype object -info: | - 22.1.3.14 Array.prototype.group ( callbackfn [ , thisArg ] ) - - ... - - 7. Let obj be OrdinaryObjectCreate(null). - ... - 9. Return obj. - - ... -features: [array-grouping] ----*/ - -const array = [1, 2, 3]; - -const obj = array.group(function (i) { - return i % 2 === 0 ? 'even' : 'odd'; -}); - -assert.sameValue(Object.getPrototypeOf(obj), null); -assert.sameValue(obj.hasOwnProperty, undefined); diff --git a/test/built-ins/Array/prototype/group/sparse-array.js b/test/built-ins/Array/prototype/group/sparse-array.js deleted file mode 100644 index ab794d169b..0000000000 --- a/test/built-ins/Array/prototype/group/sparse-array.js +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2021 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-array.prototype.group -description: Array.prototype.group adds undefined to the group for sparse arrays -info: | - 22.1.3.14 Array.prototype.group ( callbackfn [ , thisArg ] ) - - ... - - 6. Repeat, while k < len - a. Let Pk be ! ToString(𝔽(k)). - b. Let kValue be ? Get(O, Pk). - c. Let propertyKey be ? ToPropertyKey(? Call(callbackfn, thisArg, « kValue, 𝔽(k), O »)). - d. Perform AddValueToKeyedGroup(groups, propertyKey, kValue). - - ... -includes: [compareArray.js] -features: [array-grouping] ----*/ - -let calls = 0; -const array = [, , ,]; - -const obj = array.group(function () { - calls++; - return 'key'; -}); - -assert.sameValue(calls, 3); - -assert(0 in obj['key'], 'group has a first element'); -assert(1 in obj['key'], 'group has a second element'); -assert(2 in obj['key'], 'group has a third element'); -assert.compareArray(obj['key'], [void 0, void 0, void 0]); diff --git a/test/built-ins/Array/prototype/group/this-arg-strict.js b/test/built-ins/Array/prototype/group/this-arg-strict.js deleted file mode 100644 index 7f3cfc7123..0000000000 --- a/test/built-ins/Array/prototype/group/this-arg-strict.js +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) 2021 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-array.prototype.group -description: Array.prototype.group calls with thisArg -info: | - 22.1.3.14 Array.prototype.group ( callbackfn [ , thisArg ] ) - - ... - - 6. Repeat, while k < len - c. Let propertyKey be ? ToPropertyKey(? Call(callbackfn, thisArg, « kValue, 𝔽(k), O »)). - - ... -flags: [onlyStrict] -features: [array-grouping] ----*/ - - -let sentinel = {}; -let result; - -[1].group(function() { - result = this; -}, "TestString"); -assert.sameValue(result, "TestString"); - -[1].group(function() { - result = this; -}, 1); -assert.sameValue(result, 1); - -[1].group(function() { - result = this; -}, true); -assert.sameValue(result, true); - -[1].group(function() { - result = this; -}, null); -assert.sameValue(result, null); - -[1].group(function() { - result = this; -}, sentinel); -assert.sameValue(result, sentinel); - -[1].group(function() { - result = this; -}, void 0); -assert.sameValue(result, void 0); - -[1].group(function() { - result = this; -}); -assert.sameValue(result, void 0); diff --git a/test/built-ins/Array/prototype/group/this-arg.js b/test/built-ins/Array/prototype/group/this-arg.js deleted file mode 100644 index 15d36c5c6b..0000000000 --- a/test/built-ins/Array/prototype/group/this-arg.js +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) 2021 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-array.prototype.group -description: Array.prototype.group calls with thisArg -info: | - 22.1.3.14 Array.prototype.group ( callbackfn [ , thisArg ] ) - - ... - - 6. Repeat, while k < len - c. Let propertyKey be ? ToPropertyKey(? Call(callbackfn, thisArg, « kValue, 𝔽(k), O »)). - - ... -flags: [noStrict] -features: [array-grouping] ----*/ - - -let sentinel = {}; -let result; - -[1].group(function() { - result = this; -}, "TestString"); -assert.sameValue(result instanceof String, true); -assert.sameValue(result.valueOf(), "TestString"); - -[1].group(function() { - result = this; -}, 1); -assert.sameValue(result instanceof Number, true); -assert.sameValue(result.valueOf(), 1); - -[1].group(function() { - result = this; -}, true); -assert.sameValue(result instanceof Boolean, true); -assert.sameValue(result.valueOf(), true); - -[1].group(function() { - result = this; -}, null); -assert.sameValue(result, globalThis); - -[1].group(function() { - result = this; -}, sentinel); -assert.sameValue(result, sentinel); - -[1].group(function() { - result = this; -}, void 0); -assert.sameValue(result, globalThis); - -[1].group(function() { - result = this; -}); -assert.sameValue(result, globalThis); diff --git a/test/built-ins/Array/prototype/group/toPropertyKey.js b/test/built-ins/Array/prototype/group/toPropertyKey.js deleted file mode 100644 index b14ad7488a..0000000000 --- a/test/built-ins/Array/prototype/group/toPropertyKey.js +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2021 Ecma International. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - -/*--- -esid: sec-array.prototype.group -description: Array.prototype.group coerces return value with ToPropertyKey -info: | - 22.1.3.14 Array.prototype.group ( callbackfn [ , thisArg ] ) - - ... - - 6. Repeat, while k < len - c. Let propertyKey be ? ToPropertyKey(? Call(callbackfn, thisArg, « kValue, 𝔽(k), O »)). - d. Perform AddValueToKeyedGroup(groups, propertyKey, kValue). - ... - 8. For each Record { [[Key]], [[Elements]] } g of groups, do - a. Let elements be ! CreateArrayFromList(g.[[Elements]]). - b. Perform ! CreateDataPropertyOrThrow(obj, g.[[Key]], elements). - - ... -includes: [compareArray.js] -features: [array-grouping] ----*/ - -let calls = 0; -const stringable = { - toString() { - return 1; - } -} - -const array = [1, '1', stringable]; - -const obj = array.group(function (v) { return v; }); - -assert.compareArray(Object.keys(obj), ['1']); -assert.compareArray(obj['1'], [1, '1', stringable]); diff --git a/test/built-ins/Object/groupBy/callback-arg.js b/test/built-ins/Object/groupBy/callback-arg.js new file mode 100644 index 0000000000..b6fd2c6bbe --- /dev/null +++ b/test/built-ins/Object/groupBy/callback-arg.js @@ -0,0 +1,32 @@ +// Copyright (c) 2023 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-object.groupby +description: Object.groupBy calls function with correct arguments +info: | + Object.groupBy ( items, callbackfn ) + + ... + GroupBy ( items, callbackfn, coercion ) + + 6. Repeat, + + e. Let key be Completion(Call(callbackfn, undefined, « value, 𝔽(k) »)). + ... +features: [array-grouping] +---*/ + + +const arr = [-0, 0, 1, 2, 3]; + +let calls = 0; + +Object.groupBy(arr, function (n, i) { + calls++; + assert.sameValue(n, arr[i], "selected element aligns with index"); + assert.sameValue(arguments.length, 2, "only two arguments are passed"); + return null; +}); + +assert.sameValue(calls, 5, 'called for all 5 elements'); diff --git a/test/built-ins/Object/groupBy/callback-throws.js b/test/built-ins/Object/groupBy/callback-throws.js new file mode 100644 index 0000000000..8430b8f98d --- /dev/null +++ b/test/built-ins/Object/groupBy/callback-throws.js @@ -0,0 +1,25 @@ +// Copyright (c) 2023 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-object.groupby +description: Object.groupBy throws when callback throws +info: | + Object.groupBy ( items, callbackfn ) + + ... + GroupBy ( items, callbackfn, coercion ) + + 6. Repeat, + e. Let key be Completion(Call(callbackfn, undefined, « value, 𝔽(k) »)). + f. IfAbruptCloseIterator(key, iteratorRecord). + ... +features: [array-grouping] +---*/ + +assert.throws(Test262Error, function() { + const array = [1]; + Object.groupBy(array, function() { + throw new Test262Error('throw in callback'); + }) +}); diff --git a/test/built-ins/Object/groupBy/emptyList.js b/test/built-ins/Object/groupBy/emptyList.js new file mode 100644 index 0000000000..52e2d093c9 --- /dev/null +++ b/test/built-ins/Object/groupBy/emptyList.js @@ -0,0 +1,27 @@ +// Copyright (c) 2023 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-object.groupby +description: Callback is not called and object is not populated if the iterable is empty +info: | + Object.groupBy ( items, callbackfn ) + + ... + GroupBy ( items, callbackfn, coercion ) + + 6. Repeat, + c. If next is false, then + i. Return groups. + ... +features: [array-grouping] +---*/ + +const original = []; + +const obj = Object.groupBy(original, function () { + throw new Test262Error('callback function should not be called') +}); + +assert.notSameValue(original, obj, 'Object.groupBy returns an object'); +assert.sameValue(Object.keys(obj).length, 0); diff --git a/test/built-ins/Object/groupBy/evenOdd.js b/test/built-ins/Object/groupBy/evenOdd.js new file mode 100644 index 0000000000..f884b2a3ce --- /dev/null +++ b/test/built-ins/Object/groupBy/evenOdd.js @@ -0,0 +1,22 @@ +// Copyright (c) 2023 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-object.groupby +description: Object.groupBy populates object with correct keys and values +info: | + Object.groupBy ( items, callbackfn ) + ... +includes: [compareArray.js] +features: [array-grouping] +---*/ + +const array = [1, 2, 3]; + +const obj = Object.groupBy(array, function (i) { + return i % 2 === 0 ? 'even' : 'odd'; +}); + +assert.compareArray(Object.keys(obj), ['odd', 'even']); +assert.compareArray(obj['even'], [2]); +assert.compareArray(obj['odd'], [1, 3]); diff --git a/test/built-ins/Array/prototype/group/groupLength.js b/test/built-ins/Object/groupBy/groupLength.js similarity index 50% rename from test/built-ins/Array/prototype/group/groupLength.js rename to test/built-ins/Object/groupBy/groupLength.js index 2123378e11..9be21a3968 100644 --- a/test/built-ins/Array/prototype/group/groupLength.js +++ b/test/built-ins/Object/groupBy/groupLength.js @@ -1,19 +1,18 @@ -// Copyright (c) 2021 Ecma International. All rights reserved. +// Copyright (c) 2023 Ecma International. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- -esid: sec-array.prototype.group +esid: sec-object.groupby description: Callback can return numbers that are converted to property keys info: | - 22.1.3.14 Array.prototype.group ( callbackfn [ , thisArg ] ) + Object.groupBy ( items, callbackfn ) ... + GroupBy ( items, callbackfn, coercion ) - 8. For each Record { [[Key]], [[Elements]] } g of groups, do - - a. Let elements be ! CreateArrayFromList(g.[[Elements]]). - b. Perform ! CreateDataPropertyOrThrow(obj, g.[[Key]], elements). - + 6. Repeat, + c. If next is false, then + i. Return groups. ... includes: [compareArray.js] features: [array-grouping] @@ -21,7 +20,7 @@ features: [array-grouping] const arr = ['hello', 'test', 'world']; -const obj = arr.group(function (i) { return i.length; }); +const obj = Object.groupBy(arr, function (i) { return i.length; }); assert.compareArray(Object.keys(obj), ['4', '5']); assert.compareArray(obj['5'], ['hello', 'world']); diff --git a/test/built-ins/Object/groupBy/invalid-callback.js b/test/built-ins/Object/groupBy/invalid-callback.js new file mode 100644 index 0000000000..f5348e4ff2 --- /dev/null +++ b/test/built-ins/Object/groupBy/invalid-callback.js @@ -0,0 +1,29 @@ +// Copyright (c) 2023 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-object.groupby +description: Object.groupBy called with non-callable throws TypeError +info: | + Object.groupBy ( items, callbackfn ) + + ... + GroupBy ( items, callbackfn, coercion ) + + 2. If IsCallable(callbackfn) is false, throw a TypeError exception. + ... +features: [array-grouping] +---*/ + + +assert.throws(TypeError, function() { + Object.groupBy([], null) +}, "null callback throws TypeError"); + +assert.throws(TypeError, function() { + Object.groupBy([], undefined) +}, "undefined callback throws TypeError"); + +assert.throws(TypeError, function() { + Object.groupBy([], {}) +}, "object callback throws TypeError"); diff --git a/test/built-ins/Object/groupBy/invalid-iterable.js b/test/built-ins/Object/groupBy/invalid-iterable.js new file mode 100644 index 0000000000..1f984a0f65 --- /dev/null +++ b/test/built-ins/Object/groupBy/invalid-iterable.js @@ -0,0 +1,34 @@ +// Copyright (c) 2023 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-object.groupby +description: Object.groupBy with a nullish Symbol.iterator throws +info: | + Object.groupBy ( items, callbackfn ) + + ... + GroupBy ( items, callbackfn, coercion ) + + 4. Let iteratorRecord be ? GetIterator(items). + + ... +features: [array-grouping] +---*/ + +const throws = function () { + throw new Test262Error('callback function should not be called') +}; + +function makeIterable(obj, iteratorFn) { + obj[Symbol.iterator] = iteratorFn; + return obj; +} + +assert.throws(TypeError, function () { + Object.groupBy(makeIterable({}, undefined), throws); +}, 'undefined Symbol.iterator'); + +assert.throws(TypeError, function () { + Object.groupBy(makeIterable({}, null), throws); +}, 'null Symbol.iterator'); diff --git a/test/built-ins/Object/groupBy/invalid-property-key.js b/test/built-ins/Object/groupBy/invalid-property-key.js new file mode 100644 index 0000000000..47d21f935f --- /dev/null +++ b/test/built-ins/Object/groupBy/invalid-property-key.js @@ -0,0 +1,31 @@ +// Copyright (c) 2023 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-object.groupby +description: Object.groupBy errors when callback return value cannot be converted to a property key. +info: | + Object.groupBy ( items, callbackfn ) + + ... + GroupBy ( items, callbackfn, coercion ) + + 6. Repeat, + g. If coercion is property, then + i. Set key to Completion(ToPropertyKey(key)). + ii. IfAbruptCloseIterator(key, iteratorRecord). + + ... +features: [array-grouping] +---*/ + +assert.throws(Test262Error, function () { + const array = [1]; + Object.groupBy(array, function () { + return { + toString() { + throw new Test262Error('not a property key'); + } + }; + }) +}); diff --git a/test/built-ins/Object/groupBy/iterator-next-throws.js b/test/built-ins/Object/groupBy/iterator-next-throws.js new file mode 100644 index 0000000000..97ee2a4135 --- /dev/null +++ b/test/built-ins/Object/groupBy/iterator-next-throws.js @@ -0,0 +1,31 @@ +// Copyright (c) 2023 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-object.groupby +description: Object.groupBy throws when iterator next throws +info: | + Object.groupBy ( items, callbackfn ) + + ... + + GroupBy ( items, callbackfn, coercion ) + + 6. Repeat, + b. Let next be ? IteratorStep(iteratorRecord). + + ... +features: [array-grouping] +---*/ + +const throwingIterator = { + next: function next() { + throw new Test262Error('next() method was called'); + } +}; + +assert.throws(Test262Error, function () { + Object.groupBy(throwingIterator, function () { + return 'key'; + }); +}); diff --git a/test/built-ins/Object/groupBy/length.js b/test/built-ins/Object/groupBy/length.js new file mode 100644 index 0000000000..6d7c1ff6d5 --- /dev/null +++ b/test/built-ins/Object/groupBy/length.js @@ -0,0 +1,25 @@ +// Copyright (c) 2023 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-object.groupby +description: Object.groupBy property length descriptor +info: | + Object.groupBy ( items, callbackfn ) + + ... + + 17 ECMAScript Standard Built-in Objects + + ... + +includes: [propertyHelper.js] +features: [array-grouping] +---*/ + +verifyProperty(Object.groupBy, "length", { + value: 2, + enumerable: false, + writable: false, + configurable: true +}); diff --git a/test/built-ins/Object/groupBy/name.js b/test/built-ins/Object/groupBy/name.js new file mode 100644 index 0000000000..6e4a96df67 --- /dev/null +++ b/test/built-ins/Object/groupBy/name.js @@ -0,0 +1,25 @@ +// Copyright (c) 2023 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-object.groupby +description: Object.groupBy property name descriptor +info: | + Object.groupBy ( items, callbackfn ) + + ... + + 17 ECMAScript Standard Built-in Objects + + ... + +includes: [propertyHelper.js] +features: [array-grouping] +---*/ + +verifyProperty(Object.groupBy, "name", { + value: "groupBy", + enumerable: false, + writable: false, + configurable: true +}); diff --git a/test/built-ins/Object/groupBy/null-prototype.js b/test/built-ins/Object/groupBy/null-prototype.js new file mode 100644 index 0000000000..d37fcb0399 --- /dev/null +++ b/test/built-ins/Object/groupBy/null-prototype.js @@ -0,0 +1,27 @@ +// Copyright (c) 2023 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-object.groupby +description: Object.groupBy returns a null prototype object +info: | + Object.groupBy ( items, callbackfn ) + + ... + + 2. Let obj be OrdinaryObjectCreate(null). + ... + 4. Return obj. + + ... +features: [array-grouping] +---*/ + +const array = [1, 2, 3]; + +const obj = Object.groupBy(array, function (i) { + return i % 2 === 0 ? 'even' : 'odd'; +}); + +assert.sameValue(Object.getPrototypeOf(obj), null); +assert.sameValue(obj.hasOwnProperty, undefined); diff --git a/test/built-ins/Object/groupBy/toPropertyKey.js b/test/built-ins/Object/groupBy/toPropertyKey.js new file mode 100644 index 0000000000..df3734fc0c --- /dev/null +++ b/test/built-ins/Object/groupBy/toPropertyKey.js @@ -0,0 +1,36 @@ +// Copyright (c) 2023 Ecma International. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-object.groupby +description: Object.groupBy coerces return value with ToPropertyKey +info: | + Object.groupBy ( items, callbackfn ) + + ... + + GroupBy ( items, callbackfn, coercion ) + + 6. Repeat, + g. If coercion is property, then + i. Set key to Completion(ToPropertyKey(key)). + ii. IfAbruptCloseIterator(key, iteratorRecord). + + ... +includes: [compareArray.js] +features: [array-grouping] +---*/ + +let calls = 0; +const stringable = { + toString: function toString() { + return 1; + } +} + +const array = [1, '1', stringable]; + +const obj = Object.groupBy(array, function (v) { return v; }); + +assert.compareArray(Object.keys(obj), ['1']); +assert.compareArray(obj['1'], [1, '1', stringable]);