]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/tests/core/src/com/ibm/icu/dev/test/bidi/TestReorderingMode.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / tests / core / src / com / ibm / icu / dev / test / bidi / TestReorderingMode.java
1 /*\r
2 *******************************************************************************\r
3 *   Copyright (C) 2001-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.util.Arrays;\r
11 \r
12 import com.ibm.icu.text.Bidi;\r
13 \r
14 /**\r
15  * Regression test for variants to the UBA.\r
16  *\r
17  * @author Lina Kemmel, Matitiahu Allouche\r
18  */\r
19 \r
20 public class TestReorderingMode extends BidiTest {\r
21 \r
22     static final String[] textIn = {\r
23     /* (0) 123 */\r
24         "123",\r
25     /* (1) .123->4.5 */\r
26         ".123->4.5",\r
27     /* (2) 678 */\r
28         "678",\r
29     /* (3) .678->8.9 */\r
30         ".678->8.9",\r
31     /* (4) JIH1.2,3MLK */\r
32         "JIH1.2,3MLK",\r
33     /* (5) FE.>12-> */\r
34         "FE.>12->",\r
35     /* (6) JIH.>12->a */\r
36         "JIH.>12->a",\r
37     /* (7) CBA.>67->89=a */\r
38         "CBA.>67->89=a",\r
39     /* (8) CBA.123->xyz */\r
40         "CBA.123->xyz",\r
41     /* (9) .>12->xyz */\r
42         ".>12->xyz",\r
43     /* (10) a.>67->xyz */\r
44         "a.>67->xyz",\r
45     /* (11) 123JIH */\r
46         "123JIH",\r
47     /* (12) 123 JIH */\r
48         "123 JIH"\r
49     };\r
50 \r
51     static final String[] textOut = {\r
52     /* TC 0: 123 */\r
53         "123",                                                              /* (0) */\r
54     /* TC 1: .123->4.5 */\r
55         ".123->4.5",                                                        /* (1) */\r
56         "4.5<-123.",                                                        /* (2) */\r
57     /* TC 2: 678 */\r
58         "678",                                                              /* (3) */\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
92     /* TC 11: 123JIH */\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
98     };\r
99 \r
100     static final int[][][][] outIndices = {\r
101         { /* TC 0: 123 */\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
106         },\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
112         },\r
113         { /* TC 2: 678 */\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
118         },\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
124         },\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
130         },\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
136         },\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
142         },\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
148         },\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
154         },\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
160         },\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
166         },\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
172         },\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
178         }\r
179     };\r
180 \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
187     };\r
188 \r
189     static final int[] options = { Bidi.OPTION_INSERT_MARKS, 0 };\r
190 \r
191     static final byte[] paraLevels = { Bidi.LTR, Bidi.RTL };\r
192 \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
197 \r
198     public void testReorderingMode() {\r
199 \r
200         String src, dest;\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
207         int index;\r
208         String expected;\r
209         boolean testOK = true;\r
210 \r
211         logln("\nEntering TestReorderingMode\n");\r
212 \r
213         bidi2.setInverse(true);\r
214 \r
215         for (tc = 0; tc < TC_COUNT; tc++) {\r
216             src = textIn[tc];\r
217 \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
225                 }\r
226 \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
234                     }\r
235 \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
240 \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
246                         }\r
247                         String modeDesc = modeToString(modeValue);\r
248                         String optDesc = spOptionsToString(optionValue);\r
249 \r
250                         if (modeValue == Bidi.REORDER_INVERSE_NUMBERS_AS_L) {\r
251                             index = -1;\r
252                             expected = inverseBasic(bidi2, src, optionValue,\r
253                                                     paraLevels[level]);\r
254                         }\r
255                         else {\r
256                             index = outIndices[tc][mode][option][level];\r
257                             expected = textOut[index];\r
258                         }\r
259                         if (!assertEquals("Actual and expected output mismatch",\r
260                                           expected, dest, src, modeDesc, optDesc,\r
261                                           String.valueOf(level))) {\r
262                             testOK = false;\r
263                             continue;\r
264                         }\r
265                         if ((optionValue == Bidi.OPTION_INSERT_MARKS) &&\r
266                             !assertRoundTrip(bidi3, tc, index, src, dest,\r
267                                              mode, option,\r
268                                              paraLevels[level])) {\r
269                             testOK = false;\r
270                             continue;\r
271                         }\r
272                         if (!checkResultLength(bidi, src, dest, modeDesc, optDesc,\r
273                                                paraLevels[level])) {\r
274                             testOK = false;\r
275                             continue;\r
276                         }\r
277                         if ((index > -1) &&\r
278                             !checkMaps(bidi, index, src, dest, modeDesc, optDesc,\r
279                                        paraLevels[level], true)) {\r
280                             testOK = false;\r
281                         }\r
282                     }\r
283                 }\r
284             }\r
285         }\r
286         if (testOK) {\r
287             logln("Reordering mode test OK");\r
288         }\r
289 \r
290         logln("\nExiting TestReorderingMode\n");\r
291     }\r
292 \r
293     String inverseBasic(Bidi bidi, String src, int option, byte level) {\r
294         String dest2;\r
295 \r
296         if (bidi == null || src == null) {\r
297             return null;\r
298         }\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
304         }\r
305         return dest2;\r
306     }\r
307 \r
308     static final byte roundtrip[][][][] =\r
309     {\r
310         { /* TC 0: 123 */\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
316         },\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
323         },\r
324         { /* TC 2: 678 */\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
330         },\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
337         },\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
344         },\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
351         },\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
358         },\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
365         },\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
372         },\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
379         },\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
386         },\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
393         },\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
400         }\r
401     };\r
402 \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
407         String dest2;\r
408 \r
409         switch (modes[mode]) {\r
410             case Bidi.REORDER_NUMBERS_SPECIAL:\r
411                 bidi.setReorderingMode(Bidi.REORDER_INVERSE_FOR_NUMBERS_SPECIAL);\r
412                 break;\r
413             case Bidi.REORDER_GROUP_NUMBERS_WITH_R:\r
414                 bidi.setReorderingMode(Bidi.REORDER_GROUP_NUMBERS_WITH_R);\r
415                 break;\r
416             case Bidi.REORDER_RUNS_ONLY:\r
417                 bidi.setReorderingMode(Bidi.REORDER_RUNS_ONLY);\r
418                 break;\r
419             case Bidi.REORDER_INVERSE_NUMBERS_AS_L:\r
420                 bidi.setReorderingMode(Bidi.REORDER_DEFAULT);\r
421                 break;\r
422             case Bidi.REORDER_INVERSE_LIKE_DIRECT:\r
423                 bidi.setReorderingMode(Bidi.REORDER_DEFAULT);\r
424                 break;\r
425             case Bidi.REORDER_INVERSE_FOR_NUMBERS_SPECIAL:\r
426                 bidi.setReorderingMode(Bidi.REORDER_NUMBERS_SPECIAL);\r
427                 break;\r
428             default:\r
429                 bidi.setReorderingMode(Bidi.REORDER_INVERSE_LIKE_DIRECT);\r
430                 break;\r
431         }\r
432         bidi.setReorderingOptions(Bidi.OPTION_REMOVE_CONTROLS);\r
433 \r
434         bidi.setPara(pseudoToU16(dest), level, null);\r
435         dest2 = bidi.writeReordered(Bidi.DO_MIRRORING);\r
436 \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
451             } else {\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
460             }\r
461             return false;\r
462         }\r
463         if (!checkResultLength(bidi, dest, dest2, descMode,\r
464                                "OPTION_REMOVE_CONTROLS", level)) {\r
465             return false;\r
466         }\r
467         if ((outIndex > -1) &&\r
468             !checkMaps(bidi, outIndex, src, dest, descMode,\r
469                        "OPTION_REMOVE_CONTROLS", level, false)) {\r
470             return false;\r
471         }\r
472         return true;\r
473     }\r
474 \r
475     private boolean checkResultLength(Bidi bidi, String src, String dest,\r
476                                    String mode, String option, byte level) {\r
477         int actualLen;\r
478         if (mode.equals("REORDER_INVERSE_NUMBERS_AS_L"))\r
479             actualLen = dest.length();\r
480         else\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
491             return false;\r
492         }\r
493         return true;\r
494     }\r
495 \r
496     static String formatMap(int[] map)\r
497     {\r
498         char[] buffer = new char[map.length];\r
499         int i, k;\r
500         char c;\r
501         for (i = 0; i < map.length; i++) {\r
502             k = map[i];\r
503             if (k < 0)\r
504                 c = '-';\r
505             else if (k >= columns.length)\r
506                 c = '+';\r
507             else\r
508                 c = columns[k];\r
509             buffer[i] = c;\r
510         }\r
511         return new String(buffer);\r
512     }\r
513 \r
514     static final int NO = Bidi.MAP_NOWHERE;\r
515 \r
516     static final int forwardMap[][] = {\r
517     /* TC 0: 123 */\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
522     /* TC 2: 678 */\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
563     };\r
564     static final int inverseMap[][] = {\r
565     /* TC 0: 123 */\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
570     /* TC 2: 678 */\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
611     };\r
612 \r
613     private boolean checkMaps(Bidi bidi, int stringIndex, String src, String dest,\r
614             String mode, String option, byte level, boolean forward) {\r
615 \r
616         int[] actualLogicalMap;\r
617         int[] actualVisualMap;\r
618         int[] getIndexMap;\r
619         int i, srcLen, resLen, index;\r
620         int[] expectedLogicalMap, expectedVisualMap;\r
621         boolean testOK = true;\r
622 \r
623         if (forward) {\r
624             expectedLogicalMap = forwardMap[stringIndex];\r
625             expectedVisualMap  = inverseMap[stringIndex];\r
626         } else {\r
627             expectedLogicalMap = inverseMap[stringIndex];\r
628             expectedVisualMap  = forwardMap[stringIndex];\r
629         }\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
644             testOK = false;\r
645         }\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
660             testOK = false;\r
661         }\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
666         }\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
679             testOK = false;\r
680         }\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
685         }\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
698             testOK = false;\r
699         }\r
700         return testOK;\r
701     }\r
702 \r
703 \r
704     public static void main(String[] args) {\r
705         try {\r
706             new TestReorderingMode().run(args);\r
707         }\r
708         catch (Exception e) {\r
709             System.out.println(e);\r
710         }\r
711     }\r
712 \r
713 }\r