1 /********************************************************************
2  * COPYRIGHT:
3  * Copyright (c) 1997-2013, International Business Machines Corporation and
4  * others. All Rights Reserved.
5  ********************************************************************/
6 /*   file name:  cbididat.c
7 *   encoding:   US-ASCII
8 *   tab size:   8 (not used)
9 *   indentation:4
10 *
11 *   created on: 1999sep22
12 *   created by: Markus W. Scherer
13 */
14 
15 #include "unicode/utypes.h"
16 #include "unicode/uchar.h"
17 #include "unicode/ubidi.h"
18 #include "cbiditst.h"
19 
20 const char * const
21 dirPropNames[U_CHAR_DIRECTION_COUNT]={
22     "L", "R", "EN", "ES", "ET", "AN", "CS", "B", "S", "WS", "ON",
23     "LRE", "LRO", "AL", "RLE", "RLO", "PDF", "NSM", "BN",
24     "FSI", "LRI", "RLI", "PDI"  /* new in Unicode 6.3/ICU 52 */
25 };
26 
27 UChar
28 charFromDirProp[U_CHAR_DIRECTION_COUNT]={
29  /* L     R      EN    ES    ET    AN     CS    B    S    WS    ON */
30     0x61, 0x5d0, 0x30, 0x2f, 0x25, 0x660, 0x2c, 0xa, 0x9, 0x20, 0x26,
31  /* LRE     LRO     AL     RLE     RLO     PDF     NSM    BN */
32     0x202a, 0x202d, 0x627, 0x202b, 0x202e, 0x202c, 0x308, 0x200c,
33  /* FSI     LRI     RLI     PDI */
34     0x2068, 0x2066, 0x2067, 0x2069  /* new in Unicode 6.3/ICU 52 */
35 };
36 
37 static const uint8_t
38 testText1[]={
39     L, L, WS, L, WS, EN, L, B
40 };
41 
42 static const UBiDiLevel
43 testLevels1[]={
44     0, 0, 0, 0, 0, 0, 0, 0
45 };
46 
47 static const uint8_t
48 testVisualMap1[]={
49     0, 1, 2, 3, 4, 5, 6, 7
50 };
51 
52 static const uint8_t
53 testText2[]={
54     R, AL, WS, R, AL, WS, R
55 };
56 
57 static const UBiDiLevel
58 testLevels2[]={
59     1, 1, 1, 1, 1, 1, 1
60 };
61 
62 static const uint8_t
63 testVisualMap2[]={
64     6, 5, 4, 3, 2, 1, 0
65 };
66 
67 static const uint8_t
68 testText3[]={
69     L, L, WS, EN, CS, WS, EN, CS, EN, WS, L, L
70 };
71 
72 static const UBiDiLevel
73 testLevels3[]={
74     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
75 };
76 
77 static const uint8_t
78 testVisualMap3[]={
79     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
80 };
81 
82 static const uint8_t
83 testText4[]={
84     L, AL, AL, AL, L, AL, AL, L, WS, EN, CS, WS, EN, CS, EN, WS, L, L
85 };
86 
87 static const UBiDiLevel
88 testLevels4[]={
89     0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
90 };
91 
92 static const uint8_t
93 testVisualMap4[]={
94     0, 3, 2, 1, 4, 6, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17
95 };
96 
97 static const uint8_t
98 testText5[]={
99     AL, R, AL, WS, EN, CS, WS, EN, CS, EN, WS, R, R, WS, L, L
100 };
101 
102 static const UBiDiLevel
103 testLevels5[]={
104     1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 1, 1, 1, 1, 2, 2
105 };
106 
107 static const uint8_t
108 testVisualMap5[]={
109     15, 14, 13, 12, 11, 10, 9, 6, 7, 8, 5, 4, 3, 2, 0, 1
110 };
111 
112 static const uint8_t
113 testText6[]={
114     R, EN, NSM, ET
115 };
116 
117 static const UBiDiLevel
118 testLevels6[]={
119     1, 2, 2, 2
120 };
121 
122 static const uint8_t
123 testVisualMap6[]={
124     3, 0, 1, 2
125 };
126 
127 #if 0
128 static const uint8_t
129 testText7[]={
130     /* empty */
131 };
132 
133 static const UBiDiLevel
134 testLevels7[]={
135 };
136 
137 static const uint8_t
138 testVisualMap7[]={
139 };
140 
141 #endif
142 
143 static const uint8_t
144 testText8[]={
145     RLE, WS, R, R, R, WS, PDF, WS, B
146 };
147 
148 static const UBiDiLevel
149 testLevels8[]={
150     1, 1, 1, 1, 1, 1, 1, 1, 1
151 };
152 
153 static const uint8_t
154 testVisualMap8[]={
155     8, 7, 6, 5, 4, 3, 2, 1, 0
156 };
157 
158 static const uint8_t
159 testText9[]={
160     LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE,      /* 15 entries */
161     LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE,      /* 15 entries */
162     AN, RLO, NSM, LRE, PDF, RLE, ES, EN, ON                                         /*  9 entries */
163 };
164 
165 static const UBiDiLevel
166 testLevels9[]={
167     126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,      /* 15 entries */
168     126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,      /* 15 entries */
169     126, 125, 125, 125, 125, 125, 125, 125, 125                                     /*  9 entries */
170 };
171 
172 static const uint8_t
173 testVisualMap9[]={
174     8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,                       /* 15 entries */
175     23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,                     /* 15 entries */
176     38, 7, 6, 5, 4, 3, 2, 1, 0                                                      /*  9 entries */
177 };
178 
179 static const uint8_t
180 testText10[]={
181     LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE,      /* 15 entries */
182     LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE, LRE,      /* 15 entries */
183     LRE, BN, CS, RLO, S, PDF, EN, LRO, AN, ES                                       /* 10 entries */
184 };
185 
186 static const UBiDiLevel
187 testLevels10[]={
188     124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,      /* 15 entries */
189     124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,      /* 15 entries */
190     124, 124, 124, 64, 64, 124, 124, 126, 126, 124                                  /* 10 entries */
191 };
192 
193 static const uint8_t
194 testVisualMap10[]={
195     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,                               /* 15 entries */
196     15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,                     /* 15 entries */
197     30, 31, 32, 33, 34, 35, 36, 37, 38, 39                                          /* 10 entries */
198 };
199 
200 static const uint8_t
201 testText11[]={
202     S, WS, NSM, RLE, WS, L, L, L, WS, LRO, WS, R, R, R, WS, RLO, WS, L, L, L,       /* 20 entries */
203     WS, LRE, WS, R, R, R, WS, PDF, WS, L, L, L, WS, PDF, WS, AL, AL, AL, WS, PDF,   /* 20 entries */
204     WS, L, L, L, WS, PDF, WS, L, L, L, WS, PDF, ON, PDF, BN, BN, ON, PDF            /* 18 entries */
205 };
206 
207 static const UBiDiLevel
208 testLevels11[]={
209     0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,                     /* 20 entries */
210     3, 4, 4, 5, 5, 5, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2,                     /* 20 entries */
211     2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0                            /* 18 entries */
212 };
213 
214 static const uint8_t
215 testVisualMap11[]={
216     0, 1, 2, 44, 43, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 31, 30, 29, 28, 27,          /* 20 entries */
217     26, 20, 21, 24, 23, 22, 25, 19, 18, 17, 16, 15, 14, 32, 33, 34, 35, 36, 37, 38, /* 20 entries */
218     39, 40, 41, 42, 3, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57           /* 18 entries */
219 };
220 
221 static const uint8_t
222 testText12[]={
223     NSM, WS, L, L, L, L, L, L, L, WS, L, L, L, L, WS,
224     R, R, R, R, R, WS, L, L, L, L, L, L, L, WS, WS, AL,
225     AL, AL, AL, WS, EN, EN, ES, EN, EN, CS, S, EN, EN, CS, WS,
226     EN, EN, WS, AL, AL, AL, AL, AL, B, L, L, L, L, L, L,
227     L, L, WS, AN, AN, CS, AN, AN, WS
228 };
229 
230 static const UBiDiLevel
231 testLevels12[]={
232     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 0, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0
233 };
234 
235 static const uint8_t
236 testVisualMap12[]={
237     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 19, 18, 17, 16, 15, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 40, 39, 38, 37, 36, 34, 35, 33, 31, 32, 30, 41, 52, 53, 51, 50, 48, 49, 47, 46, 45, 44, 43, 42, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69
238 };
239 
240 static const UBiDiLevel
241 testLevels13[]={
242     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 0, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0
243 };
244 
245 static const uint8_t
246 testVisualMap13[]={
247     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 19, 18, 17, 16, 15, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 40, 39, 38, 37, 36, 34, 35, 33, 31, 32, 30, 41, 52, 53, 51, 50, 48, 49, 47, 46, 45, 44, 43, 42, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69
248 };
249 
250 static const UBiDiLevel
251 testLevels14[]={
252     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 3, 4, 4, 3, 2, 4, 4, 3, 3, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 2
253 };
254 
255 static const uint8_t
256 testVisualMap14[]={
257     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 19, 18, 17, 16, 15, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 40, 39, 38, 37, 36, 34, 35, 33, 31, 32, 30, 41, 52, 53, 51, 50, 48, 49, 47, 46, 45, 44, 43, 42, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69
258 };
259 
260 static const UBiDiLevel
261 testLevels15[]={
262     5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 6, 6, 5, 5, 6, 6, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 5
263 };
264 
265 static const uint8_t
266 testVisualMap15[]={
267     69, 68, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 55, 54, 53, 52, 51, 50, 49, 42, 43, 44, 45, 46, 47, 48, 41, 40, 39, 38, 37, 36, 35, 33, 34, 32, 30, 31, 29, 28, 26, 27, 25, 24, 22, 23, 21, 20, 19, 18, 17, 16, 15, 7, 8, 9, 10, 11, 12, 13, 14, 6, 1, 2, 3, 4, 5, 0
268 };
269 
270 static const UBiDiLevel
271 testLevels16[]={
272     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 0, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0
273 };
274 
275 static const uint8_t
276 testVisualMap16[]={
277     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 19, 18, 17, 16, 15, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 40, 39, 38, 37, 36, 34, 35, 33, 31, 32, 30, 41, 52, 53, 51, 50, 48, 49, 47, 46, 45, 44, 43, 42, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69
278 };
279 
280 static const uint8_t
281 testText13[]={
282     ON, L, RLO, CS, R, WS, AN, AN, PDF, LRE, R, L, LRO, WS, BN, ON, S, LRE, LRO, B
283 };
284 
285 static const UBiDiLevel
286 testLevels17[]={
287     0, 0, 1, 1, 1, 1, 1, 1, 3, 3, 3, 2, 4, 4, 4, 4, 0, 0, 0, 0
288 };
289 
290 static const uint8_t
291 testVisualMap17[]={
292     0, 1, 15, 14, 13, 12, 11, 10, 4, 3, 2, 5, 6, 7, 8, 9, 16, 17, 18, 19
293 };
294 
295 static const UBiDiLevel
296 testLevels18[]={
297     0, 0, 1, 1, 1, 0
298 };
299 
300 static const uint8_t
301 testVisualMap18[]={
302     0, 1, 4, 3, 2, 5
303 };
304 
305 static const uint8_t
306 testText14[]={
307     RLO, RLO, AL, AL, WS, EN, ES, ON, WS, S, S, PDF, LRO, WS, AL, ET, RLE, ON, EN, B
308 };
309 
310 static const UBiDiLevel
311 testLevels19[]={
312     1
313 };
314 
315 static const uint8_t
316 testVisualMap19[]={
317     0
318 };
319 
320 static const uint8_t
321 testText15[]={
322     R, L, CS, L
323 };
324 
325 static const UBiDiLevel
326 testLevels20[]={
327     2
328 };
329 
330 static const uint8_t
331 testText16[]={
332     L, L, L, WS, L, L, L, WS, L, L, L
333 };
334 
335 static const UBiDiLevel
336 testLevels21[]={
337     2, 2, 2, 2, 2, 2, 2, 1
338 };
339 
340 static const uint8_t
341 testVisualMap20[]={
342     1, 2, 3, 4, 5, 6, 7, 0
343 };
344 
345 static const uint8_t
346 testText17[]={
347     R, R, R, WS, R, R, R, WS, R, R, R
348 };
349 
350 static const UBiDiLevel
351 testLevels22[]={
352     1, 1, 1, 1, 1, 1, 1, 0
353 };
354 
355 static const uint8_t
356 testVisualMap21[]={
357     6, 5, 4, 3, 2, 1, 0, 7
358 };
359 
360 static const uint8_t
361 testTextXX[]={
362     L
363 };
364 
365 static const UBiDiLevel
366 testLevelsXX[]={
367     2
368 };
369 
370 static const uint8_t
371 testVisualMapXX[]={
372     0
373 };
374 
375 const BiDiTestData
376 tests[]={
377     {testText1,  ARRAY_LENGTH(testText1),  UBIDI_DEFAULT_LTR, -1, -1,
378         UBIDI_LTR, 0,
379         testLevels1, testVisualMap1},
380     {testText2,  ARRAY_LENGTH(testText2),  UBIDI_DEFAULT_LTR, -1, -1,
381         UBIDI_RTL, 1,
382         testLevels2, testVisualMap2},
383     {testText3,  ARRAY_LENGTH(testText3),  UBIDI_DEFAULT_LTR, -1, -1,
384         UBIDI_LTR, 0,
385         testLevels3, testVisualMap3},
386     {testText4,  ARRAY_LENGTH(testText4),  UBIDI_DEFAULT_LTR, -1, -1,
387         UBIDI_MIXED, 0,
388         testLevels4, testVisualMap4},
389     {testText5,  ARRAY_LENGTH(testText5),  UBIDI_DEFAULT_LTR, -1, -1,
390         UBIDI_MIXED, 1,
391         testLevels5, testVisualMap5},
392     {testText6,  ARRAY_LENGTH(testText6),  UBIDI_DEFAULT_LTR, -1, -1,
393         UBIDI_MIXED, 1,
394         testLevels6, testVisualMap6},
395     {NULL,       0,                        UBIDI_DEFAULT_LTR, -1, -1,
396         UBIDI_LTR, 0,
397         NULL, NULL},
398     {testText8,  ARRAY_LENGTH(testText8),  UBIDI_DEFAULT_LTR, -1, -1,
399         UBIDI_RTL, 1,
400         testLevels8, testVisualMap8},
401     {testText9,  ARRAY_LENGTH(testText9),  64, -1, -1,
402         UBIDI_MIXED, 64,
403         testLevels9, testVisualMap9},
404     {testText10, ARRAY_LENGTH(testText10), 64, -1, -1,
405         UBIDI_MIXED, 64,
406         testLevels10, testVisualMap10},
407     {testText11, ARRAY_LENGTH(testText11), UBIDI_DEFAULT_LTR, -1, -1,
408         UBIDI_MIXED, 0,
409         testLevels11, testVisualMap11},
410     {testText12, ARRAY_LENGTH(testText12), UBIDI_DEFAULT_LTR, -1, -1,
411         UBIDI_MIXED, 0,
412         testLevels12, testVisualMap12},
413     {testText12, ARRAY_LENGTH(testText12), UBIDI_DEFAULT_RTL, -1, -1,
414         UBIDI_MIXED, 0,
415         testLevels13, testVisualMap13},
416     {testText12, ARRAY_LENGTH(testText12), 2, -1, -1,
417         UBIDI_MIXED, 2,
418         testLevels14, testVisualMap14},
419     {testText12, ARRAY_LENGTH(testText12), 5, -1, -1,
420         UBIDI_MIXED, 5,
421         testLevels15, testVisualMap15},
422     {testText12, ARRAY_LENGTH(testText12), UBIDI_DEFAULT_LTR, -1, -1,
423         UBIDI_MIXED, 0,
424         testLevels16, testVisualMap16},
425     {testText13, ARRAY_LENGTH(testText13), UBIDI_DEFAULT_LTR, -1, -1,
426         UBIDI_MIXED, 0,
427         testLevels17, testVisualMap17},
428     {testText13, ARRAY_LENGTH(testText13), UBIDI_DEFAULT_LTR, 0, 6,
429         UBIDI_MIXED, 0,
430         testLevels18, testVisualMap18},
431     {testText14, ARRAY_LENGTH(testText14), UBIDI_DEFAULT_LTR, 13, 14,
432         UBIDI_RTL, 1,
433         testLevels19, testVisualMap19},
434     {testText15, ARRAY_LENGTH(testText15), UBIDI_DEFAULT_LTR, 2, 3,
435         UBIDI_LTR, 2,
436         testLevels20, testVisualMap19},
437     {testText16, ARRAY_LENGTH(testText16), UBIDI_RTL, 0, 8,
438         UBIDI_MIXED, 1,
439         testLevels21, testVisualMap20},
440     {testText17, ARRAY_LENGTH(testText17), UBIDI_LTR, 0, 8,
441         UBIDI_MIXED, 0,
442         testLevels22, testVisualMap21},
443     {testTextXX, ARRAY_LENGTH(testTextXX), UBIDI_RTL, -1, -1,
444         UBIDI_MIXED, 1, testLevelsXX, testVisualMapXX}
445 };
446 
447 const int
448 bidiTestCount=ARRAY_LENGTH(tests);
449