1// Copyright 2008 the V8 project authors. All rights reserved. 2// Redistribution and use in source and binary forms, with or without 3// modification, are permitted provided that the following conditions are 4// met: 5// 6// * Redistributions of source code must retain the above copyright 7// notice, this list of conditions and the following disclaimer. 8// * Redistributions in binary form must reproduce the above 9// copyright notice, this list of conditions and the following 10// disclaimer in the documentation and/or other materials provided 11// with the distribution. 12// * Neither the name of Google Inc. nor the names of its 13// contributors may be used to endorse or promote products derived 14// from this software without specific prior written permission. 15// 16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28// Test that array join calls toString on subarrays. 29var a = [[1,2],3,4,[5,6]]; 30assertEquals('1,2345,6', a.join('')); 31assertEquals('1,2*3*4*5,6', a.join('*')); 32assertEquals('1,2**3**4**5,6', a.join('**')); 33assertEquals('1,2****3****4****5,6', a.join('****')); 34assertEquals('1,2********3********4********5,6', a.join('********')); 35assertEquals('1,2**********3**********4**********5,6', a.join('**********')); 36 37// Create a cycle. 38a.push(a); 39assertEquals('1,2345,6', a.join('')); 40assertEquals('1,2*3*4*5,6*', a.join('*')); 41assertEquals('1,2**3**4**5,6**', a.join('**')); 42assertEquals('1,2****3****4****5,6****', a.join('****')); 43assertEquals('1,2********3********4********5,6********', a.join('********')); 44assertEquals('1,2**********3**********4**********5,6**********', a.join('**********')); 45 46// Replace array.prototype.toString. 47var oldToString = Array.prototype.toString; 48Array.prototype.toString = function() { return "array"; }; 49assertEquals('array34arrayarray', a.join('')); 50assertEquals('array*3*4*array*array', a.join('*')); 51assertEquals('array**3**4**array**array', a.join('**')); 52assertEquals('array****3****4****array****array', a.join('****')); 53assertEquals('array********3********4********array********array', a.join('********')); 54assertEquals('array**********3**********4**********array**********array', a.join('**********')); 55 56Array.prototype.toString = function() { throw 42; }; 57assertThrows("a.join('')"); 58assertThrows("a.join('*')"); 59assertThrows("a.join('**')"); 60assertThrows("a.join('****')"); 61assertThrows("a.join('********')"); 62assertThrows("a.join('**********')"); 63 64Array.prototype.toString = function() { return "array"; }; 65assertEquals('array34arrayarray', a.join('')); 66assertEquals('array*3*4*array*array', a.join('*')); 67assertEquals('array**3**4**array**array', a.join('**')); 68assertEquals('array****3****4****array****array', a.join('****')); 69assertEquals('array********3********4********array********array', a.join('********')); 70assertEquals('array**********3**********4**********array**********array', a.join('**********')); 71 72// Restore original toString. 73delete Array.prototype.toString; 74if (Array.prototype.toString != oldToString) { 75 Array.prototype.toString = oldToString; 76} 77 78var a = new Array(123123); 79assertEquals(123122, String(a).length); 80assertEquals(123122, a.join(",").length); 81assertEquals(246244, a.join("oo").length); 82 83a = new Array(Math.pow(2,32) - 1); // Max length. 84assertEquals("", a.join("")); 85a[123123123] = "o"; 86a[1255215215] = "p"; 87assertEquals("op", a.join("")); 88 89a = new Array(100001); 90for (var i = 0; i < a.length; i++) a[i] = undefined; 91a[5] = "ab"; 92a[90000] = "cd"; 93assertEquals("abcd", a.join("")); // Must not throw. 94