Skip to content

Commit c108b17

Browse files
committed
Increase test coverage: Array.prototype.splice
Branch coverage: Before: 56/78 After: 78/78 Also corrected a mistake, that "else if" branch is not needed, should be replaced with an "else". JerryScript-DCO-1.0-Signed-off-by: Mate Dabis [email protected]
1 parent 0c20f8e commit c108b17

File tree

2 files changed

+173
-1
lines changed

2 files changed

+173
-1
lines changed

jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1378,8 +1378,9 @@ ecma_builtin_array_prototype_object_splice (ecma_value_t this_arg, /**< this arg
13781378
}
13791379
}
13801380
/* 13. */
1381-
else if (item_count > delete_count)
1381+
else
13821382
{
1383+
JERRY_ASSERT (item_count > delete_count);
13831384
/* 13.b */
13841385
for (k = len - delete_count; k > start && ecma_is_value_empty (ret_value); k--)
13851386
{

tests/jerry/array-prototype-splice.js

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,3 +175,174 @@ try {
175175
assert (e.message === "foo");
176176
assert (e instanceof ReferenceError);
177177
}
178+
179+
try {
180+
Array.prototype.splice.call (undefined);
181+
assert (false);
182+
} catch (e) {
183+
assert (e instanceof TypeError);
184+
}
185+
186+
try {
187+
var o = {};
188+
Object.defineProperty(o, 'toString', { 'get' : function () { throw new ReferenceError ("foo"); } });
189+
var a = { length : o }
190+
Array.prototype.splice.call(a, function () { })
191+
assert (false);
192+
} catch (e) {
193+
assert (e instanceof ReferenceError);
194+
}
195+
196+
try {
197+
var o = {};
198+
Object.defineProperty(o, 'toString', { 'get' : function () { throw new ReferenceError ("foo"); } });
199+
[1,2].splice(o)
200+
assert (false);
201+
} catch (e) {
202+
assert (e instanceof ReferenceError);
203+
}
204+
205+
try {
206+
var o = {};
207+
Object.defineProperty(o, 'toString', { 'get' : function () { throw new ReferenceError ("foo"); } });
208+
[1,2].splice(1, o)
209+
assert (false);
210+
} catch (e) {
211+
assert (e instanceof ReferenceError);
212+
}
213+
214+
try{
215+
var a = [1,5, ,2]
216+
Object.defineProperty(a, '2',{ 'get' : function () { throw new ReferenceError ("foo"); } } )
217+
a.splice(1, 7, 7, 7,7,7)
218+
assert (false)
219+
} catch (e) {
220+
assert (e instanceof ReferenceError);
221+
}
222+
223+
var a = {length : 13}
224+
Array.prototype.splice.call(a, function () {delete a})
225+
assert (a.length === 0)
226+
227+
try{
228+
var a = [1,5,6,7,8,5]
229+
Object.defineProperty(a, '1',{ 'get' : function () { throw new ReferenceError ("foo"); } } )
230+
Object.defineProperty(a, '0',{ 'get' : function () { throw new ReferenceError ("foo"); } } )
231+
Object.defineProperty(a, '2',{ 'get' : function () { throw new ReferenceError ("foo"); } } )
232+
Array.prototype.splice.call(a, 0, 3)
233+
assert (false)
234+
} catch (e) {
235+
assert (e instanceof ReferenceError);
236+
}
237+
238+
try{
239+
f = function () {delete arr[3]; arr.length = 13; Object.defineProperty(arr, '5', function () {})};
240+
obj = {get: f, valueOf : f, toString: f}
241+
arr = [1, 2, obj, 4, 5];
242+
243+
Object.defineProperty(arr, '2',{ 'get' : f } )
244+
print(arr)
245+
arr.splice(1, 4, obj);
246+
print(arr)
247+
} catch (e) {}
248+
249+
try{
250+
f = function () { for(var i=0; i<arr.length; i++){ delete arr[i]}};
251+
obj = {get: f, valueOf : f, toString: f}
252+
arr = [1, 2, obj, 4, 5];
253+
Object.defineProperty(arr, '0',{ 'get' : f } )
254+
Object.defineProperty(arr, '1',{ 'get' : f } )
255+
Object.defineProperty(arr, '2',{ 'get' : f } )
256+
Object.defineProperty(arr, '3',{ 'get' : f } )
257+
Object.defineProperty(arr, '4',{ 'get' : f } )
258+
Object.defineProperty(arr, '5',{ 'get' : f } )
259+
arr.splice(1, 3, obj);
260+
} catch (e) {}
261+
262+
try{
263+
f = function () { throw new TypeError;};
264+
obj = {get: f, valueOf : f, toString: f}
265+
arr = [1, 2, obj, 4, 5];
266+
Object.defineProperty(arr, '4',{ 'get' : f } )
267+
arr.splice(1, 3, obj);
268+
} catch (e) {}
269+
270+
try{
271+
f = function () { for(var i=0; i<arr.length; i++){ delete arr[i]} };
272+
f1 = function () { throw new TypeError;};
273+
f2 = function () { delete arr[2];};
274+
f3 = function () { delete arr[3];};
275+
f4 = function () { delete arr[4];};
276+
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
277+
delete arr[2]; delete arr[3];
278+
Object.defineProperty(arr, '0',{ 'get' : f } )
279+
Object.defineProperty(arr, '1',{ 'get' : f } )
280+
Object.defineProperty(arr, '2',{ 'get' : f } )
281+
Object.defineProperty(arr, '3',{ 'get' : f } )
282+
Object.defineProperty(arr, '8',{ 'get' : f2 } )
283+
Object.defineProperty(arr, '9',{ 'get' : f3 } )
284+
Object.defineProperty(arr, '10',{ 'get' : f4 } )
285+
arr.splice(1, 7, 5);
286+
} catch (e) {}
287+
288+
try{
289+
f = function () { for(var i=0; i<arr.length; i++){ delete arr[i]} };
290+
f1 = function () { throw new TypeError;};
291+
f2 = function () { delete arr[2];};
292+
f3 = function () { delete arr[3];};
293+
f4 = function () { delete arr[4];};
294+
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24];
295+
delete arr[2];
296+
delete arr[3];
297+
Object.defineProperty(arr, '0',{ 'get' : f } )
298+
Object.defineProperty(arr, '1',{ 'get' : f } )
299+
Object.defineProperty(arr, '2',{ 'get' : f } )
300+
Object.defineProperty(arr, '3',{ 'get' : f } )
301+
Object.defineProperty(arr, '8',{ 'get' : f2 } )
302+
Object.defineProperty(arr, '9',{ 'get' : f3 } )
303+
Object.defineProperty(arr, '10',{ 'get' : f4 } )
304+
arr.splice(1, 7, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5);
305+
} catch (e) {}
306+
307+
try{
308+
var a = [1,5,6,7,8,5]
309+
Object.defineProperty(a, '1',{ 'get' : function () { throw new ReferenceError ("foo"); } } )
310+
Object.defineProperty(a, '0',{ 'get' : function () { throw new ReferenceError ("foo"); } } )
311+
Object.defineProperty(a, '2',{ 'get' : function () { throw new ReferenceError ("foo"); } } )
312+
Array.prototype.splice.call(a, 0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3)
313+
assert (false)
314+
} catch (e) {
315+
assert (e instanceof ReferenceError);
316+
}
317+
318+
try{
319+
f = function () { for(var i=0; i<arr.length; i++){ delete arr[i]} };
320+
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24];
321+
delete arr[22];
322+
delete arr[23];
323+
Object.defineProperty(arr, '21',{ 'get' : f } )
324+
Object.defineProperty(arr, '22',{ 'get' : f } )
325+
Object.defineProperty(arr, '23',{ 'get' : f } )
326+
arr.splice(1, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5);
327+
} catch (e) {}
328+
329+
try{
330+
f = function () { throw new TypeError;};
331+
arr = [1, 2, 4, 5];
332+
Object.defineProperty(arr, '4',{ 'get' : f } )
333+
arr.splice(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
334+
} catch (e) {}
335+
336+
try{
337+
f = function () { delete arr[23];}
338+
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24];
339+
delete arr[23];
340+
Object.defineProperty(arr, '23',{ 'get' : f } )
341+
arr.splice(1, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5);
342+
} catch (e) {}
343+
344+
try{
345+
arr = [];
346+
Object.defineProperty(arr, 'length', { value : 999, writable: false } )
347+
arr.splice(1, 2, 4, 5);
348+
} catch (e) {}

0 commit comments

Comments
 (0)