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