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