]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/tests/core/src/com/ibm/icu/dev/test/bidi/TestCompatibility.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / tests / core / src / com / ibm / icu / dev / test / bidi / TestCompatibility.java
1 /*\r
2 *******************************************************************************\r
3 *   Copyright (C) 2007-2010, International Business Machines\r
4 *   Corporation and others.  All Rights Reserved.\r
5 *******************************************************************************\r
6 */\r
7 \r
8 package com.ibm.icu.dev.test.bidi;\r
9 \r
10 import java.awt.font.NumericShaper;\r
11 import java.awt.font.TextAttribute;\r
12 import java.text.AttributedCharacterIterator;\r
13 import java.text.AttributedString;\r
14 \r
15 import com.ibm.icu.text.Bidi;\r
16 \r
17 /**\r
18  * Regression test for java.text.Bidi compatibility\r
19  *\r
20  * @author Matitiahu Allouche\r
21  */\r
22 \r
23 public class TestCompatibility extends BidiTest {\r
24 \r
25     void compareBidi(Bidi bidi, java.text.Bidi jbidi)\r
26     {\r
27         byte paraLevel = bidi.getParaLevel();\r
28         if (bidi.baseIsLeftToRight() != jbidi.baseIsLeftToRight()) {\r
29             errln("Discrepancy in baseIsLeftToRight for case " +\r
30                   "(level=" + paraLevel + "): " +\r
31                   u16ToPseudo(bidi.getTextAsString()) +\r
32                   "\n    bidi: " + bidi.baseIsLeftToRight() +\r
33                   "\n   jbidi: " + jbidi.baseIsLeftToRight());\r
34         }\r
35         if (bidi.getBaseLevel() != jbidi.getBaseLevel()) {\r
36             errln("Discrepancy in getBaseLevel for case " +\r
37                   "(level=" + paraLevel + "): " +\r
38                   u16ToPseudo(bidi.getTextAsString()) +\r
39                   "\n    bidi: " + bidi.getBaseLevel() +\r
40                   "\n   jbidi: " + jbidi.getBaseLevel());\r
41         }\r
42         if (bidi.getLength() != jbidi.getLength()) {\r
43             errln("Discrepancy in getLength for case " +\r
44                   "(level=" + paraLevel + "): " +\r
45                   u16ToPseudo(bidi.getTextAsString()) +\r
46                   "\n    bidi: " + bidi.getLength() +\r
47                   "\n   jbidi: " + jbidi.getLength());\r
48         }\r
49         int len = bidi.getLength();\r
50         for (int i = 0; i < len; i++) {\r
51             if (bidi.getLevelAt(i) != jbidi.getLevelAt(i)) {\r
52                 errln("Discrepancy in getLevelAt for offset " + i +\r
53                       " of case " +\r
54                       "(level=" + paraLevel + "): " +\r
55                       u16ToPseudo(bidi.getTextAsString()) +\r
56                       "\n    bidi: " + bidi.getLevelAt(i) +\r
57                       "\n   jbidi: " + jbidi.getLevelAt(i));\r
58             }\r
59         }\r
60         if (bidi.getRunCount() != jbidi.getRunCount()) {\r
61             if (!(len == 0 && jbidi.getRunCount() == 1)) {\r
62                 errln("Discrepancy in getRunCount for case " +\r
63                       "(level=" + paraLevel + "): " +\r
64                       u16ToPseudo(bidi.getTextAsString()) +\r
65                       "\n    bidi: " + bidi.getRunCount() +\r
66                       "\n   jbidi: " + jbidi.getRunCount());\r
67             }\r
68         }\r
69         int runCount = bidi.getRunCount();\r
70         for (int i = 0; i < runCount; i++) {\r
71             if (bidi.getRunLevel(i) != jbidi.getRunLevel(i)) {\r
72                 errln("Discrepancy in getRunLevel for run " + i +\r
73                       " of case " +\r
74                       "(level=" + paraLevel + "): " +\r
75                       u16ToPseudo(bidi.getTextAsString()) +\r
76                       "\n    bidi: " + bidi.getRunLevel(i) +\r
77                       "\n   jbidi: " + jbidi.getRunLevel(i));\r
78             }\r
79             if (bidi.getRunLimit(i) != jbidi.getRunLimit(i)) {\r
80                 errln("Discrepancy in getRunLimit for run " + i +\r
81                       " of case " +\r
82                       "(level=" + paraLevel + "): " +\r
83                       u16ToPseudo(bidi.getTextAsString()) +\r
84                       "\n    bidi: " + bidi.getRunLimit(i) +\r
85                       "\n   jbidi: " + jbidi.getRunLimit(i));\r
86             }\r
87             if (bidi.getRunStart(i) != jbidi.getRunStart(i)) {\r
88                 errln("Discrepancy in getRunStart for run " + i +\r
89                       " of case " +\r
90                       "(level=" + paraLevel + "): " +\r
91                       u16ToPseudo(bidi.getTextAsString()) +\r
92                       "\n    bidi: " + bidi.getRunStart(i) +\r
93                       "\n   jbidi: " + jbidi.getRunStart(i));\r
94             }\r
95         }\r
96         if (bidi.isLeftToRight() != jbidi.isLeftToRight()) {\r
97             errln("Discrepancy in isLeftToRight for case " +\r
98                   "(level=" + paraLevel + "): " +\r
99                   u16ToPseudo(bidi.getTextAsString()) +\r
100                   "\n    bidi: " + bidi.isLeftToRight() +\r
101                   "\n   jbidi: " + jbidi.isLeftToRight());\r
102         }\r
103         if (bidi.isMixed() != jbidi.isMixed()) {\r
104             errln("Discrepancy in isMixed for case " +\r
105                   "(level=" + paraLevel + "): " +\r
106                   u16ToPseudo(bidi.getTextAsString()) +\r
107                   "\n    bidi: " + bidi.isMixed() +\r
108                   "\n   jbidi: " + jbidi.isMixed());\r
109         }\r
110         if (bidi.isRightToLeft() != jbidi.isRightToLeft()) {\r
111             errln("Discrepancy in isRightToLeft for case " +\r
112                   "(level=" + paraLevel + "): " +\r
113                   u16ToPseudo(bidi.getTextAsString()) +\r
114                   "\n    bidi: " + bidi.isRightToLeft() +\r
115                   "\n   jbidi: " + jbidi.isRightToLeft());\r
116         }\r
117         char[] text = bidi.getText();\r
118         if (Bidi.requiresBidi(text, 0, text.length) !=\r
119             java.text.Bidi.requiresBidi(text, 0, text.length)) {\r
120             errln("Discrepancy in requiresBidi for case " +\r
121                   u16ToPseudo(bidi.getTextAsString()) +\r
122                   "\n    bidi: " + Bidi.requiresBidi(text, 0, text.length) +\r
123                   "\n   jbidi: " + java.text.Bidi.requiresBidi(text, 0, text.length));\r
124         }\r
125         /* skip the next test, since the toString implementation are\r
126          * not compatible\r
127         if (!bidi.toString().equals(jbidi.toString())) {\r
128             errln("Discrepancy in toString for case " +\r
129                   "(level=" + paraLevel + "): " +\r
130                   u16ToPseudo(bidi.getTextAsString() +\r
131                   "\n    bidi: " + bidi.toString() +\r
132                   "\n   jbidi: " + jbidi.toString()));\r
133         }\r
134          */\r
135     }\r
136 \r
137     public void testCompatibility()\r
138     {\r
139         // This test case does not work well on Java 1.4/1.4.1 environment,\r
140         // because of insufficient Bidi implementation in these versions.\r
141         // This test case also does not work will with Java 1.7 environment,\r
142         // because the changes to the Java Bidi implementation.\r
143         String javaVersion = System.getProperty("java.version");\r
144         if (javaVersion.startsWith("1.4.0") || javaVersion.startsWith("1.4.1") || javaVersion.startsWith("1.7")) {\r
145             logln("\nSkipping TestCompatibility.  The test case is known to fail on Java "\r
146                     + javaVersion + "\n");\r
147             return;\r
148         }\r
149         logln("\nEntering TestCompatibility\n");\r
150         /* check constant field values */\r
151         int val;\r
152         val = Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT;\r
153         val = Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT;\r
154         val = Bidi.DIRECTION_LEFT_TO_RIGHT;\r
155         val = Bidi.DIRECTION_RIGHT_TO_LEFT;\r
156         logln("last val = " + val);\r
157 \r
158         String[] data = {"",\r
159                          /* the following 2 cases are skipped, because\r
160                           * java.text.Bidi has bugs which cause discrepancies\r
161                          "abc",\r
162                          "ABC",\r
163                           */\r
164                          "abc def",\r
165                          "ABC DEF",\r
166                          "abc 123 def",\r
167                          "ABC 123 DEF",\r
168                          "abc DEF ghi",\r
169                          "abc DEF 123 xyz",\r
170                          "abc GHIJ 12345 def KLM"\r
171                         };\r
172         int dataCnt = data.length;\r
173         Bidi bidi;\r
174         java.text.Bidi jbidi;\r
175         for (int i = 0; i < dataCnt; i++) {\r
176             String src = pseudoToU16(data[i]);\r
177             bidi = new Bidi(src, Bidi.DIRECTION_LEFT_TO_RIGHT);\r
178             jbidi = new java.text.Bidi(src, java.text.Bidi.DIRECTION_LEFT_TO_RIGHT);\r
179             compareBidi(bidi, jbidi);\r
180             bidi = new Bidi(src, Bidi.DIRECTION_RIGHT_TO_LEFT);\r
181             jbidi = new java.text.Bidi(src, java.text.Bidi.DIRECTION_RIGHT_TO_LEFT);\r
182             compareBidi(bidi, jbidi);\r
183             char[] chars = src.toCharArray();\r
184             bidi = new Bidi(chars, 0, null, 0, chars.length, Bidi.DIRECTION_LEFT_TO_RIGHT);\r
185             jbidi = new java.text.Bidi(chars, 0, null, 0, chars.length, java.text.Bidi.DIRECTION_LEFT_TO_RIGHT);\r
186             compareBidi(bidi, jbidi);\r
187         }\r
188         /* check bogus flags */\r
189         bidi = new Bidi("abc", 999);\r
190         assertEquals("\nDirection should be LTR", Bidi.LTR, bidi.getDirection());\r
191         /* check constructor with overriding embeddings */\r
192         bidi = new Bidi(new char[] { 's', 's', 's' }, 0,\r
193                         new byte[] {(byte) -7, (byte) -2, (byte) -3 },\r
194                         0, 3, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);\r
195         jbidi = new java.text.Bidi(new char[] { 's', 's', 's' }, 0,\r
196                         new byte[] {(byte) -7, (byte) -2, (byte) -3 },\r
197                         0, 3, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);\r
198 \r
199         AttributedString as = new AttributedString("HEBREW 123 english MOREHEB");\r
200         as.addAttribute(TextAttribute.RUN_DIRECTION, TextAttribute.RUN_DIRECTION_RTL);\r
201         as.addAttribute(TextAttribute.NUMERIC_SHAPING, NumericShaper.getShaper(NumericShaper.ARABIC));\r
202         as.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(1), 0, 26);\r
203         as.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(-1), 0, 6);\r
204         as.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(-1), 19, 26);\r
205         AttributedCharacterIterator aci = as.getIterator();\r
206         bidi = new Bidi(aci);\r
207         jbidi = new java.text.Bidi(aci);\r
208         compareBidi(bidi, jbidi);\r
209         String out = bidi.writeReordered(0);\r
210         logln("Output #1 of Bidi(AttributedCharacterIterator): " + out);\r
211 \r
212         as = new AttributedString("HEBREW 123 english MOREHEB");\r
213         as.addAttribute(TextAttribute.RUN_DIRECTION, TextAttribute.RUN_DIRECTION_RTL);\r
214         as.addAttribute(TextAttribute.BIDI_EMBEDDING, new Integer(0), 0, 26);\r
215         aci = as.getIterator();\r
216         bidi = new Bidi(aci);\r
217         jbidi = new java.text.Bidi(aci);\r
218         compareBidi(bidi, jbidi);\r
219         out = bidi.writeReordered(0);\r
220         logln("Output #2 of Bidi(AttributedCharacterIterator): " + out);\r
221 \r
222         as = new AttributedString("HEBREW 123 english MOREHEB");\r
223         aci = as.getIterator();\r
224         bidi = new Bidi(aci);\r
225         jbidi = new java.text.Bidi(aci);\r
226         compareBidi(bidi, jbidi);\r
227         out = bidi.writeReordered(0);\r
228         logln("Output #3 of Bidi(AttributedCharacterIterator): " + out);\r
229 \r
230         char[] text = "abc==(123)==>def".toCharArray();\r
231         bidi = new Bidi(text, 3, null, 0, 10, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);\r
232         jbidi = new java.text.Bidi(text, 3, null, 0, 10, java.text.Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);\r
233         compareBidi(bidi, jbidi);\r
234         out = bidi.writeReordered(0);\r
235         logln("Output of Bidi(abc==(123)==>def,3,null,0,10, DEFAULT_LTR): " + out);\r
236         bidi = new Bidi(text, 3, null, 0, 10, Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);\r
237         jbidi = new java.text.Bidi(text, 3, null, 0, 10, java.text.Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);\r
238         compareBidi(bidi, jbidi);\r
239         out = bidi.writeReordered(0);\r
240         logln("Output of Bidi(abc==(123)==>def,3,null,0,10, DEFAULT_RTL): " + out);\r
241         byte[] levels = new byte[] {0,0,0,-1,-1,-1,0,0,0,0};\r
242         bidi = new Bidi(text, 3, levels, 0, 10, Bidi.DIRECTION_LEFT_TO_RIGHT);\r
243         jbidi = new java.text.Bidi(text, 3, levels, 0, 10, java.text.Bidi.DIRECTION_LEFT_TO_RIGHT);\r
244         compareBidi(bidi, jbidi);\r
245         out = bidi.writeReordered(0);\r
246         logln("Output of Bidi(abc==(123)==>def,3,levels,0,10, LTR): " + out);\r
247         bidi = new Bidi(text, 3, levels, 0, 10, Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);\r
248         jbidi = new java.text.Bidi(text, 3, levels, 0, 10, java.text.Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT);\r
249         compareBidi(bidi, jbidi);\r
250         out = bidi.writeReordered(0);\r
251         logln("Output of Bidi(abc==(123)==>def,3,levels,0,10, DEFAULT_RTL): " + out);\r
252 \r
253         /* test reorderVisually */\r
254         byte[] myLevels = new byte[] {1,2,0,1,2,1,2,0,1,2};\r
255         Character[] objects = new Character[10];\r
256         levels = new byte[objects.length];\r
257         for (int i = 0; i < objects.length; i++) {\r
258             objects[i] = new Character((char)('a'+i));\r
259             levels[i] = myLevels[i];\r
260         }\r
261         Bidi.reorderVisually(levels, 3, objects, 3, 7);\r
262         String strbidi = "";\r
263         for (int i = 0; i < objects.length; i++) {\r
264             strbidi += objects[i].toString();\r
265         }\r
266         for (int i = 0; i < objects.length; i++) {\r
267             objects[i] = new Character((char)('a'+i));\r
268             levels[i] = myLevels[i];\r
269         }\r
270         java.text.Bidi.reorderVisually(levels, 3, objects, 3, 7);\r
271         String strjbidi = "";\r
272         for (int i = 0; i < objects.length; i++) {\r
273             strjbidi += objects[i].toString();\r
274         }\r
275         if (!strjbidi.equals(strbidi)) {\r
276             errln("Discrepancy in reorderVisually " +\r
277                   "\n      bidi: " + strbidi +\r
278                   "\n     jbidi: " + strjbidi);\r
279         } else {\r
280             logln("Correct match in reorderVisually " +\r
281                   "\n      bidi: " + strbidi +\r
282                   "\n     jbidi: " + strjbidi);\r
283         }\r
284 \r
285         logln("\nExiting TestCompatibility\n");\r
286     }\r
287 \r
288     public static void main(String[] args) {\r
289         try {\r
290             new TestCompatibility().run(args);\r
291         }\r
292         catch (Exception e) {\r
293             System.out.println(e);\r
294         }\r
295     }\r
296 }\r