1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2008 the V8 project authors. All rights reserved. 2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without 3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met: 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions of source code must retain the above copyright 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// notice, this list of conditions and the following disclaimer. 8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions in binary form must reproduce the above 9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// copyright notice, this list of conditions and the following 10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// disclaimer in the documentation and/or other materials provided 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// with the distribution. 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Neither the name of Google Inc. nor the names of its 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// contributors may be used to endorse or promote products derived 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// from this software without specific prior written permission. 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// This file contains a number of tests of array functions and their 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// interaction with properties in the prototype chain. 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The behavior of SpiderMonkey is slightly different for arrays (see 32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// below). Our behavior is consistent and matches the bahavior of 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// KJS. 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar proto = { length:3, 0:'zero', 1:'one', 2:'two' } 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction constructor() {}; 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconstructor.prototype = proto; 38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Set elements on the array prototype. 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockArray.prototype[0] = 'zero'; 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockArray.prototype[1] = 'one'; 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockArray.prototype[2] = 'two'; 43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ---------------------------------------------------------------------- 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Helper functions. 46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ---------------------------------------------------------------------- 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction assertHasOwnProperties(object, limit) { 48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (var i = 0; i < limit; i++) { 49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertTrue(object.hasOwnProperty(i)); 50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ---------------------------------------------------------------------- 55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// shift. 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ---------------------------------------------------------------------- 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 58b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochfunction runTest1() { 59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block var nonArray = new constructor(); 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block var array = ['zero', , 'two']; 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Shift away the zero. 62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('zero', array.shift()); 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('zero', Array.prototype.shift.call(nonArray)); 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Check that the local object has properties 0 and 1 with the right 65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // values. 66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals(2, array.length); 67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals(2, nonArray.length); 68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertHasOwnProperties(array, 2); 69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertHasOwnProperties(nonArray, 2); 70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Note: Spidermonkey is inconsistent here. It treats arrays 71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // differently from non-arrays. It only consults the prototype for 72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // non-arrays. Therefore, array[0] is undefined in Spidermonkey and 73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 'one' in V8 and KJS. 74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('one', array[0]); 75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('one', nonArray[0]); 76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('two', array[1]); 77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('two', nonArray[1]); 78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get index 2 from the prototype. 79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('two', array[2]); 80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('two', nonArray[2]); 81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 83b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochrunTest1(); 84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ---------------------------------------------------------------------- 86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// unshift. 87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ---------------------------------------------------------------------- 88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 89b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochrunTest2 = function() { 90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block var nonArray = new constructor(); 91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block var array = ['zero', , 'two']; 92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Unshift a new 'zero'. 93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals(4, array.unshift('zero')); 94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals(4, Array.prototype.unshift.call(nonArray, 'zero')); 95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Check that the local object has properties 0 through 3 with the 96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // right values. 97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals(4, array.length); 98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals(4, nonArray.length); 99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertHasOwnProperties(array, 4); 100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertHasOwnProperties(nonArray, 4); 101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('zero', array[0]); 102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('zero', nonArray[0]); 103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('zero', array[1]); 104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('zero', nonArray[1]); 105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Again Spidermonkey is inconsistent. array[2] is undefined 106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // instead of 'one'. 107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('one', array[2]); 108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('one', nonArray[2]); 109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('two', array[3]); 110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('two', nonArray[3]); 111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochrunTest2(); 114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ---------------------------------------------------------------------- 117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// splice 118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ---------------------------------------------------------------------- 119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochrunTest3 = function() { 121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block var nonArray = new constructor(); 122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block var array = ['zero', , 'two']; 123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Delete the first element by splicing in nothing. 124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertArrayEquals(['zero'], array.splice(0, 1)); 125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertArrayEquals(['zero'], Array.prototype.splice.call(nonArray, 0, 1)); 126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Check that the local object has properties 0 and 1 with the right 127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // values. 128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals(2, array.length); 129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals(2, nonArray.length); 130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertHasOwnProperties(array, 2); 131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertHasOwnProperties(nonArray, 2); 132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Again Spidermonkey is inconsistent. array[0] is undefined 133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // instead of 'one'. 134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('one', array[0]); 135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('one', nonArray[0]); 136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('two', array[1]); 137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('two', nonArray[1]); 138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get index 2 from the prototype. 139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('two', array[2]); 140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertEquals('two', nonArray[2]); 141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochrunTest3(); 144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ---------------------------------------------------------------------- 147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// slice 148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ---------------------------------------------------------------------- 149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochrunTest4 = function() { 151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block var nonArray = new constructor(); 152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block var array = ['zero', , 'two']; 153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Again Spidermonkey is inconsistent. (array.slice(0, 3))[1] is 154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // undefined instead of 'one'. 155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertArrayEquals(['zero', 'one', 'two'], array.slice(0, 3)); 156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block assertArrayEquals(['zero', 'one', 'two'], Array.prototype.slice.call(nonArray, 0, 3)); 157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochrunTest4(); 160