]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/tests/core/src/com/ibm/icu/dev/test/iterator/TestUCharacterIterator.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / tests / core / src / com / ibm / icu / dev / test / iterator / TestUCharacterIterator.java
1 /**\r
2  *******************************************************************************\r
3  * Copyright (C) 2001-2010, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 package com.ibm.icu.dev.test.iterator;\r
8 \r
9 import java.text.CharacterIterator;\r
10 import java.text.StringCharacterIterator;\r
11 \r
12 import com.ibm.icu.dev.test.TestFmwk;\r
13 import com.ibm.icu.text.ReplaceableString;\r
14 import com.ibm.icu.text.UCharacterIterator;\r
15 import com.ibm.icu.text.UTF16;\r
16 \r
17 /**\r
18  * @author ram\r
19  *\r
20  * To change this generated comment edit the template variable "typecomment":\r
21  * Window>Preferences>Java>Templates.\r
22  * To enable and disable the creation of type comments go to\r
23  * Window>Preferences>Java>Code Generation.\r
24  */\r
25 public class TestUCharacterIterator extends TestFmwk{\r
26 \r
27     // constructor -----------------------------------------------------\r
28   \r
29     /**\r
30      * Constructor\r
31      */\r
32     public TestUCharacterIterator()\r
33     {\r
34     }\r
35   \r
36     // public methods --------------------------------------------------\r
37   \r
38     /**\r
39     * Testing cloning\r
40     */\r
41     public void TestClone() throws CloneNotSupportedException\r
42     {\r
43          UCharacterIterator iterator = UCharacterIterator.getInstance("testing");\r
44          UCharacterIterator cloned = (UCharacterIterator)iterator.clone();\r
45          int completed = 0;\r
46          while (completed != UCharacterIterator.DONE) {\r
47             completed = iterator.next();\r
48             if (completed != cloned.next()) {\r
49                 errln("Cloned operation failed");\r
50             }\r
51          }\r
52     }\r
53     public void getText(UCharacterIterator iterator, String result){\r
54         /* test getText */\r
55         char[] buf= new char[1];\r
56         for(;;){\r
57             try{\r
58                 iterator.getText(buf);\r
59                 break;\r
60             }catch(IndexOutOfBoundsException e){\r
61                 buf = new char[iterator.getLength()];\r
62             }\r
63         }\r
64         if(result.compareTo(new String(buf,0,iterator.getLength()))!=0){\r
65             errln("getText failed for iterator");\r
66         }\r
67     }\r
68     \r
69     /**\r
70      * Testing iteration\r
71      */\r
72     public void TestIteration()\r
73     {\r
74         UCharacterIterator iterator  = UCharacterIterator.getInstance(\r
75                                                        ITERATION_STRING_);\r
76         UCharacterIterator iterator2 = UCharacterIterator.getInstance(\r
77                                                        ITERATION_STRING_);\r
78         iterator.setToStart();                                               \r
79         if (iterator.current() != ITERATION_STRING_.charAt(0)) {\r
80             errln("Iterator failed retrieving first character");\r
81         }\r
82         iterator.setToLimit(); \r
83         if (iterator.previous() != ITERATION_STRING_.charAt(\r
84                                        ITERATION_STRING_.length() - 1)) {\r
85             errln("Iterator failed retrieving last character");\r
86         }                                               \r
87         if (iterator.getLength() != ITERATION_STRING_.length()) {\r
88             errln("Iterator failed determining begin and end index");\r
89         }  \r
90         iterator2.setIndex(0);\r
91         iterator.setIndex(0);\r
92         int ch = 0;\r
93         while (ch != UCharacterIterator.DONE) {\r
94             int index = iterator2.getIndex();\r
95             ch = iterator2.nextCodePoint();\r
96             if (index != ITERATION_SUPPLEMENTARY_INDEX) {\r
97                 if (ch != (int)iterator.next() && \r
98                     ch != UCharacterIterator.DONE) {\r
99                     errln("Error mismatch in next() and nextCodePoint()"); \r
100                 }\r
101             }\r
102             else {\r
103                 if (UTF16.getLeadSurrogate(ch) != iterator.next() ||\r
104                     UTF16.getTrailSurrogate(ch) != iterator.next()) {\r
105                     errln("Error mismatch in next and nextCodePoint for " +\r
106                           "supplementary characters");\r
107                 }\r
108             }\r
109         }\r
110         iterator.setIndex(ITERATION_STRING_.length());\r
111         iterator2.setIndex(ITERATION_STRING_.length());\r
112         while (ch != UCharacterIterator.DONE) {\r
113             int index = iterator2.getIndex();\r
114             ch = iterator2.previousCodePoint();\r
115             if (index != ITERATION_SUPPLEMENTARY_INDEX) {\r
116                 if (ch != (int)iterator.previous() && \r
117                     ch != UCharacterIterator.DONE) {\r
118                     errln("Error mismatch in previous() and " +\r
119                           "previousCodePoint()"); \r
120                 }\r
121             }\r
122             else {\r
123                 if (UTF16.getLeadSurrogate(ch) != iterator.previous() || \r
124                     UTF16.getTrailSurrogate(ch) != iterator.previous()) {\r
125                     errln("Error mismatch in previous and " +\r
126                           "previousCodePoint for supplementary characters");\r
127                 }\r
128             }\r
129         }\r
130     }\r
131     \r
132     public static void main(String[] arg)\r
133     {\r
134         try\r
135         {\r
136             TestUCharacterIterator test = new TestUCharacterIterator();\r
137             test.run(arg);\r
138         }\r
139         catch (Exception e)\r
140         {\r
141             e.printStackTrace();\r
142         }\r
143     }\r
144     \r
145     //Tests for new API for utf-16 support \r
146     public void TestIterationUChar32() {\r
147         String text="\u0061\u0062\ud841\udc02\u20ac\ud7ff\ud842\udc06\ud801\udc00\u0061";\r
148         int c;\r
149         int i;\r
150         {\r
151             UCharacterIterator iter = UCharacterIterator.getInstance(text);\r
152     \r
153             String iterText = iter.getText();\r
154             if (!iterText.equals(text))\r
155               errln("iter.getText() failed");\r
156             \r
157             iter.setIndex(1);\r
158             if (iter.currentCodePoint() != UTF16.charAt(text,1))\r
159                 errln("Iterator didn't start out in the right place.");\r
160     \r
161             iter.setToStart();\r
162             c=iter.currentCodePoint();\r
163             i=0;\r
164             i=iter.moveCodePointIndex(1);\r
165             c=iter.currentCodePoint();\r
166             if(c != UTF16.charAt(text,1) || i!=1)\r
167                 errln("moveCodePointIndex(1) didn't work correctly expected "+ hex(c) +" got "+hex(UTF16.charAt(text,1)) + " i= " + i);\r
168     \r
169             i=iter.moveCodePointIndex(2);\r
170             c=iter.currentCodePoint();\r
171             if(c != UTF16.charAt(text,4) || i!=4)\r
172                 errln("moveCodePointIndex(2) didn't work correctly expected "+ hex(c) +" got "+hex(UTF16.charAt(text,4)) + " i= " + i);\r
173                 \r
174             i=iter.moveCodePointIndex(-2);\r
175             c=iter.currentCodePoint();\r
176             if(c != UTF16.charAt(text,1) || i!=1)\r
177                  errln("moveCodePointIndex(-2) didn't work correctly expected "+ hex(c) +" got "+hex(UTF16.charAt(text,1)) + " i= " + i);\r
178 \r
179             iter.setToLimit();\r
180             i=iter.moveCodePointIndex(-2);\r
181             c=iter.currentCodePoint();\r
182             if(c != UTF16.charAt(text,(text.length()-3)) || i!=(text.length()-3))\r
183                 errln("moveCodePointIndex(-2) didn't work correctly expected "+ hex(c) +" got "+hex(UTF16.charAt(text,(text.length()-3)) ) + " i= " + i);\r
184             \r
185             iter.setToStart();\r
186             c = iter.currentCodePoint();\r
187             i = 0;\r
188     \r
189             //testing first32PostInc, nextCodePointPostInc, setTostart\r
190             i = 0;\r
191             iter.setToStart();\r
192             c =iter.next();\r
193             if(c != UTF16.charAt(text,i))\r
194                 errln("first32PostInc failed.  Expected->"+hex(UTF16.charAt(text,i))+" Got-> "+hex(c));\r
195             if(iter.getIndex() != UTF16.getCharCount(c) + i)\r
196                 errln("getIndex() after first32PostInc() failed");\r
197     \r
198             iter.setToStart();\r
199             i=0;\r
200             if (iter.getIndex() != 0)\r
201                 errln("setToStart failed");\r
202            \r
203             logln("Testing forward iteration...");\r
204             do {\r
205                 if (c != UCharacterIterator.DONE)\r
206                     c = iter.nextCodePoint();\r
207     \r
208                 if(c != UTF16.charAt(text,i))\r
209                     errln("Character mismatch at position "+i+", iterator has "+hex(c)+", string has "+hex(UTF16.charAt(text,i)));\r
210     \r
211                 i+=UTF16.getCharCount(c);\r
212                 if(iter.getIndex() != i)\r
213                     errln("getIndex() aftr nextCodePointPostInc() isn't working right");\r
214                 c = iter.currentCodePoint();                   \r
215                 if( c!=UCharacterIterator.DONE && c != UTF16.charAt(text,i))\r
216                     errln("current() after nextCodePointPostInc() isn't working right");\r
217 \r
218             } while (c!=UCharacterIterator.DONE);\r
219             c=iter.nextCodePoint();\r
220             if(c!= UCharacterIterator.DONE)\r
221                 errln("nextCodePointPostInc() didn't return DONE at the beginning");\r
222     \r
223     \r
224         }\r
225     }  \r
226     \r
227     class UCharIterator {\r
228     \r
229        public UCharIterator(int[] src, int len, int index){\r
230             \r
231             s=src;\r
232             length=len;\r
233             i=index;\r
234        }\r
235     \r
236         public int current() {\r
237             if(i<length) {\r
238                 return s[i];\r
239             } else {\r
240                 return -1;\r
241             }\r
242         }\r
243     \r
244         public int next() {\r
245             if(i<length) {\r
246                 return s[i++];\r
247             } else {\r
248                 return -1;\r
249             }\r
250         }\r
251     \r
252         public int previous() {\r
253             if(i>0) {\r
254                 return s[--i];\r
255             } else {\r
256                 return -1;\r
257             }\r
258         }\r
259     \r
260         public int getIndex() {\r
261             return i;\r
262         }\r
263     \r
264         private int[] s;\r
265         private int length, i;\r
266     }\r
267     public void TestPreviousNext(){\r
268         // src and expect strings\r
269         char src[]={\r
270                 UTF16.getLeadSurrogate(0x2f999), UTF16.getTrailSurrogate(0x2f999),\r
271                 UTF16.getLeadSurrogate(0x1d15f), UTF16.getTrailSurrogate(0x1d15f),\r
272                 0xc4,\r
273                 0x1ed0\r
274             };\r
275         // iterators\r
276         UCharacterIterator iter1 = UCharacterIterator.getInstance(new ReplaceableString(new String(src)));\r
277         UCharacterIterator iter2 = UCharacterIterator.getInstance(src/*char array*/);\r
278         UCharacterIterator iter3 = UCharacterIterator.getInstance(new StringCharacterIterator(new String(src)));\r
279         UCharacterIterator iter4 = UCharacterIterator.getInstance(new StringBuffer(new String(src)));\r
280         previousNext(iter1);\r
281         previousNext(iter2);\r
282         previousNext(iter3);\r
283         previousNext(iter4);\r
284         getText(iter1,new String(src));\r
285         getText(iter2,new String(src));\r
286         getText(iter3,new String(src));\r
287         /* getCharacterIterator */\r
288         CharacterIterator citer1 = iter1.getCharacterIterator();\r
289         CharacterIterator citer2 = iter2.getCharacterIterator();\r
290         CharacterIterator citer3 = iter3.getCharacterIterator();\r
291         if(citer1.first() !=iter1.current()){\r
292             errln("getCharacterIterator for iter1 failed");\r
293         }\r
294         if(citer2.first() !=iter2.current()){\r
295             errln("getCharacterIterator for iter2 failed");\r
296         }\r
297         if(citer3.first() !=iter3.current()){\r
298             errln("getCharacterIterator for iter3 failed");\r
299         }\r
300         /* Test clone()  && moveIndex()*/\r
301         try{\r
302             UCharacterIterator clone1 = (UCharacterIterator)iter1.clone();\r
303             UCharacterIterator clone2 = (UCharacterIterator)iter2.clone();\r
304             UCharacterIterator clone3 = (UCharacterIterator)iter3.clone();\r
305             if(clone1.moveIndex(3)!=iter1.moveIndex(3)){\r
306                 errln("moveIndex for iter1 failed");\r
307             }\r
308             if(clone2.moveIndex(3)!=iter2.moveIndex(3)){\r
309                 errln("moveIndex for iter2 failed");\r
310             }\r
311             if(clone3.moveIndex(3)!=iter3.moveIndex(3)){\r
312                 errln("moveIndex for iter1 failed");\r
313             }\r
314         }catch (Exception e){\r
315             errln("could not clone the iterator");\r
316         }\r
317     }\r
318     public void previousNext(UCharacterIterator iter) {\r
319 \r
320         int expect[]={\r
321             0x2f999,\r
322             0x1d15f,\r
323             0xc4,\r
324             0x1ed0\r
325         };\r
326     \r
327         // expected src indexes corresponding to expect indexes\r
328         int expectIndex[]={\r
329             0,0,\r
330             1,1,\r
331             2,\r
332             3,\r
333             4 //needed \r
334         };\r
335     \r
336         // initial indexes into the src and expect strings\r
337         \r
338         final int SRC_MIDDLE=4;\r
339         final int EXPECT_MIDDLE=2;\r
340         \r
341     \r
342         // movement vector\r
343         // - for previous(), 0 for current(), + for next()\r
344         // not const so that we can terminate it below for the error message\r
345         String moves="0+0+0--0-0-+++0--+++++++0--------";\r
346     \r
347         \r
348         UCharIterator iter32 = new UCharIterator(expect, expect.length, \r
349                                                      EXPECT_MIDDLE);\r
350     \r
351         int c1, c2;\r
352         char m;\r
353     \r
354         // initially set the indexes into the middle of the strings\r
355         iter.setIndex(SRC_MIDDLE);\r
356     \r
357         // move around and compare the iteration code points with\r
358         // the expected ones\r
359         int movesIndex =0;\r
360         while(movesIndex<moves.length()) {\r
361             m=moves.charAt(movesIndex++);\r
362             if(m=='-') {\r
363                 c1=iter.previousCodePoint();\r
364                 c2=iter32.previous();\r
365             } else if(m=='0') {\r
366                 c1=iter.currentCodePoint();\r
367                 c2=iter32.current();\r
368             } else  {// m=='+' \r
369                 c1=iter.nextCodePoint();\r
370                 c2=iter32.next();\r
371             }\r
372     \r
373             // compare results\r
374             if(c1!=c2) {\r
375                 // copy the moves until the current (m) move, and terminate\r
376                 String history = moves.substring(0,movesIndex);\r
377                 errln("error: mismatch in Normalizer iteration at "+history+": "\r
378                       +"got c1= " + hex(c1) +" != expected c2= "+ hex(c2));\r
379                 break;\r
380             }\r
381     \r
382             // compare indexes\r
383             if(expectIndex[iter.getIndex()]!=iter32.getIndex()) {\r
384                 // copy the moves until the current (m) move, and terminate\r
385                 String history = moves.substring(0,movesIndex);\r
386                 errln("error: index mismatch in Normalizer iteration at "\r
387                       +history+ " : "+ "Normalizer index " +iter.getIndex()\r
388                       +" expected "+ expectIndex[iter32.getIndex()]);\r
389                 break;\r
390             }\r
391         }\r
392     }\r
393     public void TestUCharacterIteratorWrapper(){\r
394         String source ="asdfasdfjoiuyoiuy2341235679886765";\r
395         UCharacterIterator it = UCharacterIterator.getInstance(source);\r
396         CharacterIterator wrap_ci = it.getCharacterIterator();\r
397         CharacterIterator ci = new StringCharacterIterator(source);\r
398         wrap_ci.setIndex(10);\r
399         ci.setIndex(10);\r
400         String moves="0+0+0--0-0-+++0--+++++++0--------++++0000----0-";\r
401         int c1, c2;\r
402         char m;\r
403         int movesIndex =0;\r
404         \r
405         while(movesIndex<moves.length()) {\r
406             m=moves.charAt(movesIndex++);\r
407             if(m=='-') {\r
408                 c1=wrap_ci.previous();\r
409                 c2=ci.previous();\r
410             } else if(m=='0') {\r
411                 c1=wrap_ci.current();\r
412                 c2=ci.current();\r
413             } else  {// m=='+' \r
414                 c1=wrap_ci.next();\r
415                 c2=ci.next();\r
416             }\r
417     \r
418             // compare results\r
419             if(c1!=c2) {\r
420                 // copy the moves until the current (m) move, and terminate\r
421                 String history = moves.substring(0,movesIndex);\r
422                 errln("error: mismatch in Normalizer iteration at "+history+": "\r
423                       +"got c1= " + hex(c1) +" != expected c2= "+ hex(c2));\r
424                 break;\r
425             }\r
426     \r
427             // compare indexes\r
428             if(wrap_ci.getIndex()!=ci.getIndex()) {\r
429                 // copy the moves until the current (m) move, and terminate\r
430                 String history = moves.substring(0,movesIndex);\r
431                 errln("error: index mismatch in Normalizer iteration at "\r
432                       +history+ " : "+ "Normalizer index " +wrap_ci.getIndex()\r
433                       +" expected "+ ci.getIndex());\r
434                 break;\r
435             }\r
436         }\r
437         if(ci.first()!=wrap_ci.first()){\r
438             errln("CharacterIteratorWrapper.first() failed. expected: " + ci.first() + " got: " +wrap_ci.first());\r
439         }\r
440         if(ci.last()!=wrap_ci.last()){\r
441             errln("CharacterIteratorWrapper.last() failed expected: " + ci.last() + " got: " +wrap_ci.last());\r
442         }\r
443         if(ci.getBeginIndex()!=wrap_ci.getBeginIndex()){\r
444             errln("CharacterIteratorWrapper.getBeginIndex() failed expected: " + ci.getBeginIndex() + " got: " +wrap_ci.getBeginIndex());\r
445         }\r
446         if(ci.getEndIndex()!=wrap_ci.getEndIndex()){\r
447             errln("CharacterIteratorWrapper.getEndIndex() failed expected: " + ci.getEndIndex() + " got: " +wrap_ci.getEndIndex());\r
448         }\r
449         try{\r
450             CharacterIterator cloneWCI = (CharacterIterator) wrap_ci.clone();\r
451             if(wrap_ci.getIndex()!=cloneWCI.getIndex()){\r
452                 errln("CharacterIteratorWrapper.clone() failed expected: " +wrap_ci.getIndex() + " got: " + cloneWCI.getIndex());\r
453             }\r
454         }catch(Exception e){\r
455              errln("CharacterIterator.clone() failed");\r
456         }\r
457     }\r
458     // private data members ---------------------------------------------\r
459     \r
460     private static final String ITERATION_STRING_ =\r
461                                         "Testing 1 2 3 \ud800\udc00 456";\r
462     private static final int ITERATION_SUPPLEMENTARY_INDEX = 14;\r
463     \r
464     public void TestJitterbug1952(){\r
465         //test previous code point\r
466         char[] src = new char[]{ '\uDC00','\uD800','\uDC01','\uD802','\uDC02','\uDC03'};\r
467         UCharacterIterator iter = UCharacterIterator.getInstance(src);\r
468         iter.setIndex(1);\r
469         int ch;\r
470         // this should never go into a infinite loop\r
471         // if it does then we have a problem\r
472         while((ch=iter.previousCodePoint())!=UCharacterIterator.DONE){\r
473             if(ch!=0xDc00){\r
474                 errln("iter.previousCodePoint() failed");\r
475             }\r
476         }\r
477         iter.setIndex(5);\r
478         while((ch=iter.nextCodePoint()) !=UCharacterIterator.DONE){\r
479             if(ch!= 0xDC03){\r
480                 errln("iter.nextCodePoint() failed");\r
481             } \r
482         }      \r
483     }\r
484         \r
485 }\r