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