mirror of https://github.com/tc39/test262.git
Convert Array.prototype.group tests to Object.groupBy tests
This commit is contained in:
parent
3e858ef02d
commit
49237f30de
|
@ -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
|
||||
|
||||
|
|
|
@ -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]);
|
|
@ -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');
|
|
@ -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');
|
||||
})
|
||||
});
|
|
@ -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);
|
|
@ -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]);
|
|
@ -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';
|
||||
});
|
||||
});
|
|
@ -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");
|
|
@ -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');
|
|
@ -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');
|
||||
}
|
||||
};
|
||||
})
|
||||
});
|
|
@ -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';
|
||||
});
|
||||
});
|
|
@ -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
|
||||
});
|
|
@ -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
|
||||
});
|
|
@ -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);
|
|
@ -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]);
|
|
@ -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);
|
|
@ -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);
|
|
@ -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]);
|
|
@ -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');
|
|
@ -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');
|
||||
})
|
||||
});
|
|
@ -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);
|
|
@ -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]);
|
|
@ -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']);
|
|
@ -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");
|
|
@ -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');
|
|
@ -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');
|
||||
}
|
||||
};
|
||||
})
|
||||
});
|
|
@ -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';
|
||||
});
|
||||
});
|
|
@ -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
|
||||
});
|
|
@ -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
|
||||
});
|
|
@ -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);
|
|
@ -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]);
|
Loading…
Reference in New Issue