Skip to content

Commit 1842afc

Browse files
authored
RAB: Integrate staging tests for the .reduce method (#4156)
* Import relevant files from #3888 * Removing parts in resizableArrayBufferUtils.js and adding it in includes, while adjusting usage of CollectValuesAndResize and applying review changes from PRs for previously tested methods. * Added missing 'shrink' test for Array.prototype.reduce * Deleted accidental files * Fix accidental call of .map instead of .reduce Addresses review comments * fix copyright in new file not in origin PR
1 parent 6add1a2 commit 1842afc

6 files changed

+603
-0
lines changed
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
// Copyright 2023 the V8 project authors. All rights reserved.
2+
// This code is governed by the BSD license found in the LICENSE file.
3+
4+
/*---
5+
esid: sec-array.prototype.reduce
6+
description: >
7+
Array.p.reduce behaves correctly when the resizable buffer is grown
8+
mid-iteration.
9+
includes: [compareArray.js, resizableArrayBufferUtils.js]
10+
features: [resizable-arraybuffer]
11+
---*/
12+
13+
let values;
14+
let rab;
15+
let resizeAfter;
16+
let resizeTo;
17+
// Collects the view of the resizable array buffer rab into values, with an
18+
// iteration during which, after resizeAfter steps, rab is resized to length
19+
// resizeTo. To be called by a method of the view being collected.
20+
// Note that rab, values, resizeAfter, and resizeTo may need to be reset
21+
// before calling this.
22+
function ResizeMidIteration(acc, n) {
23+
// Returns true by default.
24+
return CollectValuesAndResize(n, values, rab, resizeAfter, resizeTo);
25+
}
26+
27+
// Orig. array: [0, 2, 4, 6]
28+
// [0, 2, 4, 6] << fixedLength
29+
// [4, 6] << fixedLengthWithOffset
30+
// [0, 2, 4, 6, ...] << lengthTracking
31+
// [4, 6, ...] << lengthTrackingWithOffset
32+
33+
// Test for reduce.
34+
35+
for (let ctor of ctors) {
36+
values = [];
37+
rab = CreateRabForTest(ctor);
38+
const fixedLength = new ctor(rab, 0, 4);
39+
resizeAfter = 2;
40+
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
41+
Array.prototype.reduce.call(fixedLength, ResizeMidIteration, 'initial value');
42+
assert.compareArray(values, [
43+
0,
44+
2,
45+
4,
46+
6
47+
]);
48+
}
49+
for (let ctor of ctors) {
50+
values = [];
51+
rab = CreateRabForTest(ctor);
52+
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
53+
resizeAfter = 1;
54+
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
55+
Array.prototype.reduce.call(fixedLengthWithOffset, ResizeMidIteration, 'initial value');
56+
assert.compareArray(values, [
57+
4,
58+
6
59+
]);
60+
}
61+
for (let ctor of ctors) {
62+
values = [];
63+
rab = CreateRabForTest(ctor);
64+
const lengthTracking = new ctor(rab, 0);
65+
resizeAfter = 2;
66+
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
67+
Array.prototype.reduce.call(lengthTracking, ResizeMidIteration, 'initial value');
68+
assert.compareArray(values, [
69+
0,
70+
2,
71+
4,
72+
6
73+
]);
74+
}
75+
for (let ctor of ctors) {
76+
values = [];
77+
rab = CreateRabForTest(ctor);
78+
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
79+
resizeAfter = 1;
80+
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
81+
Array.prototype.reduce.call(lengthTrackingWithOffset, ResizeMidIteration, 'initial value');
82+
assert.compareArray(values, [
83+
4,
84+
6
85+
]);
86+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// Copyright 2024 Igalia S.L. All rights reserved.
2+
// This code is governed by the BSD license found in the LICENSE file.
3+
4+
/*---
5+
esid: sec-%array%.prototype.reduce
6+
description: >
7+
Array.p.reduce behaves correctly when the backing resizable buffer is shrunk
8+
mid-iteration.
9+
includes: [compareArray.js, resizableArrayBufferUtils.js]
10+
features: [resizable-arraybuffer]
11+
---*/
12+
13+
let values;
14+
let rab;
15+
let resizeAfter;
16+
let resizeTo;
17+
// Collects the view of the resizable array buffer rab into values, with an
18+
// iteration during which, after resizeAfter steps, rab is resized to length
19+
// resizeTo. To be called by a method of the view being collected.
20+
// Note that rab, values, resizeAfter, and resizeTo may need to be reset
21+
// before calling this.
22+
function ResizeMidIteration(acc, n) {
23+
// Returns true by default.
24+
return CollectValuesAndResize(n, values, rab, resizeAfter, resizeTo);
25+
}
26+
27+
// Orig. array: [0, 2, 4, 6]
28+
// [0, 2, 4, 6] << fixedLength
29+
// [4, 6] << fixedLengthWithOffset
30+
// [0, 2, 4, 6, ...] << lengthTracking
31+
// [4, 6, ...] << lengthTrackingWithOffset
32+
33+
for (let ctor of ctors) {
34+
values = [];
35+
rab = CreateRabForTest(ctor);
36+
const fixedLength = new ctor(rab, 0, 4);
37+
resizeAfter = 2;
38+
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
39+
Array.prototype.reduce.call(fixedLength, ResizeMidIteration, 'initial value');
40+
assert.compareArray(values, [
41+
0,
42+
2
43+
]);
44+
}
45+
for (let ctor of ctors) {
46+
values = [];
47+
rab = CreateRabForTest(ctor);
48+
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
49+
resizeAfter = 1;
50+
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
51+
Array.prototype.reduce.call(fixedLengthWithOffset, ResizeMidIteration, 'initial value');
52+
assert.compareArray(values, [
53+
4
54+
]);
55+
}
56+
for (let ctor of ctors) {
57+
values = [];
58+
rab = CreateRabForTest(ctor);
59+
const lengthTracking = new ctor(rab, 0);
60+
resizeAfter = 2;
61+
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
62+
Array.prototype.reduce.call(lengthTracking, ResizeMidIteration, 'initial value');
63+
assert.compareArray(values, [
64+
0,
65+
2,
66+
4
67+
]);
68+
}
69+
for (let ctor of ctors) {
70+
values = [];
71+
rab = CreateRabForTest(ctor);
72+
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
73+
resizeAfter = 1;
74+
resizeTo = 3 * ctor.BYTES_PER_ELEMENT;
75+
Array.prototype.reduce.call(lengthTrackingWithOffset, ResizeMidIteration, 'initial value');
76+
assert.compareArray(values, [
77+
4
78+
]);
79+
}
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
// Copyright 2023 the V8 project authors. All rights reserved.
2+
// This code is governed by the BSD license found in the LICENSE file.
3+
4+
/*---
5+
esid: sec-array.prototype.reduce
6+
description: >
7+
Array.p.reduce behaves correctly on TypedArrays backed by resizable buffers.
8+
includes: [compareArray.js, resizableArrayBufferUtils.js]
9+
features: [resizable-arraybuffer]
10+
---*/
11+
12+
for (let ctor of ctors) {
13+
const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, 8 * ctor.BYTES_PER_ELEMENT);
14+
const fixedLength = new ctor(rab, 0, 4);
15+
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
16+
const lengthTracking = new ctor(rab, 0);
17+
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
18+
19+
// Write some data into the array.
20+
const taWrite = new ctor(rab);
21+
for (let i = 0; i < 4; ++i) {
22+
WriteToTypedArray(taWrite, i, 2 * i);
23+
}
24+
25+
// Orig. array: [0, 2, 4, 6]
26+
// [0, 2, 4, 6] << fixedLength
27+
// [4, 6] << fixedLengthWithOffset
28+
// [0, 2, 4, 6, ...] << lengthTracking
29+
// [4, 6, ...] << lengthTrackingWithOffset
30+
function ReduceCollecting(array) {
31+
const reduceValues = [];
32+
Array.prototype.reduce.call(array, (acc, n) => {
33+
reduceValues.push(n);
34+
}, 'initial value');
35+
return ToNumbers(reduceValues);
36+
}
37+
assert.compareArray(ReduceCollecting(fixedLength), [
38+
0,
39+
2,
40+
4,
41+
6
42+
]);
43+
assert.compareArray(ReduceCollecting(fixedLengthWithOffset), [
44+
4,
45+
6
46+
]);
47+
assert.compareArray(ReduceCollecting(lengthTracking), [
48+
0,
49+
2,
50+
4,
51+
6
52+
]);
53+
assert.compareArray(ReduceCollecting(lengthTrackingWithOffset), [
54+
4,
55+
6
56+
]);
57+
58+
// Shrink so that fixed length TAs go out of bounds.
59+
rab.resize(3 * ctor.BYTES_PER_ELEMENT);
60+
61+
// Orig. array: [0, 2, 4]
62+
// [0, 2, 4, ...] << lengthTracking
63+
// [4, ...] << lengthTrackingWithOffset
64+
65+
assert.compareArray(ReduceCollecting(fixedLength), []);
66+
assert.compareArray(ReduceCollecting(fixedLengthWithOffset), []);
67+
68+
assert.compareArray(ReduceCollecting(lengthTracking), [
69+
0,
70+
2,
71+
4
72+
]);
73+
assert.compareArray(ReduceCollecting(lengthTrackingWithOffset), [4]);
74+
75+
// Shrink so that the TAs with offset go out of bounds.
76+
rab.resize(1 * ctor.BYTES_PER_ELEMENT);
77+
assert.compareArray(ReduceCollecting(fixedLength), []);
78+
assert.compareArray(ReduceCollecting(fixedLengthWithOffset), []);
79+
80+
assert.compareArray(ReduceCollecting(lengthTracking), [0]);
81+
82+
// Shrink to zero.
83+
rab.resize(0);
84+
assert.compareArray(ReduceCollecting(fixedLength), []);
85+
assert.compareArray(ReduceCollecting(fixedLengthWithOffset), []);
86+
assert.compareArray(ReduceCollecting(lengthTrackingWithOffset), []);
87+
88+
assert.compareArray(ReduceCollecting(lengthTracking), []);
89+
90+
// Grow so that all TAs are back in-bounds.
91+
rab.resize(6 * ctor.BYTES_PER_ELEMENT);
92+
for (let i = 0; i < 6; ++i) {
93+
WriteToTypedArray(taWrite, i, 2 * i);
94+
}
95+
96+
// Orig. array: [0, 2, 4, 6, 8, 10]
97+
// [0, 2, 4, 6] << fixedLength
98+
// [4, 6] << fixedLengthWithOffset
99+
// [0, 2, 4, 6, 8, 10, ...] << lengthTracking
100+
// [4, 6, 8, 10, ...] << lengthTrackingWithOffset
101+
102+
assert.compareArray(ReduceCollecting(fixedLength), [
103+
0,
104+
2,
105+
4,
106+
6
107+
]);
108+
assert.compareArray(ReduceCollecting(fixedLengthWithOffset), [
109+
4,
110+
6
111+
]);
112+
assert.compareArray(ReduceCollecting(lengthTracking), [
113+
0,
114+
2,
115+
4,
116+
6,
117+
8,
118+
10
119+
]);
120+
assert.compareArray(ReduceCollecting(lengthTrackingWithOffset), [
121+
4,
122+
6,
123+
8,
124+
10
125+
]);
126+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
// Copyright 2023 the V8 project authors. All rights reserved.
2+
// This code is governed by the BSD license found in the LICENSE file.
3+
4+
/*---
5+
esid: sec-%typedarray%.prototype.reduce
6+
description: >
7+
TypedArray.p.reduce behaves correctly on TypedArrays backed by resizable
8+
buffers that are grown mid-iteration.
9+
includes: [compareArray.js, resizableArrayBufferUtils.js]
10+
features: [resizable-arraybuffer]
11+
---*/
12+
13+
let values;
14+
let rab;
15+
let resizeAfter;
16+
let resizeTo;
17+
// Collects the view of the resizable array buffer rab into values, with an
18+
// iteration during which, after resizeAfter steps, rab is resized to length
19+
// resizeTo. To be called by a method of the view being collected.
20+
// Note that rab, values, resizeAfter, and resizeTo may need to be reset
21+
// before calling this.
22+
function ResizeMidIteration(n) {
23+
// Returns true by default.
24+
return CollectValuesAndResize(n, values, rab, resizeAfter, resizeTo);
25+
}
26+
27+
// Orig. array: [0, 2, 4, 6]
28+
// [0, 2, 4, 6] << fixedLength
29+
// [4, 6] << fixedLengthWithOffset
30+
// [0, 2, 4, 6, ...] << lengthTracking
31+
// [4, 6, ...] << lengthTrackingWithOffset
32+
33+
for (let ctor of ctors) {
34+
values = [];
35+
rab = CreateRabForTest(ctor);
36+
const fixedLength = new ctor(rab, 0, 4);
37+
resizeAfter = 2;
38+
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
39+
fixedLength.reduce(ResizeMidIteration, 'initial value');
40+
assert.compareArray(values, [
41+
0,
42+
2,
43+
4,
44+
6
45+
]);
46+
}
47+
for (let ctor of ctors) {
48+
values = [];
49+
rab = CreateRabForTest(ctor);
50+
const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2);
51+
resizeAfter = 1;
52+
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
53+
fixedLengthWithOffset.reduce(ResizeMidIteration, 'initial value');
54+
assert.compareArray(values, [
55+
4,
56+
6
57+
]);
58+
}
59+
for (let ctor of ctors) {
60+
values = [];
61+
rab = CreateRabForTest(ctor);
62+
const lengthTracking = new ctor(rab, 0);
63+
resizeAfter = 2;
64+
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
65+
lengthTracking.reduce(ResizeMidIteration, 'initial value');
66+
assert.compareArray(values, [
67+
0,
68+
2,
69+
4,
70+
6
71+
]);
72+
}
73+
for (let ctor of ctors) {
74+
values = [];
75+
rab = CreateRabForTest(ctor);
76+
const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT);
77+
resizeAfter = 1;
78+
resizeTo = 5 * ctor.BYTES_PER_ELEMENT;
79+
lengthTrackingWithOffset.reduce(ResizeMidIteration, 'initial value');
80+
assert.compareArray(values, [
81+
4,
82+
6
83+
]);
84+
}

0 commit comments

Comments
 (0)