2 *******************************************************************************
\r
3 * Copyright (C) 2001-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.util.Arrays;
\r
12 import com.ibm.icu.text.Bidi;
\r
15 * Regression test for variants to the UBA.
\r
17 * @author Lina Kemmel, Matitiahu Allouche
\r
20 public class TestReorderingMode extends BidiTest {
\r
22 static final String[] textIn = {
\r
31 /* (4) JIH1.2,3MLK */
\r
35 /* (6) JIH.>12->a */
\r
37 /* (7) CBA.>67->89=a */
\r
39 /* (8) CBA.123->xyz */
\r
43 /* (10) a.>67->xyz */
\r
51 static final String[] textOut = {
\r
54 /* TC 1: .123->4.5 */
\r
55 ".123->4.5", /* (1) */
\r
56 "4.5<-123.", /* (2) */
\r
59 /* TC 3: .678->8.9 */
\r
60 ".8.9<-678", /* (4) */
\r
61 "8.9<-678.", /* (5) */
\r
62 ".678->8.9", /* (6) */
\r
63 /* TC 4: MLK1.2,3JIH */
\r
64 "KLM1.2,3HIJ", /* (7) */
\r
65 /* TC 5: FE.>12-> */
\r
66 "12<.EF->", /* (8) */
\r
67 "<-12<.EF", /* (9) */
\r
68 "EF.>@12->", /* (10) */
\r
69 /* TC 6: JIH.>12->a */
\r
70 "12<.HIJ->a", /* (11) */
\r
71 "a<-12<.HIJ", /* (12) */
\r
72 "HIJ.>@12->a", /* (13) */
\r
73 "a&<-12<.HIJ", /* (14) */
\r
74 /* TC 7: CBA.>67->89=a */
\r
75 "ABC.>@67->89=a", /* (15) */
\r
76 "a=89<-67<.ABC", /* (16) */
\r
77 "a&=89<-67<.ABC", /* (17) */
\r
78 "89<-67<.ABC=a", /* (18) */
\r
79 /* TC 8: CBA.123->xyz */
\r
80 "123.ABC->xyz", /* (19) */
\r
81 "xyz<-123.ABC", /* (20) */
\r
82 "ABC.@123->xyz", /* (21) */
\r
83 "xyz&<-123.ABC", /* (22) */
\r
84 /* TC 9: .>12->xyz */
\r
85 ".>12->xyz", /* (23) */
\r
86 "xyz<-12<.", /* (24) */
\r
87 "xyz&<-12<.", /* (25) */
\r
88 /* TC 10: a.>67->xyz */
\r
89 "a.>67->xyz", /* (26) */
\r
90 "a.>@67@->xyz", /* (27) */
\r
91 "xyz<-67<.a", /* (28) */
\r
93 "123HIJ", /* (29) */
\r
94 "HIJ123", /* (30) */
\r
95 /* TC 12: 123 JIH */
\r
96 "123 HIJ", /* (31) */
\r
97 "HIJ 123", /* (32) */
\r
100 static final int[][][][] outIndices = {
\r
102 {{ 0, 0}, { 0, 0}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
103 {{ 0, 0}, { 0, 0}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
104 {{ 0, 0}, { 0, 0}}, /* REORDER_NUMBERS_SPECIAL */
\r
105 {{ 0, 0}, { 0, 0}} /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
107 { /* TC 1: .123->4.5 */
\r
108 {{ 1, 2}, { 1, 2}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
109 {{ 1, 2}, { 1, 2}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
110 {{ 1, 2}, { 1, 2}}, /* REORDER_NUMBERS_SPECIAL */
\r
111 {{ 1, 2}, { 1, 2}} /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
114 {{ 3, 3}, { 3, 3}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
115 {{ 3, 3}, { 3, 3}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
116 {{ 3, 3}, { 3, 3}}, /* REORDER_NUMBERS_SPECIAL */
\r
117 {{ 3, 3}, { 3, 3}} /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
119 { /* TC 3: .678->8.9 */
\r
120 {{ 6, 5}, { 6, 5}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
121 {{ 4, 5}, { 4, 5}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
122 {{ 6, 5}, { 6, 5}}, /* REORDER_NUMBERS_SPECIAL */
\r
123 {{ 6, 5}, { 6, 5}} /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
125 { /* TC 4: MLK1.2,3JIH */
\r
126 {{ 7, 7}, { 7, 7}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
127 {{ 7, 7}, { 7, 7}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
128 {{ 7, 7}, { 7, 7}}, /* REORDER_NUMBERS_SPECIAL */
\r
129 {{ 7, 7}, { 7, 7}} /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
131 { /* TC 5: FE.>12-> */
\r
132 {{ 8, 9}, { 8, 9}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
133 {{10, 9}, { 8, 9}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
134 {{ 8, 9}, { 8, 9}}, /* REORDER_NUMBERS_SPECIAL */
\r
135 {{10, 9}, { 8, 9}} /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
137 { /* TC 6: JIH.>12->a */
\r
138 {{11, 12}, {11, 12}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
139 {{13, 14}, {11, 12}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
140 {{11, 12}, {11, 12}}, /* REORDER_NUMBERS_SPECIAL */
\r
141 {{13, 14}, {11, 12}} /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
143 { /* TC 7: CBA.>67->89=a */
\r
144 {{18, 16}, {18, 16}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
145 {{18, 17}, {18, 16}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
146 {{18, 16}, {18, 16}}, /* REORDER_NUMBERS_SPECIAL */
\r
147 {{15, 17}, {18, 16}} /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
149 { /* TC 8: CBA.>124->xyz */
\r
150 {{19, 20}, {19, 20}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
151 {{21, 22}, {19, 20}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
152 {{19, 20}, {19, 20}}, /* REORDER_NUMBERS_SPECIAL */
\r
153 {{21, 22}, {19, 20}} /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
155 { /* TC 9: .>12->xyz */
\r
156 {{23, 24}, {23, 24}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
157 {{23, 25}, {23, 24}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
158 {{23, 24}, {23, 24}}, /* REORDER_NUMBERS_SPECIAL */
\r
159 {{23, 25}, {23, 24}} /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
161 { /* TC 10: a.>67->xyz */
\r
162 {{26, 26}, {26, 26}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
163 {{26, 27}, {26, 28}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
164 {{26, 28}, {26, 28}}, /* REORDER_NUMBERS_SPECIAL */
\r
165 {{26, 27}, {26, 28}} /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
167 { /* TC 11: 124JIH */
\r
168 {{30, 30}, {30, 30}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
169 {{29, 30}, {29, 30}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
170 {{30, 30}, {30, 30}}, /* REORDER_NUMBERS_SPECIAL */
\r
171 {{30, 30}, {30, 30}} /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
173 { /* TC 12: 124 JIH */
\r
174 {{32, 32}, {32, 32}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
175 {{31, 32}, {31, 32}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
176 {{31, 32}, {31, 32}}, /* REORDER_NUMBERS_SPECIAL */
\r
177 {{31, 32}, {31, 32}} /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
181 static final short[] modes = {
\r
182 Bidi.REORDER_GROUP_NUMBERS_WITH_R,
\r
183 Bidi.REORDER_INVERSE_LIKE_DIRECT,
\r
184 Bidi.REORDER_NUMBERS_SPECIAL,
\r
185 Bidi.REORDER_INVERSE_FOR_NUMBERS_SPECIAL,
\r
186 Bidi.REORDER_INVERSE_NUMBERS_AS_L
\r
189 static final int[] options = { Bidi.OPTION_INSERT_MARKS, 0 };
\r
191 static final byte[] paraLevels = { Bidi.LTR, Bidi.RTL };
\r
193 static final int TC_COUNT = textIn.length;
\r
194 static final int MODES_COUNT = modes.length;
\r
195 static final int OPTIONS_COUNT = options.length;
\r
196 static final int LEVELS_COUNT = paraLevels.length;
\r
198 public void testReorderingMode() {
\r
201 Bidi bidi = new Bidi();
\r
202 Bidi bidi2 = new Bidi();
\r
203 Bidi bidi3 = new Bidi();
\r
204 int tc, mode, option, level;
\r
205 int modeValue, modeBack;
\r
206 int optionValue, optionBack;
\r
209 boolean testOK = true;
\r
211 logln("\nEntering TestReorderingMode\n");
\r
213 bidi2.setInverse(true);
\r
215 for (tc = 0; tc < TC_COUNT; tc++) {
\r
218 for (mode = 0; mode < MODES_COUNT; mode++) {
\r
219 modeValue = modes[mode];
\r
220 bidi.setReorderingMode(modeValue);
\r
221 modeBack = bidi.getReorderingMode();
\r
222 if (modeValue != modeBack) {
\r
223 errln("Error while setting reordering mode to " +
\r
224 modeValue + ", returned " + modeBack);
\r
227 for (option = 0; option < OPTIONS_COUNT; option++) {
\r
228 optionValue = options[option];
\r
229 bidi.setReorderingOptions(optionValue);
\r
230 optionBack = bidi.getReorderingOptions();
\r
231 if (optionValue != optionBack) {
\r
232 errln("Error while setting reordering options to " +
\r
233 modeValue + ", returned " + modeBack);
\r
236 for (level = 0; level < LEVELS_COUNT; level++) {
\r
237 logln("starting test " + tc + " mode=" + modeValue +
\r
238 " option=" + optionValue + " level=" + level);
\r
239 bidi.setPara(pseudoToU16(src), paraLevels[level], null);
\r
241 dest = bidi.writeReordered(Bidi.DO_MIRRORING);
\r
242 dest = u16ToPseudo(dest);
\r
243 if (!((modeValue == Bidi.REORDER_INVERSE_NUMBERS_AS_L) &&
\r
244 (optionValue == Bidi.OPTION_INSERT_MARKS))) {
\r
245 checkWhatYouCan(bidi, src, dest);
\r
247 String modeDesc = modeToString(modeValue);
\r
248 String optDesc = spOptionsToString(optionValue);
\r
250 if (modeValue == Bidi.REORDER_INVERSE_NUMBERS_AS_L) {
\r
252 expected = inverseBasic(bidi2, src, optionValue,
\r
253 paraLevels[level]);
\r
256 index = outIndices[tc][mode][option][level];
\r
257 expected = textOut[index];
\r
259 if (!assertEquals("Actual and expected output mismatch",
\r
260 expected, dest, src, modeDesc, optDesc,
\r
261 String.valueOf(level))) {
\r
265 if ((optionValue == Bidi.OPTION_INSERT_MARKS) &&
\r
266 !assertRoundTrip(bidi3, tc, index, src, dest,
\r
268 paraLevels[level])) {
\r
272 if (!checkResultLength(bidi, src, dest, modeDesc, optDesc,
\r
273 paraLevels[level])) {
\r
277 if ((index > -1) &&
\r
278 !checkMaps(bidi, index, src, dest, modeDesc, optDesc,
\r
279 paraLevels[level], true)) {
\r
287 logln("Reordering mode test OK");
\r
290 logln("\nExiting TestReorderingMode\n");
\r
293 String inverseBasic(Bidi bidi, String src, int option, byte level) {
\r
296 if (bidi == null || src == null) {
\r
299 bidi.setReorderingOptions(option);
\r
300 bidi.setPara(pseudoToU16(src), level, null);
\r
301 dest2 = u16ToPseudo(bidi.writeReordered(Bidi.DO_MIRRORING));
\r
302 if (!(option == Bidi.OPTION_INSERT_MARKS)) {
\r
303 checkWhatYouCan(bidi, src, dest2);
\r
308 static final byte roundtrip[][][][] =
\r
311 {{ 1, 1}, { 1, 1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
312 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
313 {{ 1, 1}, { 1, 1}}, /* REORDER_NUMBERS_SPECIAL */
\r
314 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
315 {{ 1, 1}, { 1, 1}} /* REORDER_INVERSE_NUMBERS_AS_L */
\r
317 { /* TC 1: .123->4.5 */
\r
318 {{ 1, 1}, { 1, 1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
319 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
320 {{ 1, 1}, { 1, 1}}, /* REORDER_NUMBERS_SPECIAL */
\r
321 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
322 {{ 1, 1}, { 1, 1}} /* REORDER_INVERSE_NUMBERS_AS_L */
\r
325 {{ 1, 1}, { 1, 1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
326 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
327 {{ 1, 1}, { 1, 1}}, /* REORDER_NUMBERS_SPECIAL */
\r
328 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
329 {{ 1, 1}, { 1, 1}} /* REORDER_INVERSE_NUMBERS_AS_L */
\r
331 { /* TC 3: .678->8.9 */
\r
332 {{ 1, 1}, { 1, 1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
333 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
334 {{ 1, 1}, { 1, 1}}, /* REORDER_NUMBERS_SPECIAL */
\r
335 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
336 {{ 0, 0}, { 1, 1}} /* REORDER_INVERSE_NUMBERS_AS_L */
\r
338 { /* TC 4: MLK1.2,3JIH */
\r
339 {{ 1, 1}, { 1, 1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
340 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
341 {{ 1, 1}, { 1, 1}}, /* REORDER_NUMBERS_SPECIAL */
\r
342 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
343 {{ 1, 1}, { 1, 1}} /* REORDER_INVERSE_NUMBERS_AS_L */
\r
345 { /* TC 5: FE.>12-> */
\r
346 {{ 1, 1}, { 1, 1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
347 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
348 {{ 0, 1}, { 1, 1}}, /* REORDER_NUMBERS_SPECIAL */
\r
349 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
350 {{ 1, 1}, { 1, 1}} /* REORDER_INVERSE_NUMBERS_AS_L */
\r
352 { /* TC 6: JIH.>12->a */
\r
353 {{ 1, 1}, { 1, 1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
354 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
355 {{ 0, 0}, { 1, 1}}, /* REORDER_NUMBERS_SPECIAL */
\r
356 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
357 {{ 1, 1}, { 1, 1}} /* REORDER_INVERSE_NUMBERS_AS_L */
\r
359 { /* TC 7: CBA.>67->89=a */
\r
360 {{ 1, 1}, { 1, 1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
361 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
362 {{ 0, 1}, { 1, 1}}, /* REORDER_NUMBERS_SPECIAL */
\r
363 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
364 {{ 0, 0}, { 1, 1}} /* REORDER_INVERSE_NUMBERS_AS_L */
\r
366 { /* TC 8: CBA.>123->xyz */
\r
367 {{ 1, 1}, { 1, 1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
368 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
369 {{ 0, 0}, { 1, 1}}, /* REORDER_NUMBERS_SPECIAL */
\r
370 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
371 {{ 1, 1}, { 1, 1}} /* REORDER_INVERSE_NUMBERS_AS_L */
\r
373 { /* TC 9: .>12->xyz */
\r
374 {{ 1, 1}, { 1, 1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
375 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
376 {{ 1, 0}, { 1, 1}}, /* REORDER_NUMBERS_SPECIAL */
\r
377 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
378 {{ 1, 1}, { 1, 1}} /* REORDER_INVERSE_NUMBERS_AS_L */
\r
380 { /* TC 10: a.>67->xyz */
\r
381 {{ 1, 1}, { 1, 1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
382 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
383 {{ 1, 1}, { 1, 1}}, /* REORDER_NUMBERS_SPECIAL */
\r
384 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
385 {{ 1, 0}, { 1, 1}} /* REORDER_INVERSE_NUMBERS_AS_L */
\r
387 { /* TC 11: 123JIH */
\r
388 {{ 1, 1}, { 1, 1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
389 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
390 {{ 1, 1}, { 1, 1}}, /* REORDER_NUMBERS_SPECIAL */
\r
391 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
392 {{ 1, 1}, { 1, 1}} /* REORDER_INVERSE_NUMBERS_AS_L */
\r
394 { /* TC 12: 123 JIH */
\r
395 {{ 1, 1}, { 1, 1}}, /* REORDER_GROUP_NUMBERS_WITH_R */
\r
396 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_LIKE_DIRECT */
\r
397 {{ 1, 1}, { 1, 1}}, /* REORDER_NUMBERS_SPECIAL */
\r
398 {{ 1, 1}, { 1, 1}}, /* REORDER_INVERSE_FOR_NUMBERS_SPECIAL */
\r
399 {{ 1, 1}, { 1, 1}} /* REORDER_INVERSE_NUMBERS_AS_L */
\r
403 private boolean assertRoundTrip(Bidi bidi, int tc, int outIndex,
\r
404 String src, String dest,
\r
405 int mode, int option, byte level) {
\r
406 String descMode, descOption;
\r
409 switch (modes[mode]) {
\r
410 case Bidi.REORDER_NUMBERS_SPECIAL:
\r
411 bidi.setReorderingMode(Bidi.REORDER_INVERSE_FOR_NUMBERS_SPECIAL);
\r
413 case Bidi.REORDER_GROUP_NUMBERS_WITH_R:
\r
414 bidi.setReorderingMode(Bidi.REORDER_GROUP_NUMBERS_WITH_R);
\r
416 case Bidi.REORDER_RUNS_ONLY:
\r
417 bidi.setReorderingMode(Bidi.REORDER_RUNS_ONLY);
\r
419 case Bidi.REORDER_INVERSE_NUMBERS_AS_L:
\r
420 bidi.setReorderingMode(Bidi.REORDER_DEFAULT);
\r
422 case Bidi.REORDER_INVERSE_LIKE_DIRECT:
\r
423 bidi.setReorderingMode(Bidi.REORDER_DEFAULT);
\r
425 case Bidi.REORDER_INVERSE_FOR_NUMBERS_SPECIAL:
\r
426 bidi.setReorderingMode(Bidi.REORDER_NUMBERS_SPECIAL);
\r
429 bidi.setReorderingMode(Bidi.REORDER_INVERSE_LIKE_DIRECT);
\r
432 bidi.setReorderingOptions(Bidi.OPTION_REMOVE_CONTROLS);
\r
434 bidi.setPara(pseudoToU16(dest), level, null);
\r
435 dest2 = bidi.writeReordered(Bidi.DO_MIRRORING);
\r
437 dest2 = u16ToPseudo(dest2);
\r
438 checkWhatYouCan(bidi, dest, dest2);
\r
439 descMode = modeToString(modes[mode]);
\r
440 descOption = spOptionsToString(options[option]);
\r
441 if (!src.equals(dest2)) {
\r
442 if (roundtrip[tc][mode][option][level] == 1) {
\r
443 errln("\nRound trip failed for case=" + tc +
\r
444 " mode=" + mode + " option=" + option +
\r
445 "\nOriginal text: " + src +
\r
446 "\nRound-tripped text: " + dest2 +
\r
447 "\nIntermediate text: " + dest +
\r
448 "\nReordering mode: " + descMode +
\r
449 "\nReordering option: " + descOption +
\r
450 "\nParagraph level: " + level);
\r
452 logln("\nExpected round trip failure for case=" + tc +
\r
453 " mode=" + mode + " option=" + option +
\r
454 "\nOriginal text: " + src +
\r
455 "\nRound-tripped text: " + dest2 +
\r
456 "\nIntermediate text: " + dest +
\r
457 "\nReordering mode: " + descMode +
\r
458 "\nReordering option: " + descOption +
\r
459 "\nParagraph level: " + level);
\r
463 if (!checkResultLength(bidi, dest, dest2, descMode,
\r
464 "OPTION_REMOVE_CONTROLS", level)) {
\r
467 if ((outIndex > -1) &&
\r
468 !checkMaps(bidi, outIndex, src, dest, descMode,
\r
469 "OPTION_REMOVE_CONTROLS", level, false)) {
\r
475 private boolean checkResultLength(Bidi bidi, String src, String dest,
\r
476 String mode, String option, byte level) {
\r
478 if (mode.equals("REORDER_INVERSE_NUMBERS_AS_L"))
\r
479 actualLen = dest.length();
\r
481 actualLen = bidi.getResultLength();
\r
482 if (actualLen != dest.length()) {
\r
483 errln("\nBidi.getResultLength failed." +
\r
484 "\nExpected: " + dest.length() +
\r
485 "\nActual: " + actualLen +
\r
486 "\nInput: " + src +
\r
487 "\nOutput: " + dest +
\r
488 "\nReordering mode: " + mode +
\r
489 "\nReordering option: " + option +
\r
490 "\nParagraph level: " + level);
\r
496 static String formatMap(int[] map)
\r
498 char[] buffer = new char[map.length];
\r
501 for (i = 0; i < map.length; i++) {
\r
505 else if (k >= columns.length)
\r
511 return new String(buffer);
\r
514 static final int NO = Bidi.MAP_NOWHERE;
\r
516 static final int forwardMap[][] = {
\r
518 { 0, 1, 2 }, /* (0) */
\r
519 /* TC 1: .123->4.5 */
\r
520 { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, /* (1) */
\r
521 { 8, 5, 6, 7, 4, 3, 0, 1, 2 }, /* (2) */
\r
523 { 0, 1, 2 }, /* (3) */
\r
524 /* TC 3: .678->8.9 */
\r
525 { 0, 6, 7, 8, 5, 4, 1, 2, 3 }, /* (4) */
\r
526 { 8, 5, 6, 7, 4, 3, 0, 1, 2 }, /* (5) */
\r
527 { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, /* (6) */
\r
528 /* TC 4: MLK1.2,3JIH */
\r
529 { 10, 9, 8, 3, 4, 5, 6, 7, 2, 1, 0 }, /* (7) */
\r
530 /* TC 5: FE.>12-> */
\r
531 { 5, 4, 3, 2, 0, 1, 6, 7 }, /* (8) */
\r
532 { 7, 6, 5, 4, 2, 3, 1, 0 }, /* (9) */
\r
533 { 1, 0, 2, 3, 5, 6, 7, 8 }, /* (10) */
\r
534 /* TC 6: JIH.>12->a */
\r
535 { 6, 5, 4, 3, 2, 0, 1, 7, 8, 9 }, /* (11) */
\r
536 { 9, 8, 7, 6, 5, 3, 4, 2, 1, 0 }, /* (12) */
\r
537 { 2, 1, 0, 3, 4, 6, 7, 8, 9, 10 }, /* (13) */
\r
538 { 10, 9, 8, 7, 6, 4, 5, 3, 2, 0 }, /* (14) */
\r
539 /* TC 7: CBA.>67->89=a */
\r
540 { 2, 1, 0, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13 }, /* (15) */
\r
541 { 12, 11, 10, 9, 8, 6, 7, 5, 4, 2, 3, 1, 0 }, /* (16) */
\r
542 { 13, 12, 11, 10, 9, 7, 8, 6, 5, 3, 4, 2, 0 }, /* (17) */
\r
543 { 10, 9, 8, 7, 6, 4, 5, 3, 2, 0, 1, 11, 12 }, /* (18) */
\r
544 /* TC 8: CBA.123->xyz */
\r
545 { 6, 5, 4, 3, 0, 1, 2, 7, 8, 9, 10, 11 }, /* (19) */
\r
546 { 11, 10, 9, 8, 5, 6, 7, 4, 3, 0, 1, 2 }, /* (20) */
\r
547 { 2, 1, 0, 3, 5, 6, 7, 8, 9, 10, 11, 12 }, /* (21) */
\r
548 { 12, 11, 10, 9, 6, 7, 8, 5, 4, 0, 1, 2 }, /* (22) */
\r
549 /* TC 9: .>12->xyz */
\r
550 { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, /* (23) */
\r
551 { 8, 7, 5, 6, 4, 3, 0, 1, 2 }, /* (24) */
\r
552 { 9, 8, 6, 7, 5, 4, 0, 1, 2 }, /* (25) */
\r
553 /* TC 10: a.>67->xyz */
\r
554 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, /* (26) */
\r
555 { 0, 1, 2, 4, 5, 7, 8, 9, 10, 11 }, /* (27) */
\r
556 { 9, 8, 7, 5, 6, 4, 3, 0, 1, 2 }, /* (28) */
\r
557 /* TC 11: 123JIH */
\r
558 { 0, 1, 2, 5, 4, 3 }, /* (29) */
\r
559 { 3, 4, 5, 2, 1, 0 }, /* (30) */
\r
560 /* TC 12: 123 JIH */
\r
561 { 0, 1, 2, 3, 6, 5, 4 }, /* (31) */
\r
562 { 4, 5, 6, 3, 2, 1, 0 }, /* (32) */
\r
564 static final int inverseMap[][] = {
\r
566 { 0, 1, 2 }, /* (0) */
\r
567 /* TC 1: .123->4.5 */
\r
568 { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, /* (1) */
\r
569 { 6, 7, 8, 5, 4, 1, 2, 3, 0 }, /* (2) */
\r
571 { 0, 1, 2 }, /* (3) */
\r
572 /* TC 3: .678->8.9 */
\r
573 { 0, 6, 7, 8, 5, 4, 1, 2, 3 }, /* (4) */
\r
574 { 6, 7, 8, 5, 4, 1, 2, 3, 0 }, /* (5) */
\r
575 { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, /* (6) */
\r
576 /* TC 4: MLK1.2,3JIH */
\r
577 { 10, 9, 8, 3, 4, 5, 6, 7, 2, 1, 0 }, /* (7) */
\r
578 /* TC 5: FE.>12-> */
\r
579 { 4, 5, 3, 2, 1, 0, 6, 7 }, /* (8) */
\r
580 { 7, 6, 4, 5, 3, 2, 1, 0 }, /* (9) */
\r
581 { 1, 0, 2, 3, NO, 4, 5, 6, 7 }, /* (10) */
\r
582 /* TC 6: JIH.>12->a */
\r
583 { 5, 6, 4, 3, 2, 1, 0, 7, 8, 9 }, /* (11) */
\r
584 { 9, 8, 7, 5, 6, 4, 3, 2, 1, 0 }, /* (12) */
\r
585 { 2, 1, 0, 3, 4, NO, 5, 6, 7, 8, 9 }, /* (13) */
\r
586 { 9, NO, 8, 7, 5, 6, 4, 3, 2, 1, 0 }, /* (14) */
\r
587 /* TC 7: CBA.>67->89=a */
\r
588 { 2, 1, 0, 3, 4, NO, 5, 6, 7, 8, 9, 10, 11, 12 }, /* (15) */
\r
589 { 12, 11, 9, 10, 8, 7, 5, 6, 4, 3, 2, 1, 0 }, /* (16) */
\r
590 { 12, NO, 11, 9, 10, 8, 7, 5, 6, 4, 3, 2, 1, 0 }, /* (17) */
\r
591 { 9, 10, 8, 7, 5, 6, 4, 3, 2, 1, 0, 11, 12 }, /* (18) */
\r
592 /* TC 8: CBA.123->xyz */
\r
593 { 4, 5, 6, 3, 2, 1, 0, 7, 8, 9, 10, 11 }, /* (19) */
\r
594 { 9, 10, 11, 8, 7, 4, 5, 6, 3, 2, 1, 0 }, /* (20) */
\r
595 { 2, 1, 0, 3, NO, 4, 5, 6, 7, 8, 9, 10, 11 }, /* (21) */
\r
596 { 9, 10, 11, NO, 8, 7, 4, 5, 6, 3, 2, 1, 0 }, /* (22) */
\r
597 /* TC 9: .>12->xyz */
\r
598 { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, /* (23) */
\r
599 { 6, 7, 8, 5, 4, 2, 3, 1, 0 }, /* (24) */
\r
600 { 6, 7, 8, NO, 5, 4, 2, 3, 1, 0 }, /* (25) */
\r
601 /* TC 10: a.>67->xyz */
\r
602 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, /* (26) */
\r
603 { 0, 1, 2, NO, 3, 4, NO, 5, 6, 7, 8, 9 }, /* (27) */
\r
604 { 7, 8, 9, 6, 5, 3, 4, 2, 1, 0 }, /* (28) */
\r
605 /* TC 11: 123JIH */
\r
606 { 0, 1, 2, 5, 4, 3 }, /* (29) */
\r
607 { 5, 4, 3, 0, 1, 2 }, /* (30) */
\r
608 /* TC 12: 123 JIH */
\r
609 { 0, 1, 2, 3, 6, 5, 4 }, /* (31) */
\r
610 { 6, 5, 4, 3, 0, 1, 2 }, /* (32) */
\r
613 private boolean checkMaps(Bidi bidi, int stringIndex, String src, String dest,
\r
614 String mode, String option, byte level, boolean forward) {
\r
616 int[] actualLogicalMap;
\r
617 int[] actualVisualMap;
\r
619 int i, srcLen, resLen, index;
\r
620 int[] expectedLogicalMap, expectedVisualMap;
\r
621 boolean testOK = true;
\r
624 expectedLogicalMap = forwardMap[stringIndex];
\r
625 expectedVisualMap = inverseMap[stringIndex];
\r
627 expectedLogicalMap = inverseMap[stringIndex];
\r
628 expectedVisualMap = forwardMap[stringIndex];
\r
630 actualLogicalMap = bidi.getLogicalMap();
\r
631 srcLen = bidi.getProcessedLength();
\r
632 if (!Arrays.equals(expectedLogicalMap, actualLogicalMap)) {
\r
633 err("Bidi.getLogicalMap returned unexpected map for output " +
\r
634 "string index " + stringIndex + "\n" +
\r
635 "source: " + src + "\n" +
\r
636 "dest : " + dest + "\n" +
\r
637 "Scale : " + columnString + "\n" +
\r
638 "ExpMap: " + formatMap(expectedLogicalMap) + "\n" +
\r
639 "Actual: " + formatMap(actualLogicalMap) + "\n" +
\r
640 "Paragraph level : " + level + " == " + bidi.getParaLevel() + "\n" +
\r
641 "Reordering mode : " + mode + " == " + bidi.getReorderingMode() + "\n" +
\r
642 "Reordering option: " + option + " == " + bidi.getReorderingOptions() + "\n" +
\r
643 "Forward flag : " + forward + "\n");
\r
646 resLen = bidi.getResultLength();
\r
647 actualVisualMap = bidi.getVisualMap();
\r
648 if (!Arrays.equals(expectedVisualMap, actualVisualMap)) {
\r
649 err("Bidi.getVisualMap returned unexpected map for output " +
\r
650 "string index " + stringIndex + "\n" +
\r
651 "source: " + src + "\n" +
\r
652 "dest : " + dest + "\n" +
\r
653 "Scale : " + columnString + "\n" +
\r
654 "ExpMap: " + formatMap(expectedVisualMap) + "\n" +
\r
655 "Actual: " + formatMap(actualVisualMap) + "\n" +
\r
656 "Paragraph level : " + level + " == " + bidi.getParaLevel() + "\n" +
\r
657 "Reordering mode : " + mode + " == " + bidi.getReorderingMode() + "\n" +
\r
658 "Reordering option: " + option + " == " + bidi.getReorderingOptions() + "\n" +
\r
659 "Forward flag : " + forward + "\n");
\r
662 getIndexMap = new int[srcLen];
\r
663 for (i = 0; i < srcLen; i++) {
\r
664 index = bidi.getVisualIndex(i);
\r
665 getIndexMap[i] = index;
\r
667 if (!Arrays.equals(actualLogicalMap, getIndexMap)) {
\r
668 err("Mismatch between getLogicalMap and getVisualIndex for output " +
\r
669 "string index " + stringIndex + "\n" +
\r
670 "source: " + src + "\n" +
\r
671 "dest : " + dest + "\n" +
\r
672 "Scale : " + columnString + "\n" +
\r
673 "ActMap: " + formatMap(actualLogicalMap) + "\n" +
\r
674 "IdxMap: " + formatMap(getIndexMap) + "\n" +
\r
675 "Paragraph level : " + level + " == " + bidi.getParaLevel() + "\n" +
\r
676 "Reordering mode : " + mode + " == " + bidi.getReorderingMode() + "\n" +
\r
677 "Reordering option: " + option + " == " + bidi.getReorderingOptions() + "\n" +
\r
678 "Forward flag : " + forward + "\n");
\r
681 getIndexMap = new int[resLen];
\r
682 for (i = 0; i < resLen; i++) {
\r
683 index = bidi.getLogicalIndex(i);
\r
684 getIndexMap[i] = index;
\r
686 if (!Arrays.equals(actualVisualMap, getIndexMap)) {
\r
687 err("Mismatch between getVisualMap and getLogicalIndex for output " +
\r
688 "string index " + stringIndex + "\n" +
\r
689 "source: " + src + "\n" +
\r
690 "dest : " + dest + "\n" +
\r
691 "Scale : " + columnString + "\n" +
\r
692 "ActMap: " + formatMap(actualVisualMap) + "\n" +
\r
693 "IdxMap: " + formatMap(getIndexMap) + "\n" +
\r
694 "Paragraph level : " + level + " == " + bidi.getParaLevel() + "\n" +
\r
695 "Reordering mode : " + mode + " == " + bidi.getReorderingMode() + "\n" +
\r
696 "Reordering option: " + option + " == " + bidi.getReorderingOptions() + "\n" +
\r
697 "Forward flag : " + forward + "\n");
\r
704 public static void main(String[] args) {
\r
706 new TestReorderingMode().run(args);
\r
708 catch (Exception e) {
\r
709 System.out.println(e);
\r