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