2 *******************************************************************************
\r
3 * Copyright (C) 2007-2010, International Business Machines
\r
4 * Corporation and others. All Rights Reserved.
\r
5 *******************************************************************************
\r
8 package com.ibm.icu.dev.test.bidi;
\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
15 import com.ibm.icu.text.Bidi;
\r
18 * Regression test for java.text.Bidi compatibility
\r
20 * @author Matitiahu Allouche
\r
23 public class TestCompatibility extends BidiTest {
\r
25 void compareBidi(Bidi bidi, java.text.Bidi jbidi)
\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
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
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
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
54 "(level=" + paraLevel + "): " +
\r
55 u16ToPseudo(bidi.getTextAsString()) +
\r
56 "\n bidi: " + bidi.getLevelAt(i) +
\r
57 "\n jbidi: " + jbidi.getLevelAt(i));
\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
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
74 "(level=" + paraLevel + "): " +
\r
75 u16ToPseudo(bidi.getTextAsString()) +
\r
76 "\n bidi: " + bidi.getRunLevel(i) +
\r
77 "\n jbidi: " + jbidi.getRunLevel(i));
\r
79 if (bidi.getRunLimit(i) != jbidi.getRunLimit(i)) {
\r
80 errln("Discrepancy in getRunLimit for run " + i +
\r
82 "(level=" + paraLevel + "): " +
\r
83 u16ToPseudo(bidi.getTextAsString()) +
\r
84 "\n bidi: " + bidi.getRunLimit(i) +
\r
85 "\n jbidi: " + jbidi.getRunLimit(i));
\r
87 if (bidi.getRunStart(i) != jbidi.getRunStart(i)) {
\r
88 errln("Discrepancy in getRunStart for run " + i +
\r
90 "(level=" + paraLevel + "): " +
\r
91 u16ToPseudo(bidi.getTextAsString()) +
\r
92 "\n bidi: " + bidi.getRunStart(i) +
\r
93 "\n jbidi: " + jbidi.getRunStart(i));
\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
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
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
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
125 /* skip the next test, since the toString implementation are
\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
137 public void testCompatibility()
\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
149 logln("\nEntering TestCompatibility\n");
\r
150 /* check constant field values */
\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
158 String[] data = {"",
\r
159 /* the following 2 cases are skipped, because
\r
160 * java.text.Bidi has bugs which cause discrepancies
\r
170 "abc GHIJ 12345 def KLM"
\r
172 int dataCnt = data.length;
\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
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
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
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
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
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
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
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
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
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
275 if (!strjbidi.equals(strbidi)) {
\r
276 errln("Discrepancy in reorderVisually " +
\r
277 "\n bidi: " + strbidi +
\r
278 "\n jbidi: " + strjbidi);
\r
280 logln("Correct match in reorderVisually " +
\r
281 "\n bidi: " + strbidi +
\r
282 "\n jbidi: " + strjbidi);
\r
285 logln("\nExiting TestCompatibility\n");
\r
288 public static void main(String[] args) {
\r
290 new TestCompatibility().run(args);
\r
292 catch (Exception e) {
\r
293 System.out.println(e);
\r