]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/tests/core/src/com/ibm/icu/dev/test/lang/UCharacterSurrogateTest.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / tests / core / src / com / ibm / icu / dev / test / lang / UCharacterSurrogateTest.java
1 /**\r
2  *******************************************************************************\r
3  * Copyright (C) 2004-2008, International Business Machines Corporation and         *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 \r
8 package com.ibm.icu.dev.test.lang;\r
9 \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
14 \r
15 /**\r
16  * Test JDK 1.5 cover APIs.\r
17  */\r
18 public final class UCharacterSurrogateTest extends TestFmwk {\r
19 \r
20     public static void main(String[] args) {\r
21         new UCharacterSurrogateTest().run(args);\r
22     }\r
23 \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
35             try {\r
36                 UCharacter.UnicodeBlock b = UCharacter.UnicodeBlock\r
37                         .forName(names[i]);\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
41                 break;\r
42             }\r
43         }\r
44     }\r
45 \r
46     public void TestIsValidCodePoint() {\r
47         if (UCharacter.isValidCodePoint(-1))\r
48             errln("-1");\r
49         if (!UCharacter.isValidCodePoint(0))\r
50             errln("0");\r
51         if (!UCharacter.isValidCodePoint(UCharacter.MAX_CODE_POINT))\r
52             errln("0x10ffff");\r
53         if (UCharacter.isValidCodePoint(UCharacter.MAX_CODE_POINT + 1))\r
54             errln("0x110000");\r
55     }\r
56 \r
57     public void TestIsSupplementaryCodePoint() {\r
58         if (UCharacter.isSupplementaryCodePoint(-1))\r
59             errln("-1");\r
60         if (UCharacter.isSupplementaryCodePoint(0))\r
61             errln("0");\r
62         if (UCharacter\r
63                 .isSupplementaryCodePoint(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT - 1))\r
64             errln("0xffff");\r
65         if (!UCharacter\r
66                 .isSupplementaryCodePoint(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT))\r
67             errln("0x10000");\r
68         if (!UCharacter.isSupplementaryCodePoint(UCharacter.MAX_CODE_POINT))\r
69             errln("0x10ffff");\r
70         if (UCharacter.isSupplementaryCodePoint(UCharacter.MAX_CODE_POINT + 1))\r
71             errln("0x110000");\r
72     }\r
73 \r
74     public void TestIsHighSurrogate() {\r
75         if (UCharacter\r
76                 .isHighSurrogate((char) (UCharacter.MIN_HIGH_SURROGATE - 1)))\r
77             errln("0xd7ff");\r
78         if (!UCharacter.isHighSurrogate(UCharacter.MIN_HIGH_SURROGATE))\r
79             errln("0xd800");\r
80         if (!UCharacter.isHighSurrogate(UCharacter.MAX_HIGH_SURROGATE))\r
81             errln("0xdbff");\r
82         if (UCharacter\r
83                 .isHighSurrogate((char) (UCharacter.MAX_HIGH_SURROGATE + 1)))\r
84             errln("0xdc00");\r
85     }\r
86 \r
87     public void TestIsLowSurrogate() {\r
88         if (UCharacter\r
89                 .isLowSurrogate((char) (UCharacter.MIN_LOW_SURROGATE - 1)))\r
90             errln("0xdbff");\r
91         if (!UCharacter.isLowSurrogate(UCharacter.MIN_LOW_SURROGATE))\r
92             errln("0xdc00");\r
93         if (!UCharacter.isLowSurrogate(UCharacter.MAX_LOW_SURROGATE))\r
94             errln("0xdfff");\r
95         if (UCharacter\r
96                 .isLowSurrogate((char) (UCharacter.MAX_LOW_SURROGATE + 1)))\r
97             errln("0xe000");\r
98     }\r
99 \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
118     }\r
119 \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
124             errln("0xffff");\r
125         if (UCharacter.charCount(UCharacter.MIN_SUPPLEMENTARY_CODE_POINT) != 2)\r
126             errln("0x010000");\r
127     }\r
128 \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
146 \r
147                 errln(Integer.toHexString(pairs[i]) + ", " + pairs[i + 1]);\r
148                 break;\r
149             }\r
150         }\r
151     }\r
152 \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
157                                                                              // low\r
158         char[] c = s.toCharArray();\r
159         int[] avalues = {\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
164         int[] bvalues = {\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
178 \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
185         }\r
186 \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
194         }\r
195 \r
196     }\r
197 \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
205 \r
206             errln("fail");\r
207         }\r
208 \r
209         chars = UCharacter.toChars(cp);\r
210         if (chars[0] != UCharacter.MIN_HIGH_SURROGATE\r
211                 || chars[1] != UCharacter.MIN_LOW_SURROGATE) {\r
212 \r
213             errln("fail");\r
214         }\r
215     }\r
216 \r
217     public void TestCodePointCount() {\r
218         class Test {\r
219             String str(String s, int start, int limit) {\r
220                 if(s==null){\r
221                     s="";\r
222                 }\r
223                 return "codePointCount('" + Utility.escape(s) + "' " + start\r
224                         + ", " + limit + ")";\r
225             }\r
226 \r
227             void test(String s, int start, int limit, int expected) {\r
228                 int val1 = UCharacter.codePointCount(s.toCharArray(), start,\r
229                         limit);\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
239                 }\r
240             }\r
241 \r
242             void fail(String s, int start, int limit, Class exc) {\r
243                 try {\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
250                     }\r
251                 }\r
252             }\r
253         }\r
254 \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
275     }\r
276 \r
277     public void TestOffsetByCodePoints() {\r
278         class Test {\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
282                         + ")";\r
283             }\r
284 \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
290                         index, offset);\r
291                 int val2 = UCharacter.offsetByCodePoints(string, index - start,\r
292                         offset)\r
293                         + start;\r
294 \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
303                             + expected);\r
304                 }\r
305 \r
306                 if (flip) {\r
307                     val1 = UCharacter.offsetByCodePoints(chars, start, count,\r
308                             expected, -offset);\r
309                     val2 = UCharacter.offsetByCodePoints(string, expected\r
310                             - start, -offset)\r
311                             + start;\r
312                     if (val1 != index) {\r
313                         errln("char[] "\r
314                                 + str(s, start, count, expected, -offset) + "("\r
315                                 + val1 + ") != " + index);\r
316                     } else if (val2 != index) {\r
317                         errln("String "\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
322                                 + index);\r
323                     }\r
324                 }\r
325             }\r
326 \r
327             void fail(char[] text, int start, int count, int index, int offset,\r
328                     Class exc) {\r
329                 try {\r
330                     UCharacter.offsetByCodePoints(text, start, count, index,\r
331                             offset);\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
339                     }\r
340                 }\r
341             }\r
342 \r
343             void fail(String text, int index, int offset, Class exc) {\r
344                 try {\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
353                     }\r
354                 }\r
355             }\r
356         }\r
357 \r
358         Test test = new Test();\r
359 \r
360         test.test("\ud800\ud800\udc00", 0, 2, 0, 1, 1, true);\r
361 \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
379 \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
385 \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
392 \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
406 \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
421     }\r
422 }\r