19258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org// Copyright 2008 the V8 project authors. All rights reserved. 29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Redistribution and use in source and binary forms, with or without 39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// modification, are permitted provided that the following conditions are 49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// met: 59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// 69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Redistributions of source code must retain the above copyright 79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// notice, this list of conditions and the following disclaimer. 89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Redistributions in binary form must reproduce the above 99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// copyright notice, this list of conditions and the following 109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// disclaimer in the documentation and/or other materials provided 119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// with the distribution. 129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Neither the name of Google Inc. nor the names of its 139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// contributors may be used to endorse or promote products derived 149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// from this software without specific prior written permission. 159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// 169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comvar s = 'abcdefghijklmn'; 299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s, s.substr()); 309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s, s.substr(0)); 319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s, s.substr('0')); 329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s, s.substr(void 0)); 339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s, s.substr(null)); 349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s, s.substr(false)); 359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s, s.substr(0.9)); 369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s, s.substr({ valueOf: function() { return 0; } })); 379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s, s.substr({ toString: function() { return '0'; } })); 389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comvar s1 = s.substring(1); 409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s1, s.substr(1)); 419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s1, s.substr('1')); 429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s1, s.substr(true)); 439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s1, s.substr(1.1)); 449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s1, s.substr({ valueOf: function() { return 1; } })); 459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s1, s.substr({ toString: function() { return '1'; } })); 469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s.substring(s.length - 1), s.substr(-1)); 499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s.substring(s.length - 1), s.substr(-1.2)); 509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s.substring(s.length - 1), s.substr(-1.7)); 519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s.substring(s.length - 2), s.substr(-2)); 529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s.substring(s.length - 2), s.substr(-2.3)); 539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s.substring(s.length - 2, s.length - 1), s.substr(-2, 1)); 549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s, s.substr(-100)); 559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals('abc', s.substr(-100, 3)); 569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s1, s.substr(-s.length + 1)); 579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 581805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org// assertEquals('', s.substr(0, void 0)); // smjs and rhino 599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals('abcdefghijklmn', s.substr(0, void 0)); // kjs and v8 609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals('', s.substr(0, null)); 619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals(s, s.substr(0, String(s.length))); 629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comassertEquals('a', s.substr(0, true)); 635c838251403b0be9a882540f1922577abba4c872ager@chromium.org 645c838251403b0be9a882540f1922577abba4c872ager@chromium.org 655c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Test substrings of different lengths and alignments. 665c838251403b0be9a882540f1922577abba4c872ager@chromium.org// First ASCII. 675c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar x = "ASCII"; 685c838251403b0be9a882540f1922577abba4c872ager@chromium.orgfor (var i = 0; i < 25; i++) { 695c838251403b0be9a882540f1922577abba4c872ager@chromium.org x += (i >> 4).toString(16) + (i & 0x0f).toString(16); 705c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 715c838251403b0be9a882540f1922577abba4c872ager@chromium.org/x/.exec(x); // Try to force a flatten. 725c838251403b0be9a882540f1922577abba4c872ager@chromium.orgfor (var i = 5; i < 25; i++) { 735c838251403b0be9a882540f1922577abba4c872ager@chromium.org for (var j = 0; j < 25; j++) { 745c838251403b0be9a882540f1922577abba4c872ager@chromium.org var z = x.substring(i, i+j); 755c838251403b0be9a882540f1922577abba4c872ager@chromium.org var w = Math.random() * 42; // Allocate something new in new-space. 765c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(j, z.length); 775c838251403b0be9a882540f1922577abba4c872ager@chromium.org for (var k = 0; k < j; k++) { 785c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(x.charAt(i+k), z.charAt(k)); 795c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 805c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 815c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 825c838251403b0be9a882540f1922577abba4c872ager@chromium.org 835c838251403b0be9a882540f1922577abba4c872ager@chromium.org 845c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Then two-byte strings. 855c838251403b0be9a882540f1922577abba4c872ager@chromium.orgx = "UC16\u2028"; // Non-ascii char forces two-byte string. 865c838251403b0be9a882540f1922577abba4c872ager@chromium.orgfor (var i = 0; i < 25; i++) { 875c838251403b0be9a882540f1922577abba4c872ager@chromium.org x += (i >> 4).toString(16) + (i & 0x0f).toString(16); 885c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 895c838251403b0be9a882540f1922577abba4c872ager@chromium.org/x/.exec(x); // Try to force a flatten. 905c838251403b0be9a882540f1922577abba4c872ager@chromium.orgfor (var i = 5; i < 25; i++) { 915c838251403b0be9a882540f1922577abba4c872ager@chromium.org for (var j = 0; j < 25; j++) { 925c838251403b0be9a882540f1922577abba4c872ager@chromium.org var z = x.substring(i, i + j); 935c838251403b0be9a882540f1922577abba4c872ager@chromium.org var w = Math.random() * 42; // Allocate something new in new-space. 945c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(j, z.length); 955c838251403b0be9a882540f1922577abba4c872ager@chromium.org for (var k = 0; k < j; k++) { 965c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(x.charAt(i+k), z.charAt(k)); 975c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 985c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 995c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 1005c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1015c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1025c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Keep creating strings to to force allocation failure on substring creation. 1035c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar x = "0123456789ABCDEF"; 1045c838251403b0be9a882540f1922577abba4c872ager@chromium.orgx += x; // 2^5 1055c838251403b0be9a882540f1922577abba4c872ager@chromium.orgx += x; 1065c838251403b0be9a882540f1922577abba4c872ager@chromium.orgx += x; 1075c838251403b0be9a882540f1922577abba4c872ager@chromium.orgx += x; 1085c838251403b0be9a882540f1922577abba4c872ager@chromium.orgx += x; 1095c838251403b0be9a882540f1922577abba4c872ager@chromium.orgx += x; // 2^10 1105c838251403b0be9a882540f1922577abba4c872ager@chromium.orgx += x; 1115c838251403b0be9a882540f1922577abba4c872ager@chromium.orgx += x; 1125c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar xl = x.length; 1135c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar cache = []; 1145c838251403b0be9a882540f1922577abba4c872ager@chromium.orgfor (var i = 0; i < 10000; i++) { 1155c838251403b0be9a882540f1922577abba4c872ager@chromium.org var z = x.substring(i % xl); 1165c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(xl - (i % xl), z.length); 1175c838251403b0be9a882540f1922577abba4c872ager@chromium.org cache.push(z); 1185c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 1195c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1205c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1215c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Same with two-byte strings 1225c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar x = "\u2028123456789ABCDEF"; 1235c838251403b0be9a882540f1922577abba4c872ager@chromium.orgx += x; // 2^5 1245c838251403b0be9a882540f1922577abba4c872ager@chromium.orgx += x; 1255c838251403b0be9a882540f1922577abba4c872ager@chromium.orgx += x; 1265c838251403b0be9a882540f1922577abba4c872ager@chromium.orgx += x; 1275c838251403b0be9a882540f1922577abba4c872ager@chromium.orgx += x; 1285c838251403b0be9a882540f1922577abba4c872ager@chromium.orgx += x; // 2^10 1295c838251403b0be9a882540f1922577abba4c872ager@chromium.orgx += x; 1305c838251403b0be9a882540f1922577abba4c872ager@chromium.orgx += x; 1315c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar xl = x.length; 1325c838251403b0be9a882540f1922577abba4c872ager@chromium.orgvar cache = []; 1335c838251403b0be9a882540f1922577abba4c872ager@chromium.orgfor (var i = 0; i < 10000; i++) { 1345c838251403b0be9a882540f1922577abba4c872ager@chromium.org var z = x.substring(i % xl); 1355c838251403b0be9a882540f1922577abba4c872ager@chromium.org assertEquals(xl - (i % xl), z.length); 1365c838251403b0be9a882540f1922577abba4c872ager@chromium.org cache.push(z); 1375c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 1384668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org 1394668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org// Substring of substring. 1404668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.orgvar cache = []; 1414668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.orgvar last = x; 1424668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.orgvar offset = 0; 1434668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.orgfor (var i = 0; i < 64; i++) { 1444668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org var z = last.substring(i); 1454668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org last = z; 1464668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org cache.push(z); 1474668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org offset += i; 1484668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org} 1494668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.orgfor (var i = 63; i >= 0; i--) { 1504668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org var z = cache.pop(); 1514668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org assertTrue(/\u2028123456789ABCDEF/.test(z)); 1524668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org assertEquals(xl - offset, z.length); 1534668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org offset -= i; 1544668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org} 155