17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*******************************************************************************
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Copyright (C) 1996-2014, International Business Machines Corporation and
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* others. All Rights Reserved.
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*******************************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*/
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.lang;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.BufferedReader;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.ArrayList;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.List;
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestFmwk;
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestUtil;
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.Utility;
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.lang.UCharacter;
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.lang.UProperty;
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.BreakIterator;
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.RuleBasedBreakIterator;
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.UTF16;
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <p>Testing character casing</p>
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* <p>Mostly following the test cases in strcase.cpp for ICU</p>
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* @author Syn Wee Quek
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* @since march 14 2002
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*/
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic final class UCharacterCaseTest extends TestFmwk
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert{
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // constructor -----------------------------------------------------------
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Constructor
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public UCharacterCaseTest()
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // public methods --------------------------------------------------------
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void main(String[] arg)
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            UCharacterCaseTest test = new UCharacterCaseTest();
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            test.run(arg);
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        catch (Exception e)
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            e.printStackTrace();
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Testing the uppercase and lowercase function of UCharacter
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCharacter()
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < CHARACTER_LOWER_.length; i ++) {
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.isLetter(CHARACTER_LOWER_[i]) &&
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                !UCharacter.isLowerCase(CHARACTER_LOWER_[i])) {
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL isLowerCase test for \\u" +
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      hex(CHARACTER_LOWER_[i]));
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.isLetter(CHARACTER_UPPER_[i]) &&
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                !(UCharacter.isUpperCase(CHARACTER_UPPER_[i]) ||
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  UCharacter.isTitleCase(CHARACTER_UPPER_[i]))) {
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL isUpperCase test for \\u" +
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      hex(CHARACTER_UPPER_[i]));
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (CHARACTER_LOWER_[i] !=
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toLowerCase(CHARACTER_UPPER_[i]) ||
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                (CHARACTER_UPPER_[i] !=
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toUpperCase(CHARACTER_LOWER_[i]) &&
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                CHARACTER_UPPER_[i] !=
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toTitleCase(CHARACTER_LOWER_[i]))) {
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL case conversion test for \\u" +
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      hex(CHARACTER_UPPER_[i]) +
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      " to \\u" + hex(CHARACTER_LOWER_[i]));
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (CHARACTER_LOWER_[i] !=
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toLowerCase(CHARACTER_LOWER_[i])) {
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL lower case conversion test for \\u" +
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      hex(CHARACTER_LOWER_[i]));
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (CHARACTER_UPPER_[i] !=
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toUpperCase(CHARACTER_UPPER_[i]) &&
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                CHARACTER_UPPER_[i] !=
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toTitleCase(CHARACTER_UPPER_[i])) {
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL upper case conversion test for \\u" +
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      hex(CHARACTER_UPPER_[i]));
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok    \\u" + hex(CHARACTER_UPPER_[i]) + " and \\u" +
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  hex(CHARACTER_LOWER_[i]));
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestFolding()
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // test simple case folding
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < FOLDING_SIMPLE_.length; i += 3) {
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.foldCase(FOLDING_SIMPLE_[i], true) !=
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                FOLDING_SIMPLE_[i + 1]) {
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: foldCase(\\u" + hex(FOLDING_SIMPLE_[i]) +
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      ", true) should be \\u" + hex(FOLDING_SIMPLE_[i + 1]));
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.foldCase(FOLDING_SIMPLE_[i],
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    UCharacter.FOLD_CASE_DEFAULT) !=
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                      FOLDING_SIMPLE_[i + 1]) {
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: foldCase(\\u" + hex(FOLDING_SIMPLE_[i]) +
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      ", UCharacter.FOLD_CASE_DEFAULT) should be \\u"
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      + hex(FOLDING_SIMPLE_[i + 1]));
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.foldCase(FOLDING_SIMPLE_[i], false) !=
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                FOLDING_SIMPLE_[i + 2]) {
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: foldCase(\\u" + hex(FOLDING_SIMPLE_[i]) +
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      ", false) should be \\u" + hex(FOLDING_SIMPLE_[i + 2]));
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.foldCase(FOLDING_SIMPLE_[i],
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    UCharacter.FOLD_CASE_EXCLUDE_SPECIAL_I) !=
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    FOLDING_SIMPLE_[i + 2]) {
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: foldCase(\\u" + hex(FOLDING_SIMPLE_[i]) +
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      ", UCharacter.FOLD_CASE_EXCLUDE_SPECIAL_I) should be \\u"
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      + hex(FOLDING_SIMPLE_[i + 2]));
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Test full string case folding with default option and separate
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // buffers
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!FOLDING_DEFAULT_[0].equals(UCharacter.foldCase(FOLDING_MIXED_[0], true))) {
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: foldCase(" + prettify(FOLDING_MIXED_[0]) +
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  ", true)=" + prettify(UCharacter.foldCase(FOLDING_MIXED_[0], true)) +
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  " should be " + prettify(FOLDING_DEFAULT_[0]));
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!FOLDING_DEFAULT_[0].equals(UCharacter.foldCase(FOLDING_MIXED_[0], UCharacter.FOLD_CASE_DEFAULT))) {
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: foldCase(" + prettify(FOLDING_MIXED_[0]) +
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          ", UCharacter.FOLD_CASE_DEFAULT)=" + prettify(UCharacter.foldCase(FOLDING_MIXED_[0], UCharacter.FOLD_CASE_DEFAULT))
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          + " should be " + prettify(FOLDING_DEFAULT_[0]));
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!FOLDING_EXCLUDE_SPECIAL_I_[0].equals(
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            UCharacter.foldCase(FOLDING_MIXED_[0], false))) {
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: foldCase(" + prettify(FOLDING_MIXED_[0]) +
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  ", false)=" + prettify(UCharacter.foldCase(FOLDING_MIXED_[0], false))
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  + " should be " + prettify(FOLDING_EXCLUDE_SPECIAL_I_[0]));
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!FOLDING_EXCLUDE_SPECIAL_I_[0].equals(
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    UCharacter.foldCase(FOLDING_MIXED_[0], UCharacter.FOLD_CASE_EXCLUDE_SPECIAL_I))) {
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: foldCase(" + prettify(FOLDING_MIXED_[0]) +
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  ", UCharacter.FOLD_CASE_EXCLUDE_SPECIAL_I)=" + prettify(UCharacter.foldCase(FOLDING_MIXED_[0], UCharacter.FOLD_CASE_EXCLUDE_SPECIAL_I))
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  + " should be " + prettify(FOLDING_EXCLUDE_SPECIAL_I_[0]));
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!FOLDING_DEFAULT_[1].equals(UCharacter.foldCase(FOLDING_MIXED_[1], true))) {
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           errln("FAIL: foldCase(" + prettify(FOLDING_MIXED_[1]) +
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                 ", true)=" + prettify(UCharacter.foldCase(FOLDING_MIXED_[1], true))
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                 + " should be " + prettify(FOLDING_DEFAULT_[1]));
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!FOLDING_DEFAULT_[1].equals(UCharacter.foldCase(FOLDING_MIXED_[1], UCharacter.FOLD_CASE_DEFAULT))) {
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: foldCase(" + prettify(FOLDING_MIXED_[1]) +
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         ", UCharacter.FOLD_CASE_DEFAULT)=" + prettify(UCharacter.foldCase(FOLDING_MIXED_[1], UCharacter.FOLD_CASE_DEFAULT))
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         + " should be " + prettify(FOLDING_DEFAULT_[1]));
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // alternate handling for dotted I/dotless i (U+0130, U+0131)
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!FOLDING_EXCLUDE_SPECIAL_I_[1].equals(
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        UCharacter.foldCase(FOLDING_MIXED_[1], false))) {
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: foldCase(" + prettify(FOLDING_MIXED_[1]) +
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  ", false)=" + prettify(UCharacter.foldCase(FOLDING_MIXED_[1], false))
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  + " should be " + prettify(FOLDING_EXCLUDE_SPECIAL_I_[1]));
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!FOLDING_EXCLUDE_SPECIAL_I_[1].equals(
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                UCharacter.foldCase(FOLDING_MIXED_[1], UCharacter.FOLD_CASE_EXCLUDE_SPECIAL_I))) {
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: foldCase(" + prettify(FOLDING_MIXED_[1]) +
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  ", UCharacter.FOLD_CASE_EXCLUDE_SPECIAL_I)=" + prettify(UCharacter.foldCase(FOLDING_MIXED_[1], UCharacter.FOLD_CASE_EXCLUDE_SPECIAL_I))
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  + " should be "
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  + prettify(FOLDING_EXCLUDE_SPECIAL_I_[1]));
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Testing the strings case mapping methods
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestUpper()
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // uppercase with root locale and in the same buffer
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!UPPER_ROOT_.equals(UCharacter.toUpperCase(UPPER_BEFORE_))) {
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail " + UPPER_BEFORE_ + " after uppercase should be " +
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  UPPER_ROOT_ + " instead got " +
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  UCharacter.toUpperCase(UPPER_BEFORE_));
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // uppercase with turkish locale and separate buffers
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!UPPER_TURKISH_.equals(UCharacter.toUpperCase(TURKISH_LOCALE_,
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                         UPPER_BEFORE_))) {
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail " + UPPER_BEFORE_ +
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  " after turkish-sensitive uppercase should be " +
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  UPPER_TURKISH_ + " instead of " +
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  UCharacter.toUpperCase(TURKISH_LOCALE_, UPPER_BEFORE_));
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // uppercase a short string with root locale
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!UPPER_MINI_UPPER_.equals(UCharacter.toUpperCase(UPPER_MINI_))) {
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error in toUpper(root locale)=\"" + UPPER_MINI_ +
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\" expected \"" + UPPER_MINI_UPPER_ + "\"");
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!SHARED_UPPERCASE_TOPKAP_.equals(
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       UCharacter.toUpperCase(SHARED_LOWERCASE_TOPKAP_))) {
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("toUpper failed: expected \"" +
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  SHARED_UPPERCASE_TOPKAP_ + "\", got \"" +
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  UCharacter.toUpperCase(SHARED_LOWERCASE_TOPKAP_) + "\".");
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!SHARED_UPPERCASE_TURKISH_.equals(
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  UCharacter.toUpperCase(TURKISH_LOCALE_,
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                         SHARED_LOWERCASE_TOPKAP_))) {
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("toUpper failed: expected \"" +
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  SHARED_UPPERCASE_TURKISH_ + "\", got \"" +
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  UCharacter.toUpperCase(TURKISH_LOCALE_,
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                     SHARED_LOWERCASE_TOPKAP_) + "\".");
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!SHARED_UPPERCASE_GERMAN_.equals(
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toUpperCase(GERMAN_LOCALE_,
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                       SHARED_LOWERCASE_GERMAN_))) {
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("toUpper failed: expected \"" + SHARED_UPPERCASE_GERMAN_
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  + "\", got \"" + UCharacter.toUpperCase(GERMAN_LOCALE_,
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                        SHARED_LOWERCASE_GERMAN_) + "\".");
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!SHARED_UPPERCASE_GREEK_.equals(
2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toUpperCase(SHARED_LOWERCASE_GREEK_))) {
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("toLower failed: expected \"" + SHARED_UPPERCASE_GREEK_ +
2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\", got \"" + UCharacter.toUpperCase(
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                        SHARED_LOWERCASE_GREEK_) + "\".");
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestLower()
2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!LOWER_ROOT_.equals(UCharacter.toLowerCase(LOWER_BEFORE_))) {
2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail " + LOWER_BEFORE_ + " after lowercase should be " +
2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  LOWER_ROOT_ + " instead of " +
2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  UCharacter.toLowerCase(LOWER_BEFORE_));
2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // lowercase with turkish locale
2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!LOWER_TURKISH_.equals(UCharacter.toLowerCase(TURKISH_LOCALE_,
2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                          LOWER_BEFORE_))) {
2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail " + LOWER_BEFORE_ +
2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  " after turkish-sensitive lowercase should be " +
2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  LOWER_TURKISH_ + " instead of " +
2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  UCharacter.toLowerCase(TURKISH_LOCALE_, LOWER_BEFORE_));
2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!SHARED_LOWERCASE_ISTANBUL_.equals(
2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                     UCharacter.toLowerCase(SHARED_UPPERCASE_ISTANBUL_))) {
2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("1. toLower failed: expected \"" +
2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  SHARED_LOWERCASE_ISTANBUL_ + "\", got \"" +
2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              UCharacter.toLowerCase(SHARED_UPPERCASE_ISTANBUL_) + "\".");
2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!SHARED_LOWERCASE_TURKISH_.equals(
2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toLowerCase(TURKISH_LOCALE_,
2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                       SHARED_UPPERCASE_ISTANBUL_))) {
2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("2. toLower failed: expected \"" +
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  SHARED_LOWERCASE_TURKISH_ + "\", got \"" +
2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  UCharacter.toLowerCase(TURKISH_LOCALE_,
2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                SHARED_UPPERCASE_ISTANBUL_) + "\".");
2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!SHARED_LOWERCASE_GREEK_.equals(
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toLowerCase(GREEK_LOCALE_,
2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                       SHARED_UPPERCASE_GREEK_))) {
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("toLower failed: expected \"" + SHARED_LOWERCASE_GREEK_ +
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\", got \"" + UCharacter.toLowerCase(GREEK_LOCALE_,
2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                        SHARED_UPPERCASE_GREEK_) + "\".");
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestTitleRegression() throws java.io.IOException {
2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean isIgnorable = UCharacter.hasBinaryProperty('\'', UProperty.CASE_IGNORABLE);
2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("Case Ignorable check of ASCII apostrophe", isIgnorable);
2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Titlecase check",
2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "The Quick Brown Fox Can't Jump Over The Lazy Dogs.",
3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toTitleCase(ULocale.ENGLISH, "THE QUICK BROWN FOX CAN'T JUMP OVER THE LAZY DOGS.", null));
3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestTitle()
3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         try{
3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < TITLE_DATA_.length;) {
3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String test = TITLE_DATA_[i++];
3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String expected = TITLE_DATA_[i++];
3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale locale = new ULocale(TITLE_DATA_[i++]);
3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int breakType = Integer.parseInt(TITLE_DATA_[i++]);
3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String optionsString = TITLE_DATA_[i++];
3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                BreakIterator iter =
3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    breakType >= 0 ?
3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        BreakIterator.getBreakInstance(locale, breakType) :
3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        breakType == -2 ?
3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            // Open a trivial break iterator that only delivers { 0, length }
3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            // or even just { 0 } as boundaries.
3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            new RuleBasedBreakIterator(".*;") :
3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            null;
3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int options = 0;
3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (optionsString.indexOf('L') >= 0) {
3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    options |= UCharacter.TITLECASE_NO_LOWERCASE;
3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (optionsString.indexOf('A') >= 0) {
3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    options |= UCharacter.TITLECASE_NO_BREAK_ADJUSTMENT;
3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String result = UCharacter.toTitleCase(locale, test, iter, options);
3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!expected.equals(result)) {
3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("titlecasing for " + prettify(test) + " (options " + options + ") should be " +
3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          prettify(expected) + " but got " +
3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          prettify(result));
3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (options == 0) {
3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    result = UCharacter.toTitleCase(locale, test, iter);
3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!expected.equals(result)) {
3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("titlecasing for " + prettify(test) + " should be " +
3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              prettify(expected) + " but got " +
3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              prettify(result));
3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         }catch(Exception ex){
3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            warnln("Could not find data for BreakIterators");
3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         }
3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestDutchTitle() {
3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale LOC_DUTCH = new ULocale("nl");
3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int options = 0;
3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        options |= UCharacter.TITLECASE_NO_LOWERCASE;
3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        BreakIterator iter = BreakIterator.getWordInstance(LOC_DUTCH);
3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Dutch titlecase check in English",
3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "Ijssel Igloo Ijmuiden",
3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toTitleCase(ULocale.ENGLISH, "ijssel igloo IJMUIDEN", null));
3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Dutch titlecase check in Dutch",
3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "IJssel Igloo IJmuiden",
3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toTitleCase(LOC_DUTCH, "ijssel igloo IJMUIDEN", null));
3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Also check the behavior using Java Locale
3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale JAVALOC_DUTCH = new Locale("nl");
3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Dutch titlecase check in English (Java Locale)",
3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "Ijssel Igloo Ijmuiden",
3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toTitleCase(Locale.ENGLISH, "ijssel igloo IJMUIDEN", null));
3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Dutch titlecase check in Dutch (Java Locale)",
3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "IJssel Igloo IJmuiden",
3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toTitleCase(JAVALOC_DUTCH, "ijssel igloo IJMUIDEN", null));
3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        iter.setText("ijssel igloo IjMUIdEN iPoD ijenough");
3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Dutch titlecase check in Dutch with nolowercase option",
3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "IJssel Igloo IJMUIdEN IPoD IJenough",
3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toTitleCase(LOC_DUTCH, "ijssel igloo IjMUIdEN iPoD ijenough", iter, options));
3757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSpecial()
3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
3797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < SPECIAL_LOCALES_.length; i ++) {
3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int    j      = i * 3;
3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Locale locale = SPECIAL_LOCALES_[i];
3827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String str    = SPECIAL_DATA_[j];
3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (locale != null) {
3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!SPECIAL_DATA_[j + 1].equals(
3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                     UCharacter.toLowerCase(locale, str))) {
3867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("error lowercasing special characters " +
3877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        hex(str) + " expected " + hex(SPECIAL_DATA_[j + 1])
3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + " for locale " + locale.toString() + " but got " +
3897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        hex(UCharacter.toLowerCase(locale, str)));
3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
3917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!SPECIAL_DATA_[j + 2].equals(
3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                     UCharacter.toUpperCase(locale, str))) {
3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("error uppercasing special characters " +
3947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        hex(str) + " expected " + SPECIAL_DATA_[j + 2]
3957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + " for locale " + locale.toString() + " but got " +
3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        hex(UCharacter.toUpperCase(locale, str)));
3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
3987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            else {
4007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!SPECIAL_DATA_[j + 1].equals(
4017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                     UCharacter.toLowerCase(str))) {
4027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("error lowercasing special characters " +
4037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        hex(str) + " expected " + SPECIAL_DATA_[j + 1] +
4047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " but got " +
4057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        hex(UCharacter.toLowerCase(locale, str)));
4067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
4077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!SPECIAL_DATA_[j + 2].equals(
4087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                     UCharacter.toUpperCase(locale, str))) {
4097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("error uppercasing special characters " +
4107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        hex(str) + " expected " + SPECIAL_DATA_[j + 2] +
4117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " but got " +
4127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        hex(UCharacter.toUpperCase(locale, str)));
4137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
4147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // turkish & azerbaijani dotless i & dotted I
4187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // remove dot above if there was a capital I before and there are no
4197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // more accents above
4207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!SPECIAL_DOTTED_LOWER_TURKISH_.equals(UCharacter.toLowerCase(
4217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                        TURKISH_LOCALE_, SPECIAL_DOTTED_))) {
4227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error in dots.toLower(tr)=\"" + SPECIAL_DOTTED_ +
4237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\" expected \"" + SPECIAL_DOTTED_LOWER_TURKISH_ +
4247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\" but got " + UCharacter.toLowerCase(TURKISH_LOCALE_,
4257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                         SPECIAL_DOTTED_));
4267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!SPECIAL_DOTTED_LOWER_GERMAN_.equals(UCharacter.toLowerCase(
4287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                             GERMAN_LOCALE_, SPECIAL_DOTTED_))) {
4297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error in dots.toLower(de)=\"" + SPECIAL_DOTTED_ +
4307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\" expected \"" + SPECIAL_DOTTED_LOWER_GERMAN_ +
4317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\" but got " + UCharacter.toLowerCase(GERMAN_LOCALE_,
4327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                         SPECIAL_DOTTED_));
4337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // lithuanian dot above in uppercasing
4367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!SPECIAL_DOT_ABOVE_UPPER_LITHUANIAN_.equals(
4377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             UCharacter.toUpperCase(LITHUANIAN_LOCALE_, SPECIAL_DOT_ABOVE_))) {
4387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error in dots.toUpper(lt)=\"" + SPECIAL_DOT_ABOVE_ +
4397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\" expected \"" + SPECIAL_DOT_ABOVE_UPPER_LITHUANIAN_ +
4407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\" but got " + UCharacter.toUpperCase(LITHUANIAN_LOCALE_,
4417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                         SPECIAL_DOT_ABOVE_));
4427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!SPECIAL_DOT_ABOVE_UPPER_GERMAN_.equals(UCharacter.toUpperCase(
4447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                        GERMAN_LOCALE_, SPECIAL_DOT_ABOVE_))) {
4457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error in dots.toUpper(de)=\"" + SPECIAL_DOT_ABOVE_ +
4467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\" expected \"" + SPECIAL_DOT_ABOVE_UPPER_GERMAN_ +
4477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\" but got " + UCharacter.toUpperCase(GERMAN_LOCALE_,
4487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                         SPECIAL_DOT_ABOVE_));
4497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // lithuanian adds dot above to i in lowercasing if there are more
4527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // above accents
4537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!SPECIAL_DOT_ABOVE_LOWER_LITHUANIAN_.equals(
4547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            UCharacter.toLowerCase(LITHUANIAN_LOCALE_,
4557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                   SPECIAL_DOT_ABOVE_UPPER_))) {
4567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error in dots.toLower(lt)=\"" + SPECIAL_DOT_ABOVE_UPPER_ +
4577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\" expected \"" + SPECIAL_DOT_ABOVE_LOWER_LITHUANIAN_ +
4587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\" but got " + UCharacter.toLowerCase(LITHUANIAN_LOCALE_,
4597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                   SPECIAL_DOT_ABOVE_UPPER_));
4607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!SPECIAL_DOT_ABOVE_LOWER_GERMAN_.equals(
4627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            UCharacter.toLowerCase(GERMAN_LOCALE_,
4637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                   SPECIAL_DOT_ABOVE_UPPER_))) {
4647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error in dots.toLower(de)=\"" + SPECIAL_DOT_ABOVE_UPPER_ +
4657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\" expected \"" + SPECIAL_DOT_ABOVE_LOWER_GERMAN_ +
4667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "\" but got " + UCharacter.toLowerCase(GERMAN_LOCALE_,
4677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                   SPECIAL_DOT_ABOVE_UPPER_));
4687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
4727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Tests for case mapping in the file SpecialCasing.txt
4737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * This method reads in SpecialCasing.txt file for testing purposes.
4747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * A default path is provided relative to the src path, however the user
4757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * could set a system property to change the directory path.<br>
4767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * e.g. java -DUnicodeData="data_dir_path" com.ibm.dev.test.lang.UCharacterTest
4777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
4787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSpecialCasingTxt()
4797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
4807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try
4817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
4827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // reading in the SpecialCasing file
4837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            BufferedReader input = TestUtil.getDataReader(
4847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                  "unicode/SpecialCasing.txt");
4857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            while (true)
4867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
4877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String s = input.readLine();
4887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (s == null) {
4897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
4907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
4917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (s.length() == 0 || s.charAt(0) == '#') {
4927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    continue;
4937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
4947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String chstr[] = getUnicodeStrings(s);
4967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                StringBuffer strbuffer   = new StringBuffer(chstr[0]);
4977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                StringBuffer lowerbuffer = new StringBuffer(chstr[1]);
4987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                StringBuffer upperbuffer = new StringBuffer(chstr[3]);
4997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Locale locale = null;
5007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                for (int i = 4; i < chstr.length; i ++) {
5017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    String condition = chstr[i];
5027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (Character.isLowerCase(chstr[i].charAt(0))) {
5037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // specified locale
5047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        locale = new Locale(chstr[i], "");
5057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
5067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    else if (condition.compareToIgnoreCase("Not_Before_Dot")
5077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                      == 0) {
5087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // turns I into dotless i
5097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
5107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    else if (condition.compareToIgnoreCase(
5117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                      "More_Above") == 0) {
5127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            strbuffer.append((char)0x300);
5137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            lowerbuffer.append((char)0x300);
5147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            upperbuffer.append((char)0x300);
5157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
5167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    else if (condition.compareToIgnoreCase(
5177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                "After_Soft_Dotted") == 0) {
5187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            strbuffer.insert(0, 'i');
5197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            lowerbuffer.insert(0, 'i');
5207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            String lang = "";
5217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            if (locale != null) {
5227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                lang = locale.getLanguage();
5237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
5247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            if (lang.equals("tr") || lang.equals("az")) {
5257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                // this is to be removed when 4.0 data comes out
5267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                // and upperbuffer.insert uncommented
5277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                // see jitterbug 2344
5287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                chstr[i] = "After_I";
5297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                strbuffer.deleteCharAt(0);
5307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                lowerbuffer.deleteCharAt(0);
5317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                i --;
5327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                continue;
5337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                // upperbuffer.insert(0, '\u0130');
5347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
5357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            else {
5367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                upperbuffer.insert(0, 'I');
5377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
5387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
5397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    else if (condition.compareToIgnoreCase(
5407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                      "Final_Sigma") == 0) {
5417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            strbuffer.insert(0, 'c');
5427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            lowerbuffer.insert(0, 'c');
5437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            upperbuffer.insert(0, 'C');
5447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
5457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    else if (condition.compareToIgnoreCase("After_I") == 0) {
5467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            strbuffer.insert(0, 'I');
5477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            lowerbuffer.insert(0, 'i');
5487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            String lang = "";
5497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            if (locale != null) {
5507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                lang = locale.getLanguage();
5517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
5527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            if (lang.equals("tr") || lang.equals("az")) {
5537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                upperbuffer.insert(0, 'I');
5547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
5557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
5567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
5577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                chstr[0] = strbuffer.toString();
5587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                chstr[1] = lowerbuffer.toString();
5597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                chstr[3] = upperbuffer.toString();
5607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (locale == null) {
5617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!UCharacter.toLowerCase(chstr[0]).equals(chstr[1])) {
5627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln(s);
5637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("Fail: toLowerCase for character " +
5647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              Utility.escape(chstr[0]) + ", expected "
5657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              + Utility.escape(chstr[1]) + " but resulted in " +
5667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              Utility.escape(UCharacter.toLowerCase(chstr[0])));
5677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
5687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!UCharacter.toUpperCase(chstr[0]).equals(chstr[3])) {
5697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln(s);
5707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("Fail: toUpperCase for character " +
5717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              Utility.escape(chstr[0]) + ", expected "
5727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              + Utility.escape(chstr[3]) + " but resulted in " +
5737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              Utility.escape(UCharacter.toUpperCase(chstr[0])));
5747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
5757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
5767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                else {
5777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!UCharacter.toLowerCase(locale, chstr[0]).equals(
5787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                                   chstr[1])) {
5797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln(s);
5807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("Fail: toLowerCase for character " +
5817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              Utility.escape(chstr[0]) + ", expected "
5827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              + Utility.escape(chstr[1]) + " but resulted in " +
5837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              Utility.escape(UCharacter.toLowerCase(locale,
5847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                                    chstr[0])));
5857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
5867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!UCharacter.toUpperCase(locale, chstr[0]).equals(
5877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                                   chstr[3])) {
5887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln(s);
5897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("Fail: toUpperCase for character " +
5907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              Utility.escape(chstr[0]) + ", expected "
5917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              + Utility.escape(chstr[3]) + " but resulted in " +
5927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              Utility.escape(UCharacter.toUpperCase(locale,
5937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                                    chstr[0])));
5947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
5957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
5967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            input.close();
5987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        catch (Exception e)
6007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
6017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          e.printStackTrace();
6027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestUpperLower()
6067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
6077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int upper[] = {0x0041, 0x0042, 0x00b2, 0x01c4, 0x01c6, 0x01c9, 0x01c8,
6087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        0x01c9, 0x000c};
6097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int lower[] = {0x0061, 0x0062, 0x00b2, 0x01c6, 0x01c6, 0x01c9, 0x01c9,
6107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        0x01c9, 0x000c};
6117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String upperTest = "abcdefg123hij.?:klmno";
6127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String lowerTest = "ABCDEFG123HIJ.?:KLMNO";
6137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Checks LetterLike Symbols which were previously a source of
6157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // confusion [Bertrand A. D. 02/04/98]
6167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0x2100; i < 0x2138; i ++) {
6177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* Unicode 5.0 adds lowercase U+214E (TURNED SMALL F) to U+2132 (TURNED CAPITAL F) */
6187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (i != 0x2126 && i != 0x212a && i != 0x212b && i!=0x2132) {
6197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (i != UCharacter.toLowerCase(i)) { // itself
6207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Failed case conversion with itself: \\u"
6217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + Utility.hex(i, 4));
6227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
6237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (i != UCharacter.toUpperCase(i)) {
6247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Failed case conversion with itself: \\u"
6257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + Utility.hex(i, 4));
6267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
6277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < upper.length; i ++) {
6307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.toLowerCase(upper[i]) != lower[i]) {
6317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAILED UCharacter.tolower() for \\u"
6327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + Utility.hex(upper[i], 4)
6337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + " Expected \\u" + Utility.hex(lower[i], 4)
6347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + " Got \\u"
6357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + Utility.hex(UCharacter.toLowerCase(upper[i]), 4));
6367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("testing upper lower");
6397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < upperTest.length(); i ++) {
6407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("testing to upper to lower");
6417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.isLetter(upperTest.charAt(i)) &&
6427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                !UCharacter.isLowerCase(upperTest.charAt(i))) {
6437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Failed isLowerCase test at \\u"
6447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + Utility.hex(upperTest.charAt(i), 4));
6457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            else if (UCharacter.isLetter(lowerTest.charAt(i))
6477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                     && !UCharacter.isUpperCase(lowerTest.charAt(i))) {
6487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Failed isUpperCase test at \\u"
6497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      + Utility.hex(lowerTest.charAt(i), 4));
6507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            else if (upperTest.charAt(i)
6527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            != UCharacter.toLowerCase(lowerTest.charAt(i))) {
6537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Failed case conversion from \\u"
6547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + Utility.hex(lowerTest.charAt(i), 4) + " To \\u"
6557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + Utility.hex(upperTest.charAt(i), 4));
6567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            else if (lowerTest.charAt(i)
6587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    != UCharacter.toUpperCase(upperTest.charAt(i))) {
6597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Failed case conversion : \\u"
6607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + Utility.hex(upperTest.charAt(i), 4) + " To \\u"
6617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + Utility.hex(lowerTest.charAt(i), 4));
6627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            else if (upperTest.charAt(i)
6647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    != UCharacter.toLowerCase(upperTest.charAt(i))) {
6657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Failed case conversion with itself: \\u"
6667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + Utility.hex(upperTest.charAt(i)));
6677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            else if (lowerTest.charAt(i)
6697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    != UCharacter.toUpperCase(lowerTest.charAt(i))) {
6707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Failed case conversion with itself: \\u"
6717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + Utility.hex(lowerTest.charAt(i)));
6727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("done testing upper Lower");
6757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // private data members - test data --------------------------------------
6787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final Locale TURKISH_LOCALE_ = new Locale("tr", "TR");
6807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final Locale GERMAN_LOCALE_ = new Locale("de", "DE");
6817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final Locale GREEK_LOCALE_ = new Locale("el", "GR");
6827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final Locale ENGLISH_LOCALE_ = new Locale("en", "US");
6837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final Locale LITHUANIAN_LOCALE_ = new Locale("lt", "LT");
6847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final int CHARACTER_UPPER_[] =
6867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      {0x41, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
6877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       0x00b1, 0x00b2, 0xb3, 0x0048, 0x0049, 0x004a, 0x002e,
6887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       0x003f, 0x003a, 0x004b, 0x004c, 0x4d, 0x004e, 0x004f,
6897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       0x01c4, 0x01c8, 0x000c, 0x0000};
6907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final int CHARACTER_LOWER_[] =
6917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      {0x61, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
6927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       0x00b1, 0x00b2, 0xb3, 0x0068, 0x0069, 0x006a, 0x002e,
6937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       0x003f, 0x003a, 0x006b, 0x006c, 0x6d, 0x006e, 0x006f,
6947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       0x01c6, 0x01c9, 0x000c, 0x0000};
6957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
6977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * CaseFolding.txt says about i and its cousins:
6987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *   0049; C; 0069; # LATIN CAPITAL LETTER I
6997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *   0049; T; 0131; # LATIN CAPITAL LETTER I
7007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
7017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *   0130; F; 0069 0307; # LATIN CAPITAL LETTER I WITH DOT ABOVE
7027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *   0130; T; 0069; # LATIN CAPITAL LETTER I WITH DOT ABOVE
7037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * That's all.
7047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * See CaseFolding.txt and the Unicode Standard for how to apply the case foldings.
7057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
7067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final int FOLDING_SIMPLE_[] = {
7077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // input, default, exclude special i
7087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        0x61,   0x61,  0x61,
7097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        0x49,   0x69,  0x131,
7107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        0x130,  0x130, 0x69,
7117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        0x131,  0x131, 0x131,
7127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        0xdf,   0xdf,  0xdf,
7137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        0xfb03, 0xfb03, 0xfb03,
7147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        0x1040e,0x10436,0x10436,
7157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        0x5ffff,0x5ffff,0x5ffff
7167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
7177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String FOLDING_MIXED_[] =
7187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          {"\u0061\u0042\u0130\u0049\u0131\u03d0\u00df\ufb03\ud93f\udfff",
7197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                           "A\u00df\u00b5\ufb03\uD801\uDC0C\u0130\u0131"};
7207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String FOLDING_DEFAULT_[] =
7217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         {"\u0061\u0062\u0069\u0307\u0069\u0131\u03b2\u0073\u0073\u0066\u0066\u0069\ud93f\udfff",
7227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          "ass\u03bcffi\uD801\uDC34i\u0307\u0131"};
7237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String FOLDING_EXCLUDE_SPECIAL_I_[] =
7247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         {"\u0061\u0062\u0069\u0131\u0131\u03b2\u0073\u0073\u0066\u0066\u0069\ud93f\udfff",
7257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          "ass\u03bcffi\uD801\uDC34i\u0131"};
7267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
7277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * "IESUS CHRISTOS"
7287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
7297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SHARED_UPPERCASE_GREEK_ =
7307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0399\u0395\u03a3\u03a5\u03a3\u0020\u03a7\u03a1\u0399\u03a3\u03a4\u039f\u03a3";
7317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
7327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * "iesus christos"
7337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
7347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SHARED_LOWERCASE_GREEK_ =
7357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u03b9\u03b5\u03c3\u03c5\u03c2\u0020\u03c7\u03c1\u03b9\u03c3\u03c4\u03bf\u03c2";
7367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SHARED_LOWERCASE_TURKISH_ =
7377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0069\u0073\u0074\u0061\u006e\u0062\u0075\u006c\u002c\u0020\u006e\u006f\u0074\u0020\u0063\u006f\u006e\u0073\u0074\u0061\u006e\u0074\u0131\u006e\u006f\u0070\u006c\u0065\u0021";
7387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SHARED_UPPERCASE_TURKISH_ =
7397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0054\u004f\u0050\u004b\u0041\u0050\u0049\u0020\u0050\u0041\u004c\u0041\u0043\u0045\u002c\u0020\u0130\u0053\u0054\u0041\u004e\u0042\u0055\u004c";
7407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SHARED_UPPERCASE_ISTANBUL_ =
7417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                          "\u0130STANBUL, NOT CONSTANTINOPLE!";
7427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SHARED_LOWERCASE_ISTANBUL_ =
7437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                          "i\u0307stanbul, not constantinople!";
7447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SHARED_LOWERCASE_TOPKAP_ =
7457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                          "topkap\u0131 palace, istanbul";
7467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SHARED_UPPERCASE_TOPKAP_ =
7477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                          "TOPKAPI PALACE, ISTANBUL";
7487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SHARED_LOWERCASE_GERMAN_ =
7497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                          "S\u00FC\u00DFmayrstra\u00DFe";
7507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SHARED_UPPERCASE_GERMAN_ =
7517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                          "S\u00DCSSMAYRSTRASSE";
7527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String UPPER_BEFORE_ =
7547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         "\u0061\u0042\u0069\u03c2\u00df\u03c3\u002f\ufb03\ufb03\ufb03\ud93f\udfff";
7557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String UPPER_ROOT_ =
7567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         "\u0041\u0042\u0049\u03a3\u0053\u0053\u03a3\u002f\u0046\u0046\u0049\u0046\u0046\u0049\u0046\u0046\u0049\ud93f\udfff";
7577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String UPPER_TURKISH_ =
7587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         "\u0041\u0042\u0130\u03a3\u0053\u0053\u03a3\u002f\u0046\u0046\u0049\u0046\u0046\u0049\u0046\u0046\u0049\ud93f\udfff";
7597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String UPPER_MINI_ = "\u00df\u0061";
7607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String UPPER_MINI_UPPER_ = "\u0053\u0053\u0041";
7617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String LOWER_BEFORE_ =
7637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      "\u0061\u0042\u0049\u03a3\u00df\u03a3\u002f\ud93f\udfff";
7647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String LOWER_ROOT_ =
7657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      "\u0061\u0062\u0069\u03c3\u00df\u03c2\u002f\ud93f\udfff";
7667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String LOWER_TURKISH_ =
7677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      "\u0061\u0062\u0131\u03c3\u00df\u03c2\u002f\ud93f\udfff";
7687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
7707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * each item is an array with input string, result string, locale ID, break iterator, options
7717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * the break iterator is specified as an int, same as in BreakIterator.KIND_*:
7727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * 0=KIND_CHARACTER  1=KIND_WORD  2=KIND_LINE  3=KIND_SENTENCE  4=KIND_TITLE  -1=default (NULL=words)  -2=no breaks (.*)
7737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * options: T=U_FOLD_CASE_EXCLUDE_SPECIAL_I  L=U_TITLECASE_NO_LOWERCASE  A=U_TITLECASE_NO_BREAK_ADJUSTMENT
7747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * see ICU4C source/test/testdata/casing.txt
7757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
7767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String TITLE_DATA_[] = {
7777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0061\u0042\u0020\u0069\u03c2\u0020\u00df\u03c3\u002f\ufb03\ud93f\udfff",
7787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0041\u0042\u0020\u0049\u03a3\u0020\u0053\u0073\u03a3\u002f\u0046\u0066\u0069\ud93f\udfff",
7797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
7807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "0",
7817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
7827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0061\u0042\u0020\u0069\u03c2\u0020\u00df\u03c3\u002f\ufb03\ud93f\udfff",
7847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u0041\u0062\u0020\u0049\u03c2\u0020\u0053\u0073\u03c3\u002f\u0046\u0066\u0069\ud93f\udfff",
7857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
7867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "1",
7877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
7887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u02bbaMeLikA huI P\u016b \u02bb\u02bb\u02bbiA", "\u02bbAmelika Hui P\u016b \u02bb\u02bb\u02bbIa", // titlecase first _cased_ letter, j4933
7907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
7917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "-1",
7927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
7937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        " tHe QUIcK bRoWn", " The Quick Brown",
7957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
7967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "4",
7977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
7987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u01c4\u01c5\u01c6\u01c7\u01c8\u01c9\u01ca\u01cb\u01cc",
8007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u01c5\u01c5\u01c5\u01c8\u01c8\u01c8\u01cb\u01cb\u01cb", // UBRK_CHARACTER
8017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
8027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "0",
8037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
8047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u01c9ubav ljubav", "\u01c8ubav Ljubav", // Lj vs. L+j
8067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
8077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "-1",
8087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
8097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "'oH dOn'T tItLeCaSe AfTeR lEtTeR+'",  "'Oh Don't Titlecase After Letter+'",
8117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
8127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "-1",
8137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
8147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "a \u02bbCaT. A \u02bbdOg! \u02bbeTc.",
8167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "A \u02bbCat. A \u02bbDog! \u02bbEtc.",
8177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
8187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "-1",
8197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "", // default
8207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "a \u02bbCaT. A \u02bbdOg! \u02bbeTc.",
8227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "A \u02bbcat. A \u02bbdog! \u02bbetc.",
8237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
8247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "-1",
8257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "A", // U_TITLECASE_NO_BREAK_ADJUSTMENT
8267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "a \u02bbCaT. A \u02bbdOg! \u02bbeTc.",
8287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "A \u02bbCaT. A \u02bbdOg! \u02bbETc.",
8297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
8307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "3",
8317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "L", // UBRK_SENTENCE and U_TITLECASE_NO_LOWERCASE
8327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u02bbcAt! \u02bbeTc.",
8357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u02bbCat! \u02bbetc.",
8367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
8377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "-2",
8387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "", // -2=Trivial break iterator
8397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u02bbcAt! \u02bbeTc.",
8417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u02bbcat! \u02bbetc.",
8427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
8437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "-2",
8447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "A", // U_TITLECASE_NO_BREAK_ADJUSTMENT
8457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u02bbcAt! \u02bbeTc.",
8477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u02bbCAt! \u02bbeTc.",
8487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
8497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "-2",
8507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "L", // U_TITLECASE_NO_LOWERCASE
8517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u02bbcAt! \u02bbeTc.",
8537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "\u02bbcAt! \u02bbeTc.",
8547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
8557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "-2",
8567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "AL", // Both options
8577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Test case for ticket #7251: UCharacter.toTitleCase() throws OutOfMemoryError
8597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // when TITLECASE_NO_LOWERCASE encounters a single-letter word
8607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "a b c",
8617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "A B C",
8627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "",
8637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "1",
8647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "L" // U_TITLECASE_NO_LOWERCASE
8657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
8667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
8697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <p>basic string, lower string, upper string, title string</p>
8707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
8717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SPECIAL_DATA_[] = {
8727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UTF16.valueOf(0x1043C) + UTF16.valueOf(0x10414),
8737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UTF16.valueOf(0x1043C) + UTF16.valueOf(0x1043C),
8747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UTF16.valueOf(0x10414) + UTF16.valueOf(0x10414),
8757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "ab'cD \uFB00i\u0131I\u0130 \u01C7\u01C8\u01C9 " +
8767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         UTF16.valueOf(0x1043C) + UTF16.valueOf(0x10414),
8777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "ab'cd \uFB00i\u0131ii\u0307 \u01C9\u01C9\u01C9 " +
8787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              UTF16.valueOf(0x1043C) + UTF16.valueOf(0x1043C),
8797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "AB'CD FFIII\u0130 \u01C7\u01C7\u01C7 " +
8807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              UTF16.valueOf(0x10414) + UTF16.valueOf(0x10414),
8817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // sigmas followed/preceded by cased letters
8827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "i\u0307\u03a3\u0308j \u0307\u03a3\u0308j i\u00ad\u03a3\u0308 \u0307\u03a3\u0308 ",
8837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "i\u0307\u03c3\u0308j \u0307\u03c3\u0308j i\u00ad\u03c2\u0308 \u0307\u03c3\u0308 ",
8847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        "I\u0307\u03a3\u0308J \u0307\u03a3\u0308J I\u00ad\u03a3\u0308 \u0307\u03a3\u0308 "
8857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
8867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final Locale SPECIAL_LOCALES_[] = {
8877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        null,
8887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ENGLISH_LOCALE_,
8897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        null,
8907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
8917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SPECIAL_DOTTED_ =
8937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "I \u0130 I\u0307 I\u0327\u0307 I\u0301\u0307 I\u0327\u0307\u0301";
8947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SPECIAL_DOTTED_LOWER_TURKISH_ =
8957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "\u0131 i i i\u0327 \u0131\u0301\u0307 i\u0327\u0301";
8967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SPECIAL_DOTTED_LOWER_GERMAN_ =
8977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "i i\u0307 i\u0307 i\u0327\u0307 i\u0301\u0307 i\u0327\u0307\u0301";
8987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SPECIAL_DOT_ABOVE_ =
8997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "a\u0307 \u0307 i\u0307 j\u0327\u0307 j\u0301\u0307";
9007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SPECIAL_DOT_ABOVE_UPPER_LITHUANIAN_ =
9017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "A\u0307 \u0307 I J\u0327 J\u0301\u0307";
9027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SPECIAL_DOT_ABOVE_UPPER_GERMAN_ =
9037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "A\u0307 \u0307 I\u0307 J\u0327\u0307 J\u0301\u0307";
9047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SPECIAL_DOT_ABOVE_UPPER_ =
9057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "I I\u0301 J J\u0301 \u012e \u012e\u0301 \u00cc\u00cd\u0128";
9067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SPECIAL_DOT_ABOVE_LOWER_LITHUANIAN_ =
9077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "i i\u0307\u0301 j j\u0307\u0301 \u012f \u012f\u0307\u0301 i\u0307\u0300i\u0307\u0301i\u0307\u0303";
9087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String SPECIAL_DOT_ABOVE_LOWER_GERMAN_ =
9097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "i i\u0301 j j\u0301 \u012f \u012f\u0301 \u00ec\u00ed\u0129";
9107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // private methods -------------------------------------------------------
9127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
9147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Converting the hex numbers represented betwee                             n ';' to Unicode strings
9157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param str string to break up into Unicode strings
9167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return array of Unicode strings ending with a null
9177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
9187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private String[] getUnicodeStrings(String str)
9197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
9207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        List<String> v = new ArrayList<String>(10);
9217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int start = 0;
9227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int casecount = 4; casecount > 0; casecount --) {
9237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int end = str.indexOf("; ", start);
9247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String casestr = str.substring(start, end);
9257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringBuffer buffer = new StringBuffer();
9267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int spaceoffset = 0;
9277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            while (spaceoffset < casestr.length()) {
9287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int nextspace = casestr.indexOf(' ', spaceoffset);
9297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (nextspace == -1) {
9307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    nextspace = casestr.length();
9317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
9327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                buffer.append((char)Integer.parseInt(
9337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                     casestr.substring(spaceoffset, nextspace),
9347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                      16));
9357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                spaceoffset = nextspace + 1;
9367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            start = end + 2;
9387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            v.add(buffer.toString());
9397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int comments = str.indexOf(" #", start);
9417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (comments != -1 && comments != start) {
9427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (str.charAt(comments - 1) == ';') {
9437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                comments --;
9447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String conditions = str.substring(start, comments);
9467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int offset = 0;
9477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            while (offset < conditions.length()) {
9487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int spaceoffset = conditions.indexOf(' ', offset);
9497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (spaceoffset == -1) {
9507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    spaceoffset = conditions.length();
9517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
9527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                v.add(conditions.substring(offset, spaceoffset));
9537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                offset = spaceoffset + 1;
9547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int size = v.size();
9577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String result[] = new String[size];
9587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < size; i ++) {
9597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result[i] = v.get(i);
9607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return result;
9627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
964