/** ******************************************************************************* * Copyright (C) 2004-2008, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ package com.ibm.icu.dev.test.lang; import com.ibm.icu.dev.test.TestFmwk; import com.ibm.icu.impl.Utility; import com.ibm.icu.lang.UCharacter; import com.ibm.icu.text.UTF16; /** * Test JDK 1.5 cover APIs. */ public final class UCharacterSurrogateTest extends TestFmwk { public static void main(String[] args) { new UCharacterSurrogateTest().run(args); } public void TestUnicodeBlockForName() { String[] names = {"Latin-1 Supplement", "Optical Character Recognition", "CJK Unified Ideographs Extension A", "Supplemental Arrows-B", "Supplemental arrows b", "supp-lement-al arrowsb", "Supplementary Private Use Area-B", "supplementary_Private_Use_Area-b", "supplementary_PRIVATE_Use_Area_b"}; for (int i = 0; i < names.length; ++i) { try { UCharacter.UnicodeBlock b = UCharacter.UnicodeBlock .forName(names[i]); logln("found: " + b + " for name: " + names[i]); } catch (Exception e) { errln("could not find block for name: " + names[i]); break; } } } public void TestIsValidCodePoint() { if (UCharacter.isValidCodePoint(-1)) errln("-1"); if (!UCharacter.isValidCodePoint(0)) errln("0"); if (!UCharacter.isValidCodePoint(UCharacter.MAX_CODE_POINT)) errln("0x10ffff"); if (UCharacter.isValidCodePoint(UCharacter.MAX_CODE_POINT + 1)) errln("0x110000"); } public void TestIsSupplementaryCodePoint() { if (UCharacter.isSupplementaryCodePoint(-1)) errln("-1"); if (UCharacter.isSupplementaryCodePoint(0)) errln("0"); if (UCharacter .isSupplementaryCodePoint(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT - 1)) errln("0xffff"); if (!UCharacter .isSupplementaryCodePoint(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT)) errln("0x10000"); if (!UCharacter.isSupplementaryCodePoint(UCharacter.MAX_CODE_POINT)) errln("0x10ffff"); if (UCharacter.isSupplementaryCodePoint(UCharacter.MAX_CODE_POINT + 1)) errln("0x110000"); } public void TestIsHighSurrogate() { if (UCharacter .isHighSurrogate((char) (UCharacter.MIN_HIGH_SURROGATE - 1))) errln("0xd7ff"); if (!UCharacter.isHighSurrogate(UCharacter.MIN_HIGH_SURROGATE)) errln("0xd800"); if (!UCharacter.isHighSurrogate(UCharacter.MAX_HIGH_SURROGATE)) errln("0xdbff"); if (UCharacter .isHighSurrogate((char) (UCharacter.MAX_HIGH_SURROGATE + 1))) errln("0xdc00"); } public void TestIsLowSurrogate() { if (UCharacter .isLowSurrogate((char) (UCharacter.MIN_LOW_SURROGATE - 1))) errln("0xdbff"); if (!UCharacter.isLowSurrogate(UCharacter.MIN_LOW_SURROGATE)) errln("0xdc00"); if (!UCharacter.isLowSurrogate(UCharacter.MAX_LOW_SURROGATE)) errln("0xdfff"); if (UCharacter .isLowSurrogate((char) (UCharacter.MAX_LOW_SURROGATE + 1))) errln("0xe000"); } public void TestIsSurrogatePair() { if (UCharacter.isSurrogatePair( (char) (UCharacter.MIN_HIGH_SURROGATE - 1), UCharacter.MIN_LOW_SURROGATE)) errln("0xd7ff,0xdc00"); if (UCharacter.isSurrogatePair( (char) (UCharacter.MAX_HIGH_SURROGATE + 1), UCharacter.MIN_LOW_SURROGATE)) errln("0xd800,0xdc00"); if (UCharacter.isSurrogatePair(UCharacter.MIN_HIGH_SURROGATE, (char) (UCharacter.MIN_LOW_SURROGATE - 1))) errln("0xd800,0xdbff"); if (UCharacter.isSurrogatePair(UCharacter.MIN_HIGH_SURROGATE, (char) (UCharacter.MAX_LOW_SURROGATE + 1))) errln("0xd800,0xe000"); if (!UCharacter.isSurrogatePair(UCharacter.MIN_HIGH_SURROGATE, UCharacter.MIN_LOW_SURROGATE)) errln("0xd800,0xdc00"); } public void TestCharCount() { UCharacter.charCount(-1); UCharacter.charCount(UCharacter.MAX_CODE_POINT + 1); if (UCharacter.charCount(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT - 1) != 1) errln("0xffff"); if (UCharacter.charCount(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT) != 2) errln("0x010000"); } public void TestToCodePoint() { final char[] pairs = {(char) (UCharacter.MIN_HIGH_SURROGATE + 0), (char) (UCharacter.MIN_LOW_SURROGATE + 0), (char) (UCharacter.MIN_HIGH_SURROGATE + 1), (char) (UCharacter.MIN_LOW_SURROGATE + 1), (char) (UCharacter.MIN_HIGH_SURROGATE + 2), (char) (UCharacter.MIN_LOW_SURROGATE + 2), (char) (UCharacter.MAX_HIGH_SURROGATE - 2), (char) (UCharacter.MAX_LOW_SURROGATE - 2), (char) (UCharacter.MAX_HIGH_SURROGATE - 1), (char) (UCharacter.MAX_LOW_SURROGATE - 1), (char) (UCharacter.MAX_HIGH_SURROGATE - 0), (char) (UCharacter.MAX_LOW_SURROGATE - 0),}; for (int i = 0; i < pairs.length; i += 2) { int cp = UCharacter.toCodePoint(pairs[i], pairs[i + 1]); if (pairs[i] != UTF16.getLeadSurrogate(cp) || pairs[i + 1] != UTF16.getTrailSurrogate(cp)) { errln(Integer.toHexString(pairs[i]) + ", " + pairs[i + 1]); break; } } } public void TestCodePointAtBefore() { String s = "" + UCharacter.MIN_HIGH_SURROGATE + // isolated high UCharacter.MIN_HIGH_SURROGATE + // pair UCharacter.MIN_LOW_SURROGATE + UCharacter.MIN_LOW_SURROGATE; // isolated // low char[] c = s.toCharArray(); int[] avalues = { UCharacter.MIN_HIGH_SURROGATE, UCharacter.toCodePoint(UCharacter.MIN_HIGH_SURROGATE, UCharacter.MIN_LOW_SURROGATE), UCharacter.MIN_LOW_SURROGATE, UCharacter.MIN_LOW_SURROGATE}; int[] bvalues = { UCharacter.MIN_HIGH_SURROGATE, UCharacter.MIN_HIGH_SURROGATE, UCharacter.toCodePoint(UCharacter.MIN_HIGH_SURROGATE, UCharacter.MIN_LOW_SURROGATE), UCharacter.MIN_LOW_SURROGATE,}; StringBuffer b = new StringBuffer(s); for (int i = 0; i < avalues.length; ++i) { if (UCharacter.codePointAt(s, i) != avalues[i]) errln("string at: " + i); if (UCharacter.codePointAt(c, i) != avalues[i]) errln("chars at: " + i); if (UCharacter.codePointAt(b, i) != avalues[i]) errln("stringbuffer at: " + i); if (UCharacter.codePointBefore(s, i + 1) != bvalues[i]) errln("string before: " + i); if (UCharacter.codePointBefore(c, i + 1) != bvalues[i]) errln("chars before: " + i); if (UCharacter.codePointBefore(b, i + 1) != bvalues[i]) errln("stringbuffer before: " + i); } //cover codePointAtBefore with limit logln("Testing codePointAtBefore with limit ..."); for (int i = 0; i < avalues.length; ++i) { if (UCharacter.codePointAt(c, i, 4) != avalues[i]) errln("chars at: " + i); if (UCharacter.codePointBefore(c, i + 1, 0) != bvalues[i]) errln("chars before: " + i); } } public void TestToChars() { char[] chars = new char[3]; int cp = UCharacter.toCodePoint(UCharacter.MIN_HIGH_SURROGATE, UCharacter.MIN_LOW_SURROGATE); UCharacter.toChars(cp, chars, 1); if (chars[1] != UCharacter.MIN_HIGH_SURROGATE || chars[2] != UCharacter.MIN_LOW_SURROGATE) { errln("fail"); } chars = UCharacter.toChars(cp); if (chars[0] != UCharacter.MIN_HIGH_SURROGATE || chars[1] != UCharacter.MIN_LOW_SURROGATE) { errln("fail"); } } public void TestCodePointCount() { class Test { String str(String s, int start, int limit) { if(s==null){ s=""; } return "codePointCount('" + Utility.escape(s) + "' " + start + ", " + limit + ")"; } void test(String s, int start, int limit, int expected) { int val1 = UCharacter.codePointCount(s.toCharArray(), start, limit); int val2 = UCharacter.codePointCount(s, start, limit); if (val1 != expected) { errln("char[] " + str(s, start, limit) + "(" + val1 + ") != " + expected); } else if (val2 != expected) { errln("String " + str(s, start, limit) + "(" + val2 + ") != " + expected); } else if (isVerbose()) { logln(str(s, start, limit) + " == " + expected); } } void fail(String s, int start, int limit, Class exc) { try { UCharacter.codePointCount(s, start, limit); errln("unexpected success " + str(s, start, limit)); } catch (Throwable e) { if (!exc.isInstance(e)) { warnln("bad exception " + str(s, start, limit) + e.getClass().getName()); } } } } Test test = new Test(); test.fail(null, 0, 1, NullPointerException.class); test.fail("a", -1, 0, IndexOutOfBoundsException.class); test.fail("a", 1, 2, IndexOutOfBoundsException.class); test.fail("a", 1, 0, IndexOutOfBoundsException.class); test.test("", 0, 0, 0); test.test("\ud800", 0, 1, 1); test.test("\udc00", 0, 1, 1); test.test("\ud800\udc00", 0, 1, 1); test.test("\ud800\udc00", 1, 2, 1); test.test("\ud800\udc00", 0, 2, 1); test.test("\udc00\ud800", 0, 1, 1); test.test("\udc00\ud800", 1, 2, 1); test.test("\udc00\ud800", 0, 2, 2); test.test("\ud800\ud800\udc00", 0, 2, 2); test.test("\ud800\ud800\udc00", 1, 3, 1); test.test("\ud800\ud800\udc00", 0, 3, 2); test.test("\ud800\udc00\udc00", 0, 2, 1); test.test("\ud800\udc00\udc00", 1, 3, 2); test.test("\ud800\udc00\udc00", 0, 3, 2); } public void TestOffsetByCodePoints() { class Test { String str(String s, int start, int count, int index, int offset) { return "offsetByCodePoints('" + Utility.escape(s) + "' " + start + ", " + count + ", " + index + ", " + offset + ")"; } void test(String s, int start, int count, int index, int offset, int expected, boolean flip) { char[] chars = s.toCharArray(); String string = s.substring(start, start + count); int val1 = UCharacter.offsetByCodePoints(chars, start, count, index, offset); int val2 = UCharacter.offsetByCodePoints(string, index - start, offset) + start; if (val1 != expected) { errln("char[] " + str(s, start, count, index, offset) + "(" + val1 + ") != " + expected); } else if (val2 != expected) { errln("String " + str(s, start, count, index, offset) + "(" + val2 + ") != " + expected); } else if (isVerbose()) { logln(str(s, start, count, index, offset) + " == " + expected); } if (flip) { val1 = UCharacter.offsetByCodePoints(chars, start, count, expected, -offset); val2 = UCharacter.offsetByCodePoints(string, expected - start, -offset) + start; if (val1 != index) { errln("char[] " + str(s, start, count, expected, -offset) + "(" + val1 + ") != " + index); } else if (val2 != index) { errln("String " + str(s, start, count, expected, -offset) + "(" + val2 + ") != " + index); } else if (isVerbose()) { logln(str(s, start, count, expected, -offset) + " == " + index); } } } void fail(char[] text, int start, int count, int index, int offset, Class exc) { try { UCharacter.offsetByCodePoints(text, start, count, index, offset); errln("unexpected success " + str(new String(text), start, count, index, offset)); } catch (Throwable e) { if (!exc.isInstance(e)) { errln("bad exception " + str(new String(text), start, count, index, offset) + e.getClass().getName()); } } } void fail(String text, int index, int offset, Class exc) { try { UCharacter.offsetByCodePoints(text, index, offset); errln("unexpected success " + str(text, index, offset, 0, text.length())); } catch (Throwable e) { if (!exc.isInstance(e)) { errln("bad exception " + str(text, 0, text.length(), index, offset) + e.getClass().getName()); } } } } Test test = new Test(); test.test("\ud800\ud800\udc00", 0, 2, 0, 1, 1, true); test.fail((char[]) null, 0, 1, 0, 1, NullPointerException.class); test.fail((String) null, 0, 1, NullPointerException.class); test.fail("abc", -1, 0, IndexOutOfBoundsException.class); test.fail("abc", 4, 0, IndexOutOfBoundsException.class); test.fail("abc", 1, -2, IndexOutOfBoundsException.class); test.fail("abc", 2, 2, IndexOutOfBoundsException.class); char[] abc = "abc".toCharArray(); test.fail(abc, -1, 2, 0, 0, IndexOutOfBoundsException.class); test.fail(abc, 2, 2, 3, 0, IndexOutOfBoundsException.class); test.fail(abc, 1, -1, 0, 0, IndexOutOfBoundsException.class); test.fail(abc, 1, 1, 2, -2, IndexOutOfBoundsException.class); test.fail(abc, 1, 1, 1, 2, IndexOutOfBoundsException.class); test.fail(abc, 1, 2, 1, 3, IndexOutOfBoundsException.class); test.fail(abc, 0, 2, 2, -3, IndexOutOfBoundsException.class); test.test("", 0, 0, 0, 0, 0, false); test.test("\ud800", 0, 1, 0, 1, 1, true); test.test("\udc00", 0, 1, 0, 1, 1, true); String s = "\ud800\udc00"; test.test(s, 0, 1, 0, 1, 1, true); test.test(s, 0, 2, 0, 1, 2, true); test.test(s, 0, 2, 1, 1, 2, false); test.test(s, 1, 1, 1, 1, 2, true); s = "\udc00\ud800"; test.test(s, 0, 1, 0, 1, 1, true); test.test(s, 0, 2, 0, 1, 1, true); test.test(s, 0, 2, 0, 2, 2, true); test.test(s, 0, 2, 1, 1, 2, true); test.test(s, 1, 1, 1, 1, 2, true); s = "\ud800\ud800\udc00"; test.test(s, 0, 1, 0, 1, 1, true); test.test(s, 0, 2, 0, 1, 1, true); test.test(s, 0, 2, 0, 2, 2, true); test.test(s, 0, 2, 1, 1, 2, true); test.test(s, 0, 3, 0, 1, 1, true); test.test(s, 0, 3, 0, 2, 3, true); test.test(s, 0, 3, 1, 1, 3, true); test.test(s, 0, 3, 2, 1, 3, false); test.test(s, 1, 1, 1, 1, 2, true); test.test(s, 1, 2, 1, 1, 3, true); test.test(s, 1, 2, 2, 1, 3, false); test.test(s, 2, 1, 2, 1, 3, true); s = "\ud800\udc00\udc00"; test.test(s, 0, 1, 0, 1, 1, true); test.test(s, 0, 2, 0, 1, 2, true); test.test(s, 0, 2, 1, 1, 2, false); test.test(s, 0, 3, 0, 1, 2, true); test.test(s, 0, 3, 0, 2, 3, true); test.test(s, 0, 3, 1, 1, 2, false); test.test(s, 0, 3, 1, 2, 3, false); test.test(s, 0, 3, 2, 1, 3, true); test.test(s, 1, 1, 1, 1, 2, true); test.test(s, 1, 2, 1, 1, 2, true); test.test(s, 1, 2, 1, 2, 3, true); test.test(s, 1, 2, 2, 1, 3, true); test.test(s, 2, 1, 2, 1, 3, true); } }