17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/** 27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2004-2008, International Business Machines Corporation and * 47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved. * 57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.lang; 97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestFmwk; 117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.Utility; 127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.lang.UCharacter; 137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.UTF16; 147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/** 167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Test JDK 1.5 cover APIs. 177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic final class UCharacterSurrogateTest extends TestFmwk { 197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static void main(String[] args) { 217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert new UCharacterSurrogateTest().run(args); 227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestUnicodeBlockForName() { 257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String[] names = {"Latin-1 Supplement", 267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "Optical Character Recognition", 277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "CJK Unified Ideographs Extension A", 287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "Supplemental Arrows-B", 297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "Supplemental arrows b", 307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "supp-lement-al arrowsb", 317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "Supplementary Private Use Area-B", 327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "supplementary_Private_Use_Area-b", 337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "supplementary_PRIVATE_Use_Area_b"}; 347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < names.length; ++i) { 357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.UnicodeBlock b = UCharacter.UnicodeBlock 377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert .forName(names[i]); 387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("found: " + b + " for name: " + names[i]); 397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Exception e) { 407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("could not find block for name: " + names[i]); 417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestIsValidCodePoint() { 477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter.isValidCodePoint(-1)) 487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("-1"); 497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!UCharacter.isValidCodePoint(0)) 507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0"); 517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!UCharacter.isValidCodePoint(UCharacter.MAX_CODE_POINT)) 527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0x10ffff"); 537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter.isValidCodePoint(UCharacter.MAX_CODE_POINT + 1)) 547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0x110000"); 557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestIsSupplementaryCodePoint() { 587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter.isSupplementaryCodePoint(-1)) 597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("-1"); 607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter.isSupplementaryCodePoint(0)) 617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0"); 627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter 637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert .isSupplementaryCodePoint(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT - 1)) 647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0xffff"); 657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!UCharacter 667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert .isSupplementaryCodePoint(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT)) 677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0x10000"); 687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!UCharacter.isSupplementaryCodePoint(UCharacter.MAX_CODE_POINT)) 697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0x10ffff"); 707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter.isSupplementaryCodePoint(UCharacter.MAX_CODE_POINT + 1)) 717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0x110000"); 727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestIsHighSurrogate() { 757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter 767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert .isHighSurrogate((char) (UCharacter.MIN_HIGH_SURROGATE - 1))) 777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0xd7ff"); 787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!UCharacter.isHighSurrogate(UCharacter.MIN_HIGH_SURROGATE)) 797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0xd800"); 807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!UCharacter.isHighSurrogate(UCharacter.MAX_HIGH_SURROGATE)) 817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0xdbff"); 827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter 837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert .isHighSurrogate((char) (UCharacter.MAX_HIGH_SURROGATE + 1))) 847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0xdc00"); 857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestIsLowSurrogate() { 887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter 897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert .isLowSurrogate((char) (UCharacter.MIN_LOW_SURROGATE - 1))) 907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0xdbff"); 917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!UCharacter.isLowSurrogate(UCharacter.MIN_LOW_SURROGATE)) 927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0xdc00"); 937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!UCharacter.isLowSurrogate(UCharacter.MAX_LOW_SURROGATE)) 947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0xdfff"); 957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter 967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert .isLowSurrogate((char) (UCharacter.MAX_LOW_SURROGATE + 1))) 977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0xe000"); 987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestIsSurrogatePair() { 1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter.isSurrogatePair( 1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (char) (UCharacter.MIN_HIGH_SURROGATE - 1), 1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.MIN_LOW_SURROGATE)) 1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0xd7ff,0xdc00"); 1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter.isSurrogatePair( 1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (char) (UCharacter.MAX_HIGH_SURROGATE + 1), 1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.MIN_LOW_SURROGATE)) 1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0xd800,0xdc00"); 1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter.isSurrogatePair(UCharacter.MIN_HIGH_SURROGATE, 1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (char) (UCharacter.MIN_LOW_SURROGATE - 1))) 1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0xd800,0xdbff"); 1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter.isSurrogatePair(UCharacter.MIN_HIGH_SURROGATE, 1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (char) (UCharacter.MAX_LOW_SURROGATE + 1))) 1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0xd800,0xe000"); 1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!UCharacter.isSurrogatePair(UCharacter.MIN_HIGH_SURROGATE, 1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.MIN_LOW_SURROGATE)) 1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0xd800,0xdc00"); 1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCharCount() { 1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.charCount(-1); 1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.charCount(UCharacter.MAX_CODE_POINT + 1); 1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter.charCount(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT - 1) != 1) 1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0xffff"); 1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter.charCount(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT) != 2) 1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("0x010000"); 1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestToCodePoint() { 1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final char[] pairs = {(char) (UCharacter.MIN_HIGH_SURROGATE + 0), 1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (char) (UCharacter.MIN_LOW_SURROGATE + 0), 1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (char) (UCharacter.MIN_HIGH_SURROGATE + 1), 1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (char) (UCharacter.MIN_LOW_SURROGATE + 1), 1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (char) (UCharacter.MIN_HIGH_SURROGATE + 2), 1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (char) (UCharacter.MIN_LOW_SURROGATE + 2), 1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (char) (UCharacter.MAX_HIGH_SURROGATE - 2), 1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (char) (UCharacter.MAX_LOW_SURROGATE - 2), 1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (char) (UCharacter.MAX_HIGH_SURROGATE - 1), 1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (char) (UCharacter.MAX_LOW_SURROGATE - 1), 1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (char) (UCharacter.MAX_HIGH_SURROGATE - 0), 1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (char) (UCharacter.MAX_LOW_SURROGATE - 0),}; 1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < pairs.length; i += 2) { 1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int cp = UCharacter.toCodePoint(pairs[i], pairs[i + 1]); 1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (pairs[i] != UTF16.getLeadSurrogate(cp) 1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert || pairs[i + 1] != UTF16.getTrailSurrogate(cp)) { 1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(Integer.toHexString(pairs[i]) + ", " + pairs[i + 1]); 1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert break; 1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCodePointAtBefore() { 1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = "" + UCharacter.MIN_HIGH_SURROGATE + // isolated high 1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.MIN_HIGH_SURROGATE + // pair 1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.MIN_LOW_SURROGATE + UCharacter.MIN_LOW_SURROGATE; // isolated 1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // low 1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char[] c = s.toCharArray(); 1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int[] avalues = { 1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.MIN_HIGH_SURROGATE, 1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.toCodePoint(UCharacter.MIN_HIGH_SURROGATE, 1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.MIN_LOW_SURROGATE), 1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.MIN_LOW_SURROGATE, UCharacter.MIN_LOW_SURROGATE}; 1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int[] bvalues = { 1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.MIN_HIGH_SURROGATE, 1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.MIN_HIGH_SURROGATE, 1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.toCodePoint(UCharacter.MIN_HIGH_SURROGATE, 1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.MIN_LOW_SURROGATE), 1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.MIN_LOW_SURROGATE,}; 1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer b = new StringBuffer(s); 1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < avalues.length; ++i) { 1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter.codePointAt(s, i) != avalues[i]) 1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("string at: " + i); 1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter.codePointAt(c, i) != avalues[i]) 1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("chars at: " + i); 1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter.codePointAt(b, i) != avalues[i]) 1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("stringbuffer at: " + i); 1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter.codePointBefore(s, i + 1) != bvalues[i]) 1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("string before: " + i); 1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter.codePointBefore(c, i + 1) != bvalues[i]) 1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("chars before: " + i); 1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter.codePointBefore(b, i + 1) != bvalues[i]) 1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("stringbuffer before: " + i); 1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert //cover codePointAtBefore with limit 1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln("Testing codePointAtBefore with limit ..."); 1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int i = 0; i < avalues.length; ++i) { 1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter.codePointAt(c, i, 4) != avalues[i]) 1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("chars at: " + i); 1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (UCharacter.codePointBefore(c, i + 1, 0) != bvalues[i]) 1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("chars before: " + i); 1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestToChars() { 1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char[] chars = new char[3]; 2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int cp = UCharacter.toCodePoint(UCharacter.MIN_HIGH_SURROGATE, 2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.MIN_LOW_SURROGATE); 2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.toChars(cp, chars, 1); 2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (chars[1] != UCharacter.MIN_HIGH_SURROGATE 2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert || chars[2] != UCharacter.MIN_LOW_SURROGATE) { 2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("fail"); 2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert chars = UCharacter.toChars(cp); 2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (chars[0] != UCharacter.MIN_HIGH_SURROGATE 2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert || chars[1] != UCharacter.MIN_LOW_SURROGATE) { 2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("fail"); 2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestCodePointCount() { 2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class Test { 2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String str(String s, int start, int limit) { 2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(s==null){ 2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s=""; 2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return "codePointCount('" + Utility.escape(s) + "' " + start 2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ", " + limit + ")"; 2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert void test(String s, int start, int limit, int expected) { 2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int val1 = UCharacter.codePointCount(s.toCharArray(), start, 2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert limit); 2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int val2 = UCharacter.codePointCount(s, start, limit); 2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (val1 != expected) { 2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("char[] " + str(s, start, limit) + "(" + val1 2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ") != " + expected); 2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (val2 != expected) { 2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("String " + str(s, start, limit) + "(" + val2 2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ") != " + expected); 2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (isVerbose()) { 2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(str(s, start, limit) + " == " + expected); 2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert void fail(String s, int start, int limit, Class exc) { 2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.codePointCount(s, start, limit); 2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("unexpected success " + str(s, start, limit)); 2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Throwable e) { 2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!exc.isInstance(e)) { 2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert warnln("bad exception " + str(s, start, limit) 2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + e.getClass().getName()); 2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Test test = new Test(); 2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.fail(null, 0, 1, NullPointerException.class); 2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.fail("a", -1, 0, IndexOutOfBoundsException.class); 2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.fail("a", 1, 2, IndexOutOfBoundsException.class); 2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.fail("a", 1, 0, IndexOutOfBoundsException.class); 2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test("", 0, 0, 0); 2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test("\ud800", 0, 1, 1); 2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test("\udc00", 0, 1, 1); 2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test("\ud800\udc00", 0, 1, 1); 2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test("\ud800\udc00", 1, 2, 1); 2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test("\ud800\udc00", 0, 2, 1); 2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test("\udc00\ud800", 0, 1, 1); 2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test("\udc00\ud800", 1, 2, 1); 2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test("\udc00\ud800", 0, 2, 2); 2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test("\ud800\ud800\udc00", 0, 2, 2); 2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test("\ud800\ud800\udc00", 1, 3, 1); 2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test("\ud800\ud800\udc00", 0, 3, 2); 2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test("\ud800\udc00\udc00", 0, 2, 1); 2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test("\ud800\udc00\udc00", 1, 3, 2); 2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test("\ud800\udc00\udc00", 0, 3, 2); 2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestOffsetByCodePoints() { 2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert class Test { 2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String str(String s, int start, int count, int index, int offset) { 2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return "offsetByCodePoints('" + Utility.escape(s) + "' " 2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + start + ", " + count + ", " + index + ", " + offset 2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + ")"; 2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert void test(String s, int start, int count, int index, int offset, 2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int expected, boolean flip) { 2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char[] chars = s.toCharArray(); 2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String string = s.substring(start, start + count); 2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int val1 = UCharacter.offsetByCodePoints(chars, start, count, 2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert index, offset); 2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int val2 = UCharacter.offsetByCodePoints(string, index - start, 2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert offset) 2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + start; 2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (val1 != expected) { 2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("char[] " + str(s, start, count, index, offset) + "(" 2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + val1 + ") != " + expected); 2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (val2 != expected) { 2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("String " + str(s, start, count, index, offset) + "(" 3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + val2 + ") != " + expected); 3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (isVerbose()) { 3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(str(s, start, count, index, offset) + " == " 3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + expected); 3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (flip) { 3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert val1 = UCharacter.offsetByCodePoints(chars, start, count, 3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert expected, -offset); 3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert val2 = UCharacter.offsetByCodePoints(string, expected 3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert - start, -offset) 3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + start; 3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (val1 != index) { 3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("char[] " 3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + str(s, start, count, expected, -offset) + "(" 3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + val1 + ") != " + index); 3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (val2 != index) { 3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("String " 3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + str(s, start, count, expected, -offset) + "(" 3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + val2 + ") != " + index); 3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (isVerbose()) { 3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(str(s, start, count, expected, -offset) + " == " 3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + index); 3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert void fail(char[] text, int start, int count, int index, int offset, 3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Class exc) { 3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.offsetByCodePoints(text, start, count, index, 3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert offset); 3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("unexpected success " 3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + str(new String(text), start, count, index, offset)); 3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Throwable e) { 3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!exc.isInstance(e)) { 3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("bad exception " 3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + str(new String(text), start, count, index, 3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert offset) + e.getClass().getName()); 3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert void fail(String text, int index, int offset, Class exc) { 3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UCharacter.offsetByCodePoints(text, index, offset); 3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("unexpected success " 3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + str(text, index, offset, 0, text.length())); 3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Throwable e) { 3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (!exc.isInstance(e)) { 3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("bad exception " 3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + str(text, 0, text.length(), index, offset) 3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert + e.getClass().getName()); 3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Test test = new Test(); 3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test("\ud800\ud800\udc00", 0, 2, 0, 1, 1, true); 3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.fail((char[]) null, 0, 1, 0, 1, NullPointerException.class); 3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.fail((String) null, 0, 1, NullPointerException.class); 3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.fail("abc", -1, 0, IndexOutOfBoundsException.class); 3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.fail("abc", 4, 0, IndexOutOfBoundsException.class); 3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.fail("abc", 1, -2, IndexOutOfBoundsException.class); 3677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.fail("abc", 2, 2, IndexOutOfBoundsException.class); 3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert char[] abc = "abc".toCharArray(); 3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.fail(abc, -1, 2, 0, 0, IndexOutOfBoundsException.class); 3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.fail(abc, 2, 2, 3, 0, IndexOutOfBoundsException.class); 3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.fail(abc, 1, -1, 0, 0, IndexOutOfBoundsException.class); 3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.fail(abc, 1, 1, 2, -2, IndexOutOfBoundsException.class); 3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.fail(abc, 1, 1, 1, 2, IndexOutOfBoundsException.class); 3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.fail(abc, 1, 2, 1, 3, IndexOutOfBoundsException.class); 3757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.fail(abc, 0, 2, 2, -3, IndexOutOfBoundsException.class); 3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test("", 0, 0, 0, 0, 0, false); 3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test("\ud800", 0, 1, 0, 1, 1, true); 3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test("\udc00", 0, 1, 0, 1, 1, true); 3797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s = "\ud800\udc00"; 3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 1, 0, 1, 1, true); 3827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 2, 0, 1, 2, true); 3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 2, 1, 1, 2, false); 3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 1, 1, 1, 1, 2, true); 3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = "\udc00\ud800"; 3877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 1, 0, 1, 1, true); 3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 2, 0, 1, 1, true); 3897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 2, 0, 2, 2, true); 3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 2, 1, 1, 2, true); 3917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 1, 1, 1, 1, 2, true); 3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = "\ud800\ud800\udc00"; 3947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 1, 0, 1, 1, true); 3957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 2, 0, 1, 1, true); 3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 2, 0, 2, 2, true); 3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 2, 1, 1, 2, true); 3987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 3, 0, 1, 1, true); 3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 3, 0, 2, 3, true); 4007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 3, 1, 1, 3, true); 4017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 3, 2, 1, 3, false); 4027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 1, 1, 1, 1, 2, true); 4037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 1, 2, 1, 1, 3, true); 4047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 1, 2, 2, 1, 3, false); 4057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 2, 1, 2, 1, 3, true); 4067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = "\ud800\udc00\udc00"; 4087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 1, 0, 1, 1, true); 4097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 2, 0, 1, 2, true); 4107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 2, 1, 1, 2, false); 4117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 3, 0, 1, 2, true); 4127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 3, 0, 2, 3, true); 4137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 3, 1, 1, 2, false); 4147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 3, 1, 2, 3, false); 4157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 0, 3, 2, 1, 3, true); 4167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 1, 1, 1, 1, 2, true); 4177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 1, 2, 1, 1, 2, true); 4187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 1, 2, 1, 2, 3, true); 4197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 1, 2, 2, 1, 3, true); 4207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert test.test(s, 2, 1, 2, 1, 3, true); 4217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert} 423