| Index: test/mjsunit/array-splice.js
|
| ===================================================================
|
| --- test/mjsunit/array-splice.js (revision 3883)
|
| +++ test/mjsunit/array-splice.js (working copy)
|
| @@ -1,314 +0,0 @@
|
| -// Copyright 2008 the V8 project authors. All rights reserved.
|
| -// Redistribution and use in source and binary forms, with or without
|
| -// modification, are permitted provided that the following conditions are
|
| -// met:
|
| -//
|
| -// * Redistributions of source code must retain the above copyright
|
| -// notice, this list of conditions and the following disclaimer.
|
| -// * Redistributions in binary form must reproduce the above
|
| -// copyright notice, this list of conditions and the following
|
| -// disclaimer in the documentation and/or other materials provided
|
| -// with the distribution.
|
| -// * Neither the name of Google Inc. nor the names of its
|
| -// contributors may be used to endorse or promote products derived
|
| -// from this software without specific prior written permission.
|
| -//
|
| -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| -
|
| -/**
|
| - * @fileoverview Test splice, shift, unshift, slice and join on small
|
| - * and large arrays. Some of these methods are specified such that they
|
| - * should work on other objects too, so we test that too.
|
| - */
|
| -
|
| -var LARGE = 40000000;
|
| -var VERYLARGE = 4000000000;
|
| -
|
| -// Nicer for firefox 1.5. Unless you uncomment the following two lines,
|
| -// smjs will appear to hang on this file.
|
| -//var LARGE = 40000;
|
| -//var VERYLARGE = 40000;
|
| -
|
| -var fourhundredth = LARGE/400;
|
| -
|
| -function PseudoArray() {
|
| -};
|
| -
|
| -for (var use_real_arrays = 0; use_real_arrays <= 1; use_real_arrays++) {
|
| - var poses = [0, 140, 20000, VERYLARGE];
|
| - var the_prototype;
|
| - var new_function;
|
| - var push_function;
|
| - var concat_function;
|
| - var slice_function;
|
| - var splice_function;
|
| - var splice_function_2;
|
| - var unshift_function;
|
| - var unshift_function_2;
|
| - var shift_function;
|
| - if (use_real_arrays) {
|
| - new_function = function(length) {
|
| - return new Array(length);
|
| - };
|
| - the_prototype = Array.prototype;
|
| - push_function = function(array, elt) {
|
| - return array.push(elt);
|
| - };
|
| - concat_function = function(array, other) {
|
| - return array.concat(other);
|
| - };
|
| - slice_function = function(array, start, len) {
|
| - return array.slice(start, len);
|
| - };
|
| - splice_function = function(array, start, len) {
|
| - return array.splice(start, len);
|
| - };
|
| - splice_function_2 = function(array, start, len, elt) {
|
| - return array.splice(start, len, elt);
|
| - };
|
| - unshift_function = function(array, elt) {
|
| - return array.unshift(elt);
|
| - };
|
| - unshift_function_2 = function(array, elt1, elt2) {
|
| - return array.unshift(elt1, elt2);
|
| - };
|
| - shift_function = function(array) {
|
| - return array.shift();
|
| - };
|
| - } else {
|
| - // Don't run largest size on non-arrays or we'll be here for ever.
|
| - poses.pop();
|
| - new_function = function(length) {
|
| - var obj = new PseudoArray();
|
| - obj.length = length;
|
| - return obj;
|
| - };
|
| - the_prototype = PseudoArray.prototype;
|
| - push_function = function(array, elt) {
|
| - array[array.length] = elt;
|
| - array.length++;
|
| - };
|
| - concat_function = function(array, other) {
|
| - return Array.prototype.concat.call(array, other);
|
| - };
|
| - slice_function = function(array, start, len) {
|
| - return Array.prototype.slice.call(array, start, len);
|
| - };
|
| - splice_function = function(array, start, len) {
|
| - return Array.prototype.splice.call(array, start, len);
|
| - };
|
| - splice_function_2 = function(array, start, len, elt) {
|
| - return Array.prototype.splice.call(array, start, len, elt);
|
| - };
|
| - unshift_function = function(array, elt) {
|
| - return Array.prototype.unshift.call(array, elt);
|
| - };
|
| - unshift_function_2 = function(array, elt1, elt2) {
|
| - return Array.prototype.unshift.call(array, elt1, elt2);
|
| - };
|
| - shift_function = function(array) {
|
| - return Array.prototype.shift.call(array);
|
| - };
|
| - }
|
| -
|
| - for (var pos_pos = 0; pos_pos < poses.length; pos_pos++) {
|
| - var pos = poses[pos_pos];
|
| - if (pos > 100) {
|
| - var a = new_function(pos);
|
| - assertEquals(pos, a.length);
|
| - push_function(a, 'foo');
|
| - assertEquals(pos + 1, a.length);
|
| - var b = ['bar'];
|
| - // Delete a huge number of holes.
|
| - var c = splice_function(a, 10, pos - 20);
|
| - assertEquals(pos - 20, c.length);
|
| - assertEquals(21, a.length);
|
| - }
|
| -
|
| - // Add a numeric property to the prototype of the array class. This
|
| - // allows us to test some borderline stuff relative to the standard.
|
| - the_prototype["" + (pos + 1)] = 'baz';
|
| -
|
| - if (use_real_arrays) {
|
| - // It seems quite clear from ECMAScript spec 15.4.4.5. Just call Get on
|
| - // every integer in the range.
|
| - // IE, Safari get this right.
|
| - // FF, Opera get this wrong.
|
| - var a = ['zero', ,'two'];
|
| - if (pos == 0) {
|
| - assertEquals("zero,baz,two", a.join(","));
|
| - }
|
| -
|
| - // Concat only applies to real arrays, unlike most of the other methods.
|
| - var a = new_function(pos);
|
| - push_function(a, "con");
|
| - assertEquals("con", a[pos]);
|
| - assertEquals(pos + 1, a.length);
|
| - var b = new_function(0);
|
| - push_function(b, "cat");
|
| - assertEquals("cat", b[0]);
|
| - var ab = concat_function(a, b);
|
| - assertEquals("con", ab[pos]);
|
| - assertEquals(pos + 2, ab.length);
|
| - assertEquals("cat", ab[pos + 1]);
|
| - var ba = concat_function(b, a);
|
| - assertEquals("con", ba[pos + 1]);
|
| - assertEquals(pos + 2, ba.length);
|
| - assertEquals("cat", ba[0]);
|
| -
|
| - // Join with '' as separator.
|
| - var join = a.join('');
|
| - assertEquals("con", join);
|
| - join = b.join('');
|
| - assertEquals("cat", join);
|
| - join = ab.join('');
|
| - assertEquals("concat", join);
|
| - join = ba.join('');
|
| - assertEquals("catcon", join);
|
| -
|
| - var sparse = [];
|
| - sparse[pos + 1000] = 'is ';
|
| - sparse[pos + 271828] = 'time ';
|
| - sparse[pos + 31415] = 'the ';
|
| - sparse[pos + 012260199] = 'all ';
|
| - sparse[-1] = 'foo';
|
| - sparse[pos + 22591927] = 'good ';
|
| - sparse[pos + 1618033] = 'for ';
|
| - sparse[pos + 91] = ': Now ';
|
| - sparse[pos + 86720199] = 'men.';
|
| - sparse.hest = 'fisk';
|
| -
|
| - assertEquals("baz: Now is the time for all good men.", sparse.join(''));
|
| - }
|
| -
|
| - a = new_function(pos);
|
| - push_function(a, 'zero');
|
| - push_function(a, void 0);
|
| - push_function(a, 'two');
|
| -
|
| - // Splice works differently from join.
|
| - // IE, Safari get this wrong.
|
| - // FF, Opera get this right.
|
| - // 15.4.4.12 line 24 says the object itself has to have the property...
|
| - var zero = splice_function(a, pos, 1);
|
| - assertEquals("undefined", typeof(a[pos]));
|
| - assertEquals("two", a[pos+1], "pos1:" + pos);
|
| - assertEquals(pos + 2, a.length, "a length");
|
| - assertEquals(1, zero.length, "zero length");
|
| - assertEquals("zero", zero[0]);
|
| -
|
| - // 15.4.4.12 line 41 says the object itself has to have the property...
|
| - a = new_function(pos);
|
| - push_function(a, 'zero');
|
| - push_function(a, void 0);
|
| - push_function(a, 'two');
|
| - var nothing = splice_function_2(a, pos, 0, 'minus1');
|
| - assertEquals("minus1", a[pos]);
|
| - assertEquals("zero", a[pos+1]);
|
| - assertEquals("undefined", typeof(a[pos+2]), "toot!");
|
| - assertEquals("two", a[pos+3], "pos3");
|
| - assertEquals(pos + 4, a.length);
|
| - assertEquals(1, zero.length);
|
| - assertEquals("zero", zero[0]);
|
| -
|
| - // 15.4.4.12 line 10 says the object itself has to have the property...
|
| - a = new_function(pos);
|
| - push_function(a, 'zero');
|
| - push_function(a, void 0);
|
| - push_function(a, 'two');
|
| - var one = splice_function(a, pos + 1, 1);
|
| - assertEquals("", one.join(","));
|
| - assertEquals(pos + 2, a.length);
|
| - assertEquals("zero", a[pos]);
|
| - assertEquals("two", a[pos+1]);
|
| -
|
| - // Set things back to the way they were.
|
| - the_prototype[pos + 1] = undefined;
|
| -
|
| - // Unshift.
|
| - var a = new_function(pos);
|
| - push_function(a, "foo");
|
| - assertEquals("foo", a[pos]);
|
| - assertEquals(pos + 1, a.length);
|
| - unshift_function(a, "bar");
|
| - assertEquals("foo", a[pos+1]);
|
| - assertEquals(pos + 2, a.length);
|
| - assertEquals("bar", a[0]);
|
| - unshift_function_2(a, "baz", "boo");
|
| - assertEquals("foo", a[pos+3]);
|
| - assertEquals(pos + 4, a.length);
|
| - assertEquals("baz", a[0]);
|
| - assertEquals("boo", a[1]);
|
| - assertEquals("bar", a[2]);
|
| -
|
| - // Shift.
|
| - var baz = shift_function(a);
|
| - assertEquals("baz", baz);
|
| - assertEquals("boo", a[0]);
|
| - assertEquals(pos + 3, a.length);
|
| - assertEquals("foo", a[pos + 2]);
|
| -
|
| - // Slice.
|
| - var bar = slice_function(a, 1, 0); // don't throw an exception please.
|
| - bar = slice_function(a, 1, 2);
|
| - assertEquals("bar", bar[0]);
|
| - assertEquals(1, bar.length);
|
| - assertEquals("bar", a[1]);
|
| -
|
| - }
|
| -}
|
| -
|
| -// Lets see if performance is reasonable.
|
| -
|
| -var a = new Array(LARGE + 10);
|
| -for (var i = 0; i < a.length; i += 1000) {
|
| - a[i] = i;
|
| -}
|
| -
|
| -// Take something near the end of the array.
|
| -for (var i = 0; i < 100; i++) {
|
| - var top = a.splice(LARGE, 5);
|
| - assertEquals(5, top.length);
|
| - assertEquals(LARGE, top[0]);
|
| - assertEquals("undefined", typeof(top[1]));
|
| - assertEquals(LARGE + 5, a.length);
|
| - a.splice(LARGE, 0, LARGE);
|
| - a.length = LARGE + 10;
|
| -}
|
| -
|
| -var a = new Array(LARGE + 10);
|
| -for (var i = 0; i < a.length; i += fourhundredth) {
|
| - a[i] = i;
|
| -}
|
| -
|
| -// Take something near the middle of the array.
|
| -for (var i = 0; i < 10; i++) {
|
| - var top = a.splice(LARGE >> 1, 5);
|
| - assertEquals(5, top.length);
|
| - assertEquals(LARGE >> 1, top[0]);
|
| - assertEquals("undefined", typeof(top[1]));
|
| - assertEquals(LARGE + 5, a.length);
|
| - a.splice(LARGE >> 1, 0, LARGE >> 1, void 0, void 0, void 0, void 0);
|
| -}
|
| -
|
| -
|
| -// Test http://b/issue?id=1202711
|
| -arr = [0];
|
| -arr.length = 2;
|
| -Array.prototype[1] = 1;
|
| -assertEquals(1, arr.pop());
|
| -assertEquals(0, arr.pop());
|
| -Array.prototype[1] = undefined;
|
| -
|
| -// Test http://code.google.com/p/chromium/issues/detail?id=21860
|
| -Array.prototype.push.apply([], [1].splice(0, -(-1 % 5)));
|
|
|
|
|