17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
2aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert *******************************************************************************
3aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert * Copyright (C) 1996-2015, International Business Machines Corporation and
4aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert * others. All Rights Reserved.
5aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert *******************************************************************************
6aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert */
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.lang;
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.BufferedReader;
11aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubertimport java.io.IOException;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Arrays;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestFmwk;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestUtil;
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.Norm2AllModes;
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.Normalizer2Impl;
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.PatternProps;
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.UCharacterName;
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.Utility;
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.lang.UCharacter;
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.lang.UCharacterCategory;
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.lang.UCharacterDirection;
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.lang.UCharacterEnums;
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.lang.UProperty;
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.lang.UScript;
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.Normalizer2;
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.UTF16;
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.UnicodeSet;
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.UnicodeSetIterator;
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.RangeValueIterator;
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ValueIterator;
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.VersionInfo;
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Testing class for UCharacter
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Mostly following the test cases for ICU
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* @author Syn Wee Quek
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* @since nov 04 2000
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*/
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic final class UCharacterTest extends TestFmwk
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert{
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // private variables =============================================
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
48bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     * Expected Unicode version.
49bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert     */
50bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    private final VersionInfo VERSION_ = VersionInfo.getInstance(8);
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // constructor ===================================================
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * Constructor
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public UCharacterTest()
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // public methods ================================================
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void main(String[] arg)
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            UCharacterTest test = new UCharacterTest();
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            test.run(arg);
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        catch (Exception e)
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        e.printStackTrace();
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * Testing the letter and number determination in UCharacter
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestLetterNumber()
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0x0041; i < 0x005B; i ++)
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!UCharacter.isLetter(i))
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL \\u" + hex(i) + " expected to be a letter");
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0x0660; i < 0x066A; i ++)
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (UCharacter.isLetter(i))
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL \\u" + hex(i) + " expected not to be a letter");
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0x0660; i < 0x066A; i ++)
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!UCharacter.isDigit(i))
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL \\u" + hex(i) + " expected to be a digit");
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0x0041; i < 0x005B; i ++)
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!UCharacter.isLetterOrDigit(i))
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(i) + " expected not to be a digit");
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0x0660; i < 0x066A; i ++)
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!UCharacter.isLetterOrDigit(i))
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(i) +
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "expected to be either a letter or a digit");
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * The following checks work only starting from Unicode 4.0.
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Check the version number here.
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        VersionInfo version =    UCharacter.getUnicodeVersion();
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(version.getMajor()<4 || version.equals(VersionInfo.getInstance(4, 0, 1))) {
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Sanity check:
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Verify that exactly the digit characters have decimal digit values.
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * This assumption is used in the implementation of u_digit()
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * (which checks nt=de)
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * compared with the parallel java.lang.Character.digit()
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * (which checks Nd).
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         *
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * This was not true in Unicode 3.2 and earlier.
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Unicode 4.0 fixed discrepancies.
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * Unicode 4.0.1 re-introduced problems in this area due to an
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * unintentionally incomplete last-minute change.
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String digitsPattern = "[:Nd:]";
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String decimalValuesPattern = "[:Numeric_Type=Decimal:]";
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UnicodeSet digits, decimalValues;
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        digits= new UnicodeSet(digitsPattern);
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        decimalValues=new UnicodeSet(decimalValuesPattern);
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        compareUSets(digits, decimalValues, "[:Nd:]", "[:Numeric_Type=Decimal:]", true);
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * Tests for space determination in UCharacter
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSpaces()
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int spaces[] = {0x0020, 0x00a0, 0x2000, 0x2001, 0x2005};
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int nonspaces[] = {0x0061, 0x0062, 0x0063, 0x0064, 0x0074};
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int whitespaces[] = {0x2008, 0x2009, 0x200a, 0x001c, 0x000c /* ,0x200b */}; // 0x200b was "Zs" in Unicode 4.0, but it is "Cf" in Unicode 4.1
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int nonwhitespaces[] = {0x0061, 0x0062, 0x003c, 0x0028, 0x003f, 0x00a0, 0x2007, 0x202f, 0xfefe, 0x200b};
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int size = spaces.length;
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < size; i ++)
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!UCharacter.isSpaceChar(spaces[i]))
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(spaces[i]) +
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    " expected to be a space character");
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.isSpaceChar(nonspaces[i]))
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(nonspaces[i]) +
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                " expected not to be space character");
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!UCharacter.isWhitespace(whitespaces[i]))
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(whitespaces[i]) +
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " expected to be a white space character");
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.isWhitespace(nonwhitespaces[i]))
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(nonwhitespaces[i]) +
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            " expected not to be a space character");
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok    \\u" + hex(spaces[i]) + " and \\u" +
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  hex(nonspaces[i]) + " and \\u" + hex(whitespaces[i]) +
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  " and \\u" + hex(nonwhitespaces[i]));
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int patternWhiteSpace[] = {0x9, 0xd, 0x20, 0x85,
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                0x200e, 0x200f, 0x2028, 0x2029};
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int nonPatternWhiteSpace[] = {0x8, 0xe, 0x21, 0x86, 0xa0, 0xa1,
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                   0x1680, 0x1681, 0x180e, 0x180f,
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                   0x1FFF, 0x2000, 0x200a, 0x200b,
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                   0x2010, 0x202f, 0x2030, 0x205f,
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                   0x2060, 0x3000, 0x3001};
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < patternWhiteSpace.length; i ++) {
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!PatternProps.isWhiteSpace(patternWhiteSpace[i])) {
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("\\u" + Utility.hex(patternWhiteSpace[i], 4)
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      + " expected to be a Pattern_White_Space");
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < nonPatternWhiteSpace.length; i ++) {
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (PatternProps.isWhiteSpace(nonPatternWhiteSpace[i])) {
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("\\u" + Utility.hex(nonPatternWhiteSpace[i], 4)
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      + " expected to be a non-Pattern_White_Space");
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // TODO: propose public API for constants like uchar.h's U_GC_*_MASK
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // (http://bugs.icu-project.org/trac/ticket/7461)
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int GC_Z_MASK =
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            (1 << UCharacter.SPACE_SEPARATOR) |
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            (1 << UCharacter.LINE_SEPARATOR) |
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            (1 << UCharacter.PARAGRAPH_SEPARATOR);
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // UCharacter.isWhitespace(c) should be the same as Character.isWhitespace().
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // This uses logln() because Character.isWhitespace() differs between Java versions, thus
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // it is not necessarily an error if there is a difference between
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // particular Java and ICU versions.
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // However, you need to run tests with -v to see the output.
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Also note that, at least as of Unicode 5.2,
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // there are no supplementary white space characters.
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int c = 0; c <= 0xffff; ++c) {
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            boolean j = Character.isWhitespace(c);
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            boolean i = UCharacter.isWhitespace(c);
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            boolean u = UCharacter.isUWhiteSpace(c);
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            boolean z = (UCharacter.getIntPropertyValue(c, UProperty.GENERAL_CATEGORY_MASK) &
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         GC_Z_MASK) != 0;
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (j != i) {
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln(String.format(
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "isWhitespace(U+%04x) difference: JDK %5b ICU %5b Unicode WS %5b Z Separator %5b",
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    c, j, i, u, z));
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else if (j || i || u || z) {
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln(String.format(
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "isWhitespace(U+%04x) FYI:        JDK %5b ICU %5b Unicode WS %5b Z Separator %5b",
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    c, j, i, u, z));
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (char c = 0; c <= 0xff; ++c) {
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            boolean j = Character.isSpace(c);
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            boolean i = UCharacter.isSpace(c);
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            boolean z = (UCharacter.getIntPropertyValue(c, UProperty.GENERAL_CATEGORY_MASK) &
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         GC_Z_MASK) != 0;
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (j != i) {
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln(String.format(
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "isSpace(U+%04x) difference: JDK %5b ICU %5b Z Separator %5b",
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    (int)c, j, i, z));
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else if (j || i || z) {
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln(String.format(
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "isSpace(U+%04x) FYI:        JDK %5b ICU %5b Z Separator %5b",
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    (int)c, j, i, z));
2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test various implementations of Pattern_Syntax & Pattern_White_Space.
2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestPatternProperties() {
2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UnicodeSet syn_pp = new UnicodeSet();
2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UnicodeSet syn_prop = new UnicodeSet("[:Pattern_Syntax:]");
2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UnicodeSet syn_list = new UnicodeSet(
2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "[!-/\\:-@\\[-\\^`\\{-~"+
2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "\u00A1-\u00A7\u00A9\u00AB\u00AC\u00AE\u00B0\u00B1\u00B6\u00BB\u00BF\u00D7\u00F7"+
2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "\u2010-\u2027\u2030-\u203E\u2041-\u2053\u2055-\u205E\u2190-\u245F\u2500-\u2775"+
2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "\u2794-\u2BFF\u2E00-\u2E7F\u3001-\u3003\u3008-\u3020\u3030\uFD3E\uFD3F\uFE45\uFE46]");
2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UnicodeSet ws_pp = new UnicodeSet();
2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UnicodeSet ws_prop = new UnicodeSet("[:Pattern_White_Space:]");
2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UnicodeSet ws_list = new UnicodeSet("[\\u0009-\\u000D\\ \\u0085\\u200E\\u200F\\u2028\\u2029]");
2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UnicodeSet syn_ws_pp = new UnicodeSet();
2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UnicodeSet syn_ws_prop = new UnicodeSet(syn_prop).addAll(ws_prop);
2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int c=0; c<=0xffff; ++c) {
2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(PatternProps.isSyntax(c)) {
2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                syn_pp.add(c);
2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(PatternProps.isWhiteSpace(c)) {
2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ws_pp.add(c);
2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(PatternProps.isSyntaxOrWhiteSpace(c)) {
2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                syn_ws_pp.add(c);
2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        compareUSets(syn_pp, syn_prop,
2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                     "PatternProps.isSyntax()", "[:Pattern_Syntax:]", true);
2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        compareUSets(syn_pp, syn_list,
2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                     "PatternProps.isSyntax()", "[Pattern_Syntax ranges]", true);
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        compareUSets(ws_pp, ws_prop,
2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                     "PatternProps.isWhiteSpace()", "[:Pattern_White_Space:]", true);
2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        compareUSets(ws_pp, ws_list,
2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                     "PatternProps.isWhiteSpace()", "[Pattern_White_Space ranges]", true);
2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        compareUSets(syn_ws_pp, syn_ws_prop,
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                     "PatternProps.isSyntaxOrWhiteSpace()",
2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                     "[[:Pattern_Syntax:][:Pattern_White_Space:]]", true);
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * Tests for defined and undefined characters
2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestDefined()
2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int undefined[] = {0xfff1, 0xfff7, 0xfa6e};
2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int defined[] = {0x523E, 0x004f88, 0x00fffd};
2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int size = undefined.length;
3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < size; i ++)
3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.isDefined(undefined[i]))
3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(undefined[i]) +
3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            " expected not to be defined");
3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!UCharacter.isDefined(defined[i]))
3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(defined[i]) + " expected defined");
3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * Tests for base characters and their cellwidth
3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestBase()
3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int base[] = {0x0061, 0x000031, 0x0003d2};
3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int nonbase[] = {0x002B, 0x000020, 0x00203B};
3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int size = base.length;
3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < size; i ++)
3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.isBaseForm(nonbase[i]))
3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(nonbase[i]) +
3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            " expected not to be a base character");
3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!UCharacter.isBaseForm(base[i]))
3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(base[i]) +
3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      " expected to be a base character");
3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * Tests for digit characters
3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestDigits()
3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int digits[] = {0x0030, 0x000662, 0x000F23, 0x000ED5, 0x002160};
3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //special characters not in the properties table
3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int digits2[] = {0x3007, 0x004e00, 0x004e8c, 0x004e09, 0x0056d8,
3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         0x004e94, 0x00516d, 0x4e03, 0x00516b, 0x004e5d};
3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int nondigits[] = {0x0010, 0x000041, 0x000122, 0x0068FE};
3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int digitvalues[] = {0, 2, 3, 5, 1};
3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int digitvalues2[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int size  = digits.length;
3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < size; i ++) {
3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.isDigit(digits[i]) &&
3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.digit(digits[i]) != digitvalues[i])
3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(digits[i]) +
3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " expected digit with value " + digitvalues[i]);
3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        size = nondigits.length;
3677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < size; i ++)
3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.isDigit(nondigits[i]))
3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(nondigits[i]) + " expected nondigit");
3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        size = digits2.length;
3757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < 10; i ++) {
3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.isDigit(digits2[i]) &&
3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.digit(digits2[i]) != digitvalues2[i])
3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
3797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(digits2[i]) +
3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    " expected digit with value " + digitvalues2[i]);
3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
3827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
3877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    *  Tests for numeric characters
3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
3897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestNumeric()
3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
3917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (UCharacter.getNumericValue(0x00BC) != -2) {
3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Numeric value of 0x00BC expected to be -2");
3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = '0'; i < '9'; i ++) {
3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int n1 = UCharacter.getNumericValue(i);
3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double n2 = UCharacter.getUnicodeNumericValue(i);
3987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (n1 != n2 ||  n1 != (i - '0')) {
3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Numeric value of " + (char)i + " expected to be " +
4007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      (i - '0'));
4017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 'A'; i < 'F'; i ++) {
4047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int n1 = UCharacter.getNumericValue(i);
4057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double n2 = UCharacter.getUnicodeNumericValue(i);
4067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (n2 != UCharacter.NO_NUMERIC_VALUE ||  n1 != (i - 'A' + 10)) {
4077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Numeric value of " + (char)i + " expected to be " +
4087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      (i - 'A' + 10));
4097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0xFF21; i < 0xFF26; i ++) {
4127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // testing full wideth latin characters A-F
4137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int n1 = UCharacter.getNumericValue(i);
4147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double n2 = UCharacter.getUnicodeNumericValue(i);
4157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (n2 != UCharacter.NO_NUMERIC_VALUE ||  n1 != (i - 0xFF21 + 10)) {
4167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Numeric value of " + (char)i + " expected to be " +
4177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      (i - 0xFF21 + 10));
4187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // testing han numbers
4217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int han[] = {0x96f6, 0, 0x58f9, 1, 0x8cb3, 2, 0x53c3, 3,
4227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                     0x8086, 4, 0x4f0d, 5, 0x9678, 6, 0x67d2, 7,
4237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                     0x634c, 8, 0x7396, 9, 0x5341, 10, 0x62fe, 10,
4247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                     0x767e, 100, 0x4f70, 100, 0x5343, 1000, 0x4edf, 1000,
4257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                     0x824c, 10000, 0x5104, 100000000};
4267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < han.length; i += 2) {
4277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.getHanNumericValue(han[i]) != han[i + 1]) {
4287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Numeric value of \\u" +
4297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      Integer.toHexString(han[i]) + " expected to be " +
4307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      han[i + 1]);
4317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
4367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * Tests for version
4377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
4387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestVersion()
4397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
4407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!UCharacter.getUnicodeVersion().equals(VERSION_))
4417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL expected: " + VERSION_ + " got: " + UCharacter.getUnicodeVersion());
4427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
4457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * Tests for control characters
4467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
4477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestISOControl()
4487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
4497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int control[] = {0x001b, 0x000097, 0x000082};
4507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int noncontrol[] = {0x61, 0x000031, 0x0000e2};
4517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int size = control.length;
4537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < size; i ++)
4547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
4557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!UCharacter.isISOControl(control[i]))
4567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
4577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL 0x" + Integer.toHexString(control[i]) +
4587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " expected to be a control character");
4597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
4607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.isISOControl(noncontrol[i]))
4627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
4637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL 0x" + Integer.toHexString(noncontrol[i]) +
4647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " expected to be not a control character");
4657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
4667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok    0x" + Integer.toHexString(control[i]) + " and 0x" +
4697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Integer.toHexString(noncontrol[i]));
4707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
4747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test Supplementary
4757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
4767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSupplementary()
4777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
4787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < 0x10000; i ++) {
4797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.isSupplementary(i)) {
4807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Codepoint \\u" + Integer.toHexString(i) +
4817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      " is not supplementary");
4827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0x10000; i < 0x10FFFF; i ++) {
4857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!UCharacter.isSupplementary(i)) {
4867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Codepoint \\u" + Integer.toHexString(i) +
4877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      " is supplementary");
4887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
4937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test mirroring
4947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
4957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestMirror()
4967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
4977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!(UCharacter.isMirrored(0x28) && UCharacter.isMirrored(0xbb) &&
4987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              UCharacter.isMirrored(0x2045) && UCharacter.isMirrored(0x232a)
4997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              && !UCharacter.isMirrored(0x27) &&
5007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              !UCharacter.isMirrored(0x61) && !UCharacter.isMirrored(0x284)
5017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              && !UCharacter.isMirrored(0x3400))) {
5027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("isMirrored() does not work correctly");
5037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!(UCharacter.getMirror(0x3c) == 0x3e &&
5067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              UCharacter.getMirror(0x5d) == 0x5b &&
5077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              UCharacter.getMirror(0x208d) == 0x208e &&
5087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              UCharacter.getMirror(0x3017) == 0x3016 &&
5097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              UCharacter.getMirror(0xbb) == 0xab &&
5117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              UCharacter.getMirror(0x2215) == 0x29F5 &&
5127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              UCharacter.getMirror(0x29F5) == 0x2215 && /* large delta between the code points */
5137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              UCharacter.getMirror(0x2e) == 0x2e &&
5157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              UCharacter.getMirror(0x6f3) == 0x6f3 &&
5167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              UCharacter.getMirror(0x301c) == 0x301c &&
5177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              UCharacter.getMirror(0xa4ab) == 0xa4ab &&
5187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              /* see Unicode Corrigendum #6 at http://www.unicode.org/versions/corrigendum6.html */
5207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              UCharacter.getMirror(0x2018) == 0x2018 &&
5217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              UCharacter.getMirror(0x201b) == 0x201b &&
5227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              UCharacter.getMirror(0x301d) == 0x301d)) {
5237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("getMirror() does not work correctly");
5247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* verify that Bidi_Mirroring_Glyph roundtrips */
5277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UnicodeSet set=new UnicodeSet("[:Bidi_Mirrored:]");
5287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UnicodeSetIterator iter=new UnicodeSetIterator(set);
5297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int start, end, c2, c3;
5307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        while(iter.nextRange() && (start=iter.codepoint)>=0) {
5317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            end=iter.codepointEnd;
5327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            do {
5337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                c2=UCharacter.getMirror(start);
5347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                c3=UCharacter.getMirror(c2);
5357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(c3!=start) {
5367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("getMirror() does not roundtrip: U+"+hex(start)+"->U+"+hex(c2)+"->U+"+hex(c3));
5377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
5387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                c3=UCharacter.getBidiPairedBracket(start);
5397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(UCharacter.getIntPropertyValue(start, UProperty.BIDI_PAIRED_BRACKET_TYPE)==UCharacter.BidiPairedBracketType.NONE) {
5407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if(c3!=start) {
5417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("u_getBidiPairedBracket(U+"+hex(start)+") != self for bpt(c)==None");
5427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
5437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
5447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if(c3!=c2) {
5457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("u_getBidiPairedBracket(U+"+hex(start)+") != U+"+hex(c2)+" = bmg(c)'");
5467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
5477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
5487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } while(++start<=end);
5497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // verify that Unicode Corrigendum #6 reverts mirrored status of the following
5527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (UCharacter.isMirrored(0x2018) ||
5537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            UCharacter.isMirrored(0x201d) ||
5547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            UCharacter.isMirrored(0x201f) ||
5557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            UCharacter.isMirrored(0x301e)) {
5567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Unicode Corrigendum #6 conflict, one or more of 2018/201d/201f/301e has mirrored property");
5577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
5617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * Tests for printable characters
5627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
5637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestPrint()
5647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
5657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int printable[] = {0x0042, 0x00005f, 0x002014};
5667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int nonprintable[] = {0x200c, 0x00009f, 0x00001b};
5677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int size = printable.length;
5697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < size; i ++)
5707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
5717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!UCharacter.isPrintable(printable[i]))
5727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
5737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(printable[i]) +
5747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    " expected to be a printable character");
5757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
5767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.isPrintable(nonprintable[i]))
5787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
5797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(nonprintable[i]) +
5807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " expected not to be a printable character");
5817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
5827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok    \\u" + hex(printable[i]) + " and \\u" +
5847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    hex(nonprintable[i]));
5857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // test all ISO 8 controls
5887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int ch = 0; ch <= 0x9f; ++ ch) {
5897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (ch == 0x20) {
5907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // skip ASCII graphic characters and continue with DEL
5917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ch = 0x7f;
5927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.isPrintable(ch)) {
5947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Fail \\u" + hex(ch) +
5957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    " is a ISO 8 control character hence not printable\n");
5967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* test all Latin-1 graphic characters */
6007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int ch = 0x20; ch <= 0xff; ++ ch) {
6017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (ch == 0x7f) {
6027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ch = 0xa0;
6037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!UCharacter.isPrintable(ch)
6057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                && ch != 0x00AD/* Unicode 4.0 changed the defintion of soft hyphen to be a Cf*/) {
6067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Fail \\u" + hex(ch) +
6077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      " is a Latin-1 graphic character\n");
6087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
6137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * Testing for identifier characters
6147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
6157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestIdentifier()
6167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
6177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int unicodeidstart[] = {0x0250, 0x0000e2, 0x000061};
6187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int nonunicodeidstart[] = {0x2000, 0x00000a, 0x002019};
6197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int unicodeidpart[] = {0x005f, 0x000032, 0x000045};
6207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int nonunicodeidpart[] = {0x2030, 0x0000a3, 0x000020};
6217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int idignore[] = {0x0006, 0x0010, 0x206b};
6227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int nonidignore[] = {0x0075, 0x0000a3, 0x000061};
6237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int size = unicodeidstart.length;
6257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < size; i ++)
6267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
6277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!UCharacter.isUnicodeIdentifierStart(unicodeidstart[i]))
6287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
6297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(unicodeidstart[i]) +
6307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    " expected to be a unicode identifier start character");
6317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
6327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.isUnicodeIdentifierStart(nonunicodeidstart[i]))
6347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
6357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(nonunicodeidstart[i]) +
6367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " expected not to be a unicode identifier start " +
6377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "character");
6387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
6397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!UCharacter.isUnicodeIdentifierPart(unicodeidpart[i]))
6417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
6427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(unicodeidpart[i]) +
6437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    " expected to be a unicode identifier part character");
6447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
6457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.isUnicodeIdentifierPart(nonunicodeidpart[i]))
6477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
6487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(nonunicodeidpart[i]) +
6497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " expected not to be a unicode identifier part " +
6507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "character");
6517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
6527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!UCharacter.isIdentifierIgnorable(idignore[i]))
6547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
6557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(idignore[i]) +
6567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " expected to be a ignorable unicode character");
6577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
6587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.isIdentifierIgnorable(nonidignore[i]))
6607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
6617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(nonidignore[i]) +
6627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    " expected not to be a ignorable unicode character");
6637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
6647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Ok    \\u" + hex(unicodeidstart[i]) + " and \\u" +
6667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    hex(nonunicodeidstart[i]) + " and \\u" +
6677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    hex(unicodeidpart[i]) + " and \\u" +
6687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    hex(nonunicodeidpart[i]) + " and \\u" +
6697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    hex(idignore[i]) + " and \\u" + hex(nonidignore[i]));
6707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
6747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * Tests for the character types, direction.<br>
6757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * This method reads in UnicodeData.txt file for testing purposes. A
6767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * default path is provided relative to the src path, however the user
6777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * could set a system property to change the directory path.<br>
6787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * e.g. java -DUnicodeData="data_directory_path"
6797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * com.ibm.icu.dev.test.lang.UCharacterTest
6807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
6817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestUnicodeData()
6827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
6837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // this is the 2 char category types used in the UnicodeData file
6847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String TYPE =
6857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "LuLlLtLmLoMnMeMcNdNlNoZsZlZpCcCfCoCsPdPsPePcPoSmScSkSoPiPf";
6867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // directorionality types used in the UnicodeData file
6887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // padded by spaces to make each type size 4
6897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String DIR =
6907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "L   R   EN  ES  ET  AN  CS  B   S   WS  ON  LRE LRO AL  RLE RLO PDF NSM BN  FSI LRI RLI PDI ";
6917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Normalizer2 nfc = Normalizer2.getNFCInstance();
6937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Normalizer2 nfkc = Normalizer2.getNFKCInstance();
6947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
695aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert        BufferedReader input = null;
696aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert        try {
697aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert            input = TestUtil.getDataReader("unicode/UnicodeData.txt");
6987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int numErrors = 0;
6997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (;;) {
7017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String s = input.readLine();
7027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(s == null) {
7037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
7047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
7057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(s.length()<4 || s.startsWith("#")) {
7067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    continue;
7077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
7087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String[] fields = s.split(";", -1);
7097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assert (fields.length == 15 ) : "Number of fields is " + fields.length + ": " + s;
7107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int ch = Integer.parseInt(fields[0], 16);
7127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // testing the general category
7147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int type = TYPE.indexOf(fields[2]);
7157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (type < 0)
7167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    type = 0;
7177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                else
7187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    type = (type >> 1) + 1;
7197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (UCharacter.getType(ch) != type)
7207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
7217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL \\u" + hex(ch) + " expected type " + type);
7227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
7237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
7247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (UCharacter.getIntPropertyValue(ch,
7267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                           UProperty.GENERAL_CATEGORY_MASK) != (1 << type)) {
7277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("error: getIntPropertyValue(\\u" +
7287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          Integer.toHexString(ch) +
7297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          ", UProperty.GENERAL_CATEGORY_MASK) != " +
7307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "getMask(getType(ch))");
7317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
7327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // testing combining class
7347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int cc = Integer.parseInt(fields[3]);
7357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (UCharacter.getCombiningClass(ch) != cc)
7367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
7377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL \\u" + hex(ch) + " expected combining " +
7387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            "class " + cc);
7397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
7407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
7417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (nfkc.getCombiningClass(ch) != cc)
7427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
7437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL \\u" + hex(ch) + " expected NFKC combining " +
7447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            "class " + cc);
7457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
7467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
7477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // testing the direction
7497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String d = fields[4];
7507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (d.length() == 1)
7517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    d = d + "   ";
7527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int dir = DIR.indexOf(d) >> 2;
7547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (UCharacter.getDirection(ch) != dir)
7557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
7567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL \\u" + hex(ch) +
7577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " expected direction " + dir + " but got " + UCharacter.getDirection(ch));
7587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
7597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
7607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                byte bdir = (byte)dir;
7627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (UCharacter.getDirectionality(ch) != bdir)
7637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
7647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL \\u" + hex(ch) +
7657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " expected directionality " + bdir + " but got " +
7667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        UCharacter.getDirectionality(ch));
7677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
7687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
7697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                /* get Decomposition_Type & Decomposition_Mapping, field 5 */
7717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int dt;
7727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(fields[5].length()==0) {
7737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    /* no decomposition, except UnicodeData.txt omits Hangul syllable decompositions */
7747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if(ch==0xac00 || ch==0xd7a3) {
7757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        dt=UCharacter.DecompositionType.CANONICAL;
7767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } else {
7777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        dt=UCharacter.DecompositionType.NONE;
7787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
7797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
7807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    d=fields[5];
7817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    dt=-1;
7827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if(d.charAt(0)=='<') {
7837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        int end=d.indexOf('>', 1);
7847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if(end>=0) {
7857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            dt=UCharacter.getPropertyValueEnum(UProperty.DECOMPOSITION_TYPE, d.substring(1, end));
7867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            while(d.charAt(++end)==' ') {}  // skip spaces
7877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            d=d.substring(end);
7887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
7897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } else {
7907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        dt=UCharacter.DecompositionType.CANONICAL;
7917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
7927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
7937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String dm;
7947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(dt>UCharacter.DecompositionType.NONE) {
7957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if(ch==0xac00) {
7967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        dm="\u1100\u1161";
7977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } else if(ch==0xd7a3) {
7987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        dm="\ud788\u11c2";
7997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    } else {
8007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        String[] dmChars=d.split(" +");
8017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        StringBuilder dmb=new StringBuilder(dmChars.length);
8027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        for(String dmc : dmChars) {
8037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            dmb.appendCodePoint(Integer.parseInt(dmc, 16));
8047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
8057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        dm=dmb.toString();
8067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
8077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
8087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    dm=null;
8097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
8107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(dt<0) {
8117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln(String.format("error in UnicodeData.txt: syntax error in U+%04lX decomposition field", ch));
8127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    return;
8137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
8147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int i=UCharacter.getIntPropertyValue(ch, UProperty.DECOMPOSITION_TYPE);
8157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals(
8167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        String.format("error: UCharacter.getIntPropertyValue(U+%04x, UProperty.DECOMPOSITION_TYPE) is wrong", ch),
8177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        dt, i);
8187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                /* Expect Decomposition_Mapping=nfkc.getRawDecomposition(c). */
8197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String mapping=nfkc.getRawDecomposition(ch);
8207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals(
8217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        String.format("error: nfkc.getRawDecomposition(U+%04x) is wrong", ch),
8227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        dm, mapping);
8237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                /* For canonical decompositions only, expect Decomposition_Mapping=nfc.getRawDecomposition(c). */
8247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(dt!=UCharacter.DecompositionType.CANONICAL) {
8257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    dm=null;
8267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
8277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                mapping=nfc.getRawDecomposition(ch);
8287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals(
8297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        String.format("error: nfc.getRawDecomposition(U+%04x) is wrong", ch),
8307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        dm, mapping);
8317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                /* recompose */
8327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(dt==UCharacter.DecompositionType.CANONICAL
8337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        && !UCharacter.hasBinaryProperty(ch, UProperty.FULL_COMPOSITION_EXCLUSION)) {
8347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    int a=dm.codePointAt(0);
8357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    int b=dm.codePointBefore(dm.length());
8367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    int composite=nfc.composePair(a, b);
8377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    assertEquals(
8387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            String.format(
8397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    "error: nfc U+%04X decomposes to U+%04X+U+%04X "+
8407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    "but does not compose back (instead U+%04X)",
8417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    ch, a, b, composite),
8427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ch, composite);
8437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    /*
8447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                     * Note: NFKC has fewer round-trip mappings than NFC,
8457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                     * so we can't just test nfkc.composePair(a, b) here without further data.
8467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                     */
8477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
8487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // testing iso comment
8507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                try{
8517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    String isocomment = fields[11];
8527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    String comment = UCharacter.getISOComment(ch);
8537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (comment == null) {
8547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        comment = "";
8557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
8567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (!comment.equals(isocomment)) {
8577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("FAIL \\u" + hex(ch) +
8587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            " expected iso comment " + isocomment);
8597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        break;
8607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
8617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }catch(Exception e){
8627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if(e.getMessage().indexOf("unames.icu") >= 0){
8637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        numErrors++;
8647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }else{
8657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        throw e;
8667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
8677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
8687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String upper = fields[12];
8707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int tempchar = ch;
8717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (upper.length() > 0) {
8727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    tempchar = Integer.parseInt(upper, 16);
8737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
8747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int resultCp = UCharacter.toUpperCase(ch);
8757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (resultCp != tempchar) {
8767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL \\u" + Utility.hex(ch, 4)
8777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + " expected uppercase \\u"
8787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + Utility.hex(tempchar, 4)
8797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + " but got \\u"
8807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + Utility.hex(resultCp, 4));
8817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
8827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
8837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String lower = fields[13];
8857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                tempchar = ch;
8867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (lower.length() > 0) {
8877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    tempchar = Integer.parseInt(lower, 16);
8887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
8897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (UCharacter.toLowerCase(ch) != tempchar) {
8907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL \\u" + Utility.hex(ch, 4)
8917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + " expected lowercase \\u"
8927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + Utility.hex(tempchar, 4));
8937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
8947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
8957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String title = fields[14];
8997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                tempchar = ch;
9007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (title.length() > 0) {
9017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    tempchar = Integer.parseInt(title, 16);
9027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
9037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (UCharacter.toTitleCase(ch) != tempchar) {
9047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL \\u" + Utility.hex(ch, 4)
9057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + " expected titlecase \\u"
9067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + Utility.hex(tempchar, 4));
9077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
9087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
9097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(numErrors > 0){
9117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                warnln("Could not find unames.icu");
9127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
913aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert        } catch (Exception e) {
9147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            e.printStackTrace();
915aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert        } finally {
916aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert            if (input != null) {
917aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert                try {
918aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert                    input.close();
919aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert                } catch (IOException ignored) {
920aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert                }
921aacdd6f022693689b3bf76f70670711f3254a441Fredrik Roubert            }
9227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (UCharacter.UnicodeBlock.of(0x0041)
9257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                        != UCharacter.UnicodeBlock.BASIC_LATIN
9267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || UCharacter.getIntPropertyValue(0x41, UProperty.BLOCK)
9277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              != UCharacter.UnicodeBlock.BASIC_LATIN.getID()) {
9287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("UCharacter.UnicodeBlock.of(\\u0041) property failed! "
9297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + "Expected : "
9307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + UCharacter.UnicodeBlock.BASIC_LATIN.getID() + " got "
9317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + UCharacter.UnicodeBlock.of(0x0041));
9327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // sanity check on repeated properties
9357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int ch = 0xfffe; ch <= 0x10ffff;) {
9367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int type = UCharacter.getType(ch);
9377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.getIntPropertyValue(ch,
9387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                               UProperty.GENERAL_CATEGORY_MASK)
9397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                != (1 << type)) {
9407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("error: UCharacter.getIntPropertyValue(\\u"
9417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      + Integer.toHexString(ch)
9427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      + ", UProperty.GENERAL_CATEGORY_MASK) != "
9437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      + "getMask(getType())");
9447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (type != UCharacterCategory.UNASSIGNED) {
9467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("error: UCharacter.getType(\\u" + Utility.hex(ch, 4)
9477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + " != UCharacterCategory.UNASSIGNED (returns "
9487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + UCharacterCategory.toString(UCharacter.getType(ch))
9497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + ")");
9507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if ((ch & 0xffff) == 0xfffe) {
9527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ++ ch;
9537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            else {
9557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ch += 0xffff;
9567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // test that PUA is not "unassigned"
9607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int ch = 0xe000; ch <= 0x10fffd;) {
9617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int type = UCharacter.getType(ch);
9627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.getIntPropertyValue(ch,
9637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                               UProperty.GENERAL_CATEGORY_MASK)
9647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                != (1 << type)) {
9657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("error: UCharacter.getIntPropertyValue(\\u"
9667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      + Integer.toHexString(ch)
9677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      + ", UProperty.GENERAL_CATEGORY_MASK) != "
9687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      + "getMask(getType())");
9697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (type == UCharacterCategory.UNASSIGNED) {
9727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("error: UCharacter.getType(\\u"
9737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + Utility.hex(ch, 4)
9747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + ") == UCharacterCategory.UNASSIGNED");
9757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            else if (type != UCharacterCategory.PRIVATE_USE) {
9777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("PUA override: UCharacter.getType(\\u"
9787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      + Utility.hex(ch, 4) + ")=" + type);
9797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (ch == 0xf8ff) {
9817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ch = 0xf0000;
9827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            else if (ch == 0xffffd) {
9847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ch = 0x100000;
9857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            else {
9877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ++ ch;
9887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
9947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * Test for the character names
9957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
9967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestNames()
9977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
9987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try{
9997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int length = UCharacterName.INSTANCE.getMaxCharNameLength();
10007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (length < 83) { // Unicode 3.2 max char name length
10017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               errln("getMaxCharNameLength()=" + length + " is too short");
10027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
10037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int c[] = {0x0061,                //LATIN SMALL LETTER A
10057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       0x000284,              //LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
10067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       0x003401,              //CJK UNIFIED IDEOGRAPH-3401
10077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       0x007fed,              //CJK UNIFIED IDEOGRAPH-7FED
10087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       0x00ac00,              //HANGUL SYLLABLE GA
10097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       0x00d7a3,              //HANGUL SYLLABLE HIH
10107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       0x00d800, 0x00dc00,    //LINEAR B SYLLABLE B008 A
10117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       0xff08,                //FULLWIDTH LEFT PARENTHESIS
10127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       0x00ffe5,              //FULLWIDTH YEN SIGN
10137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       0x00ffff,              //null
10147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       0x0023456              //CJK UNIFIED IDEOGRAPH-23456
10157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       };
10167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String name[] = {
10177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             "LATIN SMALL LETTER A",
10187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             "LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK",
10197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             "CJK UNIFIED IDEOGRAPH-3401",
10207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             "CJK UNIFIED IDEOGRAPH-7FED",
10217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             "HANGUL SYLLABLE GA",
10227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             "HANGUL SYLLABLE HIH",
10237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             "",
10247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             "",
10257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             "FULLWIDTH LEFT PARENTHESIS",
10267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             "FULLWIDTH YEN SIGN",
10277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             "",
10287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             "CJK UNIFIED IDEOGRAPH-23456"
10297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             };
10307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String oldname[] = {"", "", "",
10317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            "",
10327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            "", "", "", "", "", "",
10337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            "", ""};
10347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String extendedname[] = {"LATIN SMALL LETTER A",
10357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                 "LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK",
10367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                 "CJK UNIFIED IDEOGRAPH-3401",
10377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                 "CJK UNIFIED IDEOGRAPH-7FED",
10387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                 "HANGUL SYLLABLE GA",
10397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                 "HANGUL SYLLABLE HIH",
10407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                 "<lead surrogate-D800>",
10417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                 "<trail surrogate-DC00>",
10427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                 "FULLWIDTH LEFT PARENTHESIS",
10437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                 "FULLWIDTH YEN SIGN",
10447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                 "<noncharacter-FFFF>",
10457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                 "CJK UNIFIED IDEOGRAPH-23456"};
10467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int size = c.length;
10487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String str;
10497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int uc;
10507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < size; i ++)
10527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {
10537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // modern Unicode character name
10547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                str = UCharacter.getName(c[i]);
10557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if ((str == null && name[i].length() > 0) ||
10567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    (str != null && !str.equals(name[i])))
10577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
10587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL \\u" + hex(c[i]) + " expected name " +
10597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            name[i]);
10607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
10617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
10627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // 1.0 Unicode character name
10647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                str = UCharacter.getName1_0(c[i]);
10657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if ((str == null && oldname[i].length() > 0) ||
10667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    (str != null && !str.equals(oldname[i])))
10677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
10687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL \\u" + hex(c[i]) + " expected 1.0 name " +
10697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            oldname[i]);
10707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
10717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
10727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // extended character name
10747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                str = UCharacter.getExtendedName(c[i]);
10757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (str == null || !str.equals(extendedname[i]))
10767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
10777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL \\u" + hex(c[i]) + " expected extended name " +
10787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            extendedname[i]);
10797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
10807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
10817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // retrieving unicode character from modern name
10837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                uc = UCharacter.getCharFromName(name[i]);
10847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (uc != c[i] && name[i].length() != 0)
10857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
10867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL " + name[i] + " expected character \\u" +
10877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          hex(c[i]));
10887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
10897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
10907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                //retrieving unicode character from 1.0 name
10927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                uc = UCharacter.getCharFromName1_0(oldname[i]);
10937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (uc != c[i] && oldname[i].length() != 0)
10947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
10957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL " + oldname[i] + " expected 1.0 character \\u" +
10967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          hex(c[i]));
10977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
10987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
10997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                //retrieving unicode character from 1.0 name
11017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                uc = UCharacter.getCharFromExtendedName(extendedname[i]);
11027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (uc != c[i] && i != 0 && (i == 1 || i == 6))
11037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
11047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL " + extendedname[i] +
11057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          " expected extended character \\u" + hex(c[i]));
11067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
11077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
11087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // test getName works with mixed-case names (new in 2.0)
11117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (0x61 != UCharacter.getCharFromName("LATin smALl letTER A")) {
11127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL: 'LATin smALl letTER A' should result in character "
11137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      + "U+0061");
11147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (getInclusion() >= 5) {
11177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // extra testing different from icu
11187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                for (int i = UCharacter.MIN_VALUE; i < UCharacter.MAX_VALUE; i ++)
11197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
11207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    str = UCharacter.getName(i);
11217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (str != null && UCharacter.getCharFromName(str) != i)
11227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    {
11237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("FAIL \\u" + hex(i) + " " + str  +
11247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                            " retrieval of name and vice versa" );
11257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        break;
11267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
11277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
11287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Test getCharNameCharacters
11317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (getInclusion() >= 10) {
11327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                boolean map[] = new boolean[256];
11337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UnicodeSet set = new UnicodeSet(1, 0); // empty set
11357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UnicodeSet dumb = new UnicodeSet(1, 0); // empty set
11367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // uprv_getCharNameCharacters() will likely return more lowercase
11387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // letters than actual character names contain because
11397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // it includes all the characters in lowercased names of
11407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // general categories, for the full possible set of extended names.
11417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacterName.INSTANCE.getCharNameCharacters(set);
11427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // build set the dumb (but sure-fire) way
11447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Arrays.fill(map, false);
11457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int maxLength = 0;
11477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                for (int cp = 0; cp < 0x110000; ++ cp) {
11487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    String n = UCharacter.getExtendedName(cp);
11497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    int len = n.length();
11507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (len > maxLength) {
11517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        maxLength = len;
11527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
11537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    for (int i = 0; i < len; ++ i) {
11557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        char ch = n.charAt(i);
11567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (!map[ch & 0xff]) {
11577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            dumb.add(ch);
11587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            map[ch & 0xff] = true;
11597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
11607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
11617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
11627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                length = UCharacterName.INSTANCE.getMaxCharNameLength();
11647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (length != maxLength) {
11657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("getMaxCharNameLength()=" + length
11667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          + " differs from the maximum length " + maxLength
11677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          + " of all extended names");
11687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
11697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // compare the sets.  Where is my uset_equals?!!
11717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                boolean ok = true;
11727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                for (int i = 0; i < 256; ++ i) {
11737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (set.contains(i) != dumb.contains(i)) {
11747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if (0x61 <= i && i <= 0x7a // a-z
11757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            && set.contains(i) && !dumb.contains(i)) {
11767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            // ignore lowercase a-z that are in set but not in dumb
11777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ok = true;
11787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
11797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        else {
11807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ok = false;
11817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            break;
11827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
11837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
11847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
11857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String pattern1 = set.toPattern(true);
11877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String pattern2 = dumb.toPattern(true);
11887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!ok) {
11907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: getCharNameCharacters() returned " + pattern1
11917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          + " expected " + pattern2
11927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          + " (too many lowercase a-z are ok)");
11937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
11947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    logln("Ok: getCharNameCharacters() returned " + pattern1);
11957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
11967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // improve code coverage
11987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           String expected = "LATIN SMALL LETTER A|LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK|"+
11997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             "CJK UNIFIED IDEOGRAPH-3401|CJK UNIFIED IDEOGRAPH-7FED|HANGUL SYLLABLE GA|"+
12007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             "HANGUL SYLLABLE HIH|LINEAR B SYLLABLE B008 A|FULLWIDTH LEFT PARENTHESIS|"+
12017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             "FULLWIDTH YEN SIGN|"+
12027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             "null|"+ // getName returns null because 0xFFFF does not have a name, but has an extended name!
12037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             "CJK UNIFIED IDEOGRAPH-23456";
12047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           String separator= "|";
12057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           String source = Utility.valueOf(c);
12067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           String result = UCharacter.getName(source, separator);
12077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           if(!result.equals(expected)){
12087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               errln("UCharacter.getName did not return the expected result.\n\t Expected: "+ expected+"\n\t Got: "+ result);
12097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           }
12107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }catch(IllegalArgumentException e){
12127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(e.getMessage().indexOf("unames.icu") >= 0){
12137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                warnln("Could not find unames.icu");
12147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }else{
12157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                throw e;
12167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
12177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
12207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestUCharFromNameUnderflow() {
12227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Ticket #10889: Underflow crash when there is no dash.
12237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int c = UCharacter.getCharFromExtendedName("<NO BREAK SPACE>");
12247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(c >= 0) {
12257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("UCharacter.getCharFromExtendedName(<NO BREAK SPACE>) = U+" + hex(c) +
12267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    " but should fail (-1)");
12277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Test related edge cases.
12307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        c = UCharacter.getCharFromExtendedName("<-00a0>");
12317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(c >= 0) {
12327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("UCharacter.getCharFromExtendedName(<-00a0>) = U+" + hex(c) +
12337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    " but should fail (-1)");
12347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        c = UCharacter.getCharFromExtendedName("<control->");
12377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(c >= 0) {
12387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("UCharacter.getCharFromExtendedName(<control->) = U+" + hex(c) +
12397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    " but should fail (-1)");
12407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        c = UCharacter.getCharFromExtendedName("<control-111111>");
12437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(c >= 0) {
12447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("UCharacter.getCharFromExtendedName(<control-111111>) = U+" + hex(c) +
12457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    " but should fail (-1)");
12467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
12487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
12507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * Testing name iteration
12517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
12527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestNameIteration()throws Exception
12537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
12547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
12557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ValueIterator iterator = UCharacter.getExtendedNameIterator();
12567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ValueIterator.Element element = new ValueIterator.Element();
12577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ValueIterator.Element old     = new ValueIterator.Element();
12587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // testing subrange
12597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            iterator.setRange(-10, -5);
12607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (iterator.next(element)) {
12617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Fail, expected iterator to return false when range is set outside the meaningful range");
12627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
12637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            iterator.setRange(0x110000, 0x111111);
12647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (iterator.next(element)) {
12657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Fail, expected iterator to return false when range is set outside the meaningful range");
12667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
12677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
12687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                iterator.setRange(50, 10);
12697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Fail, expected exception when encountered invalid range");
12707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (Exception e) {
12717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
12727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            iterator.setRange(-10, 10);
12747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!iterator.next(element) || element.integer != 0) {
12757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Fail, expected iterator to return 0 when range start limit is set outside the meaningful range");
12767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
12777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            iterator.setRange(0x10FFFE, 0x200000);
12797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int last = 0;
12807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            while (iterator.next(element)) {
12817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                last = element.integer;
12827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
12837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (last != 0x10FFFF) {
12847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Fail, expected iterator to return 0x10FFFF when range end limit is set outside the meaningful range");
12857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
12867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            iterator = UCharacter.getNameIterator();
12887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            iterator.setRange(0xF, 0x45);
12897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            while (iterator.next(element)) {
12907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (element.integer <= old.integer) {
12917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL next returned a less codepoint \\u" +
12927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        Integer.toHexString(element.integer) + " than \\u" +
12937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        Integer.toHexString(old.integer));
12947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
12957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
12967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!UCharacter.getName(element.integer).equals(element.value))
12977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
12987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL next codepoint \\u" +
12997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        Integer.toHexString(element.integer) +
13007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " does not have the expected name " +
13017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        UCharacter.getName(element.integer) +
13027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " instead have the name " + (String)element.value);
13037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
13047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
13057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                old.integer = element.integer;
13067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            iterator.reset();
13097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            iterator.next(element);
13107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (element.integer != 0x20) {
13117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL reset in iterator");
13127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            iterator.setRange(0, 0x110000);
13157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            old.integer = 0;
13167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            while (iterator.next(element)) {
13177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (element.integer != 0 && element.integer <= old.integer) {
13187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL next returned a less codepoint \\u" +
13197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        Integer.toHexString(element.integer) + " than \\u" +
13207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        Integer.toHexString(old.integer));
13217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
13227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
13237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!UCharacter.getName(element.integer).equals(element.value))
13247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {
13257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL next codepoint \\u" +
13267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            Integer.toHexString(element.integer) +
13277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            " does not have the expected name " +
13287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            UCharacter.getName(element.integer) +
13297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            " instead have the name " + (String)element.value);
13307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
13317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
13327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                for (int i = old.integer + 1; i < element.integer; i ++) {
13337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (UCharacter.getName(i) != null) {
13347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("FAIL between codepoints are not null \\u" +
13357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                Integer.toHexString(old.integer) + " and " +
13367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                Integer.toHexString(element.integer) + " has " +
13377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                Integer.toHexString(i) + " with a name " +
13387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                UCharacter.getName(i));
13397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        break;
13407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
13417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
13427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                old.integer = element.integer;
13437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            iterator = UCharacter.getExtendedNameIterator();
13467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            old.integer = 0;
13477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            while (iterator.next(element)) {
13487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (element.integer != 0 && element.integer != old.integer) {
13497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL next returned a codepoint \\u" +
13507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            Integer.toHexString(element.integer) +
13517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            " different from \\u" +
13527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            Integer.toHexString(old.integer));
13537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
13547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
13557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!UCharacter.getExtendedName(element.integer).equals(
13567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                              element.value)) {
13577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL next codepoint \\u" +
13587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        Integer.toHexString(element.integer) +
13597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " name should be "
13607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + UCharacter.getExtendedName(element.integer) +
13617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " instead of " + (String)element.value);
13627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
13637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
13647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                old.integer++;
13657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            iterator = UCharacter.getName1_0Iterator();
13677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            old.integer = 0;
13687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            while (iterator.next(element)) {
13697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln(Integer.toHexString(element.integer) + " " +
13707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                        (String)element.value);
13717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (element.integer != 0 && element.integer <= old.integer) {
13727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL next returned a less codepoint \\u" +
13737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        Integer.toHexString(element.integer) + " than \\u" +
13747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        Integer.toHexString(old.integer));
13757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
13767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
13777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!element.value.equals(UCharacter.getName1_0(
13787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                            element.integer))) {
13797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL next codepoint \\u" +
13807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            Integer.toHexString(element.integer) +
13817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            " name cannot be null");
13827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
13837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
13847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                for (int i = old.integer + 1; i < element.integer; i ++) {
13857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (UCharacter.getName1_0(i) != null) {
13867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("FAIL between codepoints are not null \\u" +
13877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            Integer.toHexString(old.integer) + " and " +
13887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            Integer.toHexString(element.integer) + " has " +
13897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            Integer.toHexString(i) + " with a name " +
13907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            UCharacter.getName1_0(i));
13917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        break;
13927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
13937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
13947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                old.integer = element.integer;
13957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch(Exception e){
13977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // !!! wouldn't preflighting be simpler?  This looks like
13987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // it is effectively be doing that.  It seems that for every
13997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // true error the code will call errln, which will throw the error, which
14007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // this will catch, which this will then rethrow the error.  Just seems
14017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // cumbersome.
14027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(e.getMessage().indexOf("unames.icu") >= 0){
14037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                warnln("Could not find unames.icu");
14047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
14057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln(e.getMessage());
14067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
14097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
14117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * Testing the for illegal characters
14127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
14137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestIsLegal()
14147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
14157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int illegal[] = {0xFFFE, 0x00FFFF, 0x005FFFE, 0x005FFFF, 0x0010FFFE,
14167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         0x0010FFFF, 0x110000, 0x00FDD0, 0x00FDDF, 0x00FDE0,
14177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         0x00FDEF, 0xD800, 0xDC00, -1};
14187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int legal[] = {0x61, 0x00FFFD, 0x0010000, 0x005FFFD, 0x0060000,
14197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       0x0010FFFD, 0xFDCF, 0x00FDF0};
14207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int count = 0; count < illegal.length; count ++) {
14217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.isLegal(illegal[count])) {
14227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(illegal[count]) +
14237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " is not a legal character");
14247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int count = 0; count < legal.length; count ++) {
14287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!UCharacter.isLegal(legal[count])) {
14297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(legal[count]) +
14307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                   " is a legal character");
14317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String illegalStr = "This is an illegal string ";
14357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String legalStr = "This is a legal string ";
14367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int count = 0; count < illegal.length; count ++) {
14387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringBuffer str = new StringBuffer(illegalStr);
14397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (illegal[count] < 0x10000) {
14407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                str.append((char)illegal[count]);
14417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            else {
14437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                char lead = UTF16.getLeadSurrogate(illegal[count]);
14447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                char trail = UTF16.getTrailSurrogate(illegal[count]);
14457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                str.append(lead);
14467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                str.append(trail);
14477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.isLegal(str.toString())) {
14497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL " + hex(str.toString()) +
14507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      " is not a legal string");
14517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int count = 0; count < legal.length; count ++) {
14557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringBuffer str = new StringBuffer(legalStr);
14567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (legal[count] < 0x10000) {
14577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                str.append((char)legal[count]);
14587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            else {
14607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                char lead = UTF16.getLeadSurrogate(legal[count]);
14617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                char trail = UTF16.getTrailSurrogate(legal[count]);
14627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                str.append(lead);
14637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                str.append(trail);
14647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!UCharacter.isLegal(str.toString())) {
14667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL " + hex(str.toString()) + " is a legal string");
14677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
14707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
14727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test getCodePoint
14737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
14747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCodePoint()
14757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
14767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int ch = 0x10000;
14777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (char i = 0xD800; i < 0xDC00; i ++) {
14787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (char j = 0xDC00; j <= 0xDFFF; j ++) {
14797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (UCharacter.getCodePoint(i, j) != ch) {
14807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Error getting codepoint for surrogate " +
14817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          "characters \\u"
14827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          + Integer.toHexString(i) + " \\u" +
14837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          Integer.toHexString(j));
14847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
14857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ch ++;
14867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try
14897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
14907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            UCharacter.getCodePoint((char)0xD7ff, (char)0xDC00);
14917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Invalid surrogate characters should not form a " +
14927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  "supplementary");
14937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch(Exception e) {
14947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (char i = 0; i < 0xFFFF; i++) {
14967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (i == 0xFFFE ||
14977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                (i >= 0xD800 && i <= 0xDFFF) ||
14987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                (i >= 0xFDD0 && i <= 0xFDEF)) {
14997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // not a character
15007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                try {
15017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    UCharacter.getCodePoint(i);
15027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Not a character is not a valid codepoint");
15037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } catch (Exception e) {
15047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
15057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
15067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            else {
15077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (UCharacter.getCodePoint(i) != i) {
15087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("A valid codepoint should return itself");
15097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
15107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
15117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
15127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
15137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
15157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * This method is a little different from the type test in icu4c.
15167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    * But combined with testUnicodeData, they basically do the same thing.
15177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    */
15187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestIteration()
15197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
15207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int limit     = 0;
15217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int prevtype  = -1;
15227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int shouldBeDir;
15237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int test[][]={{0x41, UCharacterCategory.UPPERCASE_LETTER},
15247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        {0x308, UCharacterCategory.NON_SPACING_MARK},
15257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        {0xfffe, UCharacterCategory.GENERAL_OTHER_TYPES},
15267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        {0xe0041, UCharacterCategory.FORMAT},
15277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        {0xeffff, UCharacterCategory.UNASSIGNED}};
15287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // default Bidi classes for unassigned code points, from the DerivedBidiClass.txt header
15307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int defaultBidi[][]={
15317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0590, UCharacterDirection.LEFT_TO_RIGHT },
15327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0600, UCharacterDirection.RIGHT_TO_LEFT },
15337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x07C0, UCharacterDirection.RIGHT_TO_LEFT_ARABIC },
15347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x08A0, UCharacterDirection.RIGHT_TO_LEFT },
15357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0900, UCharacterDirection.RIGHT_TO_LEFT_ARABIC },  /* Unicode 6.1 changes U+08A0..U+08FF from R to AL */
15367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x20A0, UCharacterDirection.LEFT_TO_RIGHT },
15377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x20D0, UCharacterDirection.EUROPEAN_NUMBER_TERMINATOR },  /* Unicode 6.3 changes the currency symbols block U+20A0..U+20CF to default to ET not L */
15387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xFB1D, UCharacterDirection.LEFT_TO_RIGHT },
15397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xFB50, UCharacterDirection.RIGHT_TO_LEFT },
15407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xFE00, UCharacterDirection.RIGHT_TO_LEFT_ARABIC },
15417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xFE70, UCharacterDirection.LEFT_TO_RIGHT },
15427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xFF00, UCharacterDirection.RIGHT_TO_LEFT_ARABIC },
15437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x10800, UCharacterDirection.LEFT_TO_RIGHT },
15447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x11000, UCharacterDirection.RIGHT_TO_LEFT },
15457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1E800, UCharacterDirection.LEFT_TO_RIGHT },  /* new default-R range in Unicode 5.2: U+1E800 - U+1EFFF */
15467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1EE00, UCharacterDirection.RIGHT_TO_LEFT },
15477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1EF00, UCharacterDirection.RIGHT_TO_LEFT_ARABIC },  /* Unicode 6.1 changes U+1EE00..U+1EEFF from R to AL */
15487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1F000, UCharacterDirection.RIGHT_TO_LEFT },
15497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x110000, UCharacterDirection.LEFT_TO_RIGHT }
15507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
15517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        RangeValueIterator iterator = UCharacter.getTypeIterator();
15537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        RangeValueIterator.Element result = new RangeValueIterator.Element();
15547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        while (iterator.next(result)) {
15557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (result.start != limit) {
15567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacterIteration failed: Ranges not continuous " +
15577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "0x" + Integer.toHexString(result.start));
15587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
15597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            limit = result.limit;
15617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (result.value == prevtype) {
15627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Type of the next set of enumeration should be different");
15637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
15647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            prevtype = result.value;
15657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = result.start; i < limit; i ++) {
15677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int temptype = UCharacter.getType(i);
15687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (temptype != result.value) {
15697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("UCharacterIteration failed: Codepoint \\u" +
15707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            Integer.toHexString(i) + " should be of type " +
15717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            temptype + " not " + result.value);
15727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
15737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
15747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < test.length; ++ i) {
15767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (result.start <= test[i][0] && test[i][0] < result.limit) {
15777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (result.value != test[i][1]) {
15787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("error: getTypes() has range ["
15797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              + Integer.toHexString(result.start) + ", "
15807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              + Integer.toHexString(result.limit)
15817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              + "] with type " + result.value
15827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              + " instead of ["
15837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              + Integer.toHexString(test[i][0]) + ", "
15847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              + Integer.toHexString(test[i][1]));
15857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
15867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
15877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
15887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // LineBreak.txt specifies:
15907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //   #  - Assigned characters that are not listed explicitly are given the value
15917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //   #    "AL".
15927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //   #  - Unassigned characters are given the value "XX".
15937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //
15947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // PUA characters are listed explicitly with "XX".
15957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Verify that no assigned character has "XX".
15967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (result.value != UCharacterCategory.UNASSIGNED
15977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                && result.value != UCharacterCategory.PRIVATE_USE) {
15987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int c = result.start;
15997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                while (c < result.limit) {
16007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (0 == UCharacter.getIntPropertyValue(c,
16017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                UProperty.LINE_BREAK)) {
16027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        logln("error UProperty.LINE_BREAK(assigned \\u"
16037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                              + Utility.hex(c, 4) + ")=XX");
16047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
16057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ++ c;
16067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
16077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
16087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /*
16107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             * Verify default Bidi classes.
16117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             * For recent Unicode versions, see UCD.html.
16127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             *
16137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             * For older Unicode versions:
16147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             * See table 3-7 "Bidirectional Character Types" in UAX #9.
16157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             * http://www.unicode.org/reports/tr9/
16167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             *
16177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             * See also DerivedBidiClass.txt for Cn code points!
16187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             *
16197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             * Unicode 4.0.1/Public Review Issue #28 (http://www.unicode.org/review/resolved-pri.html)
16207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             * changed some default values.
16217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             * In particular, non-characters and unassigned Default Ignorable Code Points
16227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             * change from L to BN.
16237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             *
16247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             * UCD.html version 4.0.1 does not yet reflect these changes.
16257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             */
16267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (result.value == UCharacterCategory.UNASSIGNED
16277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                || result.value == UCharacterCategory.PRIVATE_USE) {
16287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int c = result.start;
16297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                for (int i = 0; i < defaultBidi.length && c < result.limit;
16307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                     ++ i) {
16317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (c < defaultBidi[i][0]) {
16327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        while (c < result.limit && c < defaultBidi[i][0]) {
16337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            // TODO change to public UCharacter.isNonCharacter(c) once it's available
16347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            if(com.ibm.icu.impl.UCharacterUtility.isNonCharacter(c) || UCharacter.hasBinaryProperty(c, UProperty.DEFAULT_IGNORABLE_CODE_POINT)) {
16357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                shouldBeDir=UCharacter.BOUNDARY_NEUTRAL;
16367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            } else {
16377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                shouldBeDir=defaultBidi[i][1];
16387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
16397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            if (UCharacter.getDirection(c) != shouldBeDir
16417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                || UCharacter.getIntPropertyValue(c,
16427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                          UProperty.BIDI_CLASS)
16437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                   != shouldBeDir) {
16447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                errln("error: getDirection(unassigned/PUA "
16457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                      + Integer.toHexString(c)
16467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                      + ") should be "
16477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                      + shouldBeDir);
16487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
16497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ++ c;
16507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
16517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
16527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
16537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
16547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
16557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        iterator.reset();
16577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (iterator.next(result) == false || result.start != 0) {
16587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.out.println("result " + result.start);
16597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("UCharacterIteration reset() failed");
16607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
16617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
16627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
16647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Testing getAge
16657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
16667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetAge()
16677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
16687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int ages[] = {0x41,    1, 1, 0, 0,
16697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      0xffff,  1, 1, 0, 0,
16707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      0x20ab,  2, 0, 0, 0,
16717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      0x2fffe, 2, 0, 0, 0,
16727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      0x20ac,  2, 1, 0, 0,
16737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      0xfb1d,  3, 0, 0, 0,
16747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      0x3f4,   3, 1, 0, 0,
16757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      0x10300, 3, 1, 0, 0,
16767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      0x220,   3, 2, 0, 0,
16777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      0xff60,  3, 2, 0, 0};
16787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < ages.length; i += 5) {
16797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            VersionInfo age = UCharacter.getAge(ages[i]);
16807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (age != VersionInfo.getInstance(ages[i + 1], ages[i + 2],
16817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                               ages[i + 3], ages[i + 4])) {
16827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("error: getAge(\\u" + Integer.toHexString(ages[i]) +
16837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      ") == " + age.toString() + " instead of " +
16847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      ages[i + 1] + "." + ages[i + 2] + "." + ages[i + 3] +
16857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      "." + ages[i + 4]);
16867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
16877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
16887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] valid_tests = {
16907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.MIN_VALUE, UCharacter.MIN_VALUE+1,
16917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.MAX_VALUE-1, UCharacter.MAX_VALUE};
16927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] invalid_tests = {
16937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.MIN_VALUE-1, UCharacter.MIN_VALUE-2,
16947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.MAX_VALUE+1, UCharacter.MAX_VALUE+2};
16957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
16967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i< valid_tests.length; i++){
16977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
16987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.getAge(valid_tests[i]);
16997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){
17007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.getAge(int) was not suppose to have " +
17017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "an exception. Value passed: " + valid_tests[i]);
17027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
17037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i< invalid_tests.length; i++){
17067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
17077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.getAge(invalid_tests[i]);
17087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.getAge(int) was suppose to have " +
17097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "an exception. Value passed: " + invalid_tests[i]);
17107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){
17117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
17127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
17147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
17167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test binary non core properties
17177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
17187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestAdditionalProperties()
17197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
17207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // test data for hasBinaryProperty()
17217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int props[][] = { // code point, property
17227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0627, UProperty.ALPHABETIC, 1 },
17237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1034a, UProperty.ALPHABETIC, 1 },
17247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2028, UProperty.ALPHABETIC, 0 },
17257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0066, UProperty.ASCII_HEX_DIGIT, 1 },
17277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0067, UProperty.ASCII_HEX_DIGIT, 0 },
17287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x202c, UProperty.BIDI_CONTROL, 1 },
17307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x202f, UProperty.BIDI_CONTROL, 0 },
17317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x003c, UProperty.BIDI_MIRRORED, 1 },
17337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x003d, UProperty.BIDI_MIRRORED, 0 },
17347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* see Unicode Corrigendum #6 at http://www.unicode.org/versions/corrigendum6.html */
17367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2018, UProperty.BIDI_MIRRORED, 0 },
17377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x201d, UProperty.BIDI_MIRRORED, 0 },
17387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x201f, UProperty.BIDI_MIRRORED, 0 },
17397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x301e, UProperty.BIDI_MIRRORED, 0 },
17407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x058a, UProperty.DASH, 1 },
17427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x007e, UProperty.DASH, 0 },
17437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0c4d, UProperty.DIACRITIC, 1 },
17457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x3000, UProperty.DIACRITIC, 0 },
17467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0e46, UProperty.EXTENDER, 1 },
17487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0020, UProperty.EXTENDER, 0 },
17497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xfb1d, UProperty.FULL_COMPOSITION_EXCLUSION, 1 },
17517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1d15f, UProperty.FULL_COMPOSITION_EXCLUSION, 1 },
17527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xfb1e, UProperty.FULL_COMPOSITION_EXCLUSION, 0 },
17537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x110a, UProperty.NFD_INERT, 1 },      /* Jamo L */
17557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0308, UProperty.NFD_INERT, 0 },
17567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1164, UProperty.NFKD_INERT, 1 },     /* Jamo V */
17587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1d79d, UProperty.NFKD_INERT, 0 },   /* math compat version of xi */
17597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0021, UProperty.NFC_INERT, 1 },      /* ! */
17617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0061, UProperty.NFC_INERT, 0 },     /* a */
17627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x00e4, UProperty.NFC_INERT, 0 },     /* a-umlaut */
17637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0102, UProperty.NFC_INERT, 0 },     /* a-breve */
17647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xac1c, UProperty.NFC_INERT, 0 },     /* Hangul LV */
17657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xac1d, UProperty.NFC_INERT, 1 },      /* Hangul LVT */
17667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1d79d, UProperty.NFKC_INERT, 0 },   /* math compat version of xi */
17687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2a6d6, UProperty.NFKC_INERT, 1 },    /* Han, last of CJK ext. B */
17697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x00e4, UProperty.SEGMENT_STARTER, 1 },
17717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0308, UProperty.SEGMENT_STARTER, 0 },
17727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x110a, UProperty.SEGMENT_STARTER, 1 }, /* Jamo L */
17737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1164, UProperty.SEGMENT_STARTER, 0 },/* Jamo V */
17747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xac1c, UProperty.SEGMENT_STARTER, 1 }, /* Hangul LV */
17757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xac1d, UProperty.SEGMENT_STARTER, 1 }, /* Hangul LVT */
17767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0044, UProperty.HEX_DIGIT, 1 },
17787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xff46, UProperty.HEX_DIGIT, 1 },
17797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0047, UProperty.HEX_DIGIT, 0 },
17807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x30fb, UProperty.HYPHEN, 1 },
17827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xfe58, UProperty.HYPHEN, 0 },
17837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2172, UProperty.ID_CONTINUE, 1 },
17857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0307, UProperty.ID_CONTINUE, 1 },
17867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x005c, UProperty.ID_CONTINUE, 0 },
17877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2172, UProperty.ID_START, 1 },
17897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x007a, UProperty.ID_START, 1 },
17907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0039, UProperty.ID_START, 0 },
17917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x4db5, UProperty.IDEOGRAPHIC, 1 },
17937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2f999, UProperty.IDEOGRAPHIC, 1 },
17947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2f99, UProperty.IDEOGRAPHIC, 0 },
17957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x200c, UProperty.JOIN_CONTROL, 1 },
17977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2029, UProperty.JOIN_CONTROL, 0 },
17987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1d7bc, UProperty.LOWERCASE, 1 },
18007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0345, UProperty.LOWERCASE, 1 },
18017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0030, UProperty.LOWERCASE, 0 },
18027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1d7a9, UProperty.MATH, 1 },
18047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2135, UProperty.MATH, 1 },
18057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0062, UProperty.MATH, 0 },
18067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xfde1, UProperty.NONCHARACTER_CODE_POINT, 1 },
18087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x10ffff, UProperty.NONCHARACTER_CODE_POINT, 1 },
18097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x10fffd, UProperty.NONCHARACTER_CODE_POINT, 0 },
18107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0022, UProperty.QUOTATION_MARK, 1 },
18127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xff62, UProperty.QUOTATION_MARK, 1 },
18137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xd840, UProperty.QUOTATION_MARK, 0 },
18147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x061f, UProperty.TERMINAL_PUNCTUATION, 1 },
18167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xe003f, UProperty.TERMINAL_PUNCTUATION, 0 },
18177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1d44a, UProperty.UPPERCASE, 1 },
18197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2162, UProperty.UPPERCASE, 1 },
18207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0345, UProperty.UPPERCASE, 0 },
18217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0020, UProperty.WHITE_SPACE, 1 },
18237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x202f, UProperty.WHITE_SPACE, 1 },
18247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x3001, UProperty.WHITE_SPACE, 0 },
18257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0711, UProperty.XID_CONTINUE, 1 },
18277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1d1aa, UProperty.XID_CONTINUE, 1 },
18287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x007c, UProperty.XID_CONTINUE, 0 },
18297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x16ee, UProperty.XID_START, 1 },
18317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x23456, UProperty.XID_START, 1 },
18327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1d1aa, UProperty.XID_START, 0 },
18337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /*
18357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             * Version break:
18367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             * The following properties are only supported starting with the
18377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             * Unicode version indicated in the second field.
18387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             */
18397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { -1, 0x320, 0 },
18407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x180c, UProperty.DEFAULT_IGNORABLE_CODE_POINT, 1 },
18427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xfe02, UProperty.DEFAULT_IGNORABLE_CODE_POINT, 1 },
18437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1801, UProperty.DEFAULT_IGNORABLE_CODE_POINT, 0 },
18447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0149, UProperty.DEPRECATED, 1 },         /* changed in Unicode 5.2 */
18467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0341, UProperty.DEPRECATED, 0 },        /* changed in Unicode 5.2 */
1847bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            { 0xe0001, UProperty.DEPRECATED, 1 },       /* Changed from Unicode 5 to 5.1 */
18487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xe0100, UProperty.DEPRECATED, 0 },
18497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x00a0, UProperty.GRAPHEME_BASE, 1 },
18517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0a4d, UProperty.GRAPHEME_BASE, 0 },
18527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xff9d, UProperty.GRAPHEME_BASE, 1 },
18537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xff9f, UProperty.GRAPHEME_BASE, 0 },      /* changed from Unicode 3.2 to 4  and again 5 to 5.1 */
18547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0300, UProperty.GRAPHEME_EXTEND, 1 },
18567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xff9d, UProperty.GRAPHEME_EXTEND, 0 },
18577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xff9f, UProperty.GRAPHEME_EXTEND, 1 },   /* changed from Unicode 3.2 to 4 and again 5 to 5.1 */
18587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0603, UProperty.GRAPHEME_EXTEND, 0 },
18597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0a4d, UProperty.GRAPHEME_LINK, 1 },
18617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xff9f, UProperty.GRAPHEME_LINK, 0 },
18627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2ff7, UProperty.IDS_BINARY_OPERATOR, 1 },
18647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2ff3, UProperty.IDS_BINARY_OPERATOR, 0 },
18657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2ff3, UProperty.IDS_TRINARY_OPERATOR, 1 },
18677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2f03, UProperty.IDS_TRINARY_OPERATOR, 0 },
18687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0ec1, UProperty.LOGICAL_ORDER_EXCEPTION, 1 },
18707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xdcba, UProperty.LOGICAL_ORDER_EXCEPTION, 0 },
18717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2e9b, UProperty.RADICAL, 1 },
18737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x4e00, UProperty.RADICAL, 0 },
18747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x012f, UProperty.SOFT_DOTTED, 1 },
18767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0049, UProperty.SOFT_DOTTED, 0 },
18777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xfa11, UProperty.UNIFIED_IDEOGRAPH, 1 },
18797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xfa12, UProperty.UNIFIED_IDEOGRAPH, 0 },
18807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { -1, 0x401, 0 }, /* version break for Unicode 4.0.1 */
18827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x002e, UProperty.S_TERM, 1 },
18847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0061, UProperty.S_TERM, 0 },
18857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x180c, UProperty.VARIATION_SELECTOR, 1 },
18877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xfe03, UProperty.VARIATION_SELECTOR, 1 },
18887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xe01ef, UProperty.VARIATION_SELECTOR, 1 },
18897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xe0200, UProperty.VARIATION_SELECTOR, 0 },
18907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* enum/integer type properties */
18927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* test default Bidi classes for unassigned code points */
18937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0590, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT },
18947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x05cf, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT },
18957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x05ed, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT },
18967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x07f2, UProperty.BIDI_CLASS, UCharacterDirection.DIR_NON_SPACING_MARK }, /* Nko, new in Unicode 5.0 */
18977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x07fe, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT }, /* unassigned R */
18987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x089f, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT },
18997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xfb37, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT },
19007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xfb42, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT },
19017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x10806, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT },
19027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x10909, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT },
19037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x10fe4, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT },
19047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x061d, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT_ARABIC },
19067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x063f, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT_ARABIC },
19077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x070e, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT_ARABIC },
19087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0775, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT_ARABIC },
19097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xfbc2, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT_ARABIC },
19107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xfd90, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT_ARABIC },
19117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xfefe, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT_ARABIC },
19127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x02AF, UProperty.BLOCK, UCharacter.UnicodeBlock.IPA_EXTENSIONS.getID() },
19147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0C4E, UProperty.BLOCK, UCharacter.UnicodeBlock.TELUGU.getID()},
19157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x155A, UProperty.BLOCK, UCharacter.UnicodeBlock.UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS.getID() },
19167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1717, UProperty.BLOCK, UCharacter.UnicodeBlock.TAGALOG.getID() },
19177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1900, UProperty.BLOCK, UCharacter.UnicodeBlock.LIMBU.getID() },
19187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1CBF, UProperty.BLOCK, UCharacter.UnicodeBlock.NO_BLOCK.getID()},
19197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x3040, UProperty.BLOCK, UCharacter.UnicodeBlock.HIRAGANA.getID()},
19207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1D0FF, UProperty.BLOCK, UCharacter.UnicodeBlock.BYZANTINE_MUSICAL_SYMBOLS.getID()},
19217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x50000, UProperty.BLOCK, UCharacter.UnicodeBlock.NO_BLOCK.getID() },
19227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xEFFFF, UProperty.BLOCK, UCharacter.UnicodeBlock.NO_BLOCK.getID() },
19237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x10D0FF, UProperty.BLOCK, UCharacter.UnicodeBlock.SUPPLEMENTARY_PRIVATE_USE_AREA_B.getID() },
19247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* UProperty.CANONICAL_COMBINING_CLASS tested for assigned characters in TestUnicodeData() */
19267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xd7d7, UProperty.CANONICAL_COMBINING_CLASS, 0 },
19277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x00A0, UProperty.DECOMPOSITION_TYPE, UCharacter.DecompositionType.NOBREAK },
19297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x00A8, UProperty.DECOMPOSITION_TYPE, UCharacter.DecompositionType.COMPAT },
19307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x00bf, UProperty.DECOMPOSITION_TYPE, UCharacter.DecompositionType.NONE },
19317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x00c0, UProperty.DECOMPOSITION_TYPE, UCharacter.DecompositionType.CANONICAL },
19327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1E9B, UProperty.DECOMPOSITION_TYPE, UCharacter.DecompositionType.CANONICAL },
19337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xBCDE, UProperty.DECOMPOSITION_TYPE, UCharacter.DecompositionType.CANONICAL },
19347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xFB5D, UProperty.DECOMPOSITION_TYPE, UCharacter.DecompositionType.MEDIAL },
19357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1D736, UProperty.DECOMPOSITION_TYPE, UCharacter.DecompositionType.FONT },
19367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xe0033, UProperty.DECOMPOSITION_TYPE, UCharacter.DecompositionType.NONE },
19377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0009, UProperty.EAST_ASIAN_WIDTH, UCharacter.EastAsianWidth.NEUTRAL },
19397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0020, UProperty.EAST_ASIAN_WIDTH, UCharacter.EastAsianWidth.NARROW },
19407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x00B1, UProperty.EAST_ASIAN_WIDTH, UCharacter.EastAsianWidth.AMBIGUOUS },
19417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x20A9, UProperty.EAST_ASIAN_WIDTH, UCharacter.EastAsianWidth.HALFWIDTH },
19427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2FFB, UProperty.EAST_ASIAN_WIDTH, UCharacter.EastAsianWidth.WIDE },
19437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x3000, UProperty.EAST_ASIAN_WIDTH, UCharacter.EastAsianWidth.FULLWIDTH },
19447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x35bb, UProperty.EAST_ASIAN_WIDTH, UCharacter.EastAsianWidth.WIDE },
19457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x58bd, UProperty.EAST_ASIAN_WIDTH, UCharacter.EastAsianWidth.WIDE },
19467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xD7A3, UProperty.EAST_ASIAN_WIDTH, UCharacter.EastAsianWidth.WIDE },
19477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xEEEE, UProperty.EAST_ASIAN_WIDTH, UCharacter.EastAsianWidth.AMBIGUOUS },
19487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1D198, UProperty.EAST_ASIAN_WIDTH, UCharacter.EastAsianWidth.NEUTRAL },
19497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x20000, UProperty.EAST_ASIAN_WIDTH, UCharacter.EastAsianWidth.WIDE },
19507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2F8C7, UProperty.EAST_ASIAN_WIDTH, UCharacter.EastAsianWidth.WIDE },
19517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x3a5bd, UProperty.EAST_ASIAN_WIDTH, UCharacter.EastAsianWidth.WIDE },
19527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x5a5bd, UProperty.EAST_ASIAN_WIDTH, UCharacter.EastAsianWidth.NEUTRAL },
19537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xFEEEE, UProperty.EAST_ASIAN_WIDTH, UCharacter.EastAsianWidth.AMBIGUOUS },
19547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x10EEEE, UProperty.EAST_ASIAN_WIDTH, UCharacter.EastAsianWidth.AMBIGUOUS },
19557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* UProperty.GENERAL_CATEGORY tested for assigned characters in TestUnicodeData() */
19577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xd7c7, UProperty.GENERAL_CATEGORY, 0 },
19587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xd7d7, UProperty.GENERAL_CATEGORY, UCharacterEnums.ECharacterCategory.OTHER_LETTER },     /* changed in Unicode 5.2 */
19597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0444, UProperty.JOINING_GROUP, UCharacter.JoiningGroup.NO_JOINING_GROUP },
19617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0639, UProperty.JOINING_GROUP, UCharacter.JoiningGroup.AIN },
19627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x072A, UProperty.JOINING_GROUP, UCharacter.JoiningGroup.DALATH_RISH },
19637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0647, UProperty.JOINING_GROUP, UCharacter.JoiningGroup.HEH },
19647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x06C1, UProperty.JOINING_GROUP, UCharacter.JoiningGroup.HEH_GOAL },
19657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x200C, UProperty.JOINING_TYPE, UCharacter.JoiningType.NON_JOINING },
19677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x200D, UProperty.JOINING_TYPE, UCharacter.JoiningType.JOIN_CAUSING },
19687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0639, UProperty.JOINING_TYPE, UCharacter.JoiningType.DUAL_JOINING },
19697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0640, UProperty.JOINING_TYPE, UCharacter.JoiningType.JOIN_CAUSING },
19707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x06C3, UProperty.JOINING_TYPE, UCharacter.JoiningType.RIGHT_JOINING },
19717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0300, UProperty.JOINING_TYPE, UCharacter.JoiningType.TRANSPARENT },
19727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x070F, UProperty.JOINING_TYPE, UCharacter.JoiningType.TRANSPARENT },
19737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xe0033, UProperty.JOINING_TYPE, UCharacter.JoiningType.TRANSPARENT },
19747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* TestUnicodeData() verifies that no assigned character has "XX" (unknown) */
19767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xe7e7, UProperty.LINE_BREAK, UCharacter.LineBreak.UNKNOWN },
19777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x10fffd, UProperty.LINE_BREAK, UCharacter.LineBreak.UNKNOWN },
19787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0028, UProperty.LINE_BREAK, UCharacter.LineBreak.OPEN_PUNCTUATION },
19797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x232A, UProperty.LINE_BREAK, UCharacter.LineBreak.CLOSE_PUNCTUATION },
19807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x3401, UProperty.LINE_BREAK, UCharacter.LineBreak.IDEOGRAPHIC },
19817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x4e02, UProperty.LINE_BREAK, UCharacter.LineBreak.IDEOGRAPHIC },
19827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x20004, UProperty.LINE_BREAK, UCharacter.LineBreak.IDEOGRAPHIC },
19837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xf905, UProperty.LINE_BREAK, UCharacter.LineBreak.IDEOGRAPHIC },
19847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xdb7e, UProperty.LINE_BREAK, UCharacter.LineBreak.SURROGATE },
19857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xdbfd, UProperty.LINE_BREAK, UCharacter.LineBreak.SURROGATE },
19867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xdffc, UProperty.LINE_BREAK, UCharacter.LineBreak.SURROGATE },
19877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2762, UProperty.LINE_BREAK, UCharacter.LineBreak.EXCLAMATION },
19887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x002F, UProperty.LINE_BREAK, UCharacter.LineBreak.BREAK_SYMBOLS },
19897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1D49C, UProperty.LINE_BREAK, UCharacter.LineBreak.ALPHABETIC },
19907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1731, UProperty.LINE_BREAK, UCharacter.LineBreak.ALPHABETIC },
19917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* UProperty.NUMERIC_TYPE tested in TestNumericProperties() */
19937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* UProperty.SCRIPT tested in TestUScriptCodeAPI() */
19957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x10ff, UProperty.HANGUL_SYLLABLE_TYPE, 0 },
19977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1100, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.LEADING_JAMO },
19987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1111, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.LEADING_JAMO },
19997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1159, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.LEADING_JAMO },
20007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x115a, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.LEADING_JAMO },     /* changed in Unicode 5.2 */
20017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x115e, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.LEADING_JAMO },     /* changed in Unicode 5.2 */
20027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x115f, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.LEADING_JAMO },
20037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xa95f, UProperty.HANGUL_SYLLABLE_TYPE, 0 },
20057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xa960, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.LEADING_JAMO },     /* changed in Unicode 5.2 */
20067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xa97c, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.LEADING_JAMO },     /* changed in Unicode 5.2 */
20077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xa97d, UProperty.HANGUL_SYLLABLE_TYPE, 0 },
20087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1160, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.VOWEL_JAMO },
20107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1161, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.VOWEL_JAMO },
20117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1172, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.VOWEL_JAMO },
20127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x11a2, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.VOWEL_JAMO },
20137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x11a3, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.VOWEL_JAMO },       /* changed in Unicode 5.2 */
20147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x11a7, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.VOWEL_JAMO },       /* changed in Unicode 5.2 */
20157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xd7af, UProperty.HANGUL_SYLLABLE_TYPE, 0 },
20177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xd7b0, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.VOWEL_JAMO },       /* changed in Unicode 5.2 */
20187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xd7c6, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.VOWEL_JAMO },       /* changed in Unicode 5.2 */
20197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xd7c7, UProperty.HANGUL_SYLLABLE_TYPE, 0 },
20207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x11a8, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.TRAILING_JAMO },
20227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x11b8, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.TRAILING_JAMO },
20237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x11c8, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.TRAILING_JAMO },
20247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x11f9, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.TRAILING_JAMO },
20257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x11fa, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.TRAILING_JAMO },    /* changed in Unicode 5.2 */
20267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x11ff, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.TRAILING_JAMO },    /* changed in Unicode 5.2 */
20277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1200, UProperty.HANGUL_SYLLABLE_TYPE, 0 },
20287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xd7ca, UProperty.HANGUL_SYLLABLE_TYPE, 0 },
20307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xd7cb, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.TRAILING_JAMO },    /* changed in Unicode 5.2 */
20317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xd7fb, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.TRAILING_JAMO },    /* changed in Unicode 5.2 */
20327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xd7fc, UProperty.HANGUL_SYLLABLE_TYPE, 0 },
20337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xac00, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.LV_SYLLABLE },
20357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xac1c, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.LV_SYLLABLE },
20367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xc5ec, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.LV_SYLLABLE },
20377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xd788, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.LV_SYLLABLE },
20387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xac01, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.LVT_SYLLABLE },
20407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xac1b, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.LVT_SYLLABLE },
20417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xac1d, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.LVT_SYLLABLE },
20427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xc5ee, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.LVT_SYLLABLE },
20437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xd7a3, UProperty.HANGUL_SYLLABLE_TYPE, UCharacter.HangulSyllableType.LVT_SYLLABLE },
20447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xd7a4, UProperty.HANGUL_SYLLABLE_TYPE, 0 },
20467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { -1, 0x410, 0 }, /* version break for Unicode 4.1 */
20487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x00d7, UProperty.PATTERN_SYNTAX, 1 },
20507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xfe45, UProperty.PATTERN_SYNTAX, 1 },
20517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0061, UProperty.PATTERN_SYNTAX, 0 },
20527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0020, UProperty.PATTERN_WHITE_SPACE, 1 },
20547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0085, UProperty.PATTERN_WHITE_SPACE, 1 },
20557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x200f, UProperty.PATTERN_WHITE_SPACE, 1 },
20567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x00a0, UProperty.PATTERN_WHITE_SPACE, 0 },
20577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x3000, UProperty.PATTERN_WHITE_SPACE, 0 },
20587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1d200, UProperty.BLOCK, UCharacter.UnicodeBlock.ANCIENT_GREEK_MUSICAL_NOTATION_ID },
20607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2c8e,  UProperty.BLOCK, UCharacter.UnicodeBlock.COPTIC_ID },
20617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xfe17,  UProperty.BLOCK, UCharacter.UnicodeBlock.VERTICAL_FORMS_ID },
20627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1a00,  UProperty.SCRIPT, UScript.BUGINESE },
20647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2cea,  UProperty.SCRIPT, UScript.COPTIC },
20657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xa82b,  UProperty.SCRIPT, UScript.SYLOTI_NAGRI },
20667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x103d0, UProperty.SCRIPT, UScript.OLD_PERSIAN },
20677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xcc28, UProperty.LINE_BREAK, UCharacter.LineBreak.H2 },
20697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xcc29, UProperty.LINE_BREAK, UCharacter.LineBreak.H3 },
20707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xac03, UProperty.LINE_BREAK, UCharacter.LineBreak.H3 },
20717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x115f, UProperty.LINE_BREAK, UCharacter.LineBreak.JL },
20727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x11aa, UProperty.LINE_BREAK, UCharacter.LineBreak.JT },
20737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x11a1, UProperty.LINE_BREAK, UCharacter.LineBreak.JV },
20747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xb2c9, UProperty.GRAPHEME_CLUSTER_BREAK, UCharacter.GraphemeClusterBreak.LVT },
20767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x036f, UProperty.GRAPHEME_CLUSTER_BREAK, UCharacter.GraphemeClusterBreak.EXTEND },
20777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0000, UProperty.GRAPHEME_CLUSTER_BREAK, UCharacter.GraphemeClusterBreak.CONTROL },
20787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1160, UProperty.GRAPHEME_CLUSTER_BREAK, UCharacter.GraphemeClusterBreak.V },
20797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x05f4, UProperty.WORD_BREAK, UCharacter.WordBreak.MIDLETTER },
20817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x4ef0, UProperty.WORD_BREAK, UCharacter.WordBreak.OTHER },
20827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x19d9, UProperty.WORD_BREAK, UCharacter.WordBreak.NUMERIC },
20837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2044, UProperty.WORD_BREAK, UCharacter.WordBreak.MIDNUM },
20847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xfffd, UProperty.SENTENCE_BREAK, UCharacter.SentenceBreak.OTHER },
20867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1ffc, UProperty.SENTENCE_BREAK, UCharacter.SentenceBreak.UPPER },
20877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xff63, UProperty.SENTENCE_BREAK, UCharacter.SentenceBreak.CLOSE },
20887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2028, UProperty.SENTENCE_BREAK, UCharacter.SentenceBreak.SEP },
20897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { -1, 0x520, 0 }, /* version break for Unicode 5.2 */
20917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* unassigned code points in new default Bidi R blocks */
20937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1ede4, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT },
20947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1efe4, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT },
20957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* test some script codes >127 */
20977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xa6e6,  UProperty.SCRIPT, UScript.BAMUM },
20987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xa4d0,  UProperty.SCRIPT, UScript.LISU },
20997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x10a7f,  UProperty.SCRIPT, UScript.OLD_SOUTH_ARABIAN },
21007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { -1, 0x600, 0 }, /* version break for Unicode 6.0 */
21027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* value changed in Unicode 6.0 */
21047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x06C3, UProperty.JOINING_GROUP, UCharacter.JoiningGroup.TEH_MARBUTA_GOAL },
21057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { -1, 0x610, 0 }, /* version break for Unicode 6.1 */
21077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* unassigned code points in new/changed default Bidi AL blocks */
21097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x08ba, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT_ARABIC },
21107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1eee4, UProperty.BIDI_CLASS, UCharacterDirection.RIGHT_TO_LEFT_ARABIC },
21117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { -1, 0x630, 0 }, /* version break for Unicode 6.3 */
21137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* unassigned code points in the currency symbols block now default to ET */
21157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x20C0, UProperty.BIDI_CLASS, UCharacterDirection.EUROPEAN_NUMBER_TERMINATOR },
21167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x20CF, UProperty.BIDI_CLASS, UCharacterDirection.EUROPEAN_NUMBER_TERMINATOR },
21177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* new property in Unicode 6.3 */
21197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0027, UProperty.BIDI_PAIRED_BRACKET_TYPE, UCharacter.BidiPairedBracketType.NONE },
21207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0028, UProperty.BIDI_PAIRED_BRACKET_TYPE, UCharacter.BidiPairedBracketType.OPEN },
21217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0029, UProperty.BIDI_PAIRED_BRACKET_TYPE, UCharacter.BidiPairedBracketType.CLOSE },
21227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xFF5C, UProperty.BIDI_PAIRED_BRACKET_TYPE, UCharacter.BidiPairedBracketType.NONE },
21237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xFF5B, UProperty.BIDI_PAIRED_BRACKET_TYPE, UCharacter.BidiPairedBracketType.OPEN },
21247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xFF5D, UProperty.BIDI_PAIRED_BRACKET_TYPE, UCharacter.BidiPairedBracketType.CLOSE },
21257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { -1, 0x700, 0 }, /* version break for Unicode 7.0 */
21277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* new character range with Joining_Group values */
21297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x10ABF, UProperty.JOINING_GROUP, UCharacter.JoiningGroup.NO_JOINING_GROUP },
21307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x10AC0, UProperty.JOINING_GROUP, UCharacter.JoiningGroup.MANICHAEAN_ALEPH },
21317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x10AC1, UProperty.JOINING_GROUP, UCharacter.JoiningGroup.MANICHAEAN_BETH },
21327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x10AEF, UProperty.JOINING_GROUP, UCharacter.JoiningGroup.MANICHAEAN_HUNDRED },
21337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x10AF0, UProperty.JOINING_GROUP, UCharacter.JoiningGroup.NO_JOINING_GROUP },
21347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* undefined UProperty values */
21367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x61, 0x4a7, 0 },
21377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x234bc, 0x15ed, 0 }
21387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
21397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (UCharacter.getIntPropertyMinValue(UProperty.DASH) != 0
21427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || UCharacter.getIntPropertyMinValue(UProperty.BIDI_CLASS) != 0
21437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || UCharacter.getIntPropertyMinValue(UProperty.BLOCK)!= 0  /* j2478 */
21447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || UCharacter.getIntPropertyMinValue(UProperty.SCRIPT)!= 0 /* JB#2410 */
21457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || UCharacter.getIntPropertyMinValue(0x2345) != 0) {
21467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMinValue() wrong");
21477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if( UCharacter.getIntPropertyMaxValue(UProperty.DASH)!=1) {
21507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMaxValue(UProperty.DASH) wrong\n");
21517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if( UCharacter.getIntPropertyMaxValue(UProperty.ID_CONTINUE)!=1) {
21537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMaxValue(UProperty.ID_CONTINUE) wrong\n");
21547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if( UCharacter.getIntPropertyMaxValue(UProperty.BINARY_LIMIT-1)!=1) {
21567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMaxValue(UProperty.BINARY_LIMIT-1) wrong\n");
21577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if( UCharacter.getIntPropertyMaxValue(UProperty.BIDI_CLASS)!=UCharacterDirection.CHAR_DIRECTION_COUNT-1 ) {
21607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMaxValue(UProperty.BIDI_CLASS) wrong\n");
21617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if( UCharacter.getIntPropertyMaxValue(UProperty.BLOCK)!=UCharacter.UnicodeBlock.COUNT-1 ) {
21637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMaxValue(UProperty.BLOCK) wrong\n");
21647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(UCharacter.getIntPropertyMaxValue(UProperty.LINE_BREAK)!=UCharacter.LineBreak.COUNT-1) {
21667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMaxValue(UProperty.LINE_BREAK) wrong\n");
21677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(UCharacter.getIntPropertyMaxValue(UProperty.SCRIPT)!=UScript.CODE_LIMIT-1) {
21697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMaxValue(UProperty.SCRIPT) wrong\n");
21707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(UCharacter.getIntPropertyMaxValue(UProperty.NUMERIC_TYPE)!=UCharacter.NumericType.COUNT-1) {
21727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMaxValue(UProperty.NUMERIC_TYPE) wrong\n");
21737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(UCharacter.getIntPropertyMaxValue(UProperty.GENERAL_CATEGORY)!=UCharacterCategory.CHAR_CATEGORY_COUNT-1) {
21757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMaxValue(UProperty.GENERAL_CATEGORY) wrong\n");
21767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(UCharacter.getIntPropertyMaxValue(UProperty.HANGUL_SYLLABLE_TYPE)!=UCharacter.HangulSyllableType.COUNT-1) {
21787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMaxValue(UProperty.HANGUL_SYLLABLE_TYPE) wrong\n");
21797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(UCharacter.getIntPropertyMaxValue(UProperty.GRAPHEME_CLUSTER_BREAK)!=UCharacter.GraphemeClusterBreak.COUNT-1) {
21817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMaxValue(UProperty.GRAPHEME_CLUSTER_BREAK) wrong\n");
21827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(UCharacter.getIntPropertyMaxValue(UProperty.SENTENCE_BREAK)!=UCharacter.SentenceBreak.COUNT-1) {
21847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMaxValue(UProperty.SENTENCE_BREAK) wrong\n");
21857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(UCharacter.getIntPropertyMaxValue(UProperty.WORD_BREAK)!=UCharacter.WordBreak.COUNT-1) {
21877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMaxValue(UProperty.WORD_BREAK) wrong\n");
21887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(UCharacter.getIntPropertyMaxValue(UProperty.BIDI_PAIRED_BRACKET_TYPE)!=UCharacter.BidiPairedBracketType.COUNT-1) {
21907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMaxValue(UProperty.BIDI_PAIRED_BRACKET_TYPE) wrong\n");
21917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*JB#2410*/
21937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if( UCharacter.getIntPropertyMaxValue(0x2345)!=-1) {
21947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMaxValue(0x2345) wrong\n");
21957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if( UCharacter.getIntPropertyMaxValue(UProperty.DECOMPOSITION_TYPE) !=  (UCharacter.DecompositionType.COUNT - 1)) {
21977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMaxValue(UProperty.DECOMPOSITION_TYPE) wrong\n");
21987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if( UCharacter.getIntPropertyMaxValue(UProperty.JOINING_GROUP) !=   (UCharacter.JoiningGroup.COUNT -1)) {
22007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMaxValue(UProperty.JOINING_GROUP) wrong\n");
22017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
22027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if( UCharacter.getIntPropertyMaxValue(UProperty.JOINING_TYPE) !=  (UCharacter.JoiningType.COUNT -1)) {
22037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMaxValue(UProperty.JOINING_TYPE) wrong\n");
22047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
22057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if( UCharacter.getIntPropertyMaxValue(UProperty.EAST_ASIAN_WIDTH) !=  (UCharacter.EastAsianWidth.COUNT -1)) {
22067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMaxValue(UProperty.EAST_ASIAN_WIDTH) wrong\n");
22077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
22087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
22097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        VersionInfo version = UCharacter.getUnicodeVersion();
22107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
22117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // test hasBinaryProperty()
22127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < props.length; ++ i) {
22137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int which = props[i][1];
22147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (props[i][0] < 0) {
22157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (version.compareTo(VersionInfo.getInstance(which >> 8,
22167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                          (which >> 4) & 0xF,
22177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                          which & 0xF,
22187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                          0)) < 0) {
22197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
22207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
22217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                continue;
22227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
22237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String whichName;
22247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
22257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                whichName = UCharacter.getPropertyName(which, UProperty.NameChoice.LONG);
22267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(IllegalArgumentException e) {
22277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // There are intentionally invalid property integer values ("which").
22287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // Catch and ignore the exception from getPropertyName().
22297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                whichName = "undefined UProperty value";
22307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
22317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            boolean expect = true;
22327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (props[i][2] == 0) {
22337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                expect = false;
22347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
22357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (which < UProperty.INT_START) {
22367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (UCharacter.hasBinaryProperty(props[i][0], which)
22377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    != expect) {
22387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("error: UCharacter.hasBinaryProperty(U+" +
22397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            Utility.hex(props[i][0], 4) + ", " +
22407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          whichName + ") has an error, expected=" + expect);
22417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
22427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
22437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
22447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int retVal = UCharacter.getIntPropertyValue(props[i][0], which);
22457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (retVal != props[i][2]) {
22467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("error: UCharacter.getIntPropertyValue(U+" +
22477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      Utility.hex(props[i][0], 4) +
22487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      ", " + whichName + ") is wrong, expected="
22497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      + props[i][2] + " actual=" + retVal);
22507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
22517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
22527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // test separate functions, too
22537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            switch (which) {
22547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            case UProperty.ALPHABETIC:
22557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (UCharacter.isUAlphabetic(props[i][0]) != expect) {
22567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("error: UCharacter.isUAlphabetic(\\u" +
22577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          Integer.toHexString(props[i][0]) +
22587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          ") is wrong expected " + props[i][2]);
22597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
22607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
22617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            case UProperty.LOWERCASE:
22627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (UCharacter.isULowercase(props[i][0]) != expect) {
22637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("error: UCharacter.isULowercase(\\u" +
22647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          Integer.toHexString(props[i][0]) +
22657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          ") is wrong expected " +props[i][2]);
22667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
22677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
22687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            case UProperty.UPPERCASE:
22697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (UCharacter.isUUppercase(props[i][0]) != expect) {
22707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("error: UCharacter.isUUppercase(\\u" +
22717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          Integer.toHexString(props[i][0]) +
22727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          ") is wrong expected " + props[i][2]);
22737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
22747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
22757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            case UProperty.WHITE_SPACE:
22767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (UCharacter.isUWhiteSpace(props[i][0]) != expect) {
22777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("error: UCharacter.isUWhiteSpace(\\u" +
22787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          Integer.toHexString(props[i][0]) +
22797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          ") is wrong expected " + props[i][2]);
22807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
22817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
22827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            default:
22837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                break;
22847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
22857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
22867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
22877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
22887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestNumericProperties()
22897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
22907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // see UnicodeData.txt, DerivedNumericValues.txt
22917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double values[][] = {
22927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Code point, numeric type, numeric value.
22937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // If a fourth value is specified, it is the getNumericValue().
22947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Otherwise it is expected to be the same as the getUnicodeNumericValue(),
22957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // where UCharacter.NO_NUMERIC_VALUE is turned into -1.
22967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // getNumericValue() returns -2 if the code point has a value
22977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // which is not a non-negative integer. (This is mostly auto-converted to -2.)
22987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0F33, UCharacter.NumericType.NUMERIC, -1./2. },
22997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0C66, UCharacter.NumericType.DECIMAL, 0 },
23007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x96f6, UCharacter.NumericType.NUMERIC, 0 },
23017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xa833, UCharacter.NumericType.NUMERIC, 1./16. },
23027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2152, UCharacter.NumericType.NUMERIC, 1./10. },
23037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2151, UCharacter.NumericType.NUMERIC, 1./9. },
23047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1245f, UCharacter.NumericType.NUMERIC, 1./8. },
23057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2150, UCharacter.NumericType.NUMERIC, 1./7. },
23067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2159, UCharacter.NumericType.NUMERIC, 1./6. },
23077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x09f6, UCharacter.NumericType.NUMERIC, 3./16. },
23087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2155, UCharacter.NumericType.NUMERIC, 1./5. },
23097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x00BD, UCharacter.NumericType.NUMERIC, 1./2. },
23107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0031, UCharacter.NumericType.DECIMAL, 1. },
23117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x4e00, UCharacter.NumericType.NUMERIC, 1. },
23127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x58f1, UCharacter.NumericType.NUMERIC, 1. },
23137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x10320, UCharacter.NumericType.NUMERIC, 1. },
23147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0F2B, UCharacter.NumericType.NUMERIC, 3./2. },
23157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x00B2, UCharacter.NumericType.DIGIT, 2. }, /* Unicode 4.0 change */
23167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x5f10, UCharacter.NumericType.NUMERIC, 2. },
23177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1813, UCharacter.NumericType.DECIMAL, 3. },
23187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x5f0e, UCharacter.NumericType.NUMERIC, 3. },
23197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2173, UCharacter.NumericType.NUMERIC, 4. },
23207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x8086, UCharacter.NumericType.NUMERIC, 4. },
23217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x278E, UCharacter.NumericType.DIGIT, 5. },
23227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1D7F2, UCharacter.NumericType.DECIMAL, 6. },
23237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x247A, UCharacter.NumericType.DIGIT, 7. },
23247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x7396, UCharacter.NumericType.NUMERIC, 9. },
23257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1372, UCharacter.NumericType.NUMERIC, 10. },
23267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x216B, UCharacter.NumericType.NUMERIC, 12. },
23277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x16EE, UCharacter.NumericType.NUMERIC, 17. },
23287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x249A, UCharacter.NumericType.NUMERIC, 19. },
23297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x303A, UCharacter.NumericType.NUMERIC, 30. },
23307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x5345, UCharacter.NumericType.NUMERIC, 30. },
23317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x32B2, UCharacter.NumericType.NUMERIC, 37. },
23327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x1375, UCharacter.NumericType.NUMERIC, 40. },
23337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x10323, UCharacter.NumericType.NUMERIC, 50. },
23347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x0BF1, UCharacter.NumericType.NUMERIC, 100. },
23357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x964c, UCharacter.NumericType.NUMERIC, 100. },
23367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x217E, UCharacter.NumericType.NUMERIC, 500. },
23377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2180, UCharacter.NumericType.NUMERIC, 1000. },
23387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x4edf, UCharacter.NumericType.NUMERIC, 1000. },
23397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x2181, UCharacter.NumericType.NUMERIC, 5000. },
23407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x137C, UCharacter.NumericType.NUMERIC, 10000. },
23417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x4e07, UCharacter.NumericType.NUMERIC, 10000. },
23427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x12432, UCharacter.NumericType.NUMERIC, 216000. },
23437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x12433, UCharacter.NumericType.NUMERIC, 432000. },
23447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x4ebf, UCharacter.NumericType.NUMERIC, 100000000. },
23457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x5146, UCharacter.NumericType.NUMERIC, 1000000000000. },
23467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { -1, UCharacter.NumericType.NONE, UCharacter.NO_NUMERIC_VALUE },
23477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x61, UCharacter.NumericType.NONE, UCharacter.NO_NUMERIC_VALUE, 10. },
23487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x3000, UCharacter.NumericType.NONE, UCharacter.NO_NUMERIC_VALUE },
23497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xfffe, UCharacter.NumericType.NONE, UCharacter.NO_NUMERIC_VALUE },
23507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x10301, UCharacter.NumericType.NONE, UCharacter.NO_NUMERIC_VALUE },
23517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0xe0033, UCharacter.NumericType.NONE, UCharacter.NO_NUMERIC_VALUE },
23527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x10ffff, UCharacter.NumericType.NONE, UCharacter.NO_NUMERIC_VALUE },
23537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            { 0x110000, UCharacter.NumericType.NONE, UCharacter.NO_NUMERIC_VALUE }
23547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
23557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
23567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < values.length; ++ i) {
23577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int c = (int)values[i][0];
23587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int type = UCharacter.getIntPropertyValue(c,
23597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                      UProperty.NUMERIC_TYPE);
23607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            double nv = UCharacter.getUnicodeNumericValue(c);
23617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
23627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (type != values[i][1]) {
23637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UProperty.NUMERIC_TYPE(\\u" + Utility.hex(c, 4)
23647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       + ") = " + type + " should be " + (int)values[i][1]);
23657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
23667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (0.000001 <= Math.abs(nv - values[i][2])) {
23677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.getUnicodeNumericValue(\\u" + Utility.hex(c, 4)
23687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + ") = " + nv + " should be " + values[i][2]);
23697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
23707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
23717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Test getNumericValue() as well.
23727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // It can only return the subset of numeric values that are
23737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // non-negative and fit into an int.
23747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int expectedInt;
23757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (values[i].length == 3) {
23767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (values[i][2] == UCharacter.NO_NUMERIC_VALUE) {
23777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    expectedInt = -1;
23787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
23797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    expectedInt = (int)values[i][2];
23807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if (expectedInt < 0 || expectedInt != values[i][2]) {
23817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        // The numeric value is not a non-negative integer.
23827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        expectedInt = -2;
23837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
23847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
23857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
23867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                expectedInt = (int)values[i][3];
23877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
23887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int nvInt = UCharacter.getNumericValue(c);
23897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (nvInt != expectedInt) {
23907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.getNumericValue(\\u" + Utility.hex(c, 4)
23917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + ") = " + nvInt + " should be " + expectedInt);
23927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
23937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
23947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
23957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
23967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
23977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Test the property values API.  See JB#2410.
23987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
23997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestPropertyValues() {
24007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int i, p, min, max;
24017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
24027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* Min should be 0 for everything. */
24037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* Until JB#2478 is fixed, the one exception is UProperty.BLOCK. */
24047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (p=UProperty.INT_START; p<UProperty.INT_LIMIT; ++p) {
24057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            min = UCharacter.getIntPropertyMinValue(p);
24067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (min != 0) {
24077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (p == UProperty.BLOCK) {
24087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    /* This is okay...for now.  See JB#2487.
24097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                       TODO Update this for JB#2487. */
24107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
24117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    String name;
24127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    name = UCharacter.getPropertyName(p, UProperty.NameChoice.LONG);
24137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: UCharacter.getIntPropertyMinValue(" + name + ") = " +
24147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          min + ", exp. 0");
24157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
24167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
24177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
24187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
24197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (UCharacter.getIntPropertyMinValue(UProperty.GENERAL_CATEGORY_MASK)
24207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            != 0
24217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            || UCharacter.getIntPropertyMaxValue(
24227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                               UProperty.GENERAL_CATEGORY_MASK)
24237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               != -1) {
24247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("error: UCharacter.getIntPropertyMin/MaxValue("
24257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  + "UProperty.GENERAL_CATEGORY_MASK) is wrong");
24267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
24277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
24287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* Max should be -1 for invalid properties. */
24297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        max = UCharacter.getIntPropertyMaxValue(-1);
24307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (max != -1) {
24317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: UCharacter.getIntPropertyMaxValue(-1) = " +
24327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                  max + ", exp. -1");
24337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
24347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
24357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* Script should return 0 for an invalid code point. If the API
24367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           throws an exception then that's fine too. */
24377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (i=0; i<2; ++i) {
24387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
24397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int script = 0;
24407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String desc = null;
24417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                switch (i) {
24427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 0:
24437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    script = UScript.getScript(-1);
24447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    desc = "UScript.getScript(-1)";
24457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
24467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                case 1:
24477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    script = UCharacter.getIntPropertyValue(-1, UProperty.SCRIPT);
24487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    desc = "UCharacter.getIntPropertyValue(-1, UProperty.SCRIPT)";
24497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
24507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
24517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (script != 0) {
24527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("FAIL: " + desc + " = " + script + ", exp. 0");
24537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
24547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (IllegalArgumentException e) {}
24557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
24567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
24577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
24587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestBidiPairedBracketType() {
24597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // BidiBrackets-6.3.0.txt says:
24607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //
24617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // The set of code points listed in this file was originally derived
24627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // using the character properties General_Category (gc), Bidi_Class (bc),
24637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Bidi_Mirrored (Bidi_M), and Bidi_Mirroring_Glyph (bmg), as follows:
24647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // two characters, A and B, form a pair if A has gc=Ps and B has gc=Pe,
24657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // both have bc=ON and Bidi_M=Y, and bmg of A is B. Bidi_Paired_Bracket
24667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // maps A to B and vice versa, and their Bidi_Paired_Bracket_Type
24677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // property values are Open and Close, respectively.
24687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UnicodeSet bpt = new UnicodeSet("[:^bpt=n:]");
24697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("bpt!=None is not empty", !bpt.isEmpty());
24707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // The following should always be true.
24717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UnicodeSet mirrored = new UnicodeSet("[:Bidi_M:]");
24727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UnicodeSet other_neutral = new UnicodeSet("[:bc=ON:]");
24737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("bpt!=None is a subset of Bidi_M", mirrored.containsAll(bpt));
24747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("bpt!=None is a subset of bc=ON", other_neutral.containsAll(bpt));
24757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // The following are true at least initially in Unicode 6.3.
24767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UnicodeSet bpt_open = new UnicodeSet("[:bpt=o:]");
24777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UnicodeSet bpt_close = new UnicodeSet("[:bpt=c:]");
24787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UnicodeSet ps = new UnicodeSet("[:Ps:]");
24797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UnicodeSet pe = new UnicodeSet("[:Pe:]");
24807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("bpt=Open is a subset of Ps", ps.containsAll(bpt_open));
24817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertTrue("bpt=Close is a subset of Pe", pe.containsAll(bpt_close));
24827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
24837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
24847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestIsBMP()
24857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
24867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int ch[] = {0x0, -1, 0xffff, 0x10ffff, 0xff, 0x1ffff};
24877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean flag[] = {true, false, true, false, true, false};
24887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < ch.length; i ++) {
24897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (UCharacter.isBMP(ch[i]) != flag[i]) {
24907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Fail: \\u" + Utility.hex(ch[i], 8)
24917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                      + " failed at UCharacter.isBMP");
24927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
24937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
24947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
24957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
24967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private boolean showADiffB(UnicodeSet a, UnicodeSet b,
24977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                        String a_name, String b_name,
24987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                        boolean expect,
24997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                        boolean diffIsError){
25007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int i, start, end;
25017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean equal=true;
25027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(i=0; i < a.getRangeCount(); ++i) {
25037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            start  = a.getRangeStart(i);
25047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            end    = a.getRangeEnd(i);
25057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(expect!=b.contains(start, end)) {
25067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                equal=false;
25077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                while(start<=end) {
25087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if(expect!=b.contains(start)) {
25097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        if(diffIsError) {
25107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            if(expect) {
25117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                errln("error: "+ a_name +" contains "+ hex(start)+" but "+ b_name +" does not");
25127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            } else {
25137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                errln("error: "+a_name +" and "+ b_name+" both contain "+hex(start) +" but should not intersect");
25147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
25157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        } else {
25167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            if(expect) {
25177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                logln("info: "+a_name +" contains "+hex(start)+ "but " + b_name +" does not");
25187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            } else {
25197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                logln("info: "+a_name +" and "+b_name+" both contain "+hex(start)+" but should not intersect");
25207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            }
25217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
25227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
25237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ++start;
25247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
25257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
25267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
25277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return equal;
25287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
25297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private boolean showAMinusB(UnicodeSet a, UnicodeSet b,
25307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                        String a_name, String b_name,
25317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                        boolean diffIsError) {
25327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return showADiffB(a, b, a_name, b_name, true, diffIsError);
25347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
25357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private boolean showAIntersectB(UnicodeSet a, UnicodeSet b,
25377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                            String a_name, String b_name,
25387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                            boolean diffIsError) {
25397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return showADiffB(a, b, a_name, b_name, false, diffIsError);
25407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
25417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private boolean compareUSets(UnicodeSet a, UnicodeSet b,
25437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                         String a_name, String b_name,
25447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                         boolean diffIsError) {
25457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return
25467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            showAMinusB(a, b, a_name, b_name, diffIsError) &&
25477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            showAMinusB(b, a, b_name, a_name, diffIsError);
25487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
25497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert   /* various tests for consistency of UCD data and API behavior */
25517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert   public void TestConsistency() {
25527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       UnicodeSet set1, set2, set3, set4;
25537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       int start, end;
25557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       int i, length;
25567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       String hyphenPattern = "[:Hyphen:]";
25587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       String dashPattern = "[:Dash:]";
25597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       String lowerPattern = "[:Lowercase:]";
25607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       String formatPattern = "[:Cf:]";
25617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       String alphaPattern  =  "[:Alphabetic:]";
25627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       /*
25647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        * It used to be that UCD.html and its precursors said
25657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        * "Those dashes used to mark connections between pieces of words,
25667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        *  plus the Katakana middle dot."
25677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        *
25687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        * Unicode 4 changed 00AD Soft Hyphen to Cf and removed it from Dash
25697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        * but not from Hyphen.
25707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        * UTC 94 (2003mar) decided to leave it that way and to change UCD.html.
25717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        * Therefore, do not show errors when testing the Hyphen property.
25727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        */
25737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       logln("Starting with Unicode 4, inconsistencies with [:Hyphen:] are\n"
25747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                   + "known to the UTC and not considered errors.\n");
25757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       set1=new UnicodeSet(hyphenPattern);
25777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       set2=new UnicodeSet(dashPattern);
25787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           /* remove the Katakana middle dot(s) from set1 */
25807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           set1.remove(0x30fb);
25817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           set2.remove (0xff65); /* halfwidth variant */
25827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           showAMinusB(set1, set2, "[:Hyphen:]", "[:Dash:]", false);
25837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       /* check that Cf is neither Hyphen nor Dash nor Alphabetic */
25867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       set3=new UnicodeSet(formatPattern);
25877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       set4=new UnicodeSet(alphaPattern);
25887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
25897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       showAIntersectB(set3, set1, "[:Cf:]", "[:Hyphen:]", false);
25907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       showAIntersectB(set3, set2, "[:Cf:]", "[:Dash:]", true);
25917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       showAIntersectB(set3, set4, "[:Cf:]", "[:Alphabetic:]", true);
25927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       /*
25937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        * Check that each lowercase character has "small" in its name
25947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        * and not "capital".
25957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        * There are some such characters, some of which seem odd.
25967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        * Use the verbose flag to see these notices.
25977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        */
25987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       set1=new UnicodeSet(lowerPattern);
25997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       for(i=0;; ++i) {
26017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//               try{
26027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//                   length=set1.getItem(set1, i, &start, &end, NULL, 0, &errorCode);
26037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//               }catch(Exception e){
26047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//                   break;
26057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//               }
26067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            start = set1.getRangeStart(i);
26077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            end = set1.getRangeEnd(i);
26087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            length = i<set1.getRangeCount() ? set1.getRangeCount() : 0;
26097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           if(length!=0) {
26107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               break; /* done with code points, got a string or -1 */
26117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           }
26127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           while(start<=end) {
26147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               String name=UCharacter.getName(start);
26157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               if( (name.indexOf("SMALL")< 0 || name.indexOf("CAPITAL")<-1) &&
26177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                   name.indexOf("SMALL CAPITAL")==-1
26187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               ) {
26197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                   logln("info: [:Lowercase:] contains U+"+hex(start) + " whose name does not suggest lowercase: " + name);
26207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               }
26217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               ++start;
26227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           }
26237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       }
26247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       /*
26277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        * Test for an example that unorm_getCanonStartSet() delivers
26287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        * all characters that compose from the input one,
26297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        * even in multiple steps.
26307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        * For example, the set for "I" (0049) should contain both
26317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        * I-diaeresis (00CF) and I-diaeresis-acute (1E2E).
26327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        * In general, the set for the middle such character should be a subset
26337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        * of the set for the first.
26347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        */
26357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       Normalizer2 norm2=Normalizer2.getNFDInstance();
26367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       set1=new UnicodeSet();
26377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       Norm2AllModes.getNFCInstance().impl.
26387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           ensureCanonIterData().getCanonStartSet(0x49, set1);
26397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       set2=new UnicodeSet();
26407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       /* enumerate all characters that are plausible to be latin letters */
26427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       for(start=0xa0; start<0x2000; ++start) {
26437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           String decomp=norm2.normalize(UTF16.valueOf(start));
26447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           if(decomp.length() > 1 && decomp.charAt(0)==0x49) {
26457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert               set2.add(start);
26467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           }
26477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       }
26487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       compareUSets(set1, set2,
26507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "[canon start set of 0049]", "[all c with canon decomp with 0049]",
26517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    false);
26527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert   }
26547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCoverage() {
26567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //cover forDigit
26577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char ch1 = UCharacter.forDigit(7, 11);
26587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("UCharacter.forDigit ", "7", String.valueOf(ch1));
26597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char ch2 = UCharacter.forDigit(17, 20);
26607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("UCharacter.forDigit ", "h", String.valueOf(ch2));
26617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //Jitterbug 4451, for coverage
26637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0x0041; i < 0x005B; i++) {
26647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!UCharacter.isJavaLetter(i))
26657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(i) + " expected to be a letter");
26667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!UCharacter.isJavaIdentifierStart(i))
26677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(i) + " expected to be a Java identifier start character");
26687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!UCharacter.isJavaLetterOrDigit(i))
26697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(i) + " expected not to be a Java letter");
26707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!UCharacter.isJavaIdentifierPart(i))
26717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(i) + " expected to be a Java identifier part character");
26727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
26737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char[] spaces = {'\t','\n','\f','\r',' '};
26747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < spaces.length; i++){
26757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!UCharacter.isSpace(spaces[i]))
26767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("FAIL \\u" + hex(spaces[i]) + " expected to be a Java space");
26777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
26787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
26797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestBlockData()
26817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
26827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Class ubc = UCharacter.UnicodeBlock.class;
26837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int b = 1; b < UCharacter.UnicodeBlock.COUNT; b += 1) {
26857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            UCharacter.UnicodeBlock blk = UCharacter.UnicodeBlock.getInstance(b);
26867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int id = blk.getID();
26877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String name = blk.toString();
26887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (id != b) {
26907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.UnicodeBlock.getInstance(" + b + ") returned a block with id = " + id);
26917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
26927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
26937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
26947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (ubc.getField(name + "_ID").getInt(blk) != b) {
26957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("UCharacter.UnicodeBlock.getInstance(" + b + ") returned a block with a name of " + name +
26967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          " which does not match the block id.");
26977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
26987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (Exception e) {
26997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Couldn't get the id name for id " + b);
27007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
27017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
27027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
27057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
27067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static UnicodeBlock getInstance(int id)
27077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
27087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetInstance(){
27097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Testing values for invalid and valid ID
27107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] invalid_test = {-1,-10,-100};
27117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i< invalid_test.length; i++){
27127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(UCharacter.UnicodeBlock.INVALID_CODE != UCharacter.UnicodeBlock.getInstance(invalid_test[i])){
27137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.UnicodeBlock.getInstance(invalid_test[i]) was " +
27147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "suppose to return UCharacter.UnicodeBlock.INVALID_CODE. Got " +
27157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        UCharacter.UnicodeBlock.getInstance(invalid_test[i]) + ". Expected " +
27167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        UCharacter.UnicodeBlock.INVALID_CODE);
27177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
27187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
27197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
27227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
27237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static UnicodeBlock of(int ch)
27247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
27257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestOf(){
27267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(UCharacter.UnicodeBlock.INVALID_CODE != UCharacter.UnicodeBlock.of(UTF16.CODEPOINT_MAX_VALUE+1)){
27277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("UCharacter.UnicodeBlock.of(UTF16.CODEPOINT_MAX_VALUE+1) was " +
27287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "suppose to return UCharacter.UnicodeBlock.INVALID_CODE. Got " +
27297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    UCharacter.UnicodeBlock.of(UTF16.CODEPOINT_MAX_VALUE+1) + ". Expected " +
27307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    UCharacter.UnicodeBlock.INVALID_CODE);
27317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
27327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
27357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
27367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static final UnicodeBlock forName(String blockName)
27377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
27387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestForName(){
27397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //UCharacter.UnicodeBlock.forName("");
27407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //Tests when "if (b == null)" is true
27417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
27447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
27457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static int getNumericValue(int ch)
27467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
27477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetNumericValue(){
27487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // The following tests the else statement when
27497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //      if(numericType<NumericType.COUNT) is false
27507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // The following values were obtained by testing all values from
27517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //      UTF16.CODEPOINT_MIN_VALUE to UTF16.CODEPOINT_MAX_VALUE inclusively
27527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //      to obtain the value to go through the else statement.
27537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] valid_values =
27547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {3058,3442,4988,8558,8559,8574,8575,8576,8577,8578,8583,8584,19975,
27557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             20159,20191,20740,20806,21315,33836,38433,65819,65820,65821,65822,
27567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             65823,65824,65825,65826,65827,65828,65829,65830,65831,65832,65833,
27577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             65834,65835,65836,65837,65838,65839,65840,65841,65842,65843,65861,
27587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             65862,65863,65868,65869,65870,65875,65876,65877,65878,65899,65900,
27597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             65901,65902,65903,65904,65905,65906,66378,68167};
27607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] results =
27627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1000,1000,10000,500,1000,500,1000,1000,5000,10000,50000,100000,
27637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             10000,100000000,1000,100000000,-2,1000,10000,1000,300,400,500,
27647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             600,700,800,900,1000,2000,3000,4000,5000,6000,7000,8000,9000,
27657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             10000,20000,30000,40000,50000,60000,70000,80000,90000,500,5000,
27667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             50000,500,1000,5000,500,1000,10000,50000,300,500,500,500,500,500,
27677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             1000,5000,900,1000};
27687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(valid_values.length != results.length){
27707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("The valid_values array and the results array need to be "+
27717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "the same length.");
27727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
27737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for(int i = 0; i < valid_values.length; i++){
27747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                try{
27757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    if(UCharacter.getNumericValue(valid_values[i]) != results[i]){
27767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        errln("UCharacter.getNumericValue(i) returned a " +
27777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                "different value from the expected result. " +
27787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                "Got " + UCharacter.getNumericValue(valid_values[i]) +
27797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                "Expected" + results[i]);
27807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
27817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } catch(Exception e){
27827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("UCharacter.getNumericValue(int) returned an exception " +
27837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            "with the parameter value");
27847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
27857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
27867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
27877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
27887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
27897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
27907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
27917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static double getUnicodeNumericValue(int ch)
27927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
27937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // The following tests covers if(mant==0), else if(mant > 9), and default
27947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetUnicodeNumericValue(){
27957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*  The code coverage for if(mant==0), else if(mant > 9), and default
27967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         *  could not be covered even with input values from UTF16.CODEPOINT_MIN_VALUE
27977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         *  to UTF16.CODEPOINT_MAX_VALUE. I also tested from UTF16.CODEPOINT_MAX_VALUE to
27987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         *  Integer.MAX_VALUE and didn't recieve any code coverage there too.
27997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         *  Therefore, the code could either be dead code or meaningless.
28007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
28017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
28047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
28057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static String toString(int ch)
28067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
28077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestToString(){
28087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] valid_tests = {
28097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.MIN_VALUE, UCharacter.MIN_VALUE+1,
28107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.MAX_VALUE-1, UCharacter.MAX_VALUE};
28117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] invalid_tests = {
28127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.MIN_VALUE-1, UCharacter.MIN_VALUE-2,
28137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.MAX_VALUE+1, UCharacter.MAX_VALUE+2};
28147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i< valid_tests.length; i++){
28167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(UCharacter.toString(valid_tests[i]) == null){
28177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.toString(int) was not suppose to return " +
28187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "null because it was given a valid parameter. Value passed: " +
28197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                valid_tests[i] + ". Got null.");
28207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
28217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
28227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i< invalid_tests.length; i++){
28247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(UCharacter.toString(invalid_tests[i]) != null){
28257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.toString(int) was suppose to return " +
28267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "null because it was given an invalid parameter. Value passed: " +
28277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                invalid_tests[i] + ". Got: " + UCharacter.toString(invalid_tests[i]));
28287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
28297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
28307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
28337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
28347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static int getCombiningClass(int ch)
28357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
28367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetCombiningClass(){
28377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] valid_tests = {
28387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.MIN_VALUE, UCharacter.MIN_VALUE+1,
28397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.MAX_VALUE-1, UCharacter.MAX_VALUE};
28407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] invalid_tests = {
28417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.MIN_VALUE-1, UCharacter.MIN_VALUE-2,
28427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.MAX_VALUE+1, UCharacter.MAX_VALUE+2};
28437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i< valid_tests.length; i++){
28457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
28467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.getCombiningClass(valid_tests[i]);
28477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){
28487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.getCombiningClass(int) was not supposed to have " +
28497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "an exception. Value passed: " + valid_tests[i]);
28507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
28517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
28527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i< invalid_tests.length; i++){
28547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
28557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals("getCombiningClass(out of range)",
28567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                             0, UCharacter.getCombiningClass(invalid_tests[i]));
28577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){
28587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.getCombiningClass(int) was not supposed to have " +
28597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "an exception. Value passed: " + invalid_tests[i]);
28607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
28617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
28627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
28657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
28667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static String getName(int ch)
28677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
28687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetName(){
28697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Need to test on other "one characters" for the getName() method
28707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] data = {"a","z"};
28717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] results = {"LATIN SMALL LETTER A","LATIN SMALL LETTER Z"};
28727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(data.length != results.length){
28737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("The data array and the results array need to be "+
28747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "the same length.");
28757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
28767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for(int i=0; i < data.length; i++){
28777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(UCharacter.getName(data[i], "").compareTo(results[i]) != 0){
28787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("UCharacter.getName(String, String) was suppose " +
28797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            "to have the same result for the data in the parameter. " +
28807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            "Value passed: " + data[i] + ". Got: " +
28817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            UCharacter.getName(data[i], "") + ". Expected: " +
28827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            results[i]);
28837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
28847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
28857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
28867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
28877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
28897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
28907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static String getISOComment(int ch)
28917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
28927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetISOComment(){
28937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] invalid_tests = {
28947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.MIN_VALUE-1, UCharacter.MIN_VALUE-2,
28957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.MAX_VALUE+1, UCharacter.MAX_VALUE+2};
28967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
28977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i< invalid_tests.length; i++){
28987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(UCharacter.getISOComment(invalid_tests[i]) != null){
28997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.getISOComment(int) was suppose to return " +
29007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "null because it was given an invalid parameter. Value passed: " +
29017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                invalid_tests[i] + ". Got: " + UCharacter.getISOComment(invalid_tests[i]));
29027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
29037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
29047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
29057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
29077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
29087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public void setLimit(int lim)
29097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
29107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSetLimit(){
29117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // TODO: Tests when "if(0<=lim && lim<=s.length())" is false
29127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
29137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
29157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
29167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public int nextCaseMapCP()
29177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
29187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestNextCaseMapCP(){
29197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // TODO: Tests when "if(UTF16.LEAD_SURROGATE_MIN_VALUE<=c || c<=UTF16.TRAIL_SURROGATE_MAX_VALUE)" is false
29207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* TODO: Tests when "if( c<=UTF16.LEAD_SURROGATE_MAX_VALUE && cpLimit<limit &&
29217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * UTF16.TRAIL_SURROGATE_MIN_VALUE<=(c2=s.charAt(cpLimit)) && c2<=UTF16.TRAIL_SURROGATE_MAX_VALUE)" is false
29227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
29237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
29247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
29267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
29277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public void reset(int direction)
29287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
29297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestReset(){
29307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // The method reset() is never called by another function
29317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // TODO: Tests when "else if(direction<0)" is false
29327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
29337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
29357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
29367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static String toTitleCase(Locale locale, String str, BreakIterator breakiter)
29377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
29387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestToTitleCaseCoverage(){
29397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //Calls the function "toTitleCase(Locale locale, String str, BreakIterator breakiter)"
29407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] locale={"en","fr","zh","ko","ja","it","de",""};
29417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i<locale.length; i++){
29427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            UCharacter.toTitleCase(new Locale(locale[i]), "", null);
29437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
29447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Calls the function "String toTitleCase(ULocale locale, String str, BreakIterator titleIter, int options)"
29467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests when "if (locale == null)" is true
29477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UCharacter.toTitleCase((ULocale)null, "", null, 0);
29487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // TODO: Tests when "if(index==BreakIterator.DONE || index>srcLength)" is true
29507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // TODO: Tests when "while((c=iter.nextCaseMapCP())>=0 && UCaseProps.NONE==gCsp.getType(c))" is false
29517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // TODO: Tests when "if(prev<titleStart)" is false
29527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // TODO: Tests when "if(c<=0xffff)" is false
29537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // TODO: Tests when "if(c<=0xffff)" is false
29547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // TODO: Tests when "if(titleLimit<index)" is false
29557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // TODO: Tests when "else if((nc=iter.nextCaseMapCP())>=0)" is false
29567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
29577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
29587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
29597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static String toUpperCase(ULocale locale, String str)
29607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
29617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestToUpperCase(){
29627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // TODO: Tests when "while((c=iter.nextCaseMapCP())>=0)" is false
29637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
29647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
29667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
29677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static String toLowerCase(ULocale locale, String str)
29687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
29697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestToLowerCase(){
29707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Test when locale is null
29717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] cases = {"","a","A","z","Z","Dummy","DUMMY","dummy","a z","A Z",
29727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "'","\"","0","9","0a","a0","*","~!@#$%^&*()_+"};
29737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i<cases.length; i++){
29747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
29757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toLowerCase((ULocale) null, cases[i]);
29767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){
29777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.toLowerCase was not suppose to return an " +
29787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "exception for input of null and string: " + cases[i]);
29797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
29807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
29817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // TODO: Tests when "while((c=iter.nextCaseMapCP())>=0)" is false
29827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
29837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
29847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
29857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
29867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static int getHanNumericValue(int ch)
29877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
29887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetHanNumericValue(){
29897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] valid = {
29907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x3007, //IDEOGRAPHIC_NUMBER_ZERO_
29917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x96f6, //CJK_IDEOGRAPH_COMPLEX_ZERO_
29927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x4e00, //CJK_IDEOGRAPH_FIRST_
29937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x58f9, //CJK_IDEOGRAPH_COMPLEX_ONE_
29947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x4e8c, //CJK_IDEOGRAPH_SECOND_
29957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x8cb3, //CJK_IDEOGRAPH_COMPLEX_TWO_
29967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x4e09, //CJK_IDEOGRAPH_THIRD_
29977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x53c3, //CJK_IDEOGRAPH_COMPLEX_THREE_
29987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x56db, //CJK_IDEOGRAPH_FOURTH_
29997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x8086, //CJK_IDEOGRAPH_COMPLEX_FOUR_
30007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x4e94, //CJK_IDEOGRAPH_FIFTH_
30017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x4f0d, //CJK_IDEOGRAPH_COMPLEX_FIVE_
30027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x516d, //CJK_IDEOGRAPH_SIXTH_
30037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x9678, //CJK_IDEOGRAPH_COMPLEX_SIX_
30047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x4e03, //CJK_IDEOGRAPH_SEVENTH_
30057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x67d2, //CJK_IDEOGRAPH_COMPLEX_SEVEN_
30067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x516b, //CJK_IDEOGRAPH_EIGHTH_
30077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x634c, //CJK_IDEOGRAPH_COMPLEX_EIGHT_
30087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x4e5d, //CJK_IDEOGRAPH_NINETH_
30097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x7396, //CJK_IDEOGRAPH_COMPLEX_NINE_
30107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x5341, //CJK_IDEOGRAPH_TEN_
30117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x62fe, //CJK_IDEOGRAPH_COMPLEX_TEN_
30127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x767e, //CJK_IDEOGRAPH_HUNDRED_
30137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x4f70, //CJK_IDEOGRAPH_COMPLEX_HUNDRED_
30147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x5343, //CJK_IDEOGRAPH_THOUSAND_
30157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x4edf, //CJK_IDEOGRAPH_COMPLEX_THOUSAND_
30167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x824c, //CJK_IDEOGRAPH_TEN_THOUSAND_
30177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0x5104, //CJK_IDEOGRAPH_HUNDRED_MILLION_
30187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
30197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] invalid = {-5,-2,-1,0};
30217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] results = {0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,100,100,
30237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1000,1000,10000,100000000};
30247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(valid.length != results.length){
30267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("The arrays valid and results are suppose to be the same length " +
30277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "to test getHanNumericValue(int ch).");
30287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else{
30297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for(int i=0; i<valid.length; i++){
30307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(UCharacter.getHanNumericValue(valid[i]) != results[i]){
30317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("UCharacter.getHanNumericValue does not return the " +
30327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            "same result as expected. Passed value: " + valid[i] +
30337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ". Got: " + UCharacter.getHanNumericValue(valid[i]) +
30347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ". Expected: " + results[i]);
30357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
30367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
30377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
30387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i<invalid.length; i++){
30407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(UCharacter.getHanNumericValue(invalid[i]) != -1){
30417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.getHanNumericValue does not return the " +
30427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "same result as expected. Passed value: " + invalid[i] +
30437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ". Got: " + UCharacter.getHanNumericValue(invalid[i]) +
30447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ". Expected: -1");
30457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
30467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
30477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
30487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
30507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
30517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static boolean hasBinaryProperty(int ch, int property)
30527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
30537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestHasBinaryProperty(){
30547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Testing when "if (ch < MIN_VALUE || ch > MAX_VALUE)" is true
30557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] invalid = {
30567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.MIN_VALUE-1, UCharacter.MIN_VALUE-2,
30577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.MAX_VALUE+1, UCharacter.MAX_VALUE+2};
30587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] valid = {
30597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.MIN_VALUE, UCharacter.MIN_VALUE+1,
30607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.MAX_VALUE, UCharacter.MAX_VALUE-1};
30617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i<invalid.length; i++){
30637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
30647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (UCharacter.hasBinaryProperty(invalid[i], 1)) {
30657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("UCharacter.hasBinaryProperty(ch, property) should return " +
30667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            "false for out-of-range code points but " +
30677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            "returns true for " + invalid[i]);
30687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
30697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e) {
30707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.hasBinaryProperty(ch, property) should not " +
30717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "throw an exception for any input. Value passed: " +
30727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        invalid[i]);
30737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
30747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
30757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i<valid.length; i++){
30777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
30787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.hasBinaryProperty(valid[i], 1);
30797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e) {
30807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.hasBinaryProperty(ch, property) should not " +
30817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "throw an exception for any input. Value passed: " +
30827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        valid[i]);
30837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
30847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
30857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
30867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
30877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
30887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
30897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static int getIntPropertyValue(int ch, int type)
30907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
30917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetIntPropertyValue(){
30927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* Testing UCharacter.getIntPropertyValue(ch, type) */
30937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Testing when "if (type < UProperty.BINARY_START)" is true
30947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] negative_cases = {-100,-50,-10,-5,-2,-1};
30957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i<negative_cases.length; i++){
30967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(UCharacter.getIntPropertyValue(0, negative_cases[i]) != 0){
30977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.getIntPropertyValue(ch, type) was suppose to return 0 " +
30987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "when passing a negative value of " + negative_cases[i]);
30997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
31017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
31027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Testing when "if(ch<NormalizerImpl.JAMO_L_BASE)" is true
31047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=Normalizer2Impl.Hangul.JAMO_L_BASE-5; i<Normalizer2Impl.Hangul.JAMO_L_BASE; i++){
31057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(UCharacter.getIntPropertyValue(i, UProperty.HANGUL_SYLLABLE_TYPE) != 0){
31067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.getIntPropertyValue(ch, type) was suppose to return 0 " +
31077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "when passing ch: " + i + "and type of Property.HANGUL_SYLLABLE_TYPE");
31087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
31107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
31117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Testing when "else if((ch-=NormalizerImpl.HANGUL_BASE)<0)" is true
31137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=Normalizer2Impl.Hangul.HANGUL_BASE-5; i<Normalizer2Impl.Hangul.HANGUL_BASE; i++){
31147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(UCharacter.getIntPropertyValue(i, UProperty.HANGUL_SYLLABLE_TYPE) != 0){
31157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.getIntPropertyValue(ch, type) was suppose to return 0 " +
31167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "when passing ch: " + i + "and type of Property.HANGUL_SYLLABLE_TYPE");
31177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
31197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
31207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
31217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
31237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
31247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static int getIntPropertyMaxValue(int type)
31257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
31267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetIntPropertyMaxValue(){
31277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* Testing UCharacter.getIntPropertyMaxValue(type) */
31287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Testing when "else if (type < UProperty.INT_START)" is true
31297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] cases = {UProperty.BINARY_LIMIT, UProperty.BINARY_LIMIT+1,
31307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UProperty.INT_START-2, UProperty.INT_START-1};
31317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i<cases.length; i++){
31327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(UCharacter.getIntPropertyMaxValue(cases[i]) != -1){
31337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.getIntPropertyMaxValue was suppose to return -1 " +
31347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "but got " + UCharacter.getIntPropertyMaxValue(cases[i]));
31357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
31367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
31377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // TODO: Testing when the case statment reaches "default"
31397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // After testing between values of UProperty.INT_START and
31407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // UProperty.INT_LIMIT are covered, none of the values reaches default.
31417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
31427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
31447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
31457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static final int codePointAt(CharSequence seq, int index)
31467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static final int codePointAt(char[] text, int index, int limit)
31477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
31487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCodePointAt(){
31497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // {LEAD_SURROGATE_MIN_VALUE,
31517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //  LEAD_SURROGATE_MAX_VALUE, LEAD_SURROGATE_MAX_VALUE-1
31527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] cases = {"\uD800","\uDBFF","\uDBFE"};
31537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] result = {55296,56319,56318};
31547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i < cases.length; i++){
31557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* Testing UCharacter.codePointAt(seq, index) */
31567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Testing when "if (index < seq.length())" is false
31577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(UCharacter.codePointAt((CharSequence) cases[i], 0) != result[i])
31587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.codePointAt(CharSequence ...) did not return as expected. " +
31597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "Passed value: " + cases[i] + ". Expected: " +
31607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        result[i] + ". Got: " +
31617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        UCharacter.codePointAt((CharSequence) cases[i], 0));
31627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* Testing UCharacter.codePointAt(text, index) */
31647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Testing when "if (index < text.length)" is false
31657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(UCharacter.codePointAt(cases[i].toCharArray(), 0) != result[i])
31667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.codePointAt(char[] ...) did not return as expected. " +
31677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "Passed value: " + cases[i] + ". Expected: " +
31687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        result[i] + ". Got: " +
31697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        UCharacter.codePointAt(cases[i].toCharArray(), 0));
31707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* Testing UCharacter.codePointAt(text, index, limit) */
31727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Testing when "if (index < limit)" is false
31737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(UCharacter.codePointAt(cases[i].toCharArray(), 0, 1) != result[i])
31747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.codePointAt(char[], int, int) did not return as expected. " +
31757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "Passed value: " + cases[i] + ". Expected: " +
31767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        result[i] + ". Got: " +
31777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        UCharacter.codePointAt(cases[i].toCharArray(), 0, 1));
31787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
31797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* Testing UCharacter.codePointAt(text, index, limit) */
31817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Testing when "if (index >= limit || limit > text.length)" is true
31827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char[] empty_text = {};
31837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char[] one_char_text = {'a'};
31847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char[] reg_text = {'d','u','m','m','y'};
31857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] limitCases = {2,3,5,10,25};
31867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // When index >= limit
31887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i < limitCases.length; i++){
31897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
31907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.codePointAt(reg_text, 100, limitCases[i]);
31917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.codePointAt was suppose to return an exception " +
31927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "but got " + UCharacter.codePointAt(reg_text, 100, limitCases[i]) +
31937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ". The following passed parameters were Text: " + String.valueOf(reg_text) + ", Start: " +
31947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        100 + ", Limit: " + limitCases[i] + ".");
31957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){
31967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
31977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
31987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
31997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // When limit > text.length
32007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i < limitCases.length; i++){
32017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
32027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.codePointAt(empty_text, 0, limitCases[i]);
32037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.codePointAt was suppose to return an exception " +
32047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "but got " + UCharacter.codePointAt(empty_text, 0, limitCases[i]) +
32057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ". The following passed parameters were Text: " + String.valueOf(empty_text) + ", Start: " +
32067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        0 + ", Limit: " + limitCases[i] + ".");
32077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){
32087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
32097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
32117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.codePointCount(one_char_text, 0, limitCases[i]);
32127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.codePointCount was suppose to return an exception " +
32137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "but got " + UCharacter.codePointCount(one_char_text, 0, limitCases[i]) +
32147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ". The following passed parameters were Text: " + String.valueOf(one_char_text) + ", Start: " +
32157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        0 + ", Limit: " + limitCases[i] + ".");
32167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){
32177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
32187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
32197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
32207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
32227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
32237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static final int codePointBefore(CharSequence seq, int index)
32247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static final int codePointBefore(char[] text, int index)
32257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static final int codePointBefore(char[] text, int index, int limit)
32267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
32277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCodePointBefore(){
32287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // {TRAIL_SURROGATE_MIN_VALUE,
32297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //  TRAIL_SURROGATE_MAX_VALUE, TRAIL_SURROGATE_MAX_VALUE -1
32307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] cases = {"\uDC00","\uDFFF","\uDDFE"};
32317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] result = {56320,57343,56830};
32327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i < cases.length; i++){
32337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* Testing UCharacter.codePointBefore(seq, index) */
32347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Testing when "if (index > 0)" is false
32357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(UCharacter.codePointBefore((CharSequence) cases[i], 1) != result[i])
32367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.codePointBefore(CharSequence ...) did not return as expected. " +
32377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "Passed value: " + cases[i] + ". Expected: " +
32387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        result[i] + ". Got: " +
32397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        UCharacter.codePointBefore((CharSequence) cases[i], 1));
32407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* Testing UCharacter.codePointBefore(text, index) */
32427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Testing when "if (index > 0)" is false
32437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(UCharacter.codePointBefore(cases[i].toCharArray(), 1) != result[i])
32447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.codePointBefore(char[] ...) did not return as expected. " +
32457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "Passed value: " + cases[i] + ". Expected: " +
32467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        result[i] + ". Got: " +
32477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        UCharacter.codePointBefore(cases[i].toCharArray(), 1));
32487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* Testing UCharacter.codePointBefore(text, index, limit) */
32507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Testing when "if (index > limit)" is false
32517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(UCharacter.codePointBefore(cases[i].toCharArray(), 1, 0) != result[i])
32527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.codePointBefore(char[], int, int) did not return as expected. " +
32537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "Passed value: " + cases[i] + ". Expected: " +
32547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        result[i] + ". Got: " +
32557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        UCharacter.codePointBefore(cases[i].toCharArray(), 1, 0));
32567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
32577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* Testing UCharacter.codePointBefore(text, index, limit) */
32597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char[] dummy = {'d','u','m','m','y'};
32607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Testing when "if (index <= limit || limit < 0)" is true
32617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] negative_cases = {-100,-10,-5,-2,-1};
32627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] index_cases = {0,1,2,5,10,100};
32637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i < negative_cases.length; i++){
32657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
32667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.codePointBefore(dummy, 10000, negative_cases[i]);
32677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.codePointBefore(text, index, limit) was suppose to return an exception " +
32687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "when the parameter limit of " + negative_cases[i] + " is a negative number.");
32697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e) {}
32707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
32717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i < index_cases.length; i++){
32737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
32747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.codePointBefore(dummy, index_cases[i], 101);
32757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.codePointBefore(text, index, limit) was suppose to return an exception " +
32767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "when the parameter index of " + index_cases[i] + " is a negative number.");
32777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e) {}
32787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
32797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
32807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
32827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
32837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static final int toChars(int cp, char[] dst, int dstIndex)
32847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static final char[] toChars(int cp)
32857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
32867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestToChars(){
32877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] positive_cases = {1,2,5,10,100};
32887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char[] dst = {'a'};
32897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
32907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* Testing UCharacter.toChars(cp, dst, dstIndex) */
32917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i < positive_cases.length; i++){
32927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Testing negative values when cp < 0 for if (cp >= 0)
32937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
32947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toChars(-1*positive_cases[i],dst,0);
32957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.toChars(int,char[],int) was suppose to return an exception " +
32967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "when the parameter " + (-1*positive_cases[i]) + " is a negative number.");
32977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){
32987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
32997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Testing when "if (cp < MIN_SUPPLEMENTARY_CODE_POINT)" is true
33017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(UCharacter.toChars(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT-positive_cases[i], dst, 0) != 1){
33027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.toChars(int,char[],int) was suppose to return a value of 1. Got: " +
33037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        UCharacter.toChars(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT-positive_cases[i], dst, 0));
33047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
33057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Testing when "if (cp < MIN_SUPPLEMENTARY_CODE_POINT)" is false and
33077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //     when "if (cp <= MAX_CODE_POINT)" is false
33087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
33097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toChars(UCharacter.MAX_CODE_POINT+positive_cases[i],dst,0);
33107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.toChars(int,char[],int) was suppose to return an exception " +
33117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "when the parameter " + (UCharacter.MAX_CODE_POINT+positive_cases[i]) +
33127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " is a large number.");
33137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){
33147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
33157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
33167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* Testing UCharacter.toChars(cp)*/
33197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i<positive_cases.length; i++){
33207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Testing negative values when cp < 0 for if (cp >= 0)
33217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
33227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toChars(-1*positive_cases[i]);
33237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.toChars(cint) was suppose to return an exception " +
33247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "when the parameter " + positive_cases[i] + " is a negative number.");
33257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){
33267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
33277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Testing when "if (cp < MIN_SUPPLEMENTARY_CODE_POINT)" is true
33297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(UCharacter.toChars(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT-positive_cases[i]).length <= 0){
33307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.toChars(int) was suppose to return some result result when the parameter " +
33317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        (UCharacter.MIN_SUPPLEMENTARY_CODE_POINT-positive_cases[i]) + "is passed.");
33327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
33337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Testing when "if (cp < MIN_SUPPLEMENTARY_CODE_POINT)" is false and
33357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //     when "if (cp <= MAX_CODE_POINT)" is false
33367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
33377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.toChars(UCharacter.MAX_CODE_POINT+positive_cases[i]);
33387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.toChars(int) was suppose to return an exception " +
33397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "when the parameter " + positive_cases[i] + " is a large number.");
33407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){
33417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
33427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
33437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
33447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
33467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
33477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static int codePointCount(CharSequence text, int start, int limit)
33487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public static int codePointCount(char[] text, int start, int limit)
33497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
33507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCodePointCount(){
33517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // The following tests the first if statement to make it true:
33527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //  if (start < 0 || limit < start || limit > text.length)
33537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //  which will throw an exception.
33547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char[] empty_text = {};
33557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char[] one_char_text = {'a'};
33567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char[] reg_text = {'d','u','m','m','y'};
33577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] invalid_startCases = {-1,-2,-5,-10,-100};
33587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] limitCases = {2,3,5,10,25};
33597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // When start < 0
33617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i < invalid_startCases.length; i++){
33627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
33637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.codePointCount(reg_text, invalid_startCases[i], 1);
33647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.codePointCount was suppose to return an exception " +
33657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "but got " + UCharacter.codePointCount(reg_text, invalid_startCases[i], 1) +
33667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ". The following passed parameters were Text: " + String.valueOf(reg_text) + ", Start: " +
33677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        invalid_startCases[i] + ", Limit: " + 1 + ".");
33687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){
33697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
33707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
33717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // When limit < start
33737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i < limitCases.length; i++){
33747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
33757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.codePointCount(reg_text, 100, limitCases[i]);
33767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.codePointCount was suppose to return an exception " +
33777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "but got " + UCharacter.codePointCount(reg_text, 100, limitCases[i]) +
33787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ". The following passed parameters were Text: " + String.valueOf(reg_text) + ", Start: " +
33797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        100 + ", Limit: " + limitCases[i] + ".");
33807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){
33817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
33827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
33837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // When limit > text.length
33857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i < limitCases.length; i++){
33867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
33877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.codePointCount(empty_text, 0, limitCases[i]);
33887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.codePointCount was suppose to return an exception " +
33897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "but got " + UCharacter.codePointCount(empty_text, 0, limitCases[i]) +
33907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ". The following passed parameters were Text: " + String.valueOf(empty_text) + ", Start: " +
33917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        0 + ", Limit: " + limitCases[i] + ".");
33927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){
33937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
33947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
33957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try{
33967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                UCharacter.codePointCount(one_char_text, 0, limitCases[i]);
33977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.codePointCount was suppose to return an exception " +
33987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        "but got " + UCharacter.codePointCount(one_char_text, 0, limitCases[i]) +
33997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ". The following passed parameters were Text: " + String.valueOf(one_char_text) + ", Start: " +
34007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        0 + ", Limit: " + limitCases[i] + ".");
34017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch(Exception e){
34027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
34037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
34047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
34057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
34077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The following method tests
34087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      private static int getEuropeanDigit(int ch)
34097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The method needs to use the method "digit" in order to access the
34107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * getEuropeanDigit method.
34117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
34127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetEuropeanDigit(){
34137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //The number retrieved from 0xFF41 to 0xFF5A is due to
34147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //  exhaustive testing from UTF16.CODEPOINT_MIN_VALUE to
34157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //  UTF16.CODEPOINT_MAX_VALUE return a value of -1.
34167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] radixResult = {
34187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                10,11,12,13,14,15,16,17,18,19,20,21,22,
34197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                23,24,25,26,27,28,29,30,31,32,33,34,35};
34207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Invalid and too-small-for-these-digits radix values.
34217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] radixCase1 = {0,1,5,10,100};
34227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Radix values that work for at least some of the "digits".
34237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] radixCase2 = {12,16,20,36};
34247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0xFF41; i<=0xFF5A; i++){
34267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for(int j=0; j < radixCase1.length; j++){
34277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(UCharacter.digit(i, radixCase1[j]) != -1){
34287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("UCharacter.digit(int,int) was supposed to return -1 for radix " + radixCase1[j]
34297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + ". Value passed: U+" + Integer.toHexString(i) + ". Got: " + UCharacter.digit(i, radixCase1[j]));
34307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
34317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
34327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for(int j=0; j < radixCase2.length; j++){
34337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int radix = radixCase2[j];
34347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int expected = (radixResult[i-0xFF41] < radix) ? radixResult[i-0xFF41] : -1;
34357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                int actual = UCharacter.digit(i, radix);
34367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(actual != expected){
34377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("UCharacter.digit(int,int) was supposed to return " +
34387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            expected + " for radix " + radix +
34397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ". Value passed: U+" + Integer.toHexString(i) + ". Got: " + actual);
34407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    break;
34417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
34427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
34437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
34447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
34457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* Tests the method
34477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      private static final int getProperty(int ch)
34487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * from public static int getType(int ch)
34497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
34507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGetProperty(){
34517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] cases = {UTF16.CODEPOINT_MAX_VALUE+1, UTF16.CODEPOINT_MAX_VALUE+2};
34527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for(int i=0; i < cases.length; i++)
34537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(UCharacter.getType(cases[i]) != 0)
34547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("UCharacter.getType for testing UCharacter.getProperty "
34557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + "did not return 0 for passed value of " + cases[i] +
34567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        " but got " + UCharacter.getType(cases[i]));
34577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
34587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* Tests the class
34607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      abstract public static class XSymbolTable implements SymbolTable
34617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
34627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestXSymbolTable(){
34637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class MyXSymbolTable extends UnicodeSet.XSymbolTable {}
34647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MyXSymbolTable st = new MyXSymbolTable();
34657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests "public UnicodeMatcher lookupMatcher(int i)"
34677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(st.lookupMatcher(0) != null)
34687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("XSymbolTable.lookupMatcher(int i) was suppose to return null.");
34697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests "public boolean applyPropertyAlias(String propertyName, String propertyValue, UnicodeSet result)"
34717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(st.applyPropertyAlias("", "", new UnicodeSet()) != false)
34727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("XSymbolTable.applyPropertyAlias(String propertyName, String propertyValue, UnicodeSet result) was suppose to return false.");
34737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests "public char[] lookup(String s)"
34757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(st.lookup("") != null)
34767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("XSymbolTable.lookup(String s) was suppose to return null.");
34777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Tests "public String parseReference(String text, ParsePosition pos, int limit)"
34797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(st.parseReference("", null, 0) != null)
34807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("XSymbolTable.parseReference(String text, ParsePosition pos, int limit) was suppose to return null.");
34817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
34827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* Tests the method
34847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *      public boolean isFrozen()
34857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
34867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestIsFrozen(){
34877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        UnicodeSet us = new UnicodeSet();
34887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(us.isFrozen() != false)
34897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Unicode.isFrozen() was suppose to return false.");
34907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
34917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        us.freeze();
34927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(us.isFrozen() != true)
34937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Unicode.isFrozen() was suppose to return true.");
34947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
34957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
3496