function testSubstrLatin1() { var s1 = "abcdefghijklmnopqrstuvwxyz12345678900000a"; // Static strings. assertEq(s1.substr(s1.length - 1), "a"); assertEq(s1.substr(s1.length - 2), "0a"); assertEq(s1.substr(26, 3), "123"); // (Fat) inline strings. var s2 = s1.substr(3, 5); assertEq(isLatin1(s2), true); assertEq(s2, "defgh"); s2 = s1.substr(0, 20); assertEq(isLatin1(s2), true); assertEq(s2, "abcdefghijklmnopqrst"); // Dependent string. s2 = s1.substr(1, s1.length - 2); assertEq(isLatin1(s2), true); assertEq(s2.length, 39); assertEq(s2, "bcdefghijklmnopqrstuvwxyz12345678900000"); s2 = s2.substr(2).substr(1); assertEq(isLatin1(s2), true); assertEq(s2, "efghijklmnopqrstuvwxyz12345678900000"); } testSubstrLatin1(); function testSubstrTwoByte() { // Two byte string. var s1 = "abcdefghijklmnopqrstuvwxyz12345678900000a\u1480"; assertEq(isLatin1(s1), false); // Static string. var s2 = s1.substr(28, 1); assertEq(s2, "3"); // Inline string. s2 = s1.substr(3, 5); assertEq(s2, "defgh"); // Dependent string. s2 = s1.substr(2); assertEq(isLatin1(s2), false); assertEq(s2, "cdefghijklmnopqrstuvwxyz12345678900000a\u1480"); s2 = s2.substr(2).substr(1); assertEq(isLatin1(s2), false); assertEq(s2, "fghijklmnopqrstuvwxyz12345678900000a\u1480"); } testSubstrTwoByte(); function testSubstring() { var s1 = "abcdefghijklmnopqrstuvwxyz123456789000ab"; var s2 = s1.substring(1, 8); assertEq(isLatin1(s2), true); assertEq(s2, "bcdefgh"); s2 = s1.substring(0, s1.length - 1); assertEq(isLatin1(s2), true); assertEq(s2, "abcdefghijklmnopqrstuvwxyz123456789000a"); } testSubstring(); function testSlice() { var s1 = "abcdefghijklmnopqrstuvwxyz123456789000ABC"; var s2 = s1.slice(1, 8); assertEq(isLatin1(s2), true); assertEq(s2, "bcdefgh"); s2 = s1.slice(0, -2); assertEq(isLatin1(s2), true); assertEq(s2, "abcdefghijklmnopqrstuvwxyz123456789000A"); } testSlice(); function testUndepend() { // Latin1 var s = "abcdefg".repeat(7); s.indexOf("def"); // flatten assertEq(isLatin1(s), true); var dep = s.substr(7); var res = dep.replace(/abcdef/g, ""); // StrReplaceRegexpRemove undepends. assertEq(res, "gggggg"); // TwoByte var s = "abcdefg\u1200".repeat(6); s.indexOf("def"); // flatten var dep = s.substr(8); var res = dep.replace(/abcdefg/g, ""); // StrReplaceRegexpRemove undepends. assertEq(res, "\u1200\u1200\u1200\u1200\u1200"); } testUndepend();