1 /**
2  *******************************************************************************
3  * Copyright (C) 2004-2008, International Business Machines Corporation and         *
4  * others. All Rights Reserved.                                                *
5  *******************************************************************************
6  */
7 
8 package com.ibm.icu.dev.test.lang;
9 
10 import com.ibm.icu.dev.test.TestFmwk;
11 import com.ibm.icu.impl.Utility;
12 import com.ibm.icu.lang.UCharacter;
13 import com.ibm.icu.text.UTF16;
14 
15 /**
16  * Test JDK 1.5 cover APIs.
17  */
18 public final class UCharacterSurrogateTest extends TestFmwk {
19 
main(String[] args)20     public static void main(String[] args) {
21         new UCharacterSurrogateTest().run(args);
22     }
23 
TestUnicodeBlockForName()24     public void TestUnicodeBlockForName() {
25       String[] names = {"Latin-1 Supplement",
26                         "Optical Character Recognition",
27                         "CJK Unified Ideographs Extension A",
28                         "Supplemental Arrows-B",
29                         "Supplemental arrows b",
30                         "supp-lement-al arrowsb",
31                         "Supplementary Private Use Area-B",
32                         "supplementary_Private_Use_Area-b",
33                         "supplementary_PRIVATE_Use_Area_b"};
34         for (int i = 0; i < names.length; ++i) {
35             try {
36                 UCharacter.UnicodeBlock b = UCharacter.UnicodeBlock
37                         .forName(names[i]);
38                 logln("found: " + b + " for name: " + names[i]);
39             } catch (Exception e) {
40                 errln("could not find block for name: " + names[i]);
41                 break;
42             }
43         }
44     }
45 
TestIsValidCodePoint()46     public void TestIsValidCodePoint() {
47         if (UCharacter.isValidCodePoint(-1))
48             errln("-1");
49         if (!UCharacter.isValidCodePoint(0))
50             errln("0");
51         if (!UCharacter.isValidCodePoint(UCharacter.MAX_CODE_POINT))
52             errln("0x10ffff");
53         if (UCharacter.isValidCodePoint(UCharacter.MAX_CODE_POINT + 1))
54             errln("0x110000");
55     }
56 
TestIsSupplementaryCodePoint()57     public void TestIsSupplementaryCodePoint() {
58         if (UCharacter.isSupplementaryCodePoint(-1))
59             errln("-1");
60         if (UCharacter.isSupplementaryCodePoint(0))
61             errln("0");
62         if (UCharacter
63                 .isSupplementaryCodePoint(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT - 1))
64             errln("0xffff");
65         if (!UCharacter
66                 .isSupplementaryCodePoint(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT))
67             errln("0x10000");
68         if (!UCharacter.isSupplementaryCodePoint(UCharacter.MAX_CODE_POINT))
69             errln("0x10ffff");
70         if (UCharacter.isSupplementaryCodePoint(UCharacter.MAX_CODE_POINT + 1))
71             errln("0x110000");
72     }
73 
TestIsHighSurrogate()74     public void TestIsHighSurrogate() {
75         if (UCharacter
76                 .isHighSurrogate((char) (UCharacter.MIN_HIGH_SURROGATE - 1)))
77             errln("0xd7ff");
78         if (!UCharacter.isHighSurrogate(UCharacter.MIN_HIGH_SURROGATE))
79             errln("0xd800");
80         if (!UCharacter.isHighSurrogate(UCharacter.MAX_HIGH_SURROGATE))
81             errln("0xdbff");
82         if (UCharacter
83                 .isHighSurrogate((char) (UCharacter.MAX_HIGH_SURROGATE + 1)))
84             errln("0xdc00");
85     }
86 
TestIsLowSurrogate()87     public void TestIsLowSurrogate() {
88         if (UCharacter
89                 .isLowSurrogate((char) (UCharacter.MIN_LOW_SURROGATE - 1)))
90             errln("0xdbff");
91         if (!UCharacter.isLowSurrogate(UCharacter.MIN_LOW_SURROGATE))
92             errln("0xdc00");
93         if (!UCharacter.isLowSurrogate(UCharacter.MAX_LOW_SURROGATE))
94             errln("0xdfff");
95         if (UCharacter
96                 .isLowSurrogate((char) (UCharacter.MAX_LOW_SURROGATE + 1)))
97             errln("0xe000");
98     }
99 
TestIsSurrogatePair()100     public void TestIsSurrogatePair() {
101         if (UCharacter.isSurrogatePair(
102                 (char) (UCharacter.MIN_HIGH_SURROGATE - 1),
103                 UCharacter.MIN_LOW_SURROGATE))
104             errln("0xd7ff,0xdc00");
105         if (UCharacter.isSurrogatePair(
106                 (char) (UCharacter.MAX_HIGH_SURROGATE + 1),
107                 UCharacter.MIN_LOW_SURROGATE))
108             errln("0xd800,0xdc00");
109         if (UCharacter.isSurrogatePair(UCharacter.MIN_HIGH_SURROGATE,
110                 (char) (UCharacter.MIN_LOW_SURROGATE - 1)))
111             errln("0xd800,0xdbff");
112         if (UCharacter.isSurrogatePair(UCharacter.MIN_HIGH_SURROGATE,
113                 (char) (UCharacter.MAX_LOW_SURROGATE + 1)))
114             errln("0xd800,0xe000");
115         if (!UCharacter.isSurrogatePair(UCharacter.MIN_HIGH_SURROGATE,
116                 UCharacter.MIN_LOW_SURROGATE))
117             errln("0xd800,0xdc00");
118     }
119 
TestCharCount()120     public void TestCharCount() {
121         UCharacter.charCount(-1);
122         UCharacter.charCount(UCharacter.MAX_CODE_POINT + 1);
123         if (UCharacter.charCount(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT - 1) != 1)
124             errln("0xffff");
125         if (UCharacter.charCount(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT) != 2)
126             errln("0x010000");
127     }
128 
TestToCodePoint()129     public void TestToCodePoint() {
130         final char[] pairs = {(char) (UCharacter.MIN_HIGH_SURROGATE + 0),
131                 (char) (UCharacter.MIN_LOW_SURROGATE + 0),
132                 (char) (UCharacter.MIN_HIGH_SURROGATE + 1),
133                 (char) (UCharacter.MIN_LOW_SURROGATE + 1),
134                 (char) (UCharacter.MIN_HIGH_SURROGATE + 2),
135                 (char) (UCharacter.MIN_LOW_SURROGATE + 2),
136                 (char) (UCharacter.MAX_HIGH_SURROGATE - 2),
137                 (char) (UCharacter.MAX_LOW_SURROGATE - 2),
138                 (char) (UCharacter.MAX_HIGH_SURROGATE - 1),
139                 (char) (UCharacter.MAX_LOW_SURROGATE - 1),
140                 (char) (UCharacter.MAX_HIGH_SURROGATE - 0),
141                 (char) (UCharacter.MAX_LOW_SURROGATE - 0),};
142         for (int i = 0; i < pairs.length; i += 2) {
143             int cp = UCharacter.toCodePoint(pairs[i], pairs[i + 1]);
144             if (pairs[i] != UTF16.getLeadSurrogate(cp)
145                     || pairs[i + 1] != UTF16.getTrailSurrogate(cp)) {
146 
147                 errln(Integer.toHexString(pairs[i]) + ", " + pairs[i + 1]);
148                 break;
149             }
150         }
151     }
152 
TestCodePointAtBefore()153     public void TestCodePointAtBefore() {
154         String s = "" + UCharacter.MIN_HIGH_SURROGATE + // isolated high
155                 UCharacter.MIN_HIGH_SURROGATE + // pair
156                 UCharacter.MIN_LOW_SURROGATE + UCharacter.MIN_LOW_SURROGATE; // isolated
157                                                                              // low
158         char[] c = s.toCharArray();
159         int[] avalues = {
160                 UCharacter.MIN_HIGH_SURROGATE,
161                 UCharacter.toCodePoint(UCharacter.MIN_HIGH_SURROGATE,
162                         UCharacter.MIN_LOW_SURROGATE),
163                 UCharacter.MIN_LOW_SURROGATE, UCharacter.MIN_LOW_SURROGATE};
164         int[] bvalues = {
165                 UCharacter.MIN_HIGH_SURROGATE,
166                 UCharacter.MIN_HIGH_SURROGATE,
167                 UCharacter.toCodePoint(UCharacter.MIN_HIGH_SURROGATE,
168                         UCharacter.MIN_LOW_SURROGATE),
169                 UCharacter.MIN_LOW_SURROGATE,};
170         StringBuffer b = new StringBuffer(s);
171         for (int i = 0; i < avalues.length; ++i) {
172             if (UCharacter.codePointAt(s, i) != avalues[i])
173                 errln("string at: " + i);
174             if (UCharacter.codePointAt(c, i) != avalues[i])
175                 errln("chars at: " + i);
176             if (UCharacter.codePointAt(b, i) != avalues[i])
177                 errln("stringbuffer at: " + i);
178 
179             if (UCharacter.codePointBefore(s, i + 1) != bvalues[i])
180                 errln("string before: " + i);
181             if (UCharacter.codePointBefore(c, i + 1) != bvalues[i])
182                 errln("chars before: " + i);
183             if (UCharacter.codePointBefore(b, i + 1) != bvalues[i])
184                 errln("stringbuffer before: " + i);
185         }
186 
187         //cover codePointAtBefore with limit
188         logln("Testing codePointAtBefore with limit ...");
189         for (int i = 0; i < avalues.length; ++i) {
190             if (UCharacter.codePointAt(c, i, 4) != avalues[i])
191                 errln("chars at: " + i);
192             if (UCharacter.codePointBefore(c, i + 1, 0) != bvalues[i])
193                 errln("chars before: " + i);
194         }
195 
196     }
197 
TestToChars()198     public void TestToChars() {
199         char[] chars = new char[3];
200         int cp = UCharacter.toCodePoint(UCharacter.MIN_HIGH_SURROGATE,
201                 UCharacter.MIN_LOW_SURROGATE);
202         UCharacter.toChars(cp, chars, 1);
203         if (chars[1] != UCharacter.MIN_HIGH_SURROGATE
204                 || chars[2] != UCharacter.MIN_LOW_SURROGATE) {
205 
206             errln("fail");
207         }
208 
209         chars = UCharacter.toChars(cp);
210         if (chars[0] != UCharacter.MIN_HIGH_SURROGATE
211                 || chars[1] != UCharacter.MIN_LOW_SURROGATE) {
212 
213             errln("fail");
214         }
215     }
216 
TestCodePointCount()217     public void TestCodePointCount() {
218         class Test {
219             String str(String s, int start, int limit) {
220                 if(s==null){
221                     s="";
222                 }
223                 return "codePointCount('" + Utility.escape(s) + "' " + start
224                         + ", " + limit + ")";
225             }
226 
227             void test(String s, int start, int limit, int expected) {
228                 int val1 = UCharacter.codePointCount(s.toCharArray(), start,
229                         limit);
230                 int val2 = UCharacter.codePointCount(s, start, limit);
231                 if (val1 != expected) {
232                     errln("char[] " + str(s, start, limit) + "(" + val1
233                             + ") != " + expected);
234                 } else if (val2 != expected) {
235                     errln("String " + str(s, start, limit) + "(" + val2
236                             + ") != " + expected);
237                 } else if (isVerbose()) {
238                     logln(str(s, start, limit) + " == " + expected);
239                 }
240             }
241 
242             void fail(String s, int start, int limit, Class exc) {
243                 try {
244                     UCharacter.codePointCount(s, start, limit);
245                     errln("unexpected success " + str(s, start, limit));
246                 } catch (Throwable e) {
247                     if (!exc.isInstance(e)) {
248                         warnln("bad exception " + str(s, start, limit)
249                                 + e.getClass().getName());
250                     }
251                 }
252             }
253         }
254 
255         Test test = new Test();
256         test.fail(null, 0, 1, NullPointerException.class);
257         test.fail("a", -1, 0, IndexOutOfBoundsException.class);
258         test.fail("a", 1, 2, IndexOutOfBoundsException.class);
259         test.fail("a", 1, 0, IndexOutOfBoundsException.class);
260         test.test("", 0, 0, 0);
261         test.test("\ud800", 0, 1, 1);
262         test.test("\udc00", 0, 1, 1);
263         test.test("\ud800\udc00", 0, 1, 1);
264         test.test("\ud800\udc00", 1, 2, 1);
265         test.test("\ud800\udc00", 0, 2, 1);
266         test.test("\udc00\ud800", 0, 1, 1);
267         test.test("\udc00\ud800", 1, 2, 1);
268         test.test("\udc00\ud800", 0, 2, 2);
269         test.test("\ud800\ud800\udc00", 0, 2, 2);
270         test.test("\ud800\ud800\udc00", 1, 3, 1);
271         test.test("\ud800\ud800\udc00", 0, 3, 2);
272         test.test("\ud800\udc00\udc00", 0, 2, 1);
273         test.test("\ud800\udc00\udc00", 1, 3, 2);
274         test.test("\ud800\udc00\udc00", 0, 3, 2);
275     }
276 
TestOffsetByCodePoints()277     public void TestOffsetByCodePoints() {
278         class Test {
279             String str(String s, int start, int count, int index, int offset) {
280                 return "offsetByCodePoints('" + Utility.escape(s) + "' "
281                         + start + ", " + count + ", " + index + ", " + offset
282                         + ")";
283             }
284 
285             void test(String s, int start, int count, int index, int offset,
286                     int expected, boolean flip) {
287                 char[] chars = s.toCharArray();
288                 String string = s.substring(start, start + count);
289                 int val1 = UCharacter.offsetByCodePoints(chars, start, count,
290                         index, offset);
291                 int val2 = UCharacter.offsetByCodePoints(string, index - start,
292                         offset)
293                         + start;
294 
295                 if (val1 != expected) {
296                     errln("char[] " + str(s, start, count, index, offset) + "("
297                             + val1 + ") != " + expected);
298                 } else if (val2 != expected) {
299                     errln("String " + str(s, start, count, index, offset) + "("
300                             + val2 + ") != " + expected);
301                 } else if (isVerbose()) {
302                     logln(str(s, start, count, index, offset) + " == "
303                             + expected);
304                 }
305 
306                 if (flip) {
307                     val1 = UCharacter.offsetByCodePoints(chars, start, count,
308                             expected, -offset);
309                     val2 = UCharacter.offsetByCodePoints(string, expected
310                             - start, -offset)
311                             + start;
312                     if (val1 != index) {
313                         errln("char[] "
314                                 + str(s, start, count, expected, -offset) + "("
315                                 + val1 + ") != " + index);
316                     } else if (val2 != index) {
317                         errln("String "
318                                 + str(s, start, count, expected, -offset) + "("
319                                 + val2 + ") != " + index);
320                     } else if (isVerbose()) {
321                         logln(str(s, start, count, expected, -offset) + " == "
322                                 + index);
323                     }
324                 }
325             }
326 
327             void fail(char[] text, int start, int count, int index, int offset,
328                     Class exc) {
329                 try {
330                     UCharacter.offsetByCodePoints(text, start, count, index,
331                             offset);
332                     errln("unexpected success "
333                             + str(new String(text), start, count, index, offset));
334                 } catch (Throwable e) {
335                     if (!exc.isInstance(e)) {
336                         errln("bad exception "
337                                 + str(new String(text), start, count, index,
338                                         offset) + e.getClass().getName());
339                     }
340                 }
341             }
342 
343             void fail(String text, int index, int offset, Class exc) {
344                 try {
345                     UCharacter.offsetByCodePoints(text, index, offset);
346                     errln("unexpected success "
347                             + str(text, index, offset, 0, text.length()));
348                 } catch (Throwable e) {
349                     if (!exc.isInstance(e)) {
350                         errln("bad exception "
351                                 + str(text, 0, text.length(), index, offset)
352                                 + e.getClass().getName());
353                     }
354                 }
355             }
356         }
357 
358         Test test = new Test();
359 
360         test.test("\ud800\ud800\udc00", 0, 2, 0, 1, 1, true);
361 
362         test.fail((char[]) null, 0, 1, 0, 1, NullPointerException.class);
363         test.fail((String) null, 0, 1, NullPointerException.class);
364         test.fail("abc", -1, 0, IndexOutOfBoundsException.class);
365         test.fail("abc", 4, 0, IndexOutOfBoundsException.class);
366         test.fail("abc", 1, -2, IndexOutOfBoundsException.class);
367         test.fail("abc", 2, 2, IndexOutOfBoundsException.class);
368         char[] abc = "abc".toCharArray();
369         test.fail(abc, -1, 2, 0, 0, IndexOutOfBoundsException.class);
370         test.fail(abc, 2, 2, 3, 0, IndexOutOfBoundsException.class);
371         test.fail(abc, 1, -1, 0, 0, IndexOutOfBoundsException.class);
372         test.fail(abc, 1, 1, 2, -2, IndexOutOfBoundsException.class);
373         test.fail(abc, 1, 1, 1, 2, IndexOutOfBoundsException.class);
374         test.fail(abc, 1, 2, 1, 3, IndexOutOfBoundsException.class);
375         test.fail(abc, 0, 2, 2, -3, IndexOutOfBoundsException.class);
376         test.test("", 0, 0, 0, 0, 0, false);
377         test.test("\ud800", 0, 1, 0, 1, 1, true);
378         test.test("\udc00", 0, 1, 0, 1, 1, true);
379 
380         String s = "\ud800\udc00";
381         test.test(s, 0, 1, 0, 1, 1, true);
382         test.test(s, 0, 2, 0, 1, 2, true);
383         test.test(s, 0, 2, 1, 1, 2, false);
384         test.test(s, 1, 1, 1, 1, 2, true);
385 
386         s = "\udc00\ud800";
387         test.test(s, 0, 1, 0, 1, 1, true);
388         test.test(s, 0, 2, 0, 1, 1, true);
389         test.test(s, 0, 2, 0, 2, 2, true);
390         test.test(s, 0, 2, 1, 1, 2, true);
391         test.test(s, 1, 1, 1, 1, 2, true);
392 
393         s = "\ud800\ud800\udc00";
394         test.test(s, 0, 1, 0, 1, 1, true);
395         test.test(s, 0, 2, 0, 1, 1, true);
396         test.test(s, 0, 2, 0, 2, 2, true);
397         test.test(s, 0, 2, 1, 1, 2, true);
398         test.test(s, 0, 3, 0, 1, 1, true);
399         test.test(s, 0, 3, 0, 2, 3, true);
400         test.test(s, 0, 3, 1, 1, 3, true);
401         test.test(s, 0, 3, 2, 1, 3, false);
402         test.test(s, 1, 1, 1, 1, 2, true);
403         test.test(s, 1, 2, 1, 1, 3, true);
404         test.test(s, 1, 2, 2, 1, 3, false);
405         test.test(s, 2, 1, 2, 1, 3, true);
406 
407         s = "\ud800\udc00\udc00";
408         test.test(s, 0, 1, 0, 1, 1, true);
409         test.test(s, 0, 2, 0, 1, 2, true);
410         test.test(s, 0, 2, 1, 1, 2, false);
411         test.test(s, 0, 3, 0, 1, 2, true);
412         test.test(s, 0, 3, 0, 2, 3, true);
413         test.test(s, 0, 3, 1, 1, 2, false);
414         test.test(s, 0, 3, 1, 2, 3, false);
415         test.test(s, 0, 3, 2, 1, 3, true);
416         test.test(s, 1, 1, 1, 1, 2, true);
417         test.test(s, 1, 2, 1, 1, 2, true);
418         test.test(s, 1, 2, 1, 2, 3, true);
419         test.test(s, 1, 2, 2, 1, 3, true);
420         test.test(s, 2, 1, 2, 1, 3, true);
421     }
422 }
423