diff options
Diffstat (limited to 'deps/v8/test/mjsunit/array-functions-prototype-misc.js')
-rw-r--r-- | deps/v8/test/mjsunit/array-functions-prototype-misc.js | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/deps/v8/test/mjsunit/array-functions-prototype-misc.js b/deps/v8/test/mjsunit/array-functions-prototype-misc.js index 74dc9a6be0..a2c1410837 100644 --- a/deps/v8/test/mjsunit/array-functions-prototype-misc.js +++ b/deps/v8/test/mjsunit/array-functions-prototype-misc.js @@ -312,3 +312,75 @@ Array.prototype[1] = undefined; // Test http://code.google.com/p/chromium/issues/detail?id=21860 Array.prototype.push.apply([], [1].splice(0, -(-1 % 5))); + + +// Check that the Array functions work also properly on non-Arrays +var receiver; + +receiver = 'a string'; +assertThrows(function(){ + Array.prototype.push.call(receiver); +}); + +receiver = 0; +assertEquals(undefined, receiver.length); +assertEquals(0, Array.prototype.push.call(receiver)); +assertEquals(1, Array.prototype.push.call(receiver, 'first')); +assertEquals(undefined, receiver.length); + +receiver = {}; +assertEquals(undefined, receiver.length); +assertEquals(0, Array.prototype.push.call(receiver)); +assertEquals(0, Array.prototype.push.call(receiver)); +assertEquals(0, receiver.length); +assertEquals(1, Array.prototype.push.call(receiver, 'first')); +assertEquals(1, receiver.length); +assertEquals('first', receiver[0]); +assertEquals(2, Array.prototype.push.call(receiver, 'second')); +assertEquals(2, receiver.length); +assertEquals('first', receiver[0]); +assertEquals('second', receiver[1]); + +receiver = {'length': 10}; +assertEquals(10, Array.prototype.push.call(receiver)); +assertEquals(10, receiver.length); +assertEquals(11, Array.prototype.push.call(receiver, 'first')); +assertEquals(11, receiver.length); +assertEquals('first', receiver[10]); +assertEquals(13, Array.prototype.push.call(receiver, 'second', 'third')); +assertEquals(13, receiver.length); +assertEquals('first', receiver[10]); +assertEquals('second', receiver[11]); +assertEquals('third', receiver[12]); + +receiver = { + get length() { return 10; }, + set length(l) {} +}; +assertEquals(10, Array.prototype.push.call(receiver)); +assertEquals(10, receiver.length); +assertEquals(11, Array.prototype.push.call(receiver, 'first')); +assertEquals(10, receiver.length); +assertEquals('first', receiver[10]); +assertEquals(12, Array.prototype.push.call(receiver, 'second', 'third')); +assertEquals(10, receiver.length); +assertEquals('second', receiver[10]); +assertEquals('third', receiver[11]); + +// readonly length +receiver = { + get length() { return 10; }, +}; +assertThrows(function(){ + Array.prototype.push.call(receiver); +}); + +receiver = { + set length(l) {} +}; +assertEquals(0, Array.prototype.push.call(receiver)); +assertEquals(undefined, receiver.length); +assertEquals(1, Array.prototype.push.call(receiver, 'first')); +assertEquals(undefined, receiver.length); +assertEquals(2, Array.prototype.push.call(receiver, 'third', 'second')); +assertEquals(undefined, receiver.length); |