Skip to content

Commit d57893c

Browse files
committed
Add Proxy splice test.
(cherry picked from commit c989a9a)
1 parent 15ab4f0 commit d57893c

File tree

1 file changed

+122
-0
lines changed

1 file changed

+122
-0
lines changed

graal-js/src/com.oracle.truffle.js.test/js/array_splice_elementwise.js

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
* Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl.
66
*/
77

8+
load("./assert.js");
9+
810
function assertArrayEquals(actual, expected) {
911
if (actual.length !== expected.length) {
1012
throw new Error(`expected length: [${expected.length}] actual length: [${actual.length}]\nexpected array: [${expected}]\nactual array: [${actual}]`);
@@ -55,3 +57,123 @@ var arr = [0, 1, 2, 3, , 5, , , , 9];
5557
var rem = arr.splice(1, 2, 6, 7, 8);
5658
assertArrayEquals(arr, [0, 6, 7, 8, 3, , 5, , , , 9]);
5759
assertArrayEquals(rem, [1, 2]);
60+
61+
62+
// Proxy object
63+
// itemCount < actualDeleteCount
64+
arr = new Proxy([0, 1, , , 4, , , 7, ,], proxyHandler(
65+
"get(length)",
66+
"get(constructor)",
67+
"has(0)", "get(0)",
68+
"has(1)", "get(1)",
69+
"has(2)", "get(2)",
70+
"has(3)", "deleteProperty(0)",
71+
"has(4)", "get(4)", "set(1, 4)",
72+
"has(5)", "deleteProperty(2)",
73+
"has(6)", "deleteProperty(3)",
74+
"has(7)", "get(7)", "set(4, 7)",
75+
"has(8)", "deleteProperty(5)",
76+
"deleteProperty(8)",
77+
"deleteProperty(7)",
78+
"deleteProperty(6)",
79+
"set(length, 6)",
80+
));
81+
rem = Array.prototype.splice.call(arr, 0, 3);
82+
assertArrayEquals(arr, [ , 4, , , 7, ,]);
83+
assertArrayEquals(rem, [0, 1, "^2"]);
84+
85+
arr = new Proxy([0, 1, , , 4], proxyHandler(
86+
"get(length)",
87+
"get(constructor)",
88+
"has(3)",
89+
"has(4)", "get(4)", "set(3, 4)",
90+
"deleteProperty(4)",
91+
"set(length, 4)",
92+
));
93+
rem = Array.prototype.splice.call(arr, 3, 1);
94+
assertArrayEquals(arr, [0, 1, , 4]);
95+
assertArrayEquals(rem, [,]);
96+
97+
// itemCount > actualDeleteCount
98+
arr = new Proxy([0, 1, 2, 3, , 5, , , , 9], proxyHandler(
99+
"get(length)",
100+
"get(constructor)",
101+
"has(1)", "get(1)",
102+
"has(2)", "get(2)",
103+
"has(9)", "get(9)", "set(10, 9)",
104+
"has(8)", "deleteProperty(9)",
105+
"has(7)", "deleteProperty(8)",
106+
"has(6)", "deleteProperty(7)",
107+
"has(5)", "get(5)", "set(6, 5)",
108+
"has(4)", "deleteProperty(5)",
109+
"has(3)", "get(3)", "set(4, 3)",
110+
"set(1, 6)",
111+
"set(2, 7)",
112+
"set(3, 8)",
113+
"set(length, 11)",
114+
));
115+
rem = Array.prototype.splice.call(arr, 1, 2, 6, 7, 8);
116+
assertArrayEquals(arr, [0, 6, 7, 8, 3, , 5, , , , 9]);
117+
assertArrayEquals(rem, [1, 2]);
118+
119+
120+
// Array with Proxy prototype
121+
// itemCount < actualDeleteCount
122+
arr = Object.setPrototypeOf([0, 1, , , 4, , , 7, ,], new Proxy({}, proxyHandler(
123+
"get(constructor)",
124+
"has(2)",
125+
"get(2)",
126+
"has(3)",
127+
"has(5)",
128+
"has(6)",
129+
"has(8)",
130+
)));
131+
rem = Array.prototype.splice.call(arr, 0, 3);
132+
assertArrayEquals(arr, [ , 4, , , 7, ,]);
133+
assertArrayEquals(rem, [0, 1, "^2"]);
134+
135+
// itemCount > actualDeleteCount
136+
arr = Object.setPrototypeOf([0, 1, 2, 3, , 5, , , , 9], new Proxy({}, proxyHandler(
137+
"get(constructor)",
138+
"set(10, 9)",
139+
"has(8)",
140+
"has(7)",
141+
"has(6)",
142+
"set(6, 5)",
143+
"has(4)",
144+
"set(4, 3)",
145+
)));
146+
rem = Array.prototype.splice.call(arr, 1, 2, 6, 7, 8);
147+
assertArrayEquals(arr, [0, 6, 7, 8, 3, , 5, , , , 9]);
148+
assertArrayEquals(rem, [1, 2]);
149+
150+
151+
function proxyHandler(...expectedTraps) {
152+
let it = expectedTraps.values();
153+
function log(trap) {
154+
const expected = it.next().value;
155+
if (expected !== undefined) {
156+
assertSame(expected, trap);
157+
} else {
158+
assertTrue(trap.startsWith("get"));
159+
}
160+
}
161+
return {
162+
has(target, p) {
163+
log(`has(${String(p)})`);
164+
return Reflect.has(target, p);
165+
},
166+
get(target, p, receiver) {
167+
log(`get(${String(p)})`);
168+
return Reflect.get(target, p, receiver);
169+
},
170+
set(target, p, value, receiver) {
171+
log(`set(${String(p)}, ${value})`);
172+
return Reflect.set(target, p, value, receiver);
173+
},
174+
deleteProperty(target, p) {
175+
log(`deleteProperty(${String(p)})`);
176+
return Reflect.deleteProperty(target, p);
177+
},
178+
};
179+
}

0 commit comments

Comments
 (0)