1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
4 ******************************************************************************
6 * Copyright (C) 2001-2014, International Business Machines
7 * Corporation and others. All Rights Reserved.
9 ******************************************************************************
10 * file name: trietest.c
12 * tab size: 8 (not used)
15 * created on: 2008sep01 (starting from a copy of trietest.c)
16 * created by: Markus W. Scherer
20 #include "unicode/utypes.h"
21 #include "unicode/utf8.h"
29 void addTrie2Test(TestNode
** root
);
31 /* Values for setting possibly overlapping, out-of-order ranges of values */
32 typedef struct SetRange
{
40 * value is set from the previous boundary's limit to before
41 * this boundary's limit
43 * There must be an entry with limit 0 and the intialValue.
44 * It may be preceded by an entry with negative limit and the errorValue.
46 typedef struct CheckRange
{
52 skipSpecialValues(const CheckRange checkRanges
[], int32_t countCheckRanges
) {
54 for(i
=0; i
<countCheckRanges
&& checkRanges
[i
].limit
<=0; ++i
) {}
59 getSpecialValues(const CheckRange checkRanges
[], int32_t countCheckRanges
,
60 uint32_t *pInitialValue
, uint32_t *pErrorValue
) {
62 if(i
<countCheckRanges
&& checkRanges
[i
].limit
<0) {
63 *pErrorValue
=checkRanges
[i
++].value
;
67 if(i
<countCheckRanges
&& checkRanges
[i
].limit
==0) {
68 *pInitialValue
=checkRanges
[i
++].value
;
75 /* utrie2_enum() callback, modifies a value */
76 static uint32_t U_CALLCONV
77 testEnumValue(const void *context
, uint32_t value
) {
81 /* utrie2_enum() callback, verifies a range */
82 static UBool U_CALLCONV
83 testEnumRange(const void *context
, UChar32 start
, UChar32 end
, uint32_t value
) {
84 const CheckRange
**pb
=(const CheckRange
**)context
;
85 const CheckRange
*b
=(*pb
)++;
89 if(start
!=(b
-1)->limit
|| limit
!=b
->limit
|| value
!=b
->value
) {
90 log_err("error: utrie2_enum() delivers wrong range [U+%04lx..U+%04lx].0x%lx instead of [U+%04lx..U+%04lx].0x%lx\n",
91 (long)start
, (long)end
, (long)value
,
92 (long)(b
-1)->limit
, (long)b
->limit
-1, (long)b
->value
);
98 testTrieEnum(const char *testName
,
100 const CheckRange checkRanges
[], int32_t countCheckRanges
) {
101 /* skip over special values */
102 while(countCheckRanges
>0 && checkRanges
[0].limit
<=0) {
106 utrie2_enum(trie
, testEnumValue
, testEnumRange
, &checkRanges
);
109 /* verify all expected values via UTRIE2_GETxx() */
111 testTrieGetters(const char *testName
,
112 const UTrie2
*trie
, UTrie2ValueBits valueBits
,
113 const CheckRange checkRanges
[], int32_t countCheckRanges
) {
114 uint32_t initialValue
, errorValue
;
115 uint32_t value
, value2
;
116 UChar32 start
, limit
;
117 int32_t i
, countSpecials
;
119 UBool isFrozen
=utrie2_isFrozen(trie
);
120 const char *const typeName
= isFrozen
? "frozen trie" : "newTrie";
122 countSpecials
=getSpecialValues(checkRanges
, countCheckRanges
, &initialValue
, &errorValue
);
125 for(i
=countSpecials
; i
<countCheckRanges
; ++i
) {
126 limit
=checkRanges
[i
].limit
;
127 value
=checkRanges
[i
].value
;
132 if(!U_IS_LEAD(start
)) {
133 if(valueBits
==UTRIE2_16_VALUE_BITS
) {
134 value2
=UTRIE2_GET16_FROM_U16_SINGLE_LEAD(trie
, start
);
136 value2
=UTRIE2_GET32_FROM_U16_SINGLE_LEAD(trie
, start
);
139 log_err("error: %s(%s).fromBMP(U+%04lx)==0x%lx instead of 0x%lx\n",
140 typeName
, testName
, (long)start
, (long)value2
, (long)value
);
144 if(valueBits
==UTRIE2_16_VALUE_BITS
) {
145 value2
=UTRIE2_GET16_FROM_SUPP(trie
, start
);
147 value2
=UTRIE2_GET32_FROM_SUPP(trie
, start
);
150 log_err("error: %s(%s).fromSupp(U+%04lx)==0x%lx instead of 0x%lx\n",
151 typeName
, testName
, (long)start
, (long)value2
, (long)value
);
154 if(valueBits
==UTRIE2_16_VALUE_BITS
) {
155 value2
=UTRIE2_GET16(trie
, start
);
157 value2
=UTRIE2_GET32(trie
, start
);
160 log_err("error: %s(%s).get(U+%04lx)==0x%lx instead of 0x%lx\n",
161 typeName
, testName
, (long)start
, (long)value2
, (long)value
);
164 value2
=utrie2_get32(trie
, start
);
166 log_err("error: %s(%s).get32(U+%04lx)==0x%lx instead of 0x%lx\n",
167 typeName
, testName
, (long)start
, (long)value2
, (long)value
);
174 /* test linear ASCII range from the data array pointer (access to "internal" field) */
176 for(i
=countSpecials
; i
<countCheckRanges
&& start
<=0x7f; ++i
) {
177 limit
=checkRanges
[i
].limit
;
178 value
=checkRanges
[i
].value
;
180 while(start
<limit
&& start
<=0x7f) {
181 if(valueBits
==UTRIE2_16_VALUE_BITS
) {
182 value2
=trie
->data16
[start
];
184 value2
=trie
->data32
[start
];
187 log_err("error: %s(%s).asciiData[U+%04lx]==0x%lx instead of 0x%lx\n",
188 typeName
, testName
, (long)start
, (long)value2
, (long)value
);
194 if(valueBits
==UTRIE2_16_VALUE_BITS
) {
195 value2
=trie
->data16
[start
];
197 value2
=trie
->data32
[start
];
199 if(errorValue
!=value2
) {
200 log_err("error: %s(%s).badData[U+%04lx]==0x%lx instead of 0x%lx\n",
201 typeName
, testName
, (long)start
, (long)value2
, (long)errorValue
);
207 if(0!=strncmp(testName
, "dummy", 5) && 0!=strncmp(testName
, "trie1", 5)) {
208 /* test values for lead surrogate code units */
209 for(start
=0xd7ff; start
<0xdc01; ++start
) {
228 if(isFrozen
&& U_IS_LEAD(start
)) {
229 if(valueBits
==UTRIE2_16_VALUE_BITS
) {
230 value2
=UTRIE2_GET16_FROM_U16_SINGLE_LEAD(trie
, start
);
232 value2
=UTRIE2_GET32_FROM_U16_SINGLE_LEAD(trie
, start
);
235 log_err("error: %s(%s).LSCU(U+%04lx)==0x%lx instead of 0x%lx\n",
236 typeName
, testName
, (long)start
, (long)value2
, (long)value
);
239 value2
=utrie2_get32FromLeadSurrogateCodeUnit(trie
, start
);
241 log_err("error: %s(%s).lscu(U+%04lx)==0x%lx instead of 0x%lx\n",
242 typeName
, testName
, (long)start
, (long)value2
, (long)value
);
247 /* test errorValue */
249 if(valueBits
==UTRIE2_16_VALUE_BITS
) {
250 value
=UTRIE2_GET16(trie
, -1);
251 value2
=UTRIE2_GET16(trie
, 0x110000);
253 value
=UTRIE2_GET32(trie
, -1);
254 value2
=UTRIE2_GET32(trie
, 0x110000);
256 if(value
!=errorValue
|| value2
!=errorValue
) {
257 log_err("error: %s(%s).get(out of range) != errorValue\n",
261 value
=utrie2_get32(trie
, -1);
262 value2
=utrie2_get32(trie
, 0x110000);
263 if(value
!=errorValue
|| value2
!=errorValue
) {
264 log_err("error: %s(%s).get32(out of range) != errorValue\n",
270 testTrieUTF16(const char *testName
,
271 const UTrie2
*trie
, UTrie2ValueBits valueBits
,
272 const CheckRange checkRanges
[], int32_t countCheckRanges
) {
274 uint32_t values
[100];
276 const UChar
*p
, *limit
;
279 UChar32 prevCP
, c
, c2
;
280 int32_t i
, length
, sIndex
, countValues
;
284 length
=countValues
=0;
285 for(i
=skipSpecialValues(checkRanges
, countCheckRanges
); i
<countCheckRanges
; ++i
) {
286 value
=checkRanges
[i
].value
;
287 /* write three code points */
288 U16_APPEND_UNSAFE(s
, length
, prevCP
); /* start of the range */
289 values
[countValues
++]=value
;
290 c
=checkRanges
[i
].limit
;
291 prevCP
=(prevCP
+c
)/2; /* middle of the range */
292 U16_APPEND_UNSAFE(s
, length
, prevCP
);
293 values
[countValues
++]=value
;
295 --c
; /* end of the range */
296 U16_APPEND_UNSAFE(s
, length
, c
);
297 values
[countValues
++]=value
;
305 sIndex
=(int32_t)(p
-s
);
306 U16_NEXT(s
, sIndex
, length
, c2
);
308 if(valueBits
==UTRIE2_16_VALUE_BITS
) {
309 UTRIE2_U16_NEXT16(trie
, p
, limit
, c
, value
);
311 UTRIE2_U16_NEXT32(trie
, p
, limit
, c
, value
);
313 if(value
!=values
[i
]) {
314 log_err("error: wrong value from UTRIE2_NEXT(%s)(U+%04lx): 0x%lx instead of 0x%lx\n",
315 testName
, (long)c
, (long)value
, (long)values
[i
]);
318 log_err("error: wrong code point from UTRIE2_NEXT(%s): U+%04lx != U+%04lx\n",
319 testName
, (long)c
, (long)c2
);
330 sIndex
=(int32_t)(p
-s
);
331 U16_PREV(s
, 0, sIndex
, c2
);
333 if(valueBits
==UTRIE2_16_VALUE_BITS
) {
334 UTRIE2_U16_PREV16(trie
, s
, p
, c
, value
);
336 UTRIE2_U16_PREV32(trie
, s
, p
, c
, value
);
338 if(value
!=values
[i
]) {
339 log_err("error: wrong value from UTRIE2_PREV(%s)(U+%04lx): 0x%lx instead of 0x%lx\n",
340 testName
, (long)c
, (long)value
, (long)values
[i
]);
343 log_err("error: wrong code point from UTRIE2_PREV(%s): U+%04lx != U+%04lx\n",
350 testTrieUTF8(const char *testName
,
351 const UTrie2
*trie
, UTrie2ValueBits valueBits
,
352 const CheckRange checkRanges
[], int32_t countCheckRanges
) {
353 // Note: The byte sequence comments refer to the original UTF-8 definition.
354 // Starting with ICU 60, any sequence that is not a prefix of a valid one
355 // is treated as multiple single-byte errors.
356 // For testing, we only rely on U8_... and UTrie2 UTF-8 macros
357 // iterating consistently.
358 static const uint8_t illegal
[]={
359 0xc0, 0x80, /* non-shortest U+0000 */
360 0xc1, 0xbf, /* non-shortest U+007f */
361 0xc2, /* truncated */
362 0xe0, 0x90, 0x80, /* non-shortest U+0400 */
363 0xe0, 0xa0, /* truncated */
364 0xed, 0xa0, 0x80, /* lead surrogate U+d800 */
365 0xed, 0xbf, 0xbf, /* trail surrogate U+dfff */
366 0xf0, 0x8f, 0xbf, 0xbf, /* non-shortest U+ffff */
367 0xf0, 0x90, 0x80, /* truncated */
368 0xf4, 0x90, 0x80, 0x80, /* beyond-Unicode U+110000 */
369 0xf8, 0x80, 0x80, 0x80, /* truncated */
370 0xf8, 0x80, 0x80, 0x80, 0x80, /* 5-byte UTF-8 */
371 0xfd, 0xbf, 0xbf, 0xbf, 0xbf, /* truncated */
372 0xfd, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, /* 6-byte UTF-8 */
377 uint32_t values
[200];
379 const uint8_t *p
, *limit
;
381 uint32_t initialValue
, errorValue
;
382 uint32_t value
, bytes
;
384 int32_t i
, countSpecials
, length
, countValues
;
387 countSpecials
=getSpecialValues(checkRanges
, countCheckRanges
, &initialValue
, &errorValue
);
391 length
=countValues
=0;
392 /* first a couple of trail bytes in lead position */
394 values
[countValues
++]=errorValue
;
396 values
[countValues
++]=errorValue
;
398 for(i
=countSpecials
; i
<countCheckRanges
; ++i
) {
399 value
=checkRanges
[i
].value
;
400 /* write three legal (or surrogate) code points */
401 U8_APPEND_UNSAFE(s
, length
, prevCP
); /* start of the range */
402 if(U_IS_SURROGATE(prevCP
)) {
403 // A surrogate byte sequence counts as 3 single-byte errors.
404 values
[countValues
++]=errorValue
;
405 values
[countValues
++]=errorValue
;
406 values
[countValues
++]=errorValue
;
408 values
[countValues
++]=value
;
410 c
=checkRanges
[i
].limit
;
411 prevCP
=(prevCP
+c
)/2; /* middle of the range */
412 U8_APPEND_UNSAFE(s
, length
, prevCP
);
413 if(U_IS_SURROGATE(prevCP
)) {
414 // A surrogate byte sequence counts as 3 single-byte errors.
415 values
[countValues
++]=errorValue
;
416 values
[countValues
++]=errorValue
;
417 values
[countValues
++]=errorValue
;
419 values
[countValues
++]=value
;
422 --c
; /* end of the range */
423 U8_APPEND_UNSAFE(s
, length
, c
);
424 if(U_IS_SURROGATE(prevCP
)) {
425 // A surrogate byte sequence counts as 3 single-byte errors.
426 values
[countValues
++]=errorValue
;
427 values
[countValues
++]=errorValue
;
428 values
[countValues
++]=errorValue
;
430 values
[countValues
++]=value
;
432 /* write an illegal byte sequence */
433 if(i8
<sizeof(illegal
)) {
434 U8_FWD_1(illegal
, i8
, sizeof(illegal
));
436 s
[length
++]=illegal
[prev8
++];
438 values
[countValues
++]=errorValue
;
441 /* write the remaining illegal byte sequences */
442 while(i8
<sizeof(illegal
)) {
443 U8_FWD_1(illegal
, i8
, sizeof(illegal
));
445 s
[length
++]=illegal
[prev8
++];
447 values
[countValues
++]=errorValue
;
455 prev8
=i8
=(int32_t)(p
-s
);
456 U8_NEXT(s
, i8
, length
, c
);
457 if(valueBits
==UTRIE2_16_VALUE_BITS
) {
458 UTRIE2_U8_NEXT16(trie
, p
, limit
, value
);
460 UTRIE2_U8_NEXT32(trie
, p
, limit
, value
);
463 if(value
!=values
[i
] || i8
!=(p
-s
)) {
466 bytes
=(bytes
<<8)|s
[k
++];
469 if(value
!=values
[i
]) {
470 log_err("error: wrong value from UTRIE2_U8_NEXT(%s)(from %d %lx->U+%04lx) (read %d bytes): "
471 "0x%lx instead of 0x%lx\n",
472 testName
, (int)prev8
, (unsigned long)bytes
, (long)c
, (int)((p
-s
)-prev8
),
473 (long)value
, (long)values
[i
]);
476 log_err("error: wrong end index from UTRIE2_U8_NEXT(%s)(from %d %lx->U+%04lx): %ld != %ld\n",
477 testName
, (int)prev8
, (unsigned long)bytes
, (long)c
, (long)(p
-s
), (long)i8
);
488 prev8
=i8
=(int32_t)(p
-s
);
489 U8_PREV(s
, 0, i8
, c
);
490 if(valueBits
==UTRIE2_16_VALUE_BITS
) {
491 UTRIE2_U8_PREV16(trie
, s
, p
, value
);
493 UTRIE2_U8_PREV32(trie
, s
, p
, value
);
496 if(value
!=values
[i
] || i8
!=(p
-s
)) {
499 bytes
=(bytes
<<8)|s
[k
++];
502 if(value
!=values
[i
]) {
503 log_err("error: wrong value from UTRIE2_U8_PREV(%s)(from %d %lx->U+%04lx) (read %d bytes): "
504 ": 0x%lx instead of 0x%lx\n",
505 testName
, (int)prev8
, (unsigned long)bytes
, (long)c
, (int)(prev8
-(p
-s
)),
506 (long)value
, (long)values
[i
]);
509 log_err("error: wrong end index from UTRIE2_U8_PREV(%s)(from %d %lx->U+%04lx): %ld != %ld\n",
510 testName
, (int)prev8
, (unsigned long)bytes
, (long)c
, (long)(p
-s
), (long)i8
);
517 testFrozenTrie(const char *testName
,
518 UTrie2
*trie
, UTrie2ValueBits valueBits
,
519 const CheckRange checkRanges
[], int32_t countCheckRanges
) {
520 UErrorCode errorCode
;
521 uint32_t value
, value2
;
523 if(!utrie2_isFrozen(trie
)) {
524 log_err("error: utrie2_isFrozen(frozen %s) returned FALSE (not frozen)\n",
529 testTrieGetters(testName
, trie
, valueBits
, checkRanges
, countCheckRanges
);
530 testTrieEnum(testName
, trie
, checkRanges
, countCheckRanges
);
531 testTrieUTF16(testName
, trie
, valueBits
, checkRanges
, countCheckRanges
);
532 testTrieUTF8(testName
, trie
, valueBits
, checkRanges
, countCheckRanges
);
534 errorCode
=U_ZERO_ERROR
;
535 value
=utrie2_get32(trie
, 1);
536 utrie2_set32(trie
, 1, 234, &errorCode
);
537 value2
=utrie2_get32(trie
, 1);
538 if(errorCode
!=U_NO_WRITE_PERMISSION
|| value2
!=value
) {
539 log_err("error: utrie2_set32(frozen %s) failed: it set %s != U_NO_WRITE_PERMISSION\n",
540 testName
, u_errorName(errorCode
));
544 errorCode
=U_ZERO_ERROR
;
545 utrie2_setRange32(trie
, 1, 5, 234, TRUE
, &errorCode
);
546 value2
=utrie2_get32(trie
, 1);
547 if(errorCode
!=U_NO_WRITE_PERMISSION
|| value2
!=value
) {
548 log_err("error: utrie2_setRange32(frozen %s) failed: it set %s != U_NO_WRITE_PERMISSION\n",
549 testName
, u_errorName(errorCode
));
553 errorCode
=U_ZERO_ERROR
;
554 value
=utrie2_get32FromLeadSurrogateCodeUnit(trie
, 0xd801);
555 utrie2_set32ForLeadSurrogateCodeUnit(trie
, 0xd801, 234, &errorCode
);
556 value2
=utrie2_get32FromLeadSurrogateCodeUnit(trie
, 0xd801);
557 if(errorCode
!=U_NO_WRITE_PERMISSION
|| value2
!=value
) {
558 log_err("error: utrie2_set32ForLeadSurrogateCodeUnit(frozen %s) failed: "
559 "it set %s != U_NO_WRITE_PERMISSION\n",
560 testName
, u_errorName(errorCode
));
566 testNewTrie(const char *testName
, const UTrie2
*trie
,
567 const CheckRange checkRanges
[], int32_t countCheckRanges
) {
568 /* The valueBits are ignored for an unfrozen trie. */
569 testTrieGetters(testName
, trie
, UTRIE2_COUNT_VALUE_BITS
, checkRanges
, countCheckRanges
);
570 testTrieEnum(testName
, trie
, checkRanges
, countCheckRanges
);
574 testTrieSerialize(const char *testName
,
575 UTrie2
*trie
, UTrie2ValueBits valueBits
,
577 const CheckRange checkRanges
[], int32_t countCheckRanges
) {
578 uint32_t storage
[10000];
579 int32_t length1
, length2
, length3
;
580 UTrie2ValueBits otherValueBits
;
581 UErrorCode errorCode
;
583 /* clone the trie so that the caller can reuse the original */
584 errorCode
=U_ZERO_ERROR
;
585 trie
=utrie2_clone(trie
, &errorCode
);
586 if(U_FAILURE(errorCode
)) {
587 log_err("error: utrie2_clone(unfrozen %s) failed - %s\n",
588 testName
, u_errorName(errorCode
));
593 * This is not a loop, but simply a block that we can exit with "break"
594 * when something goes wrong.
597 errorCode
=U_ZERO_ERROR
;
598 utrie2_serialize(trie
, storage
, sizeof(storage
), &errorCode
);
599 if(errorCode
!=U_ILLEGAL_ARGUMENT_ERROR
) {
600 log_err("error: utrie2_serialize(unfrozen %s) set %s != U_ILLEGAL_ARGUMENT_ERROR\n",
601 testName
, u_errorName(errorCode
));
604 errorCode
=U_ZERO_ERROR
;
605 utrie2_freeze(trie
, valueBits
, &errorCode
);
606 if(U_FAILURE(errorCode
) || !utrie2_isFrozen(trie
)) {
607 log_err("error: utrie2_freeze(%s) failed: %s isFrozen: %d\n",
608 testName
, u_errorName(errorCode
), utrie2_isFrozen(trie
));
611 otherValueBits
= valueBits
==UTRIE2_16_VALUE_BITS
? UTRIE2_32_VALUE_BITS
: UTRIE2_16_VALUE_BITS
;
612 utrie2_freeze(trie
, otherValueBits
, &errorCode
);
613 if(errorCode
!=U_ILLEGAL_ARGUMENT_ERROR
) {
614 log_err("error: utrie2_freeze(already-frozen with other valueBits %s) "
615 "set %s != U_ILLEGAL_ARGUMENT_ERROR\n",
616 testName
, u_errorName(errorCode
));
619 errorCode
=U_ZERO_ERROR
;
621 /* clone a frozen trie */
622 UTrie2
*clone
=utrie2_clone(trie
, &errorCode
);
623 if(U_FAILURE(errorCode
)) {
624 log_err("error: cloning a frozen UTrie2 failed (%s) - %s\n",
625 testName
, u_errorName(errorCode
));
626 errorCode
=U_ZERO_ERROR
; /* continue with the original */
632 length1
=utrie2_serialize(trie
, NULL
, 0, &errorCode
);
633 if(errorCode
!=U_BUFFER_OVERFLOW_ERROR
) {
634 log_err("error: utrie2_serialize(%s) preflighting set %s != U_BUFFER_OVERFLOW_ERROR\n",
635 testName
, u_errorName(errorCode
));
638 errorCode
=U_ZERO_ERROR
;
639 length2
=utrie2_serialize(trie
, storage
, sizeof(storage
), &errorCode
);
640 if(errorCode
==U_BUFFER_OVERFLOW_ERROR
) {
641 log_err("error: utrie2_serialize(%s) needs more memory\n", testName
);
644 if(U_FAILURE(errorCode
)) {
645 log_err("error: utrie2_serialize(%s) failed: %s\n", testName
, u_errorName(errorCode
));
648 if(length1
!=length2
) {
649 log_err("error: trie serialization (%s) lengths different: "
650 "preflight vs. serialize\n", testName
);
654 testFrozenTrie(testName
, trie
, valueBits
, checkRanges
, countCheckRanges
);
659 uint32_t swapped
[10000];
660 int32_t swappedLength
;
664 /* swap to opposite-endian */
665 uprv_memset(swapped
, 0x55, length2
);
666 ds
=udata_openSwapper(U_IS_BIG_ENDIAN
, U_CHARSET_FAMILY
,
667 !U_IS_BIG_ENDIAN
, U_CHARSET_FAMILY
, &errorCode
);
668 swappedLength
=utrie2_swap(ds
, storage
, -1, NULL
, &errorCode
);
669 if(U_FAILURE(errorCode
) || swappedLength
!=length2
) {
670 log_err("error: utrie2_swap(%s to OE preflighting) failed (%s) "
671 "or before/after lengths different\n",
672 testName
, u_errorName(errorCode
));
673 udata_closeSwapper(ds
);
676 swappedLength
=utrie2_swap(ds
, storage
, length2
, swapped
, &errorCode
);
677 udata_closeSwapper(ds
);
678 if(U_FAILURE(errorCode
) || swappedLength
!=length2
) {
679 log_err("error: utrie2_swap(%s to OE) failed (%s) or before/after lengths different\n",
680 testName
, u_errorName(errorCode
));
684 /* swap back to platform-endian */
685 uprv_memset(storage
, 0xaa, length2
);
686 ds
=udata_openSwapper(!U_IS_BIG_ENDIAN
, U_CHARSET_FAMILY
,
687 U_IS_BIG_ENDIAN
, U_CHARSET_FAMILY
, &errorCode
);
688 swappedLength
=utrie2_swap(ds
, swapped
, -1, NULL
, &errorCode
);
689 if(U_FAILURE(errorCode
) || swappedLength
!=length2
) {
690 log_err("error: utrie2_swap(%s to PE preflighting) failed (%s) "
691 "or before/after lengths different\n",
692 testName
, u_errorName(errorCode
));
693 udata_closeSwapper(ds
);
696 swappedLength
=utrie2_swap(ds
, swapped
, length2
, storage
, &errorCode
);
697 udata_closeSwapper(ds
);
698 if(U_FAILURE(errorCode
) || swappedLength
!=length2
) {
699 log_err("error: utrie2_swap(%s to PE) failed (%s) or before/after lengths different\n",
700 testName
, u_errorName(errorCode
));
705 trie
=utrie2_openFromSerialized(valueBits
, storage
, length2
, &length3
, &errorCode
);
706 if(U_FAILURE(errorCode
)) {
707 log_err("error: utrie2_openFromSerialized(%s) failed, %s\n", testName
, u_errorName(errorCode
));
710 if((valueBits
==UTRIE2_16_VALUE_BITS
)!=(trie
->data32
==NULL
)) {
711 log_err("error: trie serialization (%s) did not preserve 32-bitness\n", testName
);
714 if(length2
!=length3
) {
715 log_err("error: trie serialization (%s) lengths different: "
716 "serialize vs. unserialize\n", testName
);
719 /* overwrite the storage that is not supposed to be needed */
720 uprv_memset((char *)storage
+length3
, 0xfa, (int32_t)(sizeof(storage
)-length3
));
722 utrie2_freeze(trie
, valueBits
, &errorCode
);
723 if(U_FAILURE(errorCode
) || !utrie2_isFrozen(trie
)) {
724 log_err("error: utrie2_freeze(unserialized %s) failed: %s isFrozen: %d\n",
725 testName
, u_errorName(errorCode
), utrie2_isFrozen(trie
));
728 utrie2_freeze(trie
, otherValueBits
, &errorCode
);
729 if(errorCode
!=U_ILLEGAL_ARGUMENT_ERROR
) {
730 log_err("error: utrie2_freeze(unserialized with other valueBits %s) "
731 "set %s != U_ILLEGAL_ARGUMENT_ERROR\n",
732 testName
, u_errorName(errorCode
));
735 errorCode
=U_ZERO_ERROR
;
737 /* clone an unserialized trie */
738 UTrie2
*clone
=utrie2_clone(trie
, &errorCode
);
739 if(U_FAILURE(errorCode
)) {
740 log_err("error: utrie2_clone(unserialized %s) failed - %s\n",
741 testName
, u_errorName(errorCode
));
742 errorCode
=U_ZERO_ERROR
;
743 /* no need to break: just test the original trie */
747 uprv_memset(storage
, 0, sizeof(storage
));
750 testFrozenTrie(testName
, trie
, valueBits
, checkRanges
, countCheckRanges
);
752 /* clone-as-thawed an unserialized trie */
753 UTrie2
*clone
=utrie2_cloneAsThawed(trie
, &errorCode
);
754 if(U_FAILURE(errorCode
) || utrie2_isFrozen(clone
)) {
755 log_err("error: utrie2_cloneAsThawed(unserialized %s) failed - "
756 "%s (isFrozen: %d)\n",
757 testName
, u_errorName(errorCode
), clone
!=NULL
&& utrie2_isFrozen(trie
));
765 uint32_t value
, value2
;
767 value
=utrie2_get32(trie
, 0xa1);
768 utrie2_set32(trie
, 0xa1, 789, &errorCode
);
769 value2
=utrie2_get32(trie
, 0xa1);
770 utrie2_set32(trie
, 0xa1, value
, &errorCode
);
771 if(U_FAILURE(errorCode
) || value2
!=789) {
772 log_err("error: modifying a cloneAsThawed UTrie2 (%s) failed - %s\n",
773 testName
, u_errorName(errorCode
));
776 testNewTrie(testName
, trie
, checkRanges
, countCheckRanges
);
783 testTrieSerializeAllValueBits(const char *testName
,
784 UTrie2
*trie
, UBool withClone
,
785 const CheckRange checkRanges
[], int32_t countCheckRanges
) {
788 /* verify that all the expected values are in the unfrozen trie */
789 testNewTrie(testName
, trie
, checkRanges
, countCheckRanges
);
792 * Test with both valueBits serializations,
793 * and that utrie2_serialize() can be called multiple times.
795 uprv_strcpy(name
, testName
);
796 uprv_strcat(name
, ".16");
797 testTrieSerialize(name
, trie
,
798 UTRIE2_16_VALUE_BITS
, withClone
,
799 checkRanges
, countCheckRanges
);
803 * try cloning after the first serialization;
804 * clone-as-thawed just to sometimes try it on an unfrozen trie
806 UErrorCode errorCode
=U_ZERO_ERROR
;
807 UTrie2
*clone
=utrie2_cloneAsThawed(trie
, &errorCode
);
808 if(U_FAILURE(errorCode
)) {
809 log_err("error: utrie2_cloneAsThawed(%s) after serialization failed - %s\n",
810 testName
, u_errorName(errorCode
));
815 testNewTrie(testName
, trie
, checkRanges
, countCheckRanges
);
819 uprv_strcpy(name
, testName
);
820 uprv_strcat(name
, ".32");
821 testTrieSerialize(name
, trie
,
822 UTRIE2_32_VALUE_BITS
, withClone
,
823 checkRanges
, countCheckRanges
);
825 return trie
; /* could be the clone */
829 makeTrieWithRanges(const char *testName
, UBool withClone
,
830 const SetRange setRanges
[], int32_t countSetRanges
,
831 const CheckRange checkRanges
[], int32_t countCheckRanges
) {
833 uint32_t initialValue
, errorValue
;
835 UChar32 start
, limit
;
837 UErrorCode errorCode
;
840 log_verbose("\ntesting Trie '%s'\n", testName
);
841 errorCode
=U_ZERO_ERROR
;
842 getSpecialValues(checkRanges
, countCheckRanges
, &initialValue
, &errorValue
);
843 trie
=utrie2_open(initialValue
, errorValue
, &errorCode
);
844 if(U_FAILURE(errorCode
)) {
845 log_err("error: utrie2_open(%s) failed: %s\n", testName
, u_errorName(errorCode
));
849 /* set values from setRanges[] */
850 for(i
=0; i
<countSetRanges
; ++i
) {
851 if(withClone
&& i
==countSetRanges
/2) {
852 /* switch to a clone in the middle of setting values */
853 UTrie2
*clone
=utrie2_clone(trie
, &errorCode
);
854 if(U_FAILURE(errorCode
)) {
855 log_err("error: utrie2_clone(%s) failed - %s\n",
856 testName
, u_errorName(errorCode
));
857 errorCode
=U_ZERO_ERROR
; /* continue with the original */
863 start
=setRanges
[i
].start
;
864 limit
=setRanges
[i
].limit
;
865 value
=setRanges
[i
].value
;
866 overwrite
=setRanges
[i
].overwrite
;
867 if((limit
-start
)==1 && overwrite
) {
868 utrie2_set32(trie
, start
, value
, &errorCode
);
870 utrie2_setRange32(trie
, start
, limit
-1, value
, overwrite
, &errorCode
);
874 /* set some values for lead surrogate code units */
875 utrie2_set32ForLeadSurrogateCodeUnit(trie
, 0xd800, 90, &errorCode
);
876 utrie2_set32ForLeadSurrogateCodeUnit(trie
, 0xd999, 94, &errorCode
);
877 utrie2_set32ForLeadSurrogateCodeUnit(trie
, 0xdbff, 99, &errorCode
);
878 if(U_SUCCESS(errorCode
)) {
881 log_err("error: setting values into a trie (%s) failed - %s\n",
882 testName
, u_errorName(errorCode
));
889 testTrieRanges(const char *testName
, UBool withClone
,
890 const SetRange setRanges
[], int32_t countSetRanges
,
891 const CheckRange checkRanges
[], int32_t countCheckRanges
) {
892 UTrie2
*trie
=makeTrieWithRanges(testName
, withClone
,
893 setRanges
, countSetRanges
,
894 checkRanges
, countCheckRanges
);
896 trie
=testTrieSerializeAllValueBits(testName
, trie
, withClone
,
897 checkRanges
, countCheckRanges
);
902 /* test data ----------------------------------------------------------------*/
904 /* set consecutive ranges, even with value 0 */
905 static const SetRange
907 { 0, 0x40, 0, FALSE
},
908 { 0x40, 0xe7, 0x1234, FALSE
},
909 { 0xe7, 0x3400, 0, FALSE
},
910 { 0x3400, 0x9fa6, 0x6162, FALSE
},
911 { 0x9fa6, 0xda9e, 0x3132, FALSE
},
912 { 0xdada, 0xeeee, 0x87ff, FALSE
},
913 { 0xeeee, 0x11111, 1, FALSE
},
914 { 0x11111, 0x44444, 0x6162, FALSE
},
915 { 0x44444, 0x60003, 0, FALSE
},
916 { 0xf0003, 0xf0004, 0xf, FALSE
},
917 { 0xf0004, 0xf0006, 0x10, FALSE
},
918 { 0xf0006, 0xf0007, 0x11, FALSE
},
919 { 0xf0007, 0xf0040, 0x12, FALSE
},
920 { 0xf0040, 0x110000, 0, FALSE
}
923 static const CheckRange
943 /* set some interesting overlapping ranges */
944 static const SetRange
946 { 0x21, 0x7f, 0x5555, TRUE
},
947 { 0x2f800, 0x2fedc, 0x7a, TRUE
},
948 { 0x72, 0xdd, 3, TRUE
},
949 { 0xdd, 0xde, 4, FALSE
},
950 { 0x201, 0x240, 6, TRUE
}, /* 3 consecutive blocks with the same pattern but */
951 { 0x241, 0x280, 6, TRUE
}, /* discontiguous value ranges, testing utrie2_enum() */
952 { 0x281, 0x2c0, 6, TRUE
},
953 { 0x2f987, 0x2fa98, 5, TRUE
},
954 { 0x2f777, 0x2f883, 0, TRUE
},
955 { 0x2f900, 0x2ffaa, 1, FALSE
},
956 { 0x2ffaa, 0x2ffab, 2, TRUE
},
957 { 0x2ffbb, 0x2ffc0, 7, TRUE
}
960 static const CheckRange
984 static const CheckRange
985 checkRanges2_d800
[]={
990 static const CheckRange
991 checkRanges2_d87e
[]={
999 static const CheckRange
1000 checkRanges2_d87f
[]={
1010 static const CheckRange
1011 checkRanges2_dbff
[]={
1016 /* use a non-zero initial value */
1017 static const SetRange
1019 { 0x31, 0xa4, 1, FALSE
},
1020 { 0x3400, 0x6789, 2, FALSE
},
1021 { 0x8000, 0x89ab, 9, TRUE
},
1022 { 0x9000, 0xa000, 4, TRUE
},
1023 { 0xabcd, 0xbcde, 3, TRUE
},
1024 { 0x55555, 0x110000, 6, TRUE
}, /* highStart<U+ffff with non-initialValue */
1025 { 0xcccc, 0x55555, 6, TRUE
}
1028 static const CheckRange
1030 { 0, 9 }, /* non-zero initialValue */
1043 /* empty or single-value tries, testing highStart==0 */
1044 static const SetRange
1046 { 0, 0, 0, FALSE
}, /* need some values for it to compile */
1049 static const CheckRange
1050 checkRangesEmpty
[]={
1055 static const SetRange
1056 setRangesSingleValue
[]={
1057 { 0, 0x110000, 5, TRUE
},
1060 static const CheckRange
1061 checkRangesSingleValue
[]={
1068 testTrieRanges("set1", FALSE
,
1069 setRanges1
, UPRV_LENGTHOF(setRanges1
),
1070 checkRanges1
, UPRV_LENGTHOF(checkRanges1
));
1071 testTrieRanges("set2-overlap", FALSE
,
1072 setRanges2
, UPRV_LENGTHOF(setRanges2
),
1073 checkRanges2
, UPRV_LENGTHOF(checkRanges2
));
1074 testTrieRanges("set3-initial-9", FALSE
,
1075 setRanges3
, UPRV_LENGTHOF(setRanges3
),
1076 checkRanges3
, UPRV_LENGTHOF(checkRanges3
));
1077 testTrieRanges("set-empty", FALSE
,
1079 checkRangesEmpty
, UPRV_LENGTHOF(checkRangesEmpty
));
1080 testTrieRanges("set-single-value", FALSE
,
1081 setRangesSingleValue
, UPRV_LENGTHOF(setRangesSingleValue
),
1082 checkRangesSingleValue
, UPRV_LENGTHOF(checkRangesSingleValue
));
1084 testTrieRanges("set2-overlap.withClone", TRUE
,
1085 setRanges2
, UPRV_LENGTHOF(setRanges2
),
1086 checkRanges2
, UPRV_LENGTHOF(checkRanges2
));
1090 EnumNewTrieForLeadSurrogateTest(void) {
1091 static const char *const testName
="enum-for-lead";
1092 UTrie2
*trie
=makeTrieWithRanges(testName
, FALSE
,
1093 setRanges2
, UPRV_LENGTHOF(setRanges2
),
1094 checkRanges2
, UPRV_LENGTHOF(checkRanges2
));
1096 const CheckRange
*checkRanges
;
1098 checkRanges
=checkRanges2_d800
+1;
1099 utrie2_enumForLeadSurrogate(trie
, 0xd800,
1100 testEnumValue
, testEnumRange
,
1102 checkRanges
=checkRanges2_d87e
+1
;
1103 utrie2_enumForLeadSurrogate(trie
, 0xd87e,
1104 testEnumValue
, testEnumRange
,
1106 checkRanges
=checkRanges2_d87f
+1;
1107 utrie2_enumForLeadSurrogate(trie
, 0xd87f,
1108 testEnumValue
, testEnumRange
,
1110 checkRanges
=checkRanges2_dbff
+1;
1111 utrie2_enumForLeadSurrogate(trie
, 0xdbff,
1112 testEnumValue
, testEnumRange
,
1114 if(!utrie2_isFrozen(trie
)) {
1115 UErrorCode errorCode
=U_ZERO_ERROR
;
1116 utrie2_freeze(trie
, UTRIE2_16_VALUE_BITS
, &errorCode
);
1117 if(U_FAILURE(errorCode
)) {
1118 log_err("error: utrie2_freeze(%s) failed\n", testName
);
1129 /* test utrie2_openDummy() -------------------------------------------------- */
1132 dummyTest(UTrie2ValueBits valueBits
) {
1141 UErrorCode errorCode
;
1143 const char *testName
;
1144 uint32_t initialValue
, errorValue
;
1146 if(valueBits
==UTRIE2_16_VALUE_BITS
) {
1147 testName
="dummy.16";
1151 testName
="dummy.32";
1152 initialValue
=0x01234567;
1153 errorValue
=0x89abcdef;
1155 checkRanges
[0].value
=errorValue
;
1156 checkRanges
[1].value
=checkRanges
[2].value
=initialValue
;
1158 errorCode
=U_ZERO_ERROR
;
1159 trie
=utrie2_openDummy(valueBits
, initialValue
, errorValue
, &errorCode
);
1160 if(U_FAILURE(errorCode
)) {
1161 log_err("utrie2_openDummy(valueBits=%d) failed - %s\n", valueBits
, u_errorName(errorCode
));
1165 testFrozenTrie(testName
, trie
, valueBits
, checkRanges
, UPRV_LENGTHOF(checkRanges
));
1170 DummyTrieTest(void) {
1171 dummyTest(UTRIE2_16_VALUE_BITS
);
1172 dummyTest(UTRIE2_32_VALUE_BITS
);
1175 /* test builder memory management ------------------------------------------- */
1178 FreeBlocksTest(void) {
1179 static const CheckRange
1187 static const char *const testName
="free-blocks";
1191 UErrorCode errorCode
;
1193 errorCode
=U_ZERO_ERROR
;
1194 trie
=utrie2_open(1, 0xbad, &errorCode
);
1195 if(U_FAILURE(errorCode
)) {
1196 log_err("error: utrie2_open(%s) failed: %s\n", testName
, u_errorName(errorCode
));
1201 * Repeatedly set overlapping same-value ranges to stress the free-data-block management.
1202 * If it fails, it will overflow the data array.
1204 for(i
=0; i
<(0x120000>>UTRIE2_SHIFT_2
)/2; ++i
) {
1205 utrie2_setRange32(trie
, 0x740, 0x840-1, 1, TRUE
, &errorCode
);
1206 utrie2_setRange32(trie
, 0x780, 0x880-1, 1, TRUE
, &errorCode
);
1207 utrie2_setRange32(trie
, 0x740, 0x840-1, 2, TRUE
, &errorCode
);
1208 utrie2_setRange32(trie
, 0x780, 0x880-1, 3, TRUE
, &errorCode
);
1210 /* make blocks that will be free during compaction */
1211 utrie2_setRange32(trie
, 0x1000, 0x3000-1, 2, TRUE
, &errorCode
);
1212 utrie2_setRange32(trie
, 0x2000, 0x4000-1, 3, TRUE
, &errorCode
);
1213 utrie2_setRange32(trie
, 0x1000, 0x4000-1, 1, TRUE
, &errorCode
);
1214 /* set some values for lead surrogate code units */
1215 utrie2_set32ForLeadSurrogateCodeUnit(trie
, 0xd800, 90, &errorCode
);
1216 utrie2_set32ForLeadSurrogateCodeUnit(trie
, 0xd999, 94, &errorCode
);
1217 utrie2_set32ForLeadSurrogateCodeUnit(trie
, 0xdbff, 99, &errorCode
);
1218 if(U_FAILURE(errorCode
)) {
1219 log_err("error: setting lots of ranges into a trie (%s) failed - %s\n",
1220 testName
, u_errorName(errorCode
));
1225 trie
=testTrieSerializeAllValueBits(testName
, trie
, FALSE
,
1226 checkRanges
, UPRV_LENGTHOF(checkRanges
));
1231 GrowDataArrayTest(void) {
1232 static const CheckRange
1240 static const char *const testName
="grow-data";
1244 UErrorCode errorCode
;
1246 errorCode
=U_ZERO_ERROR
;
1247 trie
=utrie2_open(1, 0xbad, &errorCode
);
1248 if(U_FAILURE(errorCode
)) {
1249 log_err("error: utrie2_open(%s) failed: %s\n", testName
, u_errorName(errorCode
));
1254 * Use utrie2_set32() not utrie2_setRange32() to write non-initialValue-data.
1255 * Should grow/reallocate the data array to a sufficient length.
1257 for(i
=0; i
<0x1000; ++i
) {
1258 utrie2_set32(trie
, i
, 2, &errorCode
);
1260 for(i
=0x720; i
<0x1100; ++i
) { /* some overlap */
1261 utrie2_set32(trie
, i
, 3, &errorCode
);
1263 for(i
=0x7a0; i
<0x900; ++i
) {
1264 utrie2_set32(trie
, i
, 4, &errorCode
);
1266 for(i
=0x8a0; i
<0x110000; ++i
) {
1267 utrie2_set32(trie
, i
, 5, &errorCode
);
1269 for(i
=0xd800; i
<0xdc00; ++i
) {
1270 utrie2_set32ForLeadSurrogateCodeUnit(trie
, i
, 1, &errorCode
);
1272 /* set some values for lead surrogate code units */
1273 utrie2_set32ForLeadSurrogateCodeUnit(trie
, 0xd800, 90, &errorCode
);
1274 utrie2_set32ForLeadSurrogateCodeUnit(trie
, 0xd999, 94, &errorCode
);
1275 utrie2_set32ForLeadSurrogateCodeUnit(trie
, 0xdbff, 99, &errorCode
);
1276 if(U_FAILURE(errorCode
)) {
1277 log_err("error: setting lots of values into a trie (%s) failed - %s\n",
1278 testName
, u_errorName(errorCode
));
1283 trie
=testTrieSerializeAllValueBits(testName
, trie
, FALSE
,
1284 checkRanges
, UPRV_LENGTHOF(checkRanges
));
1288 /* versions 1 and 2 --------------------------------------------------------- */
1291 GetVersionTest(void) {
1294 (data
[0]=0x54726965, 1!=utrie2_getVersion(data
, sizeof(data
), FALSE
)) ||
1295 (data
[0]=0x54726965, 1!=utrie2_getVersion(data
, sizeof(data
), TRUE
)) ||
1296 (data
[0]=0x65697254, 0!=utrie2_getVersion(data
, sizeof(data
), FALSE
)) ||
1297 (data
[0]=0x65697254, 1!=utrie2_getVersion(data
, sizeof(data
), TRUE
)) ||
1299 (data
[0]=0x54726932, 2!=utrie2_getVersion(data
, sizeof(data
), FALSE
)) ||
1300 (data
[0]=0x54726932, 2!=utrie2_getVersion(data
, sizeof(data
), TRUE
)) ||
1301 (data
[0]=0x32697254, 0!=utrie2_getVersion(data
, sizeof(data
), FALSE
)) ||
1302 (data
[0]=0x32697254, 2!=utrie2_getVersion(data
, sizeof(data
), TRUE
)) ||
1303 /* illegal arguments */
1304 (data
[0]=0x54726932, 0!=utrie2_getVersion(NULL
, sizeof(data
), FALSE
)) ||
1305 (data
[0]=0x54726932, 0!=utrie2_getVersion(data
, 3, FALSE
)) ||
1306 (data
[0]=0x54726932, 0!=utrie2_getVersion((char *)data
+1, sizeof(data
), FALSE
)) ||
1307 /* unknown signature values */
1308 (data
[0]=0x11223344, 0!=utrie2_getVersion(data
, sizeof(data
), FALSE
)) ||
1309 (data
[0]=0x54726933, 0!=utrie2_getVersion(data
, sizeof(data
), FALSE
))
1311 log_err("error: utrie2_getVersion() is not working as expected\n");
1316 makeNewTrie1WithRanges(const char *testName
,
1317 const SetRange setRanges
[], int32_t countSetRanges
,
1318 const CheckRange checkRanges
[], int32_t countCheckRanges
) {
1320 uint32_t initialValue
, errorValue
;
1322 UChar32 start
, limit
;
1324 UErrorCode errorCode
;
1325 UBool overwrite
, ok
;
1327 log_verbose("\ntesting Trie '%s'\n", testName
);
1328 errorCode
=U_ZERO_ERROR
;
1329 getSpecialValues(checkRanges
, countCheckRanges
, &initialValue
, &errorValue
);
1330 newTrie
=utrie_open(NULL
, NULL
, 2000,
1331 initialValue
, initialValue
,
1333 if(U_FAILURE(errorCode
)) {
1334 log_err("error: utrie_open(%s) failed: %s\n", testName
, u_errorName(errorCode
));
1338 /* set values from setRanges[] */
1340 for(i
=0; i
<countSetRanges
; ++i
) {
1341 start
=setRanges
[i
].start
;
1342 limit
=setRanges
[i
].limit
;
1343 value
=setRanges
[i
].value
;
1344 overwrite
=setRanges
[i
].overwrite
;
1345 if((limit
-start
)==1 && overwrite
) {
1346 ok
&=utrie_set32(newTrie
, start
, value
);
1348 ok
&=utrie_setRange32(newTrie
, start
, limit
, value
, overwrite
);
1354 log_err("error: setting values into a trie1 (%s) failed\n", testName
);
1355 utrie_close(newTrie
);
1361 testTrie2FromTrie1(const char *testName
,
1362 const SetRange setRanges
[], int32_t countSetRanges
,
1363 const CheckRange checkRanges
[], int32_t countCheckRanges
) {
1364 uint32_t memory1_16
[3000], memory1_32
[3000];
1365 int32_t length16
, length32
;
1370 UNewTrie
*newTrie1_16
, *newTrie1_32
;
1371 UTrie trie1_16
, trie1_32
;
1373 uint32_t initialValue
, errorValue
;
1374 UErrorCode errorCode
;
1376 newTrie1_16
=makeNewTrie1WithRanges(testName
,
1377 setRanges
, countSetRanges
,
1378 checkRanges
, countCheckRanges
);
1379 if(newTrie1_16
==NULL
) {
1382 newTrie1_32
=utrie_clone(NULL
, newTrie1_16
, NULL
, 0);
1383 if(newTrie1_32
==NULL
) {
1384 utrie_close(newTrie1_16
);
1387 errorCode
=U_ZERO_ERROR
;
1388 length16
=utrie_serialize(newTrie1_16
, memory1_16
, sizeof(memory1_16
),
1389 NULL
, TRUE
, &errorCode
);
1390 length32
=utrie_serialize(newTrie1_32
, memory1_32
, sizeof(memory1_32
),
1391 NULL
, FALSE
, &errorCode
);
1392 utrie_unserialize(&trie1_16
, memory1_16
, length16
, &errorCode
);
1393 utrie_unserialize(&trie1_32
, memory1_32
, length32
, &errorCode
);
1394 utrie_close(newTrie1_16
);
1395 utrie_close(newTrie1_32
);
1396 if(U_FAILURE(errorCode
)) {
1397 log_err("error: utrie_serialize or unserialize(%s) failed: %s\n",
1398 testName
, u_errorName(errorCode
));
1402 getSpecialValues(checkRanges
, countCheckRanges
, &initialValue
, &errorValue
);
1404 uprv_strcpy(name
, testName
);
1405 uprv_strcat(name
, ".16");
1406 trie2
=utrie2_fromUTrie(&trie1_16
, errorValue
, &errorCode
);
1407 if(U_SUCCESS(errorCode
)) {
1408 testFrozenTrie(name
, trie2
, UTRIE2_16_VALUE_BITS
, checkRanges
, countCheckRanges
);
1409 for(lead
=0xd800; lead
<0xdc00; ++lead
) {
1410 uint32_t value1
, value2
;
1411 value1
=UTRIE_GET16_FROM_LEAD(&trie1_16
, lead
);
1412 value2
=UTRIE2_GET16_FROM_U16_SINGLE_LEAD(trie2
, lead
);
1413 if(value1
!=value2
) {
1414 log_err("error: utrie2_fromUTrie(%s) wrong value %ld!=%ld "
1415 "from lead surrogate code unit U+%04lx\n",
1416 name
, (long)value2
, (long)value1
, (long)lead
);
1421 utrie2_close(trie2
);
1423 uprv_strcpy(name
, testName
);
1424 uprv_strcat(name
, ".32");
1425 trie2
=utrie2_fromUTrie(&trie1_32
, errorValue
, &errorCode
);
1426 if(U_SUCCESS(errorCode
)) {
1427 testFrozenTrie(name
, trie2
, UTRIE2_32_VALUE_BITS
, checkRanges
, countCheckRanges
);
1428 for(lead
=0xd800; lead
<0xdc00; ++lead
) {
1429 uint32_t value1
, value2
;
1430 value1
=UTRIE_GET32_FROM_LEAD(&trie1_32
, lead
);
1431 value2
=UTRIE2_GET32_FROM_U16_SINGLE_LEAD(trie2
, lead
);
1432 if(value1
!=value2
) {
1433 log_err("error: utrie2_fromUTrie(%s) wrong value %ld!=%ld "
1434 "from lead surrogate code unit U+%04lx\n",
1435 name
, (long)value2
, (long)value1
, (long)lead
);
1440 utrie2_close(trie2
);
1444 Trie12ConversionTest(void) {
1445 testTrie2FromTrie1("trie1->trie2",
1446 setRanges2
, UPRV_LENGTHOF(setRanges2
),
1447 checkRanges2
, UPRV_LENGTHOF(checkRanges2
));
1451 addTrie2Test(TestNode
** root
) {
1452 addTest(root
, &TrieTest
, "tsutil/trie2test/TrieTest");
1453 addTest(root
, &EnumNewTrieForLeadSurrogateTest
,
1454 "tsutil/trie2test/EnumNewTrieForLeadSurrogateTest");
1455 addTest(root
, &DummyTrieTest
, "tsutil/trie2test/DummyTrieTest");
1456 addTest(root
, &FreeBlocksTest
, "tsutil/trie2test/FreeBlocksTest");
1457 addTest(root
, &GrowDataArrayTest
, "tsutil/trie2test/GrowDataArrayTest");
1458 addTest(root
, &GetVersionTest
, "tsutil/trie2test/GetVersionTest");
1459 addTest(root
, &Trie12ConversionTest
, "tsutil/trie2test/Trie12ConversionTest");