1 // 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: UTF-8 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 23 const char * const 24 dirPropNames[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 30 UChar 31 charFromDirProp[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 40 static const uint8_t 41 testText1[]={ 42 L, L, WS, L, WS, EN, L, B 43 }; 44 45 static const UBiDiLevel 46 testLevels1[]={ 47 0, 0, 0, 0, 0, 0, 0, 0 48 }; 49 50 static const uint8_t 51 testVisualMap1[]={ 52 0, 1, 2, 3, 4, 5, 6, 7 53 }; 54 55 static const uint8_t 56 testText2[]={ 57 R, AL, WS, R, AL, WS, R 58 }; 59 60 static const UBiDiLevel 61 testLevels2[]={ 62 1, 1, 1, 1, 1, 1, 1 63 }; 64 65 static const uint8_t 66 testVisualMap2[]={ 67 6, 5, 4, 3, 2, 1, 0 68 }; 69 70 static const uint8_t 71 testText3[]={ 72 L, L, WS, EN, CS, WS, EN, CS, EN, WS, L, L 73 }; 74 75 static const UBiDiLevel 76 testLevels3[]={ 77 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 78 }; 79 80 static const uint8_t 81 testVisualMap3[]={ 82 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 83 }; 84 85 static const uint8_t 86 testText4[]={ 87 L, AL, AL, AL, L, AL, AL, L, WS, EN, CS, WS, EN, CS, EN, WS, L, L 88 }; 89 90 static const UBiDiLevel 91 testLevels4[]={ 92 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 93 }; 94 95 static const uint8_t 96 testVisualMap4[]={ 97 0, 3, 2, 1, 4, 6, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 98 }; 99 100 static const uint8_t 101 testText5[]={ 102 AL, R, AL, WS, EN, CS, WS, EN, CS, EN, WS, R, R, WS, L, L 103 }; 104 105 static const UBiDiLevel 106 testLevels5[]={ 107 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 1, 1, 1, 1, 2, 2 108 }; 109 110 static const uint8_t 111 testVisualMap5[]={ 112 15, 14, 13, 12, 11, 10, 9, 6, 7, 8, 5, 4, 3, 2, 0, 1 113 }; 114 115 static const uint8_t 116 testText6[]={ 117 R, EN, NSM, ET 118 }; 119 120 static const UBiDiLevel 121 testLevels6[]={ 122 1, 2, 2, 2 123 }; 124 125 static const uint8_t 126 testVisualMap6[]={ 127 3, 0, 1, 2 128 }; 129 130 #if 0 131 static const uint8_t 132 testText7[]={ 133 /* empty */ 134 }; 135 136 static const UBiDiLevel 137 testLevels7[]={ 138 }; 139 140 static const uint8_t 141 testVisualMap7[]={ 142 }; 143 144 #endif 145 146 static const uint8_t 147 testText8[]={ 148 RLE, WS, R, R, R, WS, PDF, WS, B 149 }; 150 151 static const UBiDiLevel 152 testLevels8[]={ 153 1, 1, 1, 1, 1, 1, 1, 1, 1 154 }; 155 156 static const uint8_t 157 testVisualMap8[]={ 158 8, 7, 6, 5, 4, 3, 2, 1, 0 159 }; 160 161 static const uint8_t 162 testText9[]={ 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 168 static const UBiDiLevel 169 testLevels9[]={ 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 175 static const uint8_t 176 testVisualMap9[]={ 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 182 static const uint8_t 183 testText10[]={ 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 189 static const UBiDiLevel 190 testLevels10[]={ 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 196 static const uint8_t 197 testVisualMap10[]={ 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 203 static const uint8_t 204 testText11[]={ 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 210 static const UBiDiLevel 211 testLevels11[]={ 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 217 static const uint8_t 218 testVisualMap11[]={ 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 224 static const uint8_t 225 testText12[]={ 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 233 static const UBiDiLevel 234 testLevels12[]={ 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 238 static const uint8_t 239 testVisualMap12[]={ 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 243 static const UBiDiLevel 244 testLevels13[]={ 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 248 static const uint8_t 249 testVisualMap13[]={ 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 253 static const UBiDiLevel 254 testLevels14[]={ 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 258 static const uint8_t 259 testVisualMap14[]={ 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 263 static const UBiDiLevel 264 testLevels15[]={ 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 268 static const uint8_t 269 testVisualMap15[]={ 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 273 static const UBiDiLevel 274 testLevels16[]={ 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 278 static const uint8_t 279 testVisualMap16[]={ 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 283 static const uint8_t 284 testText13[]={ 285 ON, L, RLO, CS, R, WS, AN, AN, PDF, LRE, R, L, LRO, WS, BN, ON, S, LRE, LRO, B 286 }; 287 288 static const UBiDiLevel 289 testLevels17[]={ 290 0, 0, 1, 1, 1, 1, 1, 1, 3, 3, 3, 2, 4, 4, 4, 4, 0, 0, 0, 0 291 }; 292 293 static const uint8_t 294 testVisualMap17[]={ 295 0, 1, 15, 14, 13, 12, 11, 10, 4, 3, 2, 5, 6, 7, 8, 9, 16, 17, 18, 19 296 }; 297 298 static const UBiDiLevel 299 testLevels18[]={ 300 0, 0, 1, 1, 1, 0 301 }; 302 303 static const uint8_t 304 testVisualMap18[]={ 305 0, 1, 4, 3, 2, 5 306 }; 307 308 static const uint8_t 309 testText14[]={ 310 RLO, RLO, AL, AL, WS, EN, ES, ON, WS, S, S, PDF, LRO, WS, AL, ET, RLE, ON, EN, B 311 }; 312 313 static const UBiDiLevel 314 testLevels19[]={ 315 1 316 }; 317 318 static const uint8_t 319 testVisualMap19[]={ 320 0 321 }; 322 323 static const uint8_t 324 testText15[]={ 325 R, L, CS, L 326 }; 327 328 static const UBiDiLevel 329 testLevels20[]={ 330 2 331 }; 332 333 static const uint8_t 334 testText16[]={ 335 L, L, L, WS, L, L, L, WS, L, L, L 336 }; 337 338 static const UBiDiLevel 339 testLevels21[]={ 340 2, 2, 2, 2, 2, 2, 2, 1 341 }; 342 343 static const uint8_t 344 testVisualMap20[]={ 345 1, 2, 3, 4, 5, 6, 7, 0 346 }; 347 348 static const uint8_t 349 testText17[]={ 350 R, R, R, WS, R, R, R, WS, R, R, R 351 }; 352 353 static const UBiDiLevel 354 testLevels22[]={ 355 1, 1, 1, 1, 1, 1, 1, 0 356 }; 357 358 static const uint8_t 359 testVisualMap21[]={ 360 6, 5, 4, 3, 2, 1, 0, 7 361 }; 362 363 static const uint8_t 364 testTextXX[]={ 365 L 366 }; 367 368 static const UBiDiLevel 369 testLevelsXX[]={ 370 2 371 }; 372 373 static const uint8_t 374 testVisualMapXX[]={ 375 0 376 }; 377 378 const BiDiTestData 379 tests[]={ 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 450 const int 451 bidiTestCount=UPRV_LENGTHOF(tests); 452