]>
git.saurik.com Git - apple/icu.git/blob - icuSources/test/cintltst/trietest.c
1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
4 ******************************************************************************
6 * Copyright (C) 2001-2016, 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: 2001nov20
16 * created by: Markus W. Scherer
20 #include "unicode/utypes.h"
21 #include "unicode/utf16.h"
29 /* definitions from standalone utrie development */
30 #define log_err printf
31 #define log_verbose printf
34 #define u_errorName(errorCode) "some error code"
37 /* Values for setting possibly overlapping, out-of-order ranges of values */
38 typedef struct SetRange
{
46 * value is set from the previous boundary's limit to before
47 * this boundary's limit
49 typedef struct CheckRange
{
55 static uint32_t U_CALLCONV
56 _testFoldedValue32(UNewTrie
*trie
, UChar32 start
, int32_t offset
) {
57 uint32_t foldedValue
, value
;
65 value
=utrie_get32(trie
, start
, &inBlockZero
);
67 start
+=UTRIE_DATA_BLOCK_LENGTH
;
75 return ((uint32_t)offset
<<16)|foldedValue
;
81 static int32_t U_CALLCONV
82 _testFoldingOffset32(uint32_t data
) {
83 return (int32_t)(data
>>16);
86 static uint32_t U_CALLCONV
87 _testFoldedValue16(UNewTrie
*trie
, UChar32 start
, int32_t offset
) {
88 uint32_t foldedValue
, value
;
96 value
=utrie_get32(trie
, start
, &inBlockZero
);
98 start
+=UTRIE_DATA_BLOCK_LENGTH
;
106 return (uint32_t)(offset
|0x8000);
112 static int32_t U_CALLCONV
113 _testFoldingOffset16(uint32_t data
) {
115 return (int32_t)(data
&0x7fff);
121 static uint32_t U_CALLCONV
122 _testEnumValue(const void *context
, uint32_t value
) {
123 (void)context
; // suppress compiler warnings about unused variable
127 static UBool U_CALLCONV
128 _testEnumRange(const void *context
, UChar32 start
, UChar32 limit
, uint32_t value
) {
129 const CheckRange
**pb
=(const CheckRange
**)context
;
130 const CheckRange
*b
=(*pb
)++;
133 if(start
!=(b
-1)->limit
|| limit
!=b
->limit
|| value
!=b
->value
) {
134 log_err("error: utrie_enum() delivers wrong range [U+%04lx..U+%04lx[.0x%lx instead of [U+%04lx..U+%04lx[.0x%lx\n",
136 (b
-1)->limit
, b
->limit
, b
->value
);
142 testTrieIteration(const char *testName
,
144 const CheckRange checkRanges
[], int32_t countCheckRanges
) {
148 const UChar
*p
, *limit
;
152 int32_t i
, length
, countValues
;
156 length
=countValues
=0;
157 for(i
=0; i
<countCheckRanges
; ++i
) {
158 c
=checkRanges
[i
].limit
;
161 U16_APPEND_UNSAFE(s
, length
, c
);
162 values
[countValues
++]=checkRanges
[i
].value
;
172 if(trie
->data32
!=NULL
) {
173 UTRIE_NEXT32(trie
, p
, limit
, c
, c2
, value
);
175 UTRIE_NEXT16(trie
, p
, limit
, c
, c2
, value
);
177 if(value
!=values
[i
]) {
178 log_err("error: wrong value from UTRIE_NEXT(%s)(U+%04lx, U+%04lx): 0x%lx instead of 0x%lx\n",
179 testName
, c
, c2
, value
, values
[i
]);
184 !U16_IS_LEAD(c
) || !U16_IS_TRAIL(c2
) || c
!=*(p
-2) || c2
!=*(p
-1)
186 log_err("error: wrong (c, c2) from UTRIE_NEXT(%s): (U+%04lx, U+%04lx)\n",
193 if(trie
->data32
==NULL
) {
194 value
=UTRIE_GET16_FROM_LEAD(trie
, c
);
195 offset
=trie
->getFoldingOffset(value
);
197 value
=UTRIE_GET16_FROM_OFFSET_TRAIL(trie
, offset
, c2
);
199 value
=trie
->initialValue
;
202 value
=UTRIE_GET32_FROM_LEAD(trie
, c
);
203 offset
=trie
->getFoldingOffset(value
);
205 value
=UTRIE_GET32_FROM_OFFSET_TRAIL(trie
, offset
, c2
);
207 value
=trie
->initialValue
;
210 if(value
!=values
[i
]) {
211 log_err("error: wrong value from UTRIE_GETXX_FROM_OFFSET_TRAIL(%s)(U+%04lx, U+%04lx): 0x%lx instead of 0x%lx\n",
212 testName
, c
, c2
, value
, values
[i
]);
217 if(trie
->data32
==NULL
) {
218 UTRIE_GET16_FROM_PAIR(trie
, c
, c2
, value
);
220 UTRIE_GET32_FROM_PAIR(trie
, c
, c2
, value
);
222 if(value
!=values
[i
]) {
223 log_err("error: wrong value from UTRIE_GETXX_FROM_PAIR(%s)(U+%04lx, U+%04lx): 0x%lx instead of 0x%lx\n",
224 testName
, c
, c2
, value
, values
[i
]);
236 if(trie
->data32
!=NULL
) {
237 UTRIE_PREVIOUS32(trie
, s
, p
, c
, c2
, value
);
239 UTRIE_PREVIOUS16(trie
, s
, p
, c
, c2
, value
);
241 if(value
!=values
[i
]) {
242 log_err("error: wrong value from UTRIE_PREVIOUS(%s)(U+%04lx, U+%04lx): 0x%lx instead of 0x%lx\n",
243 testName
, c
, c2
, value
, values
[i
]);
248 !U16_IS_LEAD(c
) || !U16_IS_TRAIL(c2
) || c
!=*p
|| c2
!=*(p
+1)
250 log_err("error: wrong (c, c2) from UTRIE_PREVIOUS(%s): (U+%04lx, U+%04lx)\n",
257 testTrieRangesWithMalloc(const char *testName
,
258 const SetRange setRanges
[], int32_t countSetRanges
,
259 const CheckRange checkRanges
[], int32_t countCheckRanges
,
260 UBool dataIs32
, UBool latin1Linear
) {
261 UTrieGetFoldingOffset
*getFoldingOffset
;
262 const CheckRange
*enumRanges
;
265 uint32_t value
, value2
;
266 UChar32 start
, limit
;
268 UErrorCode errorCode
;
270 uint8_t* storage
=NULL
;
271 static const int32_t DEFAULT_STORAGE_SIZE
= 32768;
272 storage
= (uint8_t*) uprv_malloc(sizeof(uint8_t)*DEFAULT_STORAGE_SIZE
);
274 log_verbose("\ntesting Trie '%s'\n", testName
);
275 newTrie
=utrie_open(NULL
, NULL
, 2000,
276 checkRanges
[0].value
, checkRanges
[0].value
,
279 /* set values from setRanges[] */
281 for(i
=0; i
<countSetRanges
; ++i
) {
282 start
=setRanges
[i
].start
;
283 limit
=setRanges
[i
].limit
;
284 value
=setRanges
[i
].value
;
285 overwrite
=setRanges
[i
].overwrite
;
286 if((limit
-start
)==1 && overwrite
) {
287 ok
&=utrie_set32(newTrie
, start
, value
);
289 ok
&=utrie_setRange32(newTrie
, start
, limit
, value
, overwrite
);
293 log_err("error: setting values into a trie failed (%s)\n", testName
);
297 /* verify that all these values are in the new Trie */
299 for(i
=0; i
<countCheckRanges
; ++i
) {
300 limit
=checkRanges
[i
].limit
;
301 value
=checkRanges
[i
].value
;
304 if(value
!=utrie_get32(newTrie
, start
, NULL
)) {
305 log_err("error: newTrie(%s)[U+%04lx]==0x%lx instead of 0x%lx\n",
306 testName
, start
, utrie_get32(newTrie
, start
, NULL
), value
);
313 getFoldingOffset
=_testFoldingOffset32
;
315 getFoldingOffset
=_testFoldingOffset16
;
318 errorCode
=U_ZERO_ERROR
;
319 length
=utrie_serialize(newTrie
, storage
, DEFAULT_STORAGE_SIZE
,
320 dataIs32
? _testFoldedValue32
: _testFoldedValue16
,
323 if(U_FAILURE(errorCode
)) {
324 log_err("error: utrie_serialize(%s) failed: %s\n", testName
, u_errorName(errorCode
));
325 utrie_close(newTrie
);
329 /* test linear Latin-1 range from utrie_getData() */
334 data
=utrie_getData(newTrie
, &dataLength
);
336 for(i
=0; i
<countCheckRanges
&& start
<=0xff; ++i
) {
337 limit
=checkRanges
[i
].limit
;
338 value
=checkRanges
[i
].value
;
340 while(start
<limit
&& start
<=0xff) {
341 if(value
!=data
[UTRIE_DATA_BLOCK_LENGTH
+start
]) {
342 log_err("error: newTrie(%s).latin1Data[U+%04lx]==0x%lx instead of 0x%lx\n",
343 testName
, start
, data
[UTRIE_DATA_BLOCK_LENGTH
+start
], value
);
350 utrie_close(newTrie
);
352 errorCode
=U_ZERO_ERROR
;
353 if(!utrie_unserialize(&trie
, storage
, length
, &errorCode
)) {
354 log_err("error: utrie_unserialize() failed, %s\n", u_errorName(errorCode
));
357 trie
.getFoldingOffset
=getFoldingOffset
;
359 if(dataIs32
!=(trie
.data32
!=NULL
)) {
360 log_err("error: trie serialization (%s) did not preserve 32-bitness\n", testName
);
362 if(latin1Linear
!=trie
.isLatin1Linear
) {
363 log_err("error: trie serialization (%s) did not preserve Latin-1-linearity\n", testName
);
366 /* verify that all these values are in the unserialized Trie */
368 for(i
=0; i
<countCheckRanges
; ++i
) {
369 limit
=checkRanges
[i
].limit
;
370 value
=checkRanges
[i
].value
;
373 /* skip surrogates */
381 value2
=UTRIE_GET32_FROM_BMP(&trie
, start
);
383 value2
=UTRIE_GET16_FROM_BMP(&trie
, start
);
386 log_err("error: unserialized trie(%s).fromBMP(U+%04lx)==0x%lx instead of 0x%lx\n",
387 testName
, start
, value2
, value
);
389 if(!U16_IS_LEAD(start
)) {
391 value2
=UTRIE_GET32_FROM_LEAD(&trie
, start
);
393 value2
=UTRIE_GET16_FROM_LEAD(&trie
, start
);
396 log_err("error: unserialized trie(%s).fromLead(U+%04lx)==0x%lx instead of 0x%lx\n",
397 testName
, start
, value2
, value
);
402 UTRIE_GET32(&trie
, start
, value2
);
404 UTRIE_GET16(&trie
, start
, value2
);
407 log_err("error: unserialized trie(%s).get(U+%04lx)==0x%lx instead of 0x%lx\n",
408 testName
, start
, value2
, value
);
414 /* enumerate and verify all ranges */
415 enumRanges
=checkRanges
+1;
416 utrie_enum(&trie
, _testEnumValue
, _testEnumRange
, &enumRanges
);
418 /* test linear Latin-1 range */
419 if(trie
.isLatin1Linear
) {
420 if(trie
.data32
!=NULL
) {
421 const uint32_t *latin1
=UTRIE_GET32_LATIN1(&trie
);
423 for(start
=0; start
<0x100; ++start
) {
424 if(latin1
[start
]!=UTRIE_GET32_FROM_LEAD(&trie
, start
)) {
425 log_err("error: (%s) trie.latin1[U+%04lx]=0x%lx!=0x%lx=trie.get32(U+%04lx)\n",
426 testName
, start
, latin1
[start
], UTRIE_GET32_FROM_LEAD(&trie
, start
), start
);
430 const uint16_t *latin1
=UTRIE_GET16_LATIN1(&trie
);
432 for(start
=0; start
<0x100; ++start
) {
433 if(latin1
[start
]!=UTRIE_GET16_FROM_LEAD(&trie
, start
)) {
434 log_err("error: (%s) trie.latin1[U+%04lx]=0x%lx!=0x%lx=trie.get16(U+%04lx)\n",
435 testName
, start
, latin1
[start
], UTRIE_GET16_FROM_LEAD(&trie
, start
), start
);
441 testTrieIteration(testName
, &trie
, checkRanges
, countCheckRanges
);
446 testTrieRanges(const char *testName
,
447 const SetRange setRanges
[], int32_t countSetRanges
,
448 const CheckRange checkRanges
[], int32_t countCheckRanges
,
449 UBool dataIs32
, UBool latin1Linear
) {
451 double bogus
; /* needed for aligining the storage */
452 uint8_t storage
[32768];
454 UTrieGetFoldingOffset
*getFoldingOffset
;
455 UNewTrieGetFoldedValue
*getFoldedValue
;
456 const CheckRange
*enumRanges
;
459 uint32_t value
, value2
;
460 UChar32 start
, limit
;
462 UErrorCode errorCode
;
465 log_verbose("\ntesting Trie '%s'\n", testName
);
466 newTrie
=utrie_open(NULL
, NULL
, 2000,
467 checkRanges
[0].value
, checkRanges
[0].value
,
470 /* set values from setRanges[] */
472 for(i
=0; i
<countSetRanges
; ++i
) {
473 start
=setRanges
[i
].start
;
474 limit
=setRanges
[i
].limit
;
475 value
=setRanges
[i
].value
;
476 overwrite
=setRanges
[i
].overwrite
;
477 if((limit
-start
)==1 && overwrite
) {
478 ok
&=utrie_set32(newTrie
, start
, value
);
480 ok
&=utrie_setRange32(newTrie
, start
, limit
, value
, overwrite
);
484 log_err("error: setting values into a trie failed (%s)\n", testName
);
488 /* verify that all these values are in the new Trie */
490 for(i
=0; i
<countCheckRanges
; ++i
) {
491 limit
=checkRanges
[i
].limit
;
492 value
=checkRanges
[i
].value
;
495 if(value
!=utrie_get32(newTrie
, start
, NULL
)) {
496 log_err("error: newTrie(%s)[U+%04lx]==0x%lx instead of 0x%lx\n",
497 testName
, start
, utrie_get32(newTrie
, start
, NULL
), value
);
504 getFoldingOffset
=_testFoldingOffset32
;
505 getFoldedValue
=_testFoldedValue32
;
507 getFoldingOffset
=_testFoldingOffset16
;
508 getFoldedValue
=_testFoldedValue16
;
512 * code coverage for utrie.c/defaultGetFoldedValue(),
513 * pick some combination of parameters for selecting the UTrie defaults
515 if(!dataIs32
&& latin1Linear
) {
516 getFoldingOffset
=NULL
;
520 errorCode
=U_ZERO_ERROR
;
521 length
=utrie_serialize(newTrie
, storageHolder
.storage
, sizeof(storageHolder
.storage
),
525 if(U_FAILURE(errorCode
)) {
526 log_err("error: utrie_serialize(%s) failed: %s\n", testName
, u_errorName(errorCode
));
527 utrie_close(newTrie
);
530 if (length
>= (int32_t)sizeof(storageHolder
.storage
)) {
531 log_err("error: utrie_serialize(%s) needs more memory\n", testName
);
532 utrie_close(newTrie
);
536 /* test linear Latin-1 range from utrie_getData() */
541 data
=utrie_getData(newTrie
, &dataLength
);
543 for(i
=0; i
<countCheckRanges
&& start
<=0xff; ++i
) {
544 limit
=checkRanges
[i
].limit
;
545 value
=checkRanges
[i
].value
;
547 while(start
<limit
&& start
<=0xff) {
548 if(value
!=data
[UTRIE_DATA_BLOCK_LENGTH
+start
]) {
549 log_err("error: newTrie(%s).latin1Data[U+%04lx]==0x%lx instead of 0x%lx\n",
550 testName
, start
, data
[UTRIE_DATA_BLOCK_LENGTH
+start
], value
);
557 utrie_close(newTrie
);
559 errorCode
=U_ZERO_ERROR
;
560 if(!utrie_unserialize(&trie
, storageHolder
.storage
, length
, &errorCode
)) {
561 log_err("error: utrie_unserialize() failed, %s\n", u_errorName(errorCode
));
564 if(getFoldingOffset
!=NULL
) {
565 trie
.getFoldingOffset
=getFoldingOffset
;
568 if(dataIs32
!=(trie
.data32
!=NULL
)) {
569 log_err("error: trie serialization (%s) did not preserve 32-bitness\n", testName
);
571 if(latin1Linear
!=trie
.isLatin1Linear
) {
572 log_err("error: trie serialization (%s) did not preserve Latin-1-linearity\n", testName
);
575 /* verify that all these values are in the unserialized Trie */
577 for(i
=0; i
<countCheckRanges
; ++i
) {
578 limit
=checkRanges
[i
].limit
;
579 value
=checkRanges
[i
].value
;
582 /* skip surrogates */
590 value2
=UTRIE_GET32_FROM_BMP(&trie
, start
);
592 value2
=UTRIE_GET16_FROM_BMP(&trie
, start
);
595 log_err("error: unserialized trie(%s).fromBMP(U+%04lx)==0x%lx instead of 0x%lx\n",
596 testName
, start
, value2
, value
);
598 if(!U16_IS_LEAD(start
)) {
600 value2
=UTRIE_GET32_FROM_LEAD(&trie
, start
);
602 value2
=UTRIE_GET16_FROM_LEAD(&trie
, start
);
605 log_err("error: unserialized trie(%s).fromLead(U+%04lx)==0x%lx instead of 0x%lx\n",
606 testName
, start
, value2
, value
);
611 UTRIE_GET32(&trie
, start
, value2
);
613 UTRIE_GET16(&trie
, start
, value2
);
616 log_err("error: unserialized trie(%s).get(U+%04lx)==0x%lx instead of 0x%lx\n",
617 testName
, start
, value2
, value
);
623 /* enumerate and verify all ranges */
624 enumRanges
=checkRanges
+1;
625 utrie_enum(&trie
, _testEnumValue
, _testEnumRange
, &enumRanges
);
627 /* test linear Latin-1 range */
628 if(trie
.isLatin1Linear
) {
629 if(trie
.data32
!=NULL
) {
630 const uint32_t *latin1
=UTRIE_GET32_LATIN1(&trie
);
632 for(start
=0; start
<0x100; ++start
) {
633 if(latin1
[start
]!=UTRIE_GET32_FROM_LEAD(&trie
, start
)) {
634 log_err("error: (%s) trie.latin1[U+%04lx]=0x%lx!=0x%lx=trie.get32(U+%04lx)\n",
635 testName
, start
, latin1
[start
], UTRIE_GET32_FROM_LEAD(&trie
, start
), start
);
639 const uint16_t *latin1
=UTRIE_GET16_LATIN1(&trie
);
641 for(start
=0; start
<0x100; ++start
) {
642 if(latin1
[start
]!=UTRIE_GET16_FROM_LEAD(&trie
, start
)) {
643 log_err("error: (%s) trie.latin1[U+%04lx]=0x%lx!=0x%lx=trie.get16(U+%04lx)\n",
644 testName
, start
, latin1
[start
], UTRIE_GET16_FROM_LEAD(&trie
, start
), start
);
650 testTrieIteration(testName
, &trie
, checkRanges
, countCheckRanges
);
654 testTrieRanges2(const char *testName
,
655 const SetRange setRanges
[], int32_t countSetRanges
,
656 const CheckRange checkRanges
[], int32_t countCheckRanges
,
660 testTrieRanges(testName
,
661 setRanges
, countSetRanges
,
662 checkRanges
, countCheckRanges
,
664 testTrieRangesWithMalloc(testName
,
665 setRanges
, countSetRanges
,
666 checkRanges
, countCheckRanges
,
669 uprv_strcpy(name
, testName
);
670 uprv_strcat(name
, "-latin1Linear");
672 setRanges
, countSetRanges
,
673 checkRanges
, countCheckRanges
,
675 testTrieRangesWithMalloc(name
,
676 setRanges
, countSetRanges
,
677 checkRanges
, countCheckRanges
,
682 testTrieRanges4(const char *testName
,
683 const SetRange setRanges
[], int32_t countSetRanges
,
684 const CheckRange checkRanges
[], int32_t countCheckRanges
) {
687 uprv_strcpy(name
, testName
);
688 uprv_strcat(name
, ".32");
689 testTrieRanges2(name
,
690 setRanges
, countSetRanges
,
691 checkRanges
, countCheckRanges
,
694 uprv_strcpy(name
, testName
);
695 uprv_strcat(name
, ".16");
696 testTrieRanges2(name
,
697 setRanges
, countSetRanges
,
698 checkRanges
, countCheckRanges
,
702 /* test data ----------------------------------------------------------------*/
704 /* set consecutive ranges, even with value 0 */
705 static const SetRange
708 {0x20, 0xa7, 0x1234, FALSE
},
709 {0xa7, 0x3400, 0, FALSE
},
710 {0x3400, 0x9fa6, 0x6162, FALSE
},
711 {0x9fa6, 0xda9e, 0x3132, FALSE
},
712 {0xdada, 0xeeee, 0x87ff, FALSE
}, /* try to disrupt _testFoldingOffset16() */
713 {0xeeee, 0x11111, 1, FALSE
},
714 {0x11111, 0x44444, 0x6162, FALSE
},
715 {0x44444, 0x60003, 0, FALSE
},
716 {0xf0003, 0xf0004, 0xf, FALSE
},
717 {0xf0004, 0xf0006, 0x10, FALSE
},
718 {0xf0006, 0xf0007, 0x11, FALSE
},
719 {0xf0007, 0xf0020, 0x12, FALSE
},
720 {0xf0020, 0x110000, 0, FALSE
}
723 static const CheckRange
725 {0, 0}, /* dummy start range to make _testEnumRange() simpler */
743 /* set some interesting overlapping ranges */
744 static const SetRange
746 {0x21, 0x7f, 0x5555, TRUE
},
747 {0x2f800,0x2fedc, 0x7a, TRUE
},
748 {0x72, 0xdd, 3, TRUE
},
749 {0xdd, 0xde, 4, FALSE
},
750 {0x201, 0x220, 6, TRUE
}, /* 3 consecutive blocks with the same pattern but discontiguous value ranges */
751 {0x221, 0x240, 6, TRUE
},
752 {0x241, 0x260, 6, TRUE
},
753 {0x2f987,0x2fa98, 5, TRUE
},
754 {0x2f777,0x2f833, 0, TRUE
},
755 {0x2f900,0x2ffee, 1, FALSE
},
756 {0x2ffee,0x2ffef, 2, TRUE
}
759 static const CheckRange
761 {0, 0}, /* dummy start range to make _testEnumRange() simpler */
781 /* use a non-zero initial value */
782 static const SetRange
784 {0x31, 0xa4, 1, FALSE
},
785 {0x3400, 0x6789, 2, FALSE
},
786 {0x30000,0x34567,9, TRUE
},
787 {0x45678,0x56789,3, TRUE
}
790 static const CheckRange
792 {0, 9}, /* dummy start range, also carries the initial value */
804 testTrieRanges4("set1",
805 setRanges1
, UPRV_LENGTHOF(setRanges1
),
806 checkRanges1
, UPRV_LENGTHOF(checkRanges1
));
807 testTrieRanges4("set2-overlap",
808 setRanges2
, UPRV_LENGTHOF(setRanges2
),
809 checkRanges2
, UPRV_LENGTHOF(checkRanges2
));
810 testTrieRanges4("set3-initial-9",
811 setRanges3
, UPRV_LENGTHOF(setRanges3
),
812 checkRanges3
, UPRV_LENGTHOF(checkRanges3
));
815 /* test utrie_unserializeDummy() -------------------------------------------- */
817 static int32_t U_CALLCONV
818 dummyGetFoldingOffset(uint32_t data
) {
819 (void)data
; // suppress compiler warnings about unused variable
820 return -1; /* never get non-initialValue data for supplementary code points */
824 dummyTest(UBool make16BitTrie
) {
825 int32_t mem
[UTRIE_DUMMY_SIZE
/4];
828 UErrorCode errorCode
;
831 uint32_t value
, initialValue
, leadUnitValue
;
835 leadUnitValue
=0xaffe;
837 initialValue
=0x01234567;
838 leadUnitValue
=0x89abcdef;
841 errorCode
=U_ZERO_ERROR
;
842 utrie_unserializeDummy(&trie
, mem
, sizeof(mem
), initialValue
, leadUnitValue
, make16BitTrie
, &errorCode
);
843 if(U_FAILURE(errorCode
)) {
844 log_err("utrie_unserializeDummy(make16BitTrie=%d) failed - %s\n", make16BitTrie
, u_errorName(errorCode
));
847 trie
.getFoldingOffset
=dummyGetFoldingOffset
;
849 /* test that all code points have initialValue */
850 for(c
=0; c
<=0x10ffff; ++c
) {
852 UTRIE_GET16(&trie
, c
, value
);
854 UTRIE_GET32(&trie
, c
, value
);
856 if(value
!=initialValue
) {
857 log_err("UTRIE_GET%s(dummy, U+%04lx)=0x%lx instead of 0x%lx\n",
858 make16BitTrie
? "16" : "32", (long)c
, (long)value
, (long)initialValue
);
862 /* test that the lead surrogate code units have leadUnitValue */
863 for(c
=0xd800; c
<=0xdbff; ++c
) {
865 value
=UTRIE_GET16_FROM_LEAD(&trie
, c
);
867 value
=UTRIE_GET32_FROM_LEAD(&trie
, c
);
869 if(value
!=leadUnitValue
) {
870 log_err("UTRIE_GET%s_FROM_LEAD(dummy, U+%04lx)=0x%lx instead of 0x%lx\n",
871 make16BitTrie
? "16" : "32", (long)c
, (long)value
, (long)leadUnitValue
);
877 DummyTrieTest(void) {
883 addTrieTest(TestNode
** root
);
886 addTrieTest(TestNode
** root
) {
887 addTest(root
, &TrieTest
, "tsutil/trietest/TrieTest");
888 addTest(root
, &DummyTrieTest
, "tsutil/trietest/DummyTrieTest");