// 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. expected = ["A", undefined, "B", "bold", "/", "B", "and", undefined, "CODE", "coded", "/", "CODE", ""]; result = "Aboldandcoded".split(/<(\/)?([^<>]+)>/); assertArrayEquals(expected, result); assertArrayEquals(["a", "b"], "ab".split(/a*?/)); assertArrayEquals(["", "b"], "ab".split(/a*/)); assertArrayEquals(["a"], "ab".split(/a*?/, 1)); assertArrayEquals([""], "ab".split(/a*/, 1)); assertArrayEquals(["as","fas","fas","f"], "asdfasdfasdf".split("d")); assertArrayEquals(["as","fas","fas","f"], "asdfasdfasdf".split("d", -1)); assertArrayEquals(["as", "fas"], "asdfasdfasdf".split("d", 2)); assertArrayEquals([], "asdfasdfasdf".split("d", 0)); assertArrayEquals(["as","fas","fas",""], "asdfasdfasd".split("d")); assertArrayEquals([], "".split("")); assertArrayEquals([""], "".split("a")); assertArrayEquals(["a","b"], "axxb".split(/x*/)); assertArrayEquals(["a","b"], "axxb".split(/x+/)); assertArrayEquals(["a","","b"], "axxb".split(/x/)); // This was http://b/issue?id=1151354 assertArrayEquals(["div", "#id", ".class"], "div#id.class".split(/(?=[#.])/)); assertArrayEquals(["div", "#i", "d", ".class"], "div#id.class".split(/(?=[d#.])/)); assertArrayEquals(["a", "b", "c"], "abc".split(/(?=.)/)); assertArrayEquals(["Wenige", "sind", "auserwählt."], "Wenige sind auserwählt.".split(" ")); assertArrayEquals([], "Wenige sind auserwählt.".split(" ", 0)); assertArrayEquals(["Wenige"], "Wenige sind auserwählt.".split(" ", 1)); assertArrayEquals(["Wenige", "sind"], "Wenige sind auserwählt.".split(" ", 2)); assertArrayEquals(["Wenige", "sind", "auserwählt."], "Wenige sind auserwählt.".split(" ", 3)); assertArrayEquals(["Wenige sind auserw", "hlt."], "Wenige sind auserwählt.".split("ä")); assertArrayEquals(["Wenige sind ", "."], "Wenige sind auserwählt.".split("auserwählt")); /* "ab".split(/((?=.))/) * * KJS: ,a,,b * SM: a,,b, * IE: a,b * Opera: a,,b * V8: a,,b * * Opera seems to have this right. The others make no sense. */ assertArrayEquals(["a", "", "b"], "ab".split(/((?=.))/)); /* "ab".split(/(?=)/) * * KJS: a,b * SM: ab * IE: a,b * Opera: a,bb * V8: a,b */ assertArrayEquals(["a", "b"], "ab".split(/(?=)/)); // For issue http://code.google.com/p/v8/issues/detail?id=924 // Splitting the empty string is a special case. assertEquals([""], ''.split()); assertEquals([""], ''.split(/./)); assertEquals([], ''.split(/.?/)); assertEquals([], ''.split(/.??/)); assertEquals([], ''.split(/()()/)); // Issue http://code.google.com/p/v8/issues/detail?id=929 // (Splitting with empty separator and a limit.) function numberObj(num) { return {valueOf: function() { return num; }}; } assertEquals([], "abc".split("", 0)); assertEquals([], "abc".split("", numberObj(0))); assertEquals(["a"], "abc".split("", 1)); assertEquals(["a"], "abc".split("", numberObj(1))); assertEquals(["a", "b"], "abc".split("", 2)); assertEquals(["a", "b"], "abc".split("", numberObj(2))); assertEquals(["a", "b", "c"], "abc".split("", 3)); assertEquals(["a", "b", "c"], "abc".split("", numberObj(3))); assertEquals(["a", "b", "c"], "abc".split("", 4)); assertEquals(["a", "b", "c"], "abc".split("", numberObj(4))); var all_ascii_codes = []; for (var i = 0; i < 128; i++) all_ascii_codes[i] = i; var all_ascii_string = String.fromCharCode.apply(String, all_ascii_codes); var split_chars = all_ascii_string.split(""); assertEquals(128, split_chars.length); for (var i = 0; i < 128; i++) { assertEquals(1, split_chars[i].length); assertEquals(i, split_chars[i].charCodeAt(0)); } // Check that the separator is converted to string before returning due to // limit == 0. var counter = 0; var separator = { toString: function() { counter++; return "b"; }}; assertEquals([], "abc".split(separator, 0)); assertEquals(1, counter); // Check that the subject is converted to string before the separator. counter = 0; var subject = { toString: function() { assertEquals(0, counter); counter++; return "abc"; }}; separator = { toString: function() { assertEquals(1, counter); counter++; return "b"; }}; assertEquals(["a", "c"], String.prototype.split.call(subject, separator)); assertEquals(2, counter); // Check ToUint32 conversion of limit. assertArrayEquals(["a"], "a,b,c,d,e,f".split(/,/, -4294967295)); assertArrayEquals(["a"], "a,b,c,d,e,f".split(/,/, -4294967294.5)); assertArrayEquals(["a", "b"], "a,b,c,d,e,f".split(/,/, -4294967294)); assertArrayEquals(["a", "b", "c"], "a,b,c,d,e,f".split(/,/, -4294967293)); assertArrayEquals(["a", "b", "c", "d"], "a,b,c,d,e,f".split(/,/, -4294967292)); assertArrayEquals(["a", "b", "c", "d", "e", "f"], "a,b,c,d,e,f".split(/,/, -1));