2 *******************************************************************************
\r
3 * Copyright (C) 2004-2008, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
8 package com.ibm.icu.dev.test.lang;
\r
10 import com.ibm.icu.dev.test.TestFmwk;
\r
11 import com.ibm.icu.impl.Utility;
\r
12 import com.ibm.icu.lang.UCharacter;
\r
13 import com.ibm.icu.text.UTF16;
\r
16 * Test JDK 1.5 cover APIs.
\r
18 public final class UCharacterSurrogateTest extends TestFmwk {
\r
20 public static void main(String[] args) {
\r
21 new UCharacterSurrogateTest().run(args);
\r
24 public void TestUnicodeBlockForName() {
\r
25 String[] names = {"Latin-1 Supplement",
\r
26 "Optical Character Recognition",
\r
27 "CJK Unified Ideographs Extension A",
\r
28 "Supplemental Arrows-B",
\r
29 "Supplemental arrows b",
\r
30 "supp-lement-al arrowsb",
\r
31 "Supplementary Private Use Area-B",
\r
32 "supplementary_Private_Use_Area-b",
\r
33 "supplementary_PRIVATE_Use_Area_b"};
\r
34 for (int i = 0; i < names.length; ++i) {
\r
36 UCharacter.UnicodeBlock b = UCharacter.UnicodeBlock
\r
38 logln("found: " + b + " for name: " + names[i]);
\r
39 } catch (Exception e) {
\r
40 errln("could not find block for name: " + names[i]);
\r
46 public void TestIsValidCodePoint() {
\r
47 if (UCharacter.isValidCodePoint(-1))
\r
49 if (!UCharacter.isValidCodePoint(0))
\r
51 if (!UCharacter.isValidCodePoint(UCharacter.MAX_CODE_POINT))
\r
53 if (UCharacter.isValidCodePoint(UCharacter.MAX_CODE_POINT + 1))
\r
57 public void TestIsSupplementaryCodePoint() {
\r
58 if (UCharacter.isSupplementaryCodePoint(-1))
\r
60 if (UCharacter.isSupplementaryCodePoint(0))
\r
63 .isSupplementaryCodePoint(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT - 1))
\r
66 .isSupplementaryCodePoint(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT))
\r
68 if (!UCharacter.isSupplementaryCodePoint(UCharacter.MAX_CODE_POINT))
\r
70 if (UCharacter.isSupplementaryCodePoint(UCharacter.MAX_CODE_POINT + 1))
\r
74 public void TestIsHighSurrogate() {
\r
76 .isHighSurrogate((char) (UCharacter.MIN_HIGH_SURROGATE - 1)))
\r
78 if (!UCharacter.isHighSurrogate(UCharacter.MIN_HIGH_SURROGATE))
\r
80 if (!UCharacter.isHighSurrogate(UCharacter.MAX_HIGH_SURROGATE))
\r
83 .isHighSurrogate((char) (UCharacter.MAX_HIGH_SURROGATE + 1)))
\r
87 public void TestIsLowSurrogate() {
\r
89 .isLowSurrogate((char) (UCharacter.MIN_LOW_SURROGATE - 1)))
\r
91 if (!UCharacter.isLowSurrogate(UCharacter.MIN_LOW_SURROGATE))
\r
93 if (!UCharacter.isLowSurrogate(UCharacter.MAX_LOW_SURROGATE))
\r
96 .isLowSurrogate((char) (UCharacter.MAX_LOW_SURROGATE + 1)))
\r
100 public void TestIsSurrogatePair() {
\r
101 if (UCharacter.isSurrogatePair(
\r
102 (char) (UCharacter.MIN_HIGH_SURROGATE - 1),
\r
103 UCharacter.MIN_LOW_SURROGATE))
\r
104 errln("0xd7ff,0xdc00");
\r
105 if (UCharacter.isSurrogatePair(
\r
106 (char) (UCharacter.MAX_HIGH_SURROGATE + 1),
\r
107 UCharacter.MIN_LOW_SURROGATE))
\r
108 errln("0xd800,0xdc00");
\r
109 if (UCharacter.isSurrogatePair(UCharacter.MIN_HIGH_SURROGATE,
\r
110 (char) (UCharacter.MIN_LOW_SURROGATE - 1)))
\r
111 errln("0xd800,0xdbff");
\r
112 if (UCharacter.isSurrogatePair(UCharacter.MIN_HIGH_SURROGATE,
\r
113 (char) (UCharacter.MAX_LOW_SURROGATE + 1)))
\r
114 errln("0xd800,0xe000");
\r
115 if (!UCharacter.isSurrogatePair(UCharacter.MIN_HIGH_SURROGATE,
\r
116 UCharacter.MIN_LOW_SURROGATE))
\r
117 errln("0xd800,0xdc00");
\r
120 public void TestCharCount() {
\r
121 UCharacter.charCount(-1);
\r
122 UCharacter.charCount(UCharacter.MAX_CODE_POINT + 1);
\r
123 if (UCharacter.charCount(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT - 1) != 1)
\r
125 if (UCharacter.charCount(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT) != 2)
\r
129 public void TestToCodePoint() {
\r
130 final char[] pairs = {(char) (UCharacter.MIN_HIGH_SURROGATE + 0),
\r
131 (char) (UCharacter.MIN_LOW_SURROGATE + 0),
\r
132 (char) (UCharacter.MIN_HIGH_SURROGATE + 1),
\r
133 (char) (UCharacter.MIN_LOW_SURROGATE + 1),
\r
134 (char) (UCharacter.MIN_HIGH_SURROGATE + 2),
\r
135 (char) (UCharacter.MIN_LOW_SURROGATE + 2),
\r
136 (char) (UCharacter.MAX_HIGH_SURROGATE - 2),
\r
137 (char) (UCharacter.MAX_LOW_SURROGATE - 2),
\r
138 (char) (UCharacter.MAX_HIGH_SURROGATE - 1),
\r
139 (char) (UCharacter.MAX_LOW_SURROGATE - 1),
\r
140 (char) (UCharacter.MAX_HIGH_SURROGATE - 0),
\r
141 (char) (UCharacter.MAX_LOW_SURROGATE - 0),};
\r
142 for (int i = 0; i < pairs.length; i += 2) {
\r
143 int cp = UCharacter.toCodePoint(pairs[i], pairs[i + 1]);
\r
144 if (pairs[i] != UTF16.getLeadSurrogate(cp)
\r
145 || pairs[i + 1] != UTF16.getTrailSurrogate(cp)) {
\r
147 errln(Integer.toHexString(pairs[i]) + ", " + pairs[i + 1]);
\r
153 public void TestCodePointAtBefore() {
\r
154 String s = "" + UCharacter.MIN_HIGH_SURROGATE + // isolated high
\r
155 UCharacter.MIN_HIGH_SURROGATE + // pair
\r
156 UCharacter.MIN_LOW_SURROGATE + UCharacter.MIN_LOW_SURROGATE; // isolated
\r
158 char[] c = s.toCharArray();
\r
160 UCharacter.MIN_HIGH_SURROGATE,
\r
161 UCharacter.toCodePoint(UCharacter.MIN_HIGH_SURROGATE,
\r
162 UCharacter.MIN_LOW_SURROGATE),
\r
163 UCharacter.MIN_LOW_SURROGATE, UCharacter.MIN_LOW_SURROGATE};
\r
165 UCharacter.MIN_HIGH_SURROGATE,
\r
166 UCharacter.MIN_HIGH_SURROGATE,
\r
167 UCharacter.toCodePoint(UCharacter.MIN_HIGH_SURROGATE,
\r
168 UCharacter.MIN_LOW_SURROGATE),
\r
169 UCharacter.MIN_LOW_SURROGATE,};
\r
170 StringBuffer b = new StringBuffer(s);
\r
171 for (int i = 0; i < avalues.length; ++i) {
\r
172 if (UCharacter.codePointAt(s, i) != avalues[i])
\r
173 errln("string at: " + i);
\r
174 if (UCharacter.codePointAt(c, i) != avalues[i])
\r
175 errln("chars at: " + i);
\r
176 if (UCharacter.codePointAt(b, i) != avalues[i])
\r
177 errln("stringbuffer at: " + i);
\r
179 if (UCharacter.codePointBefore(s, i + 1) != bvalues[i])
\r
180 errln("string before: " + i);
\r
181 if (UCharacter.codePointBefore(c, i + 1) != bvalues[i])
\r
182 errln("chars before: " + i);
\r
183 if (UCharacter.codePointBefore(b, i + 1) != bvalues[i])
\r
184 errln("stringbuffer before: " + i);
\r
187 //cover codePointAtBefore with limit
\r
188 logln("Testing codePointAtBefore with limit ...");
\r
189 for (int i = 0; i < avalues.length; ++i) {
\r
190 if (UCharacter.codePointAt(c, i, 4) != avalues[i])
\r
191 errln("chars at: " + i);
\r
192 if (UCharacter.codePointBefore(c, i + 1, 0) != bvalues[i])
\r
193 errln("chars before: " + i);
\r
198 public void TestToChars() {
\r
199 char[] chars = new char[3];
\r
200 int cp = UCharacter.toCodePoint(UCharacter.MIN_HIGH_SURROGATE,
\r
201 UCharacter.MIN_LOW_SURROGATE);
\r
202 UCharacter.toChars(cp, chars, 1);
\r
203 if (chars[1] != UCharacter.MIN_HIGH_SURROGATE
\r
204 || chars[2] != UCharacter.MIN_LOW_SURROGATE) {
\r
209 chars = UCharacter.toChars(cp);
\r
210 if (chars[0] != UCharacter.MIN_HIGH_SURROGATE
\r
211 || chars[1] != UCharacter.MIN_LOW_SURROGATE) {
\r
217 public void TestCodePointCount() {
\r
219 String str(String s, int start, int limit) {
\r
223 return "codePointCount('" + Utility.escape(s) + "' " + start
\r
224 + ", " + limit + ")";
\r
227 void test(String s, int start, int limit, int expected) {
\r
228 int val1 = UCharacter.codePointCount(s.toCharArray(), start,
\r
230 int val2 = UCharacter.codePointCount(s, start, limit);
\r
231 if (val1 != expected) {
\r
232 errln("char[] " + str(s, start, limit) + "(" + val1
\r
233 + ") != " + expected);
\r
234 } else if (val2 != expected) {
\r
235 errln("String " + str(s, start, limit) + "(" + val2
\r
236 + ") != " + expected);
\r
237 } else if (isVerbose()) {
\r
238 logln(str(s, start, limit) + " == " + expected);
\r
242 void fail(String s, int start, int limit, Class exc) {
\r
244 UCharacter.codePointCount(s, start, limit);
\r
245 errln("unexpected success " + str(s, start, limit));
\r
246 } catch (Throwable e) {
\r
247 if (!exc.isInstance(e)) {
\r
248 warnln("bad exception " + str(s, start, limit)
\r
249 + e.getClass().getName());
\r
255 Test test = new Test();
\r
256 test.fail(null, 0, 1, NullPointerException.class);
\r
257 test.fail("a", -1, 0, IndexOutOfBoundsException.class);
\r
258 test.fail("a", 1, 2, IndexOutOfBoundsException.class);
\r
259 test.fail("a", 1, 0, IndexOutOfBoundsException.class);
\r
260 test.test("", 0, 0, 0);
\r
261 test.test("\ud800", 0, 1, 1);
\r
262 test.test("\udc00", 0, 1, 1);
\r
263 test.test("\ud800\udc00", 0, 1, 1);
\r
264 test.test("\ud800\udc00", 1, 2, 1);
\r
265 test.test("\ud800\udc00", 0, 2, 1);
\r
266 test.test("\udc00\ud800", 0, 1, 1);
\r
267 test.test("\udc00\ud800", 1, 2, 1);
\r
268 test.test("\udc00\ud800", 0, 2, 2);
\r
269 test.test("\ud800\ud800\udc00", 0, 2, 2);
\r
270 test.test("\ud800\ud800\udc00", 1, 3, 1);
\r
271 test.test("\ud800\ud800\udc00", 0, 3, 2);
\r
272 test.test("\ud800\udc00\udc00", 0, 2, 1);
\r
273 test.test("\ud800\udc00\udc00", 1, 3, 2);
\r
274 test.test("\ud800\udc00\udc00", 0, 3, 2);
\r
277 public void TestOffsetByCodePoints() {
\r
279 String str(String s, int start, int count, int index, int offset) {
\r
280 return "offsetByCodePoints('" + Utility.escape(s) + "' "
\r
281 + start + ", " + count + ", " + index + ", " + offset
\r
285 void test(String s, int start, int count, int index, int offset,
\r
286 int expected, boolean flip) {
\r
287 char[] chars = s.toCharArray();
\r
288 String string = s.substring(start, start + count);
\r
289 int val1 = UCharacter.offsetByCodePoints(chars, start, count,
\r
291 int val2 = UCharacter.offsetByCodePoints(string, index - start,
\r
295 if (val1 != expected) {
\r
296 errln("char[] " + str(s, start, count, index, offset) + "("
\r
297 + val1 + ") != " + expected);
\r
298 } else if (val2 != expected) {
\r
299 errln("String " + str(s, start, count, index, offset) + "("
\r
300 + val2 + ") != " + expected);
\r
301 } else if (isVerbose()) {
\r
302 logln(str(s, start, count, index, offset) + " == "
\r
307 val1 = UCharacter.offsetByCodePoints(chars, start, count,
\r
308 expected, -offset);
\r
309 val2 = UCharacter.offsetByCodePoints(string, expected
\r
312 if (val1 != index) {
\r
314 + str(s, start, count, expected, -offset) + "("
\r
315 + val1 + ") != " + index);
\r
316 } else if (val2 != index) {
\r
318 + str(s, start, count, expected, -offset) + "("
\r
319 + val2 + ") != " + index);
\r
320 } else if (isVerbose()) {
\r
321 logln(str(s, start, count, expected, -offset) + " == "
\r
327 void fail(char[] text, int start, int count, int index, int offset,
\r
330 UCharacter.offsetByCodePoints(text, start, count, index,
\r
332 errln("unexpected success "
\r
333 + str(new String(text), start, count, index, offset));
\r
334 } catch (Throwable e) {
\r
335 if (!exc.isInstance(e)) {
\r
336 errln("bad exception "
\r
337 + str(new String(text), start, count, index,
\r
338 offset) + e.getClass().getName());
\r
343 void fail(String text, int index, int offset, Class exc) {
\r
345 UCharacter.offsetByCodePoints(text, index, offset);
\r
346 errln("unexpected success "
\r
347 + str(text, index, offset, 0, text.length()));
\r
348 } catch (Throwable e) {
\r
349 if (!exc.isInstance(e)) {
\r
350 errln("bad exception "
\r
351 + str(text, 0, text.length(), index, offset)
\r
352 + e.getClass().getName());
\r
358 Test test = new Test();
\r
360 test.test("\ud800\ud800\udc00", 0, 2, 0, 1, 1, true);
\r
362 test.fail((char[]) null, 0, 1, 0, 1, NullPointerException.class);
\r
363 test.fail((String) null, 0, 1, NullPointerException.class);
\r
364 test.fail("abc", -1, 0, IndexOutOfBoundsException.class);
\r
365 test.fail("abc", 4, 0, IndexOutOfBoundsException.class);
\r
366 test.fail("abc", 1, -2, IndexOutOfBoundsException.class);
\r
367 test.fail("abc", 2, 2, IndexOutOfBoundsException.class);
\r
368 char[] abc = "abc".toCharArray();
\r
369 test.fail(abc, -1, 2, 0, 0, IndexOutOfBoundsException.class);
\r
370 test.fail(abc, 2, 2, 3, 0, IndexOutOfBoundsException.class);
\r
371 test.fail(abc, 1, -1, 0, 0, IndexOutOfBoundsException.class);
\r
372 test.fail(abc, 1, 1, 2, -2, IndexOutOfBoundsException.class);
\r
373 test.fail(abc, 1, 1, 1, 2, IndexOutOfBoundsException.class);
\r
374 test.fail(abc, 1, 2, 1, 3, IndexOutOfBoundsException.class);
\r
375 test.fail(abc, 0, 2, 2, -3, IndexOutOfBoundsException.class);
\r
376 test.test("", 0, 0, 0, 0, 0, false);
\r
377 test.test("\ud800", 0, 1, 0, 1, 1, true);
\r
378 test.test("\udc00", 0, 1, 0, 1, 1, true);
\r
380 String s = "\ud800\udc00";
\r
381 test.test(s, 0, 1, 0, 1, 1, true);
\r
382 test.test(s, 0, 2, 0, 1, 2, true);
\r
383 test.test(s, 0, 2, 1, 1, 2, false);
\r
384 test.test(s, 1, 1, 1, 1, 2, true);
\r
386 s = "\udc00\ud800";
\r
387 test.test(s, 0, 1, 0, 1, 1, true);
\r
388 test.test(s, 0, 2, 0, 1, 1, true);
\r
389 test.test(s, 0, 2, 0, 2, 2, true);
\r
390 test.test(s, 0, 2, 1, 1, 2, true);
\r
391 test.test(s, 1, 1, 1, 1, 2, true);
\r
393 s = "\ud800\ud800\udc00";
\r
394 test.test(s, 0, 1, 0, 1, 1, true);
\r
395 test.test(s, 0, 2, 0, 1, 1, true);
\r
396 test.test(s, 0, 2, 0, 2, 2, true);
\r
397 test.test(s, 0, 2, 1, 1, 2, true);
\r
398 test.test(s, 0, 3, 0, 1, 1, true);
\r
399 test.test(s, 0, 3, 0, 2, 3, true);
\r
400 test.test(s, 0, 3, 1, 1, 3, true);
\r
401 test.test(s, 0, 3, 2, 1, 3, false);
\r
402 test.test(s, 1, 1, 1, 1, 2, true);
\r
403 test.test(s, 1, 2, 1, 1, 3, true);
\r
404 test.test(s, 1, 2, 2, 1, 3, false);
\r
405 test.test(s, 2, 1, 2, 1, 3, true);
\r
407 s = "\ud800\udc00\udc00";
\r
408 test.test(s, 0, 1, 0, 1, 1, true);
\r
409 test.test(s, 0, 2, 0, 1, 2, true);
\r
410 test.test(s, 0, 2, 1, 1, 2, false);
\r
411 test.test(s, 0, 3, 0, 1, 2, true);
\r
412 test.test(s, 0, 3, 0, 2, 3, true);
\r
413 test.test(s, 0, 3, 1, 1, 2, false);
\r
414 test.test(s, 0, 3, 1, 2, 3, false);
\r
415 test.test(s, 0, 3, 2, 1, 3, true);
\r
416 test.test(s, 1, 1, 1, 1, 2, true);
\r
417 test.test(s, 1, 2, 1, 1, 2, true);
\r
418 test.test(s, 1, 2, 1, 2, 3, true);
\r
419 test.test(s, 1, 2, 2, 1, 3, true);
\r
420 test.test(s, 2, 1, 2, 1, 3, true);
\r