From: antonm@chromium.org Date: Wed, 17 Feb 2010 10:48:29 +0000 (+0000) Subject: Renaming test/mjsunit/array-splice.js to test/mjsunit/array-functions-prototype-misc.js. X-Git-Tag: upstream/4.7.83~22459 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=210e02442e44a1f7076da5ee7224b010e4bd3c37;p=platform%2Fupstream%2Fv8.git Renaming test/mjsunit/array-splice.js to test/mjsunit/array-functions-prototype-misc.js. The test array-splice.js following array-shift, array-slice etc would be added in next commit. Review URL: http://codereview.chromium.org/618005 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3884 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/test/mjsunit/array-functions-prototype-misc.js b/test/mjsunit/array-functions-prototype-misc.js new file mode 100644 index 000000000..0543c323b --- /dev/null +++ b/test/mjsunit/array-functions-prototype-misc.js @@ -0,0 +1,314 @@ +// 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))); diff --git a/test/mjsunit/array-splice.js b/test/mjsunit/array-splice.js deleted file mode 100644 index 0543c323b..000000000 --- a/test/mjsunit/array-splice.js +++ /dev/null @@ -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)));