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