]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/tests/core/src/com/ibm/icu/dev/test/bidi/TestBidi.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / tests / core / src / com / ibm / icu / dev / test / bidi / TestBidi.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.util.Arrays;\r
11 \r
12 import com.ibm.icu.text.Bidi;\r
13 import com.ibm.icu.text.BidiRun;\r
14 \r
15 /**\r
16  * Regression test for Bidi class override.\r
17  *\r
18  * @author Lina Kemmel, Matitiahu Allouche\r
19  */\r
20 \r
21 public class TestBidi extends BidiTest {\r
22 \r
23     private static final int MAXLEN = 256;\r
24     private static final String levelString = "............................";\r
25 \r
26     public void testBidi() {\r
27         Bidi bidi;\r
28         Bidi bidiLine;\r
29 \r
30         logln("\nEntering TestBidi");\r
31         bidi = new Bidi(MAXLEN, 0);\r
32         bidiLine = new Bidi();\r
33 \r
34         doTests(bidi, bidiLine, false);\r
35         doTests(bidi, bidiLine, true);\r
36         doMisc();\r
37         logln("\nExiting TestBidi");\r
38     }\r
39 \r
40     private void doTests(Bidi bidi, Bidi bidiLine, boolean countRunsFirst) {\r
41         int testNumber;\r
42         String string;\r
43         int lineStart;\r
44         byte paraLevel;\r
45         int bidiTestCount = TestData.testCount();\r
46 \r
47         for (testNumber = 0; testNumber < bidiTestCount; ++testNumber) {\r
48             TestData test = TestData.getTestData(testNumber);\r
49             string = getStringFromDirProps(test.dirProps);\r
50             paraLevel = test.paraLevel;\r
51             try {\r
52                 bidi.setPara(string, paraLevel, null);\r
53                 logln("Bidi.setPara(tests[" + testNumber + "] OK, direction "\r
54                         + bidi.getDirection() + " paraLevel "\r
55                         + paraLevel);\r
56             } catch (Exception e) {\r
57                 errln("Bidi.setPara(tests[" + testNumber + "] failed, direction "\r
58                         + bidi.getDirection() + " paraLevel "\r
59                         + paraLevel);\r
60             }\r
61             lineStart = test.lineStart;\r
62             if (lineStart == -1) {\r
63                 doTest(bidi, testNumber, test, 0, countRunsFirst);\r
64             } else {\r
65                 try {\r
66                     bidiLine = bidi.setLine(lineStart, test.lineLimit);\r
67                     logln("Bidi.setLine(" + lineStart + ", " + test.lineLimit\r
68                             + "), in tests[" + testNumber + "] OK, direction "\r
69                             + bidiLine.getDirection() + " paraLevel "\r
70                             + bidiLine.getBaseLevel());\r
71                     doTest(bidiLine, testNumber, test, lineStart, countRunsFirst);\r
72                 } catch (Exception e)  {\r
73                     errln("Bidi.setLine(" + lineStart + ", " + test.lineLimit\r
74                             + "), in runAll test[" + testNumber + "] failed");\r
75                 }\r
76                 /* do it again using createLineBidi instead of setLine */\r
77                 try {\r
78                     bidiLine = bidi.createLineBidi(lineStart, test.lineLimit);\r
79                     logln("Bidi.createLineBidi(" + lineStart + ", " + test.lineLimit\r
80                             + "), in tests[" + testNumber + "] OK, direction "\r
81                             + bidiLine.getDirection() + " paraLevel "\r
82                             + bidiLine.getBaseLevel());\r
83                     doTest(bidiLine, testNumber, test, lineStart, countRunsFirst);\r
84                 } catch (Exception e)  {\r
85                     errln("Bidi.createLineBidi(" + lineStart + ", " + test.lineLimit\r
86                             + "), in runAll test[" + testNumber + "] failed");\r
87                 }\r
88             }\r
89         }\r
90     }\r
91 \r
92     private void doTest(Bidi bidi, int testNumber, TestData test,\r
93                         int lineStart, boolean countRunsFirst) {\r
94         short[] dirProps = test.dirProps;\r
95         byte[] levels = test.levels;\r
96         int[] visualMap = test.visualMap;\r
97         int i, len = bidi.getLength(), logicalIndex = -1, runCount = 0;\r
98         byte level, level2;\r
99 \r
100         if (countRunsFirst) {\r
101             logln("Calling Bidi.countRuns() first.");\r
102             try {\r
103                 runCount = bidi.countRuns();\r
104             } catch (IllegalStateException e) {\r
105                 errln("Bidi.countRuns(test[" + testNumber + "]) failed");\r
106             }\r
107         } else {\r
108             logln("Calling Bidi.getLogicalMap() first.");\r
109         }\r
110 \r
111         _testReordering(bidi, testNumber);\r
112 \r
113         for (i = 0; i < len; ++i) {\r
114             logln(i + "  " + bidi.getLevelAt(i) + "  " + levelString\r
115                     + TestData.dirPropNames[dirProps[lineStart + i]] + "  "\r
116                     + bidi.getVisualIndex(i));\r
117         }\r
118 \r
119         log("\n-----levels:");\r
120         for (i = 0; i < len; ++i) {\r
121             if (i > 0) {\r
122                 log(",");\r
123             }\r
124             log(" " + bidi.getLevelAt(i));\r
125         }\r
126 \r
127         log("\n--reordered:");\r
128         for (i = 0; i < len; ++i) {\r
129             if (i > 0) {\r
130                 log(",");\r
131             }\r
132             log(" " + bidi.getVisualIndex(i));\r
133         }\r
134         log("\n");\r
135 \r
136         assertEquals("\nFailure in Bidi.getDirection(test[" + testNumber + "])",\r
137                      test.direction, bidi.getDirection());\r
138         assertEquals("\nFailure in Bidi.getParaLevel(test[" + testNumber + "])",\r
139                      test.resultLevel, bidi.getParaLevel());\r
140 \r
141         for (i = 0; i < len; ++i) {\r
142             assertEquals("\nFailure in Bidi.getLevelAt(" + i +\r
143                          ") in test[" + testNumber + "]",\r
144                          levels[i], bidi.getLevelAt(i));\r
145         }\r
146 \r
147         for (i = 0; i < len; ++i) {\r
148             try {\r
149                 logicalIndex = bidi.getVisualIndex(i);\r
150             } catch (Throwable th) {\r
151                 errln("Bidi.getVisualIndex(" + i + ") in test[" + testNumber\r
152                         + "] failed");\r
153             }\r
154             if(visualMap[i] != logicalIndex) {\r
155                 assertEquals("\nFailure in Bidi.getVisualIndex(" + i +\r
156                              ") in test[" + testNumber + "])",\r
157                              visualMap[i], logicalIndex);\r
158             }\r
159         }\r
160 \r
161         if (!countRunsFirst) {\r
162             try {\r
163                 runCount = bidi.countRuns();\r
164             } catch (IllegalStateException e) {\r
165                 errln("Bidi.countRuns(test[" + testNumber + "]) failed");\r
166             }\r
167         }\r
168 \r
169         BidiRun run;\r
170 \r
171         for (logicalIndex = 0; logicalIndex < len; ) {\r
172             level = bidi.getLevelAt(logicalIndex);\r
173             run = bidi.getLogicalRun(logicalIndex);\r
174             logicalIndex = run.getLimit();\r
175             level2 = run.getEmbeddingLevel();\r
176             assertEquals("Logical " + run.toString() +\r
177                          " in test[" + testNumber + "]: wrong level",\r
178                          level, level2);\r
179             if (--runCount < 0) {\r
180                 errln("Bidi.getLogicalRun(test[" + testNumber\r
181                       + "]): wrong number of runs compared to Bidi.countRuns() = "\r
182                       + bidi.countRuns());\r
183             }\r
184         }\r
185         if (runCount != 0) {\r
186             errln("Bidi.getLogicalRun(test[" + testNumber\r
187                     + "]): wrong number of runs compared to Bidi.countRuns() = "\r
188                     + bidi.countRuns());\r
189         }\r
190 \r
191         log("\n\n");\r
192     }\r
193 \r
194     private void _testReordering(Bidi bidi, int testNumber) {\r
195         int[] logicalMap1;\r
196         int[] logicalMap2;\r
197         int[] logicalMap3;\r
198         int[] visualMap1;\r
199         int[] visualMap2;\r
200         int[] visualMap3;\r
201         int[] visualMap4 = new int[MAXLEN];\r
202         byte[] levels;\r
203         int i, length = bidi.getLength(),\r
204                destLength = bidi.getResultLength();\r
205         int runCount, visualIndex, logicalIndex = -1, logicalStart, runLength;\r
206         boolean odd;\r
207 \r
208         if(length <= 0) {\r
209             return;\r
210         }\r
211         /* get the logical and visual maps from the object */\r
212         logicalMap1 = bidi.getLogicalMap();\r
213         if (logicalMap1 == null) {\r
214             errln("getLogicalMap in test " + testNumber + " is null");\r
215             logicalMap1 = new int[0];\r
216         }\r
217 \r
218         visualMap1 = bidi.getVisualMap();\r
219 \r
220         if (visualMap1 == null) {\r
221             errln("getVisualMap() in test " + testNumber + " is null");\r
222             visualMap1 = new int[0];\r
223         }\r
224 \r
225         /* invert them both */\r
226         visualMap2 = Bidi.invertMap(logicalMap1);\r
227         logicalMap2 = Bidi.invertMap(visualMap1);\r
228 \r
229         /* get them from the levels array, too */\r
230         levels = bidi.getLevels();\r
231 \r
232         if (levels == null || levels.length != length) {\r
233             errln("getLevels() in test " + testNumber + " failed");\r
234         }\r
235 \r
236         logicalMap3 = Bidi.reorderLogical(levels);\r
237         visualMap3 = Bidi.reorderVisual(levels);\r
238 \r
239         /* get the visual map from the runs, too */\r
240         try {\r
241             runCount = bidi.countRuns();\r
242         } catch (IllegalStateException e) {\r
243             errln("countRuns() in test " + testNumber + " failed");\r
244             runCount = 0;\r
245         }\r
246 \r
247         logln("\n---- " + runCount + " runs");\r
248         visualIndex = 0;\r
249         BidiRun run;\r
250         for (i = 0; i < runCount; ++i) {\r
251             run = bidi.getVisualRun(i);\r
252             if (run == null) {\r
253                 errln("null visual run encountered at index " + i +\r
254                       ", in test " + testNumber);\r
255                 continue;\r
256             }\r
257             odd = run.isOddRun();\r
258             logicalStart = run.getStart();\r
259             runLength = run.getLength();\r
260             log("(" + (run.isOddRun() ? "R" : "L"));\r
261             log(" @" + run.getStart() + '[' + run.getLength() + "])\n");\r
262             if (!odd) {\r
263                 do {    /* LTR */\r
264                     visualMap4[visualIndex++] = logicalStart++;\r
265                 } while (--runLength > 0);\r
266             } else {\r
267                 logicalStart += runLength;  /* logicalLimit */\r
268                 do {    /* RTL */\r
269                     visualMap4[visualIndex++] = --logicalStart;\r
270                 } while (--runLength > 0);\r
271             }\r
272         }\r
273         log("\n");\r
274 \r
275         /* print all the maps */\r
276         logln("logical maps:");\r
277         for (i = 0; i < length; ++i) {\r
278             log(logicalMap1[i] + " ");\r
279         }\r
280         log("\n");\r
281         for (i = 0; i < length; ++i) {\r
282             log(logicalMap2[i] + " ");\r
283         }\r
284         log("\n");\r
285         for (i = 0; i < length; ++i) {\r
286             log(logicalMap3[i] + " ");\r
287         }\r
288 \r
289         log("\nvisual maps:\n");\r
290         for (i = 0; i < destLength; ++i) {\r
291             log(visualMap1[i] + " ");\r
292         }\r
293         log("\n");\r
294         for (i = 0; i < destLength; ++i) {\r
295             log(visualMap2[i] + " ");\r
296         }\r
297         log("\n");\r
298         for (i = 0; i < length; ++i) {\r
299             log(visualMap3[i] + " ");\r
300         }\r
301         log("\n");\r
302         for (i = 0; i < length; ++i) {\r
303             log(visualMap4[i] + " ");\r
304         }\r
305         log("\n");\r
306 \r
307         /* check that the indexes are the same between these and Bidi.getLogical/VisualIndex() */\r
308         for (i = 0; i < length; ++i) {\r
309             if (logicalMap1[i] != logicalMap2[i]) {\r
310                 errln("Error in tests[" + testNumber + "]: (logicalMap1[" + i +\r
311                       "] == " + logicalMap1[i] + ") != (logicalMap2[" + i +\r
312                       "] == " + logicalMap2[i] + ")");\r
313             }\r
314             if (logicalMap1[i] != logicalMap3[i]) {\r
315                 errln("Error in tests[" + testNumber + "]: (logicalMap1[" + i +\r
316                       "] == " + logicalMap1[i] + ") != (logicalMap3[" + i +\r
317                       "] == " + logicalMap3[i] + ")");\r
318             }\r
319             if (visualMap1[i] != visualMap2[i]) {\r
320                 errln("Error in tests[" + testNumber + "]: (visualMap1[" + i +\r
321                       "] == " + visualMap1[i] + ") != (visualMap2[" + i +\r
322                       "] == " + visualMap2[i] + ")");\r
323             }\r
324             if (visualMap1[i] != visualMap3[i]) {\r
325                 errln("Error in tests[" + testNumber + "]: (visualMap1[" + i +\r
326                       "] == " + visualMap1[i] + ") != (visualMap3[" + i +\r
327                       "] == " + visualMap3[i] + ")");\r
328             }\r
329             if (visualMap1[i] != visualMap4[i]) {\r
330                 errln("Error in tests[" + testNumber + "]: (visualMap1[" + i +\r
331                       "] == " + visualMap1[i] + ") != (visualMap4[" + i +\r
332                       "] == " + visualMap4[i] + ")");\r
333             }\r
334             try {\r
335                 visualIndex = bidi.getVisualIndex(i);\r
336             } catch (Exception e) {\r
337                 errln("Bidi.getVisualIndex(" + i + ") failed in tests[" +\r
338                       testNumber + "]");\r
339             }\r
340             if (logicalMap1[i] != visualIndex) {\r
341                 errln("Error in tests[" + testNumber + "]: (logicalMap1[" + i +\r
342                       "] == " + logicalMap1[i] + ") != (Bidi.getVisualIndex(" + i +\r
343                       ") == " + visualIndex + ")");\r
344             }\r
345             try {\r
346                 logicalIndex = bidi.getLogicalIndex(i);\r
347             } catch (Exception e) {\r
348                 errln("Bidi.getLogicalIndex(" + i + ") failed in tests[" +\r
349                       testNumber + "]");\r
350             }\r
351             if (visualMap1[i] != logicalIndex) {\r
352                 errln("Error in tests[" + testNumber + "]: (visualMap1[" + i +\r
353                       "] == " + visualMap1[i] + ") != (Bidi.getLogicalIndex(" + i +\r
354                       ") == " + logicalIndex + ")");\r
355             }\r
356         }\r
357     }\r
358 \r
359     private String getStringFromDirProps(short[] dirProps) {\r
360         int i;\r
361 \r
362         if (dirProps == null) {\r
363             return null;\r
364         }\r
365         int length = dirProps.length;\r
366         char[] buffer = new char[length];\r
367 \r
368         /* this part would have to be modified for UTF-x */\r
369         for (i = 0; i < length; ++i) {\r
370             buffer[i] = charFromDirProp[dirProps[i]];\r
371         }\r
372         return new String(buffer);\r
373     }\r
374 \r
375     private void doMisc() {\r
376     /* Miscellaneous tests to exercize less popular code paths */\r
377         Bidi bidi = new Bidi(120, 66), bidiLine;\r
378 \r
379         assertEquals("\nwriteReverse should return an empty string",\r
380                      "", Bidi.writeReverse("", 0));\r
381 \r
382         bidi.setPara("", Bidi.LTR, null);\r
383         assertEquals("\nwriteReordered should return an empty string",\r
384                      "", bidi.writeReordered(0));\r
385 \r
386         bidi.setPara("abc", Bidi.LTR, null);\r
387         assertEquals("\ngetRunStart should return 0",\r
388                      0, bidi.getRunStart(0));\r
389         assertEquals("\ngetRunLimit should return 3",\r
390                      3, bidi.getRunLimit(0));\r
391 \r
392         bidi.setPara("abc          ", Bidi.RTL, null);\r
393         bidiLine = bidi.setLine(0, 6);\r
394         for (int i = 3; i < 6; i++) {\r
395             assertEquals("\nTrailing space at " + i + " should get paragraph level",\r
396                          Bidi.RTL, bidiLine.getLevelAt(i));\r
397         }\r
398 \r
399         bidi.setPara("abc       def", Bidi.RTL, null);\r
400         bidiLine = bidi.setLine(0, 6);\r
401         for (int i = 3; i < 6; i++) {\r
402             assertEquals("\nTrailing space at " + i + " should get paragraph level",\r
403                          Bidi.RTL, bidiLine.getLevelAt(i));\r
404         }\r
405 \r
406         bidi.setPara("abcdefghi    ", Bidi.RTL, null);\r
407         bidiLine = bidi.setLine(0, 6);\r
408         for (int i = 3; i < 6; i++) {\r
409             assertEquals("\nTrailing char at " + i + " should get level 2",\r
410                          2, bidiLine.getLevelAt(i));\r
411         }\r
412 \r
413         bidi.setReorderingOptions(Bidi.OPTION_REMOVE_CONTROLS);\r
414         bidi.setPara("\u200eabc       def", Bidi.RTL, null);\r
415         bidiLine = bidi.setLine(0, 6);\r
416         assertEquals("\nWrong result length", 5, bidiLine.getResultLength());\r
417 \r
418         bidi.setPara("abcdefghi", Bidi.LTR, null);\r
419         bidiLine = bidi.setLine(0, 6);\r
420         assertEquals("\nWrong direction #1", Bidi.LTR, bidiLine.getDirection());\r
421 \r
422         bidi.setPara("", Bidi.LTR, null);\r
423         byte[] levels = bidi.getLevels();\r
424         assertEquals("\nWrong number of level elements", 0, levels.length);\r
425         assertEquals("\nWrong number of runs #1", 0, bidi.countRuns());\r
426 \r
427         bidi.setPara("          ", Bidi.RTL, null);\r
428         bidiLine = bidi.setLine(0, 6);\r
429         assertEquals("\nWrong number of runs #2", 1, bidiLine.countRuns());\r
430 \r
431         bidi.setPara("a\u05d0        bc", Bidi.RTL, null);\r
432         bidiLine = bidi.setLine(0, 6);\r
433         assertEquals("\nWrong direction #2", Bidi.MIXED, bidi.getDirection());\r
434         assertEquals("\nWrong direction #3", Bidi.MIXED, bidiLine.getDirection());\r
435         assertEquals("\nWrong number of runs #3", 2, bidiLine.countRuns());\r
436 \r
437         int[] map = Bidi.reorderLogical(null);\r
438         assertTrue("\nWe should have got a null map #1", map == null);\r
439         map = Bidi.reorderLogical(new byte[] {0,99,99});\r
440         assertTrue("\nWe should have got a null map #2", map == null);\r
441         map = Bidi.reorderVisual(null);\r
442         assertTrue("\nWe should have got a null map #3", map == null);\r
443 \r
444         map = Bidi.invertMap(null);\r
445         assertTrue("\nWe should have got a null map #4", map == null);\r
446         map = Bidi.invertMap(new int[] {0,1,-1,5,4});\r
447         assertTrue("\nUnexpected inverted Map",\r
448                    Arrays.equals(map, new int[] {0,1,-1,-1,4,3}));\r
449 \r
450         bidi.setPara("", Bidi.LTR, null);\r
451         map = bidi.getLogicalMap();\r
452         assertTrue("\nMap should have length==0 #1", map.length == 0);\r
453         map = bidi.getVisualMap();\r
454         assertTrue("\nMap should have length==0 #2", map.length == 0);\r
455 \r
456         /* test BidiRun.toString and allocation of run memory > 1 */\r
457         bidi.setPara("abc", Bidi.LTR, null);\r
458         assertEquals("\nWrong run display", "BidiRun 0 - 3 @ 0",\r
459                      bidi.getLogicalRun(0).toString());\r
460 \r
461         /* test REMOVE_BIDI_CONTROLS together with DO_MIRRORING */\r
462         bidi.setPara("abc\u200e", Bidi.LTR, null);\r
463         String out = bidi.writeReordered(Bidi.REMOVE_BIDI_CONTROLS | Bidi.DO_MIRRORING);\r
464         assertEquals("\nWrong result #1", "abc", out);\r
465 \r
466         /* test inverse Bidi with marks and contextual orientation */\r
467         bidi.setReorderingMode(Bidi.REORDER_INVERSE_LIKE_DIRECT);\r
468         bidi.setReorderingOptions(Bidi.OPTION_INSERT_MARKS);\r
469         bidi.setPara("", Bidi.LEVEL_DEFAULT_RTL, null);\r
470         out = bidi.writeReordered(0);\r
471         assertEquals("\nWrong result #2", "", out);\r
472         bidi.setPara("   ", Bidi.LEVEL_DEFAULT_RTL, null);\r
473         out = bidi.writeReordered(0);\r
474         assertEquals("\nWrong result #3", "   ", out);\r
475         bidi.setPara("abc", Bidi.LEVEL_DEFAULT_RTL, null);\r
476         out = bidi.writeReordered(0);\r
477         assertEquals("\nWrong result #4", "abc", out);\r
478         bidi.setPara("\u05d0\u05d1", Bidi.LEVEL_DEFAULT_RTL, null);\r
479         out = bidi.writeReordered(0);\r
480         assertEquals("\nWrong result #5", "\u05d1\u05d0", out);\r
481         bidi.setPara("abc \u05d0\u05d1", Bidi.LEVEL_DEFAULT_RTL, null);\r
482         out = bidi.writeReordered(0);\r
483         assertEquals("\nWrong result #6", "\u05d1\u05d0 abc", out);\r
484         bidi.setPara("\u05d0\u05d1 abc", Bidi.LEVEL_DEFAULT_RTL, null);\r
485         out = bidi.writeReordered(0);\r
486         assertEquals("\nWrong result #7", "\u200fabc \u05d1\u05d0", out);\r
487         bidi.setPara("\u05d0\u05d1 abc .-=", Bidi.LEVEL_DEFAULT_RTL, null);\r
488         out = bidi.writeReordered(0);\r
489         assertEquals("\nWrong result #8", "\u200f=-. abc \u05d1\u05d0", out);\r
490         bidi.orderParagraphsLTR(true);\r
491         bidi.setPara("\n\r   \n\rabc\n\u05d0\u05d1\rabc \u05d2\u05d3\n\r" +\r
492                      "\u05d4\u05d5 abc\n\u05d6\u05d7 abc .-=\r\n" +\r
493                      "-* \u05d8\u05d9 abc .-=", Bidi.LEVEL_DEFAULT_RTL, null);\r
494         out = bidi.writeReordered(0);\r
495         assertEquals("\nWrong result #9",\r
496                      "\n\r   \n\rabc\n\u05d1\u05d0\r\u05d3\u05d2 abc\n\r" +\r
497                      "\u200fabc \u05d5\u05d4\n\u200f=-. abc \u05d7\u05d6\r\n" +\r
498                      "\u200f=-. abc \u05d9\u05d8 *-", out);\r
499 \r
500         bidi.setPara("\u05d0 \t", Bidi.LTR, null);\r
501         out = bidi.writeReordered(0);\r
502         assertEquals("\nWrong result #10", "\u05D0\u200e \t", out);\r
503         bidi.setPara("\u05d0 123 \t\u05d1 123 \u05d2", Bidi.LTR, null);\r
504         out = bidi.writeReordered(0);\r
505         assertEquals("\nWrong result #11", "\u05d0 \u200e123\u200e \t\u05d2 123 \u05d1", out);\r
506         bidi.setPara("\u05d0 123 \u0660\u0661 ab", Bidi.LTR, null);\r
507         out = bidi.writeReordered(0);\r
508         assertEquals("\nWrong result #12", "\u05d0 \u200e123 \u200e\u0660\u0661 ab", out);\r
509         bidi.setPara("ab \t", Bidi.RTL, null);\r
510         out = bidi.writeReordered(0);\r
511         assertEquals("\nWrong result #13", "\u200f\t ab", out);\r
512 \r
513         /* check exceeding para level */\r
514         bidi = new Bidi();\r
515         bidi.setPara("A\u202a\u05d0\u202aC\u202c\u05d1\u202cE", (byte)(Bidi.MAX_EXPLICIT_LEVEL - 1), null);\r
516         assertEquals("\nWrong level at index 2", 61, bidi.getLevelAt(2));\r
517 \r
518         /* check 1-char runs with RUNS_ONLY */\r
519         bidi.setReorderingMode(Bidi.REORDER_RUNS_ONLY);\r
520         bidi.setPara("a \u05d0 b \u05d1 c \u05d2 d ", Bidi.LTR, null);\r
521         assertEquals("\nWrong number of runs #4", 14, bidi.countRuns());\r
522     }\r
523 \r
524 \r
525     public static void main(String[] args) {\r
526         try {\r
527             new TestBidi().run(args);\r
528         }\r
529         catch (Exception e) {\r
530             System.out.println(e);\r
531         }\r
532     }\r
533 }\r