1 /********************************************************************
2 * Copyright (c) 2001-2011 International Business Machines
3 * Corporation and others. All Rights Reserved.
4 ********************************************************************
6 * Modification History:
7 * Name Date Description
8 * synwee July 19 2001 creation
9 ********************************************************************/
11 #include "unicode/utypes.h"
13 #if !UCONFIG_NO_COLLATION && !UCONFIG_NO_BREAK_ITERATION && !UCONFIG_NO_FILE_IO
15 #include "unicode/usearch.h"
16 #include "unicode/ustring.h"
21 #include "unicode/ubrk.h"
24 static UBool TOCLOSE_
= TRUE
;
25 static UCollator
*EN_US_
;
26 static UCollator
*FR_FR_
;
27 static UCollator
*DE_
;
28 static UCollator
*ES_
;
31 * CHECK_BREAK(char *brk)
32 * Test if a break iterator is passed in AND break iteration is disabled.
33 * Skip the test if so.
34 * CHECK_BREAK_BOOL(char *brk)
35 * Same as above, but returns 'TRUE' as a passing result
38 #if !UCONFIG_NO_BREAK_ITERATION
39 static UBreakIterator
*EN_WORDBREAKER_
;
40 static UBreakIterator
*EN_CHARACTERBREAKER_
;
41 #define CHECK_BREAK(x)
42 #define CHECK_BREAK_BOOL(x)
44 #define CHECK_BREAK(x) if(x) { log_info("Skipping test on %s:%d because UCONFIG_NO_BREAK_ITERATION is on\n", __FILE__, __LINE__); return; }
45 #define CHECK_BREAK_BOOL(x) if(x) { log_info("Skipping test on %s:%d because UCONFIG_NO_BREAK_ITERATION is on\n", __FILE__, __LINE__); return TRUE; }
49 * Opening all static collators and break iterators
51 static void open(UErrorCode
* status
)
55 int32_t rulelength
= 0;
56 *status
= U_ZERO_ERROR
;
58 EN_US_
= ucol_open("en_US", status
);
59 if(U_FAILURE(*status
)) {
60 log_err_status(*status
, "Error opening collator\n");
63 FR_FR_
= ucol_open("fr_FR", status
);
64 DE_
= ucol_open("de_DE", status
);
65 ES_
= ucol_open("es_ES", status
);
67 u_strcpy(rules
, ucol_getRules(DE_
, &rulelength
));
68 u_unescape(EXTRACOLLATIONRULE
, rules
+ rulelength
, 1024 - rulelength
);
72 DE_
= ucol_openRules(rules
, u_strlen(rules
), UCOL_ON
, UCOL_TERTIARY
,
73 (UParseError
*)NULL
, status
);
74 u_strcpy(rules
, ucol_getRules(ES_
, &rulelength
));
75 u_unescape(EXTRACOLLATIONRULE
, rules
+ rulelength
, 1024 - rulelength
);
78 ES_
= ucol_openRules(rules
, u_strlen(rules
), UCOL_ON
, UCOL_TERTIARY
,
80 #if !UCONFIG_NO_BREAK_ITERATION
81 EN_WORDBREAKER_
= ubrk_open(UBRK_WORD
, "en_US", NULL
, 0, status
);
82 EN_CHARACTERBREAKER_
= ubrk_open(UBRK_CHARACTER
, "en_US", NULL
, 0,
90 * Start opening all static collators and break iterators
92 static void TestStart(void)
94 UErrorCode status
= U_ZERO_ERROR
;
96 if (U_FAILURE(status
)) {
97 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
104 * Closing all static collators and break iterators
106 static void close(void)
113 #if !UCONFIG_NO_BREAK_ITERATION
114 ubrk_close(EN_WORDBREAKER_
);
115 ubrk_close(EN_CHARACTERBREAKER_
);
122 * End closing all static collators and break iterators
124 static void TestEnd(void)
132 * output UChar strings for printing.
134 static char *toCharString(const UChar
* unichars
)
136 static char result
[1024];
139 int length
= u_strlen(unichars
);
141 for (; count
< length
; count
++) {
142 UChar ch
= unichars
[count
];
143 if (ch
>= 0x20 && ch
<= 0x7e) {
147 sprintf(temp
, "\\u%04x", ch
);
148 temp
+= 6; /* \uxxxx */
157 * Getting the collator
159 static UCollator
*getCollator(const char *collator
)
161 if (collator
== NULL
) {
164 if (strcmp(collator
, "fr") == 0) {
167 else if (strcmp(collator
, "de") == 0) {
170 else if (strcmp(collator
, "es") == 0) {
179 * Getting the breakiterator
181 static UBreakIterator
*getBreakIterator(const char *breaker
)
183 if (breaker
== NULL
) {
186 #if !UCONFIG_NO_BREAK_ITERATION
187 if (strcmp(breaker
, "wordbreaker") == 0) {
188 return EN_WORDBREAKER_
;
191 return EN_CHARACTERBREAKER_
;
198 static void TestOpenClose(void)
200 UErrorCode status
= U_ZERO_ERROR
;
201 UStringSearch
*result
;
202 const UChar pattern
[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66};
203 const UChar text
[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67};
204 #if !UCONFIG_NO_BREAK_ITERATION
205 UBreakIterator
*breakiter
= ubrk_open(UBRK_WORD
, "en_US",
208 /* testing null arguments */
209 result
= usearch_open(NULL
, 0, NULL
, 0, NULL
, NULL
, &status
);
210 if (U_SUCCESS(status
) || result
!= NULL
) {
211 log_err("Error: NULL arguments should produce an error and a NULL result\n");
213 status
= U_ZERO_ERROR
;
214 result
= usearch_openFromCollator(NULL
, 0, NULL
, 0, NULL
, NULL
, &status
);
215 if (U_SUCCESS(status
) || result
!= NULL
) {
216 log_err("Error: NULL arguments should produce an error and a NULL result\n");
219 status
= U_ZERO_ERROR
;
220 result
= usearch_open(pattern
, 3, NULL
, 0, NULL
, NULL
, &status
);
221 if (U_SUCCESS(status
) || result
!= NULL
) {
222 log_err("Error: NULL arguments should produce an error and a NULL result\n");
224 status
= U_ZERO_ERROR
;
225 result
= usearch_openFromCollator(pattern
, 3, NULL
, 0, NULL
, NULL
,
227 if (U_SUCCESS(status
) || result
!= NULL
) {
228 log_err("Error: NULL arguments should produce an error and a NULL result\n");
231 status
= U_ZERO_ERROR
;
232 result
= usearch_open(pattern
, 3, text
, 6, NULL
, NULL
, &status
);
233 if (U_SUCCESS(status
) || result
!= NULL
) {
234 log_err("Error: NULL arguments should produce an error and a NULL result\n");
236 status
= U_ZERO_ERROR
;
237 result
= usearch_openFromCollator(pattern
, 3, text
, 6, NULL
, NULL
,
239 if (U_SUCCESS(status
) || result
!= NULL
) {
240 log_err("Error: NULL arguments should produce an error and a NULL result\n");
243 status
= U_ZERO_ERROR
;
244 result
= usearch_open(pattern
, 3, text
, 6, "en_US", NULL
, &status
);
245 if (U_FAILURE(status
) || result
== NULL
) {
246 log_err_status(status
, "Error: NULL break iterator is valid for opening search\n");
249 usearch_close(result
);
252 if (U_FAILURE(status
)) {
253 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
256 status
= U_ZERO_ERROR
;
257 result
= usearch_openFromCollator(pattern
, 3, text
, 6, EN_US_
, NULL
,
259 if (U_FAILURE(status
) || result
== NULL
) {
260 if (EN_US_
== NULL
) {
261 log_data_err("Opening collator failed.\n");
263 log_err("Error: NULL break iterator is valid for opening search\n");
267 usearch_close(result
);
271 status
= U_ZERO_ERROR
;
272 #if !UCONFIG_NO_BREAK_ITERATION
274 result
= usearch_open(pattern
, 3, text
, 6, "en_US", breakiter
, &status
);
275 if (U_FAILURE(status
) || result
== NULL
) {
276 log_err_status(status
, "Error: Break iterator is valid for opening search\n");
279 usearch_close(result
);
281 status
= U_ZERO_ERROR
;
282 result
= usearch_openFromCollator(pattern
, 3, text
, 6, EN_US_
, breakiter
,
284 if (U_FAILURE(status
) || result
== NULL
) {
285 if (EN_US_
== NULL
) {
286 log_data_err("Opening collator failed.\n");
288 log_err("Error: Break iterator is valid for opening search\n");
292 usearch_close(result
);
294 ubrk_close(breakiter
);
299 static void TestInitialization(void)
301 UErrorCode status
= U_ZERO_ERROR
;
303 const UChar text
[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66};
305 UStringSearch
*result
;
307 /* simple test on the pattern ce construction */
311 if (U_FAILURE(status
)) {
312 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
315 result
= usearch_openFromCollator(pattern
, 2, text
, 3, EN_US_
, NULL
,
317 if (U_FAILURE(status
)) {
318 log_err("Error opening search %s\n", u_errorName(status
));
320 usearch_close(result
);
322 /* testing if an extremely large pattern will fail the initialization */
323 for(i
= 0; i
< 512; i
++) {
326 /*uprv_memset(pattern, 0x41, 512);*/
327 result
= usearch_openFromCollator(pattern
, 512, text
, 3, EN_US_
, NULL
,
329 if (U_FAILURE(status
)) {
330 log_err("Error opening search %s\n", u_errorName(status
));
332 usearch_close(result
);
336 static UBool
assertEqualWithUStringSearch( UStringSearch
*strsrch
,
337 const SearchData search
)
341 UErrorCode status
= U_ZERO_ERROR
;
342 int32_t matchindex
= search
.offset
[count
];
344 UChar matchtext
[128];
346 usearch_setAttribute(strsrch
, USEARCH_ELEMENT_COMPARISON
, search
.elemCompare
, &status
);
347 if (U_FAILURE(status
)) {
348 log_err("Error setting USEARCH_ELEMENT_COMPARISON attribute %s\n", u_errorName(status
));
352 if (usearch_getMatchedStart(strsrch
) != USEARCH_DONE
||
353 usearch_getMatchedLength(strsrch
) != 0) {
354 log_err("Error with the initialization of match start and length\n");
356 /* start of following matches */
357 while (U_SUCCESS(status
) && matchindex
>= 0) {
358 uint32_t matchlength
= search
.size
[count
];
359 usearch_next(strsrch
, &status
);
360 if (matchindex
!= usearch_getMatchedStart(strsrch
) ||
361 matchlength
!= (uint32_t)usearch_getMatchedLength(strsrch
)) {
362 char *str
= toCharString(usearch_getText(strsrch
, &textlength
));
363 log_err("Text: %s\n", str
);
364 str
= toCharString(usearch_getPattern(strsrch
, &textlength
));
365 log_err("Pattern: %s\n", str
);
366 log_err("Error following match found at idx,len %d,%d; expected %d,%d\n",
367 usearch_getMatchedStart(strsrch
), usearch_getMatchedLength(strsrch
),
368 matchindex
, matchlength
);
373 if (usearch_getMatchedText(strsrch
, matchtext
, 128, &status
) !=
374 (int32_t) matchlength
|| U_FAILURE(status
) ||
376 usearch_getText(strsrch
, &textlength
) + matchindex
,
377 matchlength
* sizeof(UChar
)) != 0) {
378 log_err("Error getting following matched text\n");
381 matchindex
= search
.offset
[count
];
383 usearch_next(strsrch
, &status
);
384 if (usearch_getMatchedStart(strsrch
) != USEARCH_DONE
||
385 usearch_getMatchedLength(strsrch
) != 0) {
386 char *str
= toCharString(usearch_getText(strsrch
, &textlength
));
387 log_err("Text: %s\n", str
);
388 str
= toCharString(usearch_getPattern(strsrch
, &textlength
));
389 log_err("Pattern: %s\n", str
);
390 log_err("Error following match found at %d %d\n",
391 usearch_getMatchedStart(strsrch
),
392 usearch_getMatchedLength(strsrch
));
395 /* start of preceding matches */
396 count
= count
== 0 ? 0 : count
- 1;
398 matchindex
= search
.offset
[count
];
400 while (U_SUCCESS(status
) && matchindex
>= 0) {
401 uint32_t matchlength
= search
.size
[count
];
402 usearch_previous(strsrch
, &status
);
403 if (matchindex
!= usearch_getMatchedStart(strsrch
) ||
404 matchlength
!= (uint32_t)usearch_getMatchedLength(strsrch
)) {
405 char *str
= toCharString(usearch_getText(strsrch
, &textlength
));
406 log_err("Text: %s\n", str
);
407 str
= toCharString(usearch_getPattern(strsrch
, &textlength
));
408 log_err("Pattern: %s\n", str
);
409 log_err("Error preceding match found at %d %d\n",
410 usearch_getMatchedStart(strsrch
),
411 usearch_getMatchedLength(strsrch
));
415 if (usearch_getMatchedText(strsrch
, matchtext
, 128, &status
) !=
416 (int32_t) matchlength
|| U_FAILURE(status
) ||
418 usearch_getText(strsrch
, &textlength
) + matchindex
,
419 matchlength
* sizeof(UChar
)) != 0) {
420 log_err("Error getting preceding matched text\n");
423 matchindex
= count
> 0 ? search
.offset
[count
- 1] : -1;
426 usearch_previous(strsrch
, &status
);
427 if (usearch_getMatchedStart(strsrch
) != USEARCH_DONE
||
428 usearch_getMatchedLength(strsrch
) != 0) {
429 char *str
= toCharString(usearch_getText(strsrch
, &textlength
));
430 log_err("Text: %s\n", str
);
431 str
= toCharString(usearch_getPattern(strsrch
, &textlength
));
432 log_err("Pattern: %s\n", str
);
433 log_err("Error preceding match found at %d %d\n",
434 usearch_getMatchedStart(strsrch
),
435 usearch_getMatchedLength(strsrch
));
439 usearch_setAttribute(strsrch
, USEARCH_ELEMENT_COMPARISON
, USEARCH_STANDARD_ELEMENT_COMPARISON
, &status
);
443 static UBool
assertEqual(const SearchData search
)
445 UErrorCode status
= U_ZERO_ERROR
;
448 UCollator
*collator
= getCollator(search
.collator
);
449 UBreakIterator
*breaker
= getBreakIterator(search
.breaker
);
450 UStringSearch
*strsrch
;
452 CHECK_BREAK_BOOL(search
.breaker
);
454 u_unescape(search
.text
, text
, 128);
455 u_unescape(search
.pattern
, pattern
, 32);
456 ucol_setStrength(collator
, search
.strength
);
457 strsrch
= usearch_openFromCollator(pattern
, -1, text
, -1, collator
,
459 if (U_FAILURE(status
)) {
460 log_err("Error opening string search %s\n", u_errorName(status
));
464 if (!assertEqualWithUStringSearch(strsrch
, search
)) {
465 ucol_setStrength(collator
, UCOL_TERTIARY
);
466 usearch_close(strsrch
);
469 ucol_setStrength(collator
, UCOL_TERTIARY
);
470 usearch_close(strsrch
);
474 static UBool
assertCanonicalEqual(const SearchData search
)
476 UErrorCode status
= U_ZERO_ERROR
;
479 UCollator
*collator
= getCollator(search
.collator
);
480 UBreakIterator
*breaker
= getBreakIterator(search
.breaker
);
481 UStringSearch
*strsrch
;
484 CHECK_BREAK_BOOL(search
.breaker
);
485 u_unescape(search
.text
, text
, 128);
486 u_unescape(search
.pattern
, pattern
, 32);
487 ucol_setStrength(collator
, search
.strength
);
488 ucol_setAttribute(collator
, UCOL_NORMALIZATION_MODE
, UCOL_ON
, &status
);
489 strsrch
= usearch_openFromCollator(pattern
, -1, text
, -1, collator
,
491 usearch_setAttribute(strsrch
, USEARCH_CANONICAL_MATCH
, USEARCH_ON
,
493 if (U_FAILURE(status
)) {
494 log_err("Error opening string search %s\n", u_errorName(status
));
499 if (!assertEqualWithUStringSearch(strsrch
, search
)) {
500 ucol_setStrength(collator
, UCOL_TERTIARY
);
501 usearch_close(strsrch
);
507 ucol_setAttribute(collator
, UCOL_NORMALIZATION_MODE
, UCOL_OFF
, &status
);
508 ucol_setStrength(collator
, UCOL_TERTIARY
);
509 usearch_close(strsrch
);
513 static UBool
assertEqualWithAttribute(const SearchData search
,
514 USearchAttributeValue canonical
,
515 USearchAttributeValue overlap
)
517 UErrorCode status
= U_ZERO_ERROR
;
520 UCollator
*collator
= getCollator(search
.collator
);
521 UBreakIterator
*breaker
= getBreakIterator(search
.breaker
);
522 UStringSearch
*strsrch
;
524 CHECK_BREAK_BOOL(search
.breaker
);
525 u_unescape(search
.text
, text
, 128);
526 u_unescape(search
.pattern
, pattern
, 32);
527 ucol_setStrength(collator
, search
.strength
);
528 strsrch
= usearch_openFromCollator(pattern
, -1, text
, -1, collator
,
530 usearch_setAttribute(strsrch
, USEARCH_CANONICAL_MATCH
, canonical
,
532 usearch_setAttribute(strsrch
, USEARCH_OVERLAP
, overlap
, &status
);
534 if (U_FAILURE(status
)) {
535 log_err("Error opening string search %s\n", u_errorName(status
));
539 if (!assertEqualWithUStringSearch(strsrch
, search
)) {
540 ucol_setStrength(collator
, UCOL_TERTIARY
);
541 usearch_close(strsrch
);
544 ucol_setStrength(collator
, UCOL_TERTIARY
);
545 usearch_close(strsrch
);
549 static void TestBasic(void)
552 UErrorCode status
= U_ZERO_ERROR
;
554 if (U_FAILURE(status
)) {
555 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
558 while (BASIC
[count
].text
!= NULL
) {
559 if (!assertEqual(BASIC
[count
])) {
560 log_err("Error at test number %d\n", count
);
567 static void TestNormExact(void)
570 UErrorCode status
= U_ZERO_ERROR
;
572 if (U_FAILURE(status
)) {
573 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
576 ucol_setAttribute(EN_US_
, UCOL_NORMALIZATION_MODE
, UCOL_ON
, &status
);
577 if (U_FAILURE(status
)) {
578 log_err("Error setting collation normalization %s\n",
579 u_errorName(status
));
581 while (BASIC
[count
].text
!= NULL
) {
582 if (!assertEqual(BASIC
[count
])) {
583 log_err("Error at test number %d\n", count
);
588 while (NORMEXACT
[count
].text
!= NULL
) {
589 if (!assertEqual(NORMEXACT
[count
])) {
590 log_err("Error at test number %d\n", count
);
594 ucol_setAttribute(EN_US_
, UCOL_NORMALIZATION_MODE
, UCOL_OFF
, &status
);
596 while (NONNORMEXACT
[count
].text
!= NULL
) {
597 if (!assertEqual(NONNORMEXACT
[count
])) {
598 log_err("Error at test number %d\n", count
);
605 static void TestStrength(void)
608 UErrorCode status
= U_ZERO_ERROR
;
610 if (U_FAILURE(status
)) {
611 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
614 while (STRENGTH
[count
].text
!= NULL
) {
615 if (!assertEqual(STRENGTH
[count
])) {
616 log_err("Error at test number %d\n", count
);
623 static void TestBreakIterator(void) {
624 UErrorCode status
= U_ZERO_ERROR
;
625 UStringSearch
*strsrch
;
632 #if !UCONFIG_NO_BREAK_ITERATION
634 if (U_FAILURE(status
)) {
635 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
638 if (usearch_getBreakIterator(NULL
) != NULL
) {
639 log_err("Expected NULL breakiterator from NULL string search\n");
641 u_unescape(BREAKITERATOREXACT
[0].text
, text
, 128);
642 u_unescape(BREAKITERATOREXACT
[0].pattern
, pattern
, 32);
643 strsrch
= usearch_openFromCollator(pattern
, -1, text
, -1, EN_US_
, NULL
,
645 if (U_FAILURE(status
)) {
646 log_err("Error opening string search %s\n", u_errorName(status
));
647 goto ENDTESTBREAKITERATOR
;
650 usearch_setBreakIterator(strsrch
, NULL
, &status
);
651 if (U_FAILURE(status
) || usearch_getBreakIterator(strsrch
) != NULL
) {
652 log_err("Error usearch_getBreakIterator returned wrong object");
653 goto ENDTESTBREAKITERATOR
;
656 usearch_setBreakIterator(strsrch
, EN_CHARACTERBREAKER_
, &status
);
657 if (U_FAILURE(status
) ||
658 usearch_getBreakIterator(strsrch
) != EN_CHARACTERBREAKER_
) {
659 log_err("Error usearch_getBreakIterator returned wrong object");
660 goto ENDTESTBREAKITERATOR
;
663 usearch_setBreakIterator(strsrch
, EN_WORDBREAKER_
, &status
);
664 if (U_FAILURE(status
) ||
665 usearch_getBreakIterator(strsrch
) != EN_WORDBREAKER_
) {
666 log_err("Error usearch_getBreakIterator returned wrong object");
667 goto ENDTESTBREAKITERATOR
;
670 usearch_close(strsrch
);
674 /* 0-3 test are fixed */
675 const SearchData
*search
= &(BREAKITERATOREXACT
[count
]);
676 UCollator
*collator
= getCollator(search
->collator
);
677 UBreakIterator
*breaker
= getBreakIterator(search
->breaker
);
679 u_unescape(search
->text
, text
, 128);
680 u_unescape(search
->pattern
, pattern
, 32);
681 ucol_setStrength(collator
, search
->strength
);
683 strsrch
= usearch_openFromCollator(pattern
, -1, text
, -1, collator
,
685 if (U_FAILURE(status
) ||
686 usearch_getBreakIterator(strsrch
) != breaker
) {
687 log_err("Error setting break iterator\n");
688 if (strsrch
!= NULL
) {
689 usearch_close(strsrch
);
692 if (!assertEqualWithUStringSearch(strsrch
, *search
)) {
693 ucol_setStrength(collator
, UCOL_TERTIARY
);
694 usearch_close(strsrch
);
695 goto ENDTESTBREAKITERATOR
;
697 search
= &(BREAKITERATOREXACT
[count
+ 1]);
698 breaker
= getBreakIterator(search
->breaker
);
699 usearch_setBreakIterator(strsrch
, breaker
, &status
);
700 if (U_FAILURE(status
) || usearch_getBreakIterator(strsrch
) != breaker
) {
701 log_err("Error setting break iterator\n");
702 usearch_close(strsrch
);
703 goto ENDTESTBREAKITERATOR
;
705 usearch_reset(strsrch
);
706 if (!assertEqualWithUStringSearch(strsrch
, *search
)) {
707 log_err("Error at test number %d\n", count
);
708 usearch_close(strsrch
);
709 goto ENDTESTBREAKITERATOR
;
711 usearch_close(strsrch
);
715 while (BREAKITERATOREXACT
[count
].text
!= NULL
) {
716 if (!assertEqual(BREAKITERATOREXACT
[count
])) {
717 log_err("Error at test number %d\n", count
);
718 goto ENDTESTBREAKITERATOR
;
723 ENDTESTBREAKITERATOR
:
728 static void TestVariable(void)
731 UErrorCode status
= U_ZERO_ERROR
;
733 if (U_FAILURE(status
)) {
734 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
737 ucol_setAttribute(EN_US_
, UCOL_ALTERNATE_HANDLING
, UCOL_SHIFTED
, &status
);
738 if (U_FAILURE(status
)) {
739 log_err("Error setting collation alternate attribute %s\n",
740 u_errorName(status
));
742 while (VARIABLE
[count
].text
!= NULL
) {
743 log_verbose("variable %d\n", count
);
744 if (!assertEqual(VARIABLE
[count
])) {
745 log_err("Error at test number %d\n", count
);
749 ucol_setAttribute(EN_US_
, UCOL_ALTERNATE_HANDLING
,
750 UCOL_NON_IGNORABLE
, &status
);
754 static void TestOverlap(void)
757 UErrorCode status
= U_ZERO_ERROR
;
759 if (U_FAILURE(status
)) {
760 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
763 while (OVERLAP
[count
].text
!= NULL
) {
764 if (!assertEqualWithAttribute(OVERLAP
[count
], USEARCH_OFF
,
766 log_err("Error at overlap test number %d\n", count
);
771 while (NONOVERLAP
[count
].text
!= NULL
) {
772 if (!assertEqual(NONOVERLAP
[count
])) {
773 log_err("Error at non overlap test number %d\n", count
);
782 const SearchData
*search
= &(OVERLAP
[count
]);
783 UCollator
*collator
= getCollator(search
->collator
);
784 UStringSearch
*strsrch
;
785 status
= U_ZERO_ERROR
;
787 u_unescape(search
->text
, text
, 128);
788 u_unescape(search
->pattern
, pattern
, 32);
789 strsrch
= usearch_openFromCollator(pattern
, -1, text
, -1, collator
,
791 if(status
== U_FILE_ACCESS_ERROR
) {
792 log_data_err("Is your data around?\n");
794 } else if(U_FAILURE(status
)) {
795 log_err("Error opening searcher\n");
798 usearch_setAttribute(strsrch
, USEARCH_OVERLAP
, USEARCH_ON
, &status
);
799 if (U_FAILURE(status
) ||
800 usearch_getAttribute(strsrch
, USEARCH_OVERLAP
) != USEARCH_ON
) {
801 log_err("Error setting overlap option\n");
803 if (!assertEqualWithUStringSearch(strsrch
, *search
)) {
804 usearch_close(strsrch
);
807 search
= &(NONOVERLAP
[count
]);
808 usearch_setAttribute(strsrch
, USEARCH_OVERLAP
, USEARCH_OFF
, &status
);
809 if (U_FAILURE(status
) ||
810 usearch_getAttribute(strsrch
, USEARCH_OVERLAP
) != USEARCH_OFF
) {
811 log_err("Error setting overlap option\n");
813 usearch_reset(strsrch
);
814 if (!assertEqualWithUStringSearch(strsrch
, *search
)) {
815 usearch_close(strsrch
);
816 log_err("Error at test number %d\n", count
);
820 usearch_close(strsrch
);
825 static void TestCollator(void)
827 /* test collator that thinks "o" and "p" are the same thing */
829 UCollator
*tailored
= NULL
;
830 UErrorCode status
= U_ZERO_ERROR
;
833 UStringSearch
*strsrch
;
842 strsrch
= usearch_open(pattern
, 2, text
, 5, "en_US", NULL
, &status
);
843 if(status
== U_FILE_ACCESS_ERROR
) {
844 log_data_err("Is your data around?\n");
846 } else if(U_FAILURE(status
)) {
847 log_err("Error opening searcher\n");
850 tailored
= usearch_getCollator(strsrch
);
851 if (usearch_next(strsrch
, &status
) != -1) {
852 log_err("Error: Found case insensitive match, when we shouldn't\n");
854 ucol_setStrength(tailored
, UCOL_PRIMARY
);
855 usearch_reset(strsrch
);
856 if (usearch_next(strsrch
, &status
) != 1) {
857 log_err("Error: Found case insensitive match not found\n");
859 usearch_close(strsrch
);
863 if (usearch_getCollator(NULL
) != NULL
) {
864 log_err("Expected NULL collator from NULL string search\n");
866 u_unescape(COLLATOR
[0].text
, text
, 128);
867 u_unescape(COLLATOR
[0].pattern
, pattern
, 32);
869 strsrch
= usearch_openFromCollator(pattern
, -1, text
, -1, EN_US_
,
871 if (U_FAILURE(status
)) {
872 log_err("Error opening string search %s\n", u_errorName(status
));
874 if (!assertEqualWithUStringSearch(strsrch
, COLLATOR
[0])) {
875 goto ENDTESTCOLLATOR
;
878 u_unescape(TESTCOLLATORRULE
, rules
, 32);
879 tailored
= ucol_openRules(rules
, -1, UCOL_ON
, COLLATOR
[1].strength
,
881 if (U_FAILURE(status
)) {
882 log_err("Error opening rule based collator %s\n", u_errorName(status
));
885 usearch_setCollator(strsrch
, tailored
, &status
);
886 if (U_FAILURE(status
) || usearch_getCollator(strsrch
) != tailored
) {
887 log_err("Error setting rule based collator\n");
889 usearch_reset(strsrch
);
890 if (!assertEqualWithUStringSearch(strsrch
, COLLATOR
[1])) {
891 goto ENDTESTCOLLATOR
;
894 usearch_setCollator(strsrch
, EN_US_
, &status
);
895 usearch_reset(strsrch
);
896 if (U_FAILURE(status
) || usearch_getCollator(strsrch
) != EN_US_
) {
897 log_err("Error setting rule based collator\n");
899 if (!assertEqualWithUStringSearch(strsrch
, COLLATOR
[0])) {
900 goto ENDTESTCOLLATOR
;
904 usearch_close(strsrch
);
905 if (tailored
!= NULL
) {
906 ucol_close(tailored
);
911 static void TestPattern(void)
913 UStringSearch
*strsrch
;
915 UChar bigpattern
[512];
919 UErrorCode status
= U_ZERO_ERROR
;
922 if (U_FAILURE(status
)) {
923 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
926 if (usearch_getPattern(NULL
, &templength
) != NULL
) {
927 log_err("Error NULL string search expected returning NULL pattern\n");
929 usearch_setPattern(NULL
, pattern
, 3, &status
);
930 if (U_SUCCESS(status
)) {
931 log_err("Error expected setting pattern in NULL strings search\n");
933 status
= U_ZERO_ERROR
;
934 u_unescape(PATTERN
[0].text
, text
, 128);
935 u_unescape(PATTERN
[0].pattern
, pattern
, 32);
937 ucol_setStrength(EN_US_
, PATTERN
[0].strength
);
938 strsrch
= usearch_openFromCollator(pattern
, -1, text
, -1, EN_US_
,
940 if(status
== U_FILE_ACCESS_ERROR
) {
941 log_data_err("Is your data around?\n");
943 } else if(U_FAILURE(status
)) {
944 log_err("Error opening searcher\n");
948 status
= U_ZERO_ERROR
;
949 usearch_setPattern(strsrch
, NULL
, 3, &status
);
950 if (U_SUCCESS(status
)) {
951 log_err("Error expected setting NULL pattern in strings search\n");
953 status
= U_ZERO_ERROR
;
954 usearch_setPattern(strsrch
, pattern
, 0, &status
);
955 if (U_SUCCESS(status
)) {
956 log_err("Error expected setting pattern with length 0 in strings search\n");
958 status
= U_ZERO_ERROR
;
959 if (U_FAILURE(status
)) {
960 log_err("Error opening string search %s\n", u_errorName(status
));
963 temp
= usearch_getPattern(strsrch
, &templength
);
964 if (u_strcmp(pattern
, temp
) != 0) {
965 log_err("Error setting pattern\n");
967 if (!assertEqualWithUStringSearch(strsrch
, PATTERN
[0])) {
971 u_unescape(PATTERN
[1].pattern
, pattern
, 32);
972 usearch_setPattern(strsrch
, pattern
, -1, &status
);
973 temp
= usearch_getPattern(strsrch
, &templength
);
974 if (u_strcmp(pattern
, temp
) != 0) {
975 log_err("Error setting pattern\n");
978 usearch_reset(strsrch
);
979 if (U_FAILURE(status
)) {
980 log_err("Error setting pattern %s\n", u_errorName(status
));
982 if (!assertEqualWithUStringSearch(strsrch
, PATTERN
[1])) {
986 u_unescape(PATTERN
[0].pattern
, pattern
, 32);
987 usearch_setPattern(strsrch
, pattern
, -1, &status
);
988 temp
= usearch_getPattern(strsrch
, &templength
);
989 if (u_strcmp(pattern
, temp
) != 0) {
990 log_err("Error setting pattern\n");
993 usearch_reset(strsrch
);
994 if (U_FAILURE(status
)) {
995 log_err("Error setting pattern %s\n", u_errorName(status
));
997 if (!assertEqualWithUStringSearch(strsrch
, PATTERN
[0])) {
1000 /* enormous pattern size to see if this crashes */
1001 for (templength
= 0; templength
!= 512; templength
++) {
1002 bigpattern
[templength
] = 0x61;
1004 bigpattern
[511] = 0;
1005 usearch_setPattern(strsrch
, bigpattern
, -1, &status
);
1006 if (U_FAILURE(status
)) {
1007 log_err("Error setting pattern with size 512, %s \n",
1008 u_errorName(status
));
1011 ucol_setStrength(EN_US_
, UCOL_TERTIARY
);
1012 if (strsrch
!= NULL
) {
1013 usearch_close(strsrch
);
1018 static void TestText(void)
1020 UStringSearch
*strsrch
;
1025 UErrorCode status
= U_ZERO_ERROR
;
1027 u_unescape(TEXT
[0].text
, text
, 128);
1028 u_unescape(TEXT
[0].pattern
, pattern
, 32);
1031 if (U_FAILURE(status
)) {
1032 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
1036 if (usearch_getText(NULL
, &templength
) != NULL
) {
1037 log_err("Error NULL string search should return NULL text\n");
1040 usearch_setText(NULL
, text
, 10, &status
);
1041 if (U_SUCCESS(status
)) {
1042 log_err("Error NULL string search should have an error when setting text\n");
1045 status
= U_ZERO_ERROR
;
1046 strsrch
= usearch_openFromCollator(pattern
, -1, text
, -1, EN_US_
,
1049 if (U_FAILURE(status
)) {
1050 log_err("Error opening string search %s\n", u_errorName(status
));
1051 goto ENDTESTPATTERN
;
1053 temp
= usearch_getText(strsrch
, &templength
);
1054 if (u_strcmp(text
, temp
) != 0) {
1055 log_err("Error setting text\n");
1057 if (!assertEqualWithUStringSearch(strsrch
, TEXT
[0])) {
1058 goto ENDTESTPATTERN
;
1061 u_unescape(TEXT
[1].text
, text
, 32);
1062 usearch_setText(strsrch
, text
, -1, &status
);
1063 temp
= usearch_getText(strsrch
, &templength
);
1064 if (u_strcmp(text
, temp
) != 0) {
1065 log_err("Error setting text\n");
1066 goto ENDTESTPATTERN
;
1068 if (U_FAILURE(status
)) {
1069 log_err("Error setting text %s\n", u_errorName(status
));
1071 if (!assertEqualWithUStringSearch(strsrch
, TEXT
[1])) {
1072 goto ENDTESTPATTERN
;
1075 u_unescape(TEXT
[0].text
, text
, 32);
1076 usearch_setText(strsrch
, text
, -1, &status
);
1077 temp
= usearch_getText(strsrch
, &templength
);
1078 if (u_strcmp(text
, temp
) != 0) {
1079 log_err("Error setting text\n");
1080 goto ENDTESTPATTERN
;
1082 if (U_FAILURE(status
)) {
1083 log_err("Error setting pattern %s\n", u_errorName(status
));
1085 if (!assertEqualWithUStringSearch(strsrch
, TEXT
[0])) {
1086 goto ENDTESTPATTERN
;
1089 if (strsrch
!= NULL
) {
1090 usearch_close(strsrch
);
1095 static void TestCompositeBoundaries(void)
1098 UErrorCode status
= U_ZERO_ERROR
;
1100 if (U_FAILURE(status
)) {
1101 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
1104 while (COMPOSITEBOUNDARIES
[count
].text
!= NULL
) {
1105 log_verbose("composite %d\n", count
);
1106 if (!assertEqual(COMPOSITEBOUNDARIES
[count
])) {
1107 log_err("Error at test number %d\n", count
);
1114 static void TestGetSetOffset(void)
1116 int searchDataIndex
= 0;
1119 UErrorCode status
= U_ZERO_ERROR
;
1120 UStringSearch
*strsrch
;
1121 memset(pattern
, 0, 32*sizeof(UChar
));
1122 memset(text
, 0, 128*sizeof(UChar
));
1125 if (U_FAILURE(status
)) {
1126 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
1129 if (usearch_getOffset(NULL
) != USEARCH_DONE
) {
1130 log_err("usearch_getOffset(NULL) expected USEARCH_DONE\n");
1132 strsrch
= usearch_openFromCollator(pattern
, 16, text
, 32, EN_US_
, NULL
,
1134 /* testing out of bounds error */
1135 usearch_setOffset(strsrch
, -1, &status
);
1136 if (U_SUCCESS(status
)) {
1137 log_err("Error expecting set offset error\n");
1139 usearch_setOffset(strsrch
, 128, &status
);
1140 if (U_SUCCESS(status
)) {
1141 log_err("Error expecting set offset error\n");
1143 while (BASIC
[searchDataIndex
].text
!= NULL
) {
1145 SearchData search
= BASIC
[searchDataIndex
++];
1146 int32_t matchindex
= search
.offset
[count
];
1149 u_unescape(search
.text
, text
, 128);
1150 u_unescape(search
.pattern
, pattern
, 32);
1151 status
= U_ZERO_ERROR
;
1152 usearch_setText(strsrch
, text
, -1, &status
);
1153 usearch_setPattern(strsrch
, pattern
, -1, &status
);
1154 ucol_setStrength(usearch_getCollator(strsrch
), search
.strength
);
1155 usearch_reset(strsrch
);
1156 while (U_SUCCESS(status
) && matchindex
>= 0) {
1157 uint32_t matchlength
= search
.size
[count
];
1158 usearch_next(strsrch
, &status
);
1159 if (matchindex
!= usearch_getMatchedStart(strsrch
) ||
1160 matchlength
!= (uint32_t)usearch_getMatchedLength(strsrch
)) {
1161 char *str
= toCharString(usearch_getText(strsrch
,
1163 log_err("Text: %s\n", str
);
1164 str
= toCharString(usearch_getPattern(strsrch
, &textlength
));
1165 log_err("Pattern: %s\n", str
);
1166 log_err("Error match found at %d %d\n",
1167 usearch_getMatchedStart(strsrch
),
1168 usearch_getMatchedLength(strsrch
));
1171 usearch_setOffset(strsrch
, matchindex
+ matchlength
, &status
);
1172 usearch_previous(strsrch
, &status
);
1173 if (matchindex
!= usearch_getMatchedStart(strsrch
) ||
1174 matchlength
!= (uint32_t)usearch_getMatchedLength(strsrch
)) {
1175 char *str
= toCharString(usearch_getText(strsrch
,
1177 log_err("Text: %s\n", str
);
1178 str
= toCharString(usearch_getPattern(strsrch
, &textlength
));
1179 log_err("Pattern: %s\n", str
);
1180 log_err("Error match found at %d %d\n",
1181 usearch_getMatchedStart(strsrch
),
1182 usearch_getMatchedLength(strsrch
));
1185 usearch_setOffset(strsrch
, matchindex
+ matchlength
, &status
);
1186 matchindex
= search
.offset
[count
+ 1] == -1 ? -1 :
1187 search
.offset
[count
+ 2];
1188 if (search
.offset
[count
+ 1] != -1) {
1189 usearch_setOffset(strsrch
, search
.offset
[count
+ 1] + 1,
1191 if (usearch_getOffset(strsrch
) != search
.offset
[count
+ 1] + 1) {
1192 log_err("Error setting offset\n");
1199 usearch_next(strsrch
, &status
);
1200 if (usearch_getMatchedStart(strsrch
) != USEARCH_DONE
) {
1201 char *str
= toCharString(usearch_getText(strsrch
, &textlength
));
1202 log_err("Text: %s\n", str
);
1203 str
= toCharString(usearch_getPattern(strsrch
, &textlength
));
1204 log_err("Pattern: %s\n", str
);
1205 log_err("Error match found at %d %d\n",
1206 usearch_getMatchedStart(strsrch
),
1207 usearch_getMatchedLength(strsrch
));
1211 ucol_setStrength(usearch_getCollator(strsrch
), UCOL_TERTIARY
);
1212 usearch_close(strsrch
);
1216 static void TestGetSetAttribute(void)
1218 UErrorCode status
= U_ZERO_ERROR
;
1221 UStringSearch
*strsrch
;
1223 memset(pattern
, 0, 32*sizeof(UChar
));
1224 memset(text
, 0, 128*sizeof(UChar
));
1227 if (U_FAILURE(status
)) {
1228 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
1231 if (usearch_getAttribute(NULL
, USEARCH_OVERLAP
) != USEARCH_DEFAULT
||
1232 usearch_getAttribute(NULL
, USEARCH_CANONICAL_MATCH
) !=
1235 "Attributes for NULL string search should be USEARCH_DEFAULT\n");
1237 strsrch
= usearch_openFromCollator(pattern
, 16, text
, 32, EN_US_
, NULL
,
1239 if (U_FAILURE(status
)) {
1240 log_err("Error opening search %s\n", u_errorName(status
));
1244 usearch_setAttribute(strsrch
, USEARCH_OVERLAP
, USEARCH_DEFAULT
, &status
);
1245 if (U_FAILURE(status
) ||
1246 usearch_getAttribute(strsrch
, USEARCH_OVERLAP
) != USEARCH_OFF
) {
1247 log_err("Error setting overlap to the default\n");
1249 usearch_setAttribute(strsrch
, USEARCH_OVERLAP
, USEARCH_ON
, &status
);
1250 if (U_FAILURE(status
) ||
1251 usearch_getAttribute(strsrch
, USEARCH_OVERLAP
) != USEARCH_ON
) {
1252 log_err("Error setting overlap true\n");
1254 usearch_setAttribute(strsrch
, USEARCH_OVERLAP
, USEARCH_OFF
, &status
);
1255 if (U_FAILURE(status
) ||
1256 usearch_getAttribute(strsrch
, USEARCH_OVERLAP
) != USEARCH_OFF
) {
1257 log_err("Error setting overlap false\n");
1259 usearch_setAttribute(strsrch
, USEARCH_OVERLAP
,
1260 USEARCH_ATTRIBUTE_VALUE_COUNT
, &status
);
1261 if (U_SUCCESS(status
)) {
1262 log_err("Error setting overlap to illegal value\n");
1264 status
= U_ZERO_ERROR
;
1265 usearch_setAttribute(strsrch
, USEARCH_CANONICAL_MATCH
, USEARCH_DEFAULT
,
1267 if (U_FAILURE(status
) ||
1268 usearch_getAttribute(strsrch
, USEARCH_CANONICAL_MATCH
) !=
1270 log_err("Error setting canonical match to the default\n");
1272 usearch_setAttribute(strsrch
, USEARCH_CANONICAL_MATCH
, USEARCH_ON
,
1274 if (U_FAILURE(status
) ||
1275 usearch_getAttribute(strsrch
, USEARCH_CANONICAL_MATCH
) !=
1277 log_err("Error setting canonical match true\n");
1279 usearch_setAttribute(strsrch
, USEARCH_CANONICAL_MATCH
, USEARCH_OFF
,
1281 if (U_FAILURE(status
) ||
1282 usearch_getAttribute(strsrch
, USEARCH_CANONICAL_MATCH
) !=
1284 log_err("Error setting canonical match false\n");
1286 usearch_setAttribute(strsrch
, USEARCH_CANONICAL_MATCH
,
1287 USEARCH_ATTRIBUTE_VALUE_COUNT
, &status
);
1288 if (U_SUCCESS(status
)) {
1289 log_err("Error setting canonical match to illegal value\n");
1291 status
= U_ZERO_ERROR
;
1292 usearch_setAttribute(strsrch
, USEARCH_ATTRIBUTE_COUNT
, USEARCH_DEFAULT
,
1294 if (U_SUCCESS(status
)) {
1295 log_err("Error setting illegal attribute success\n");
1298 usearch_close(strsrch
);
1302 static void TestGetMatch(void)
1305 UErrorCode status
= U_ZERO_ERROR
;
1308 SearchData search
= MATCH
[0];
1309 int32_t matchindex
= search
.offset
[count
];
1310 UStringSearch
*strsrch
;
1312 UChar matchtext
[128];
1315 if (U_FAILURE(status
)) {
1316 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
1320 if (usearch_getMatchedStart(NULL
) != USEARCH_DONE
||
1321 usearch_getMatchedLength(NULL
) != USEARCH_DONE
) {
1323 "Expected start and length of NULL string search should be USEARCH_DONE\n");
1326 u_unescape(search
.text
, text
, 128);
1327 u_unescape(search
.pattern
, pattern
, 32);
1328 strsrch
= usearch_openFromCollator(pattern
, -1, text
, -1, EN_US_
,
1330 if (U_FAILURE(status
)) {
1331 log_err("Error opening string search %s\n", u_errorName(status
));
1332 if (strsrch
!= NULL
) {
1333 usearch_close(strsrch
);
1338 while (U_SUCCESS(status
) && matchindex
>= 0) {
1339 int32_t matchlength
= search
.size
[count
];
1340 usearch_next(strsrch
, &status
);
1341 if (matchindex
!= usearch_getMatchedStart(strsrch
) ||
1342 matchlength
!= usearch_getMatchedLength(strsrch
)) {
1343 char *str
= toCharString(usearch_getText(strsrch
, &textlength
));
1344 log_err("Text: %s\n", str
);
1345 str
= toCharString(usearch_getPattern(strsrch
, &textlength
));
1346 log_err("Pattern: %s\n", str
);
1347 log_err("Error match found at %d %d\n",
1348 usearch_getMatchedStart(strsrch
),
1349 usearch_getMatchedLength(strsrch
));
1354 status
= U_ZERO_ERROR
;
1355 if (usearch_getMatchedText(NULL
, matchtext
, 128, &status
) !=
1356 USEARCH_DONE
|| U_SUCCESS(status
)){
1357 log_err("Error expecting errors with NULL string search\n");
1359 status
= U_ZERO_ERROR
;
1360 if (usearch_getMatchedText(strsrch
, NULL
, 0, &status
) !=
1361 (int32_t)matchlength
|| U_SUCCESS(status
)){
1362 log_err("Error pre-flighting match length\n");
1364 status
= U_ZERO_ERROR
;
1365 if (usearch_getMatchedText(strsrch
, matchtext
, 0, &status
) !=
1366 (int32_t)matchlength
|| U_SUCCESS(status
)){
1367 log_err("Error getting match text with buffer size 0\n");
1369 status
= U_ZERO_ERROR
;
1370 if (usearch_getMatchedText(strsrch
, matchtext
, matchlength
, &status
)
1371 != (int32_t)matchlength
|| matchtext
[matchlength
- 1] == 0 ||
1373 log_err("Error getting match text with exact size\n");
1375 status
= U_ZERO_ERROR
;
1376 if (usearch_getMatchedText(strsrch
, matchtext
, 128, &status
) !=
1377 (int32_t) matchlength
|| U_FAILURE(status
) ||
1379 usearch_getText(strsrch
, &textlength
) + matchindex
,
1380 matchlength
* sizeof(UChar
)) != 0 ||
1381 matchtext
[matchlength
] != 0) {
1382 log_err("Error getting matched text\n");
1385 matchindex
= search
.offset
[count
];
1387 status
= U_ZERO_ERROR
;
1388 usearch_next(strsrch
, &status
);
1389 if (usearch_getMatchedStart(strsrch
) != USEARCH_DONE
||
1390 usearch_getMatchedLength(strsrch
) != 0) {
1391 log_err("Error end of match not found\n");
1393 status
= U_ZERO_ERROR
;
1394 if (usearch_getMatchedText(strsrch
, matchtext
, 128, &status
) !=
1396 log_err("Error getting null matches\n");
1398 usearch_close(strsrch
);
1402 static void TestSetMatch(void)
1405 UErrorCode status
= U_ZERO_ERROR
;
1407 if (U_FAILURE(status
)) {
1408 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
1411 while (MATCH
[count
].text
!= NULL
) {
1412 SearchData search
= MATCH
[count
];
1414 int offsetIndex
= 0;
1417 UStringSearch
*strsrch
;
1418 status
= U_ZERO_ERROR
;
1420 if (usearch_first(NULL
, &status
) != USEARCH_DONE
||
1421 usearch_last(NULL
, &status
) != USEARCH_DONE
) {
1422 log_err("Error getting the first and last match of a NULL string search\n");
1424 u_unescape(search
.text
, text
, 128);
1425 u_unescape(search
.pattern
, pattern
, 32);
1426 strsrch
= usearch_openFromCollator(pattern
, -1, text
, -1, EN_US_
,
1428 if (U_FAILURE(status
)) {
1429 log_err("Error opening string search %s\n", u_errorName(status
));
1430 if (strsrch
!= NULL
) {
1431 usearch_close(strsrch
);
1437 while (search
.offset
[size
] != -1) {
1441 if (usearch_first(strsrch
, &status
) != search
.offset
[0] ||
1442 U_FAILURE(status
)) {
1443 log_err("Error getting first match\n");
1445 if (usearch_last(strsrch
, &status
) != search
.offset
[size
-1] ||
1446 U_FAILURE(status
)) {
1447 log_err("Error getting last match\n");
1450 while (offsetIndex
< size
) {
1451 if (offsetIndex
+ 2 < size
) {
1452 if (usearch_following(strsrch
, search
.offset
[offsetIndex
+ 2] - 1,
1453 &status
) != search
.offset
[offsetIndex
+ 2] ||
1454 U_FAILURE(status
)) {
1455 log_err("Error getting following match at index %d\n",
1456 search
.offset
[offsetIndex
+ 2] - 1);
1459 if (offsetIndex
+ 1 < size
) {
1460 if (usearch_preceding(strsrch
, search
.offset
[offsetIndex
+ 1] +
1461 search
.size
[offsetIndex
+ 1] + 1,
1462 &status
) != search
.offset
[offsetIndex
+ 1] ||
1463 U_FAILURE(status
)) {
1464 log_err("Error getting preceeding match at index %d\n",
1465 search
.offset
[offsetIndex
+ 1] + 1);
1470 status
= U_ZERO_ERROR
;
1471 if (usearch_following(strsrch
, u_strlen(text
), &status
) !=
1473 log_err("Error expecting out of bounds match\n");
1475 if (usearch_preceding(strsrch
, 0, &status
) != USEARCH_DONE
) {
1476 log_err("Error expecting out of bounds match\n");
1479 usearch_close(strsrch
);
1484 static void TestReset(void)
1486 UErrorCode status
= U_ZERO_ERROR
;
1487 UChar text
[] = {0x66, 0x69, 0x73, 0x68, 0x20,
1488 0x66, 0x69, 0x73, 0x68};
1489 UChar pattern
[] = {0x73};
1490 UStringSearch
*strsrch
;
1493 if (U_FAILURE(status
)) {
1494 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
1497 strsrch
= usearch_openFromCollator(pattern
, 1, text
, 9,
1498 EN_US_
, NULL
, &status
);
1499 if (U_FAILURE(status
)) {
1500 log_err("Error opening string search %s\n", u_errorName(status
));
1501 if (strsrch
!= NULL
) {
1502 usearch_close(strsrch
);
1506 usearch_setAttribute(strsrch
, USEARCH_OVERLAP
, USEARCH_ON
, &status
);
1507 usearch_setAttribute(strsrch
, USEARCH_CANONICAL_MATCH
, USEARCH_ON
,
1509 usearch_setOffset(strsrch
, 9, &status
);
1510 if (U_FAILURE(status
)) {
1511 log_err("Error setting attributes and offsets\n");
1514 usearch_reset(strsrch
);
1515 if (usearch_getAttribute(strsrch
, USEARCH_OVERLAP
) != USEARCH_OFF
||
1516 usearch_getAttribute(strsrch
, USEARCH_CANONICAL_MATCH
) !=
1518 usearch_getOffset(strsrch
) != 0 ||
1519 usearch_getMatchedLength(strsrch
) != 0 ||
1520 usearch_getMatchedStart(strsrch
) != USEARCH_DONE
) {
1521 log_err("Error resetting string search\n");
1523 usearch_previous(strsrch
, &status
);
1524 if (usearch_getMatchedStart(strsrch
) != 7 ||
1525 usearch_getMatchedLength(strsrch
) != 1) {
1526 log_err("Error resetting string search\n");
1529 usearch_close(strsrch
);
1533 static void TestSupplementary(void)
1536 UErrorCode status
= U_ZERO_ERROR
;
1538 if (U_FAILURE(status
)) {
1539 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
1542 while (SUPPLEMENTARY
[count
].text
!= NULL
) {
1543 if (!assertEqual(SUPPLEMENTARY
[count
])) {
1544 log_err("Error at test number %d\n", count
);
1551 static void TestContraction(void)
1556 UCollator
*collator
;
1557 UErrorCode status
= U_ZERO_ERROR
;
1559 UStringSearch
*strsrch
;
1560 memset(rules
, 0, 128*sizeof(UChar
));
1561 memset(pattern
, 0, 128*sizeof(UChar
));
1562 memset(text
, 0, 128*sizeof(UChar
));
1564 u_unescape(CONTRACTIONRULE
, rules
, 128);
1565 collator
= ucol_openRules(rules
, u_strlen(rules
), UCOL_ON
,
1566 UCOL_TERTIARY
, NULL
, &status
);
1567 if(status
== U_FILE_ACCESS_ERROR
) {
1568 log_data_err("Is your data around?\n");
1570 } else if(U_FAILURE(status
)) {
1571 log_err("Error opening collator %s\n", u_errorName(status
));
1574 strsrch
= usearch_openFromCollator(pattern
, 1, text
, 1, collator
, NULL
,
1576 if (U_FAILURE(status
)) {
1577 log_err("Error opening string search %s\n", u_errorName(status
));
1580 while (CONTRACTION
[count
].text
!= NULL
) {
1581 u_unescape(CONTRACTION
[count
].text
, text
, 128);
1582 u_unescape(CONTRACTION
[count
].pattern
, pattern
, 128);
1583 usearch_setText(strsrch
, text
, -1, &status
);
1584 usearch_setPattern(strsrch
, pattern
, -1, &status
);
1585 if (!assertEqualWithUStringSearch(strsrch
, CONTRACTION
[count
])) {
1586 log_err("Error at test number %d\n", count
);
1590 usearch_close(strsrch
);
1591 ucol_close(collator
);
1594 static void TestIgnorable(void)
1599 UCollator
*collator
;
1600 UErrorCode status
= U_ZERO_ERROR
;
1601 UStringSearch
*strsrch
;
1604 memset(rules
, 0, 128*sizeof(UChar
));
1605 memset(pattern
, 0, 128*sizeof(UChar
));
1606 memset(text
, 0, 128*sizeof(UChar
));
1608 u_unescape(IGNORABLERULE
, rules
, 128);
1609 collator
= ucol_openRules(rules
, u_strlen(rules
), UCOL_ON
,
1610 IGNORABLE
[count
].strength
, NULL
, &status
);
1611 if(status
== U_FILE_ACCESS_ERROR
) {
1612 log_data_err("Is your data around?\n");
1614 } else if(U_FAILURE(status
)) {
1615 log_err("Error opening collator %s\n", u_errorName(status
));
1618 strsrch
= usearch_openFromCollator(pattern
, 1, text
, 1, collator
, NULL
,
1620 if (U_FAILURE(status
)) {
1621 log_err("Error opening string search %s\n", u_errorName(status
));
1624 while (IGNORABLE
[count
].text
!= NULL
) {
1625 u_unescape(IGNORABLE
[count
].text
, text
, 128);
1626 u_unescape(IGNORABLE
[count
].pattern
, pattern
, 128);
1627 usearch_setText(strsrch
, text
, -1, &status
);
1628 usearch_setPattern(strsrch
, pattern
, -1, &status
);
1629 if (!assertEqualWithUStringSearch(strsrch
, IGNORABLE
[count
])) {
1630 log_err("Error at test number %d\n", count
);
1634 usearch_close(strsrch
);
1635 ucol_close(collator
);
1638 static void TestDiacriticMatch(void)
1642 UErrorCode status
= U_ZERO_ERROR
;
1643 UStringSearch
*strsrch
= NULL
;
1644 UCollator
*coll
= NULL
;
1648 memset(pattern
, 0, 128*sizeof(UChar
));
1649 memset(text
, 0, 128*sizeof(UChar
));
1651 strsrch
= usearch_open(pattern
, 1, text
, 1, uloc_getDefault(), NULL
, &status
);
1652 if (U_FAILURE(status
)) {
1653 log_err_status(status
, "Error opening string search %s\n", u_errorName(status
));
1657 search
= DIACRITICMATCH
[count
];
1658 while (search
.text
!= NULL
) {
1659 if (search
.collator
!= NULL
) {
1660 coll
= ucol_openFromShortString(search
.collator
, FALSE
, NULL
, &status
);
1662 /* Always use "en_US" because some of these tests fail in Danish locales. */
1663 coll
= ucol_open("en_US"/*uloc_getDefault()*/, &status
);
1664 ucol_setStrength(coll
, search
.strength
);
1666 if (U_FAILURE(status
)) {
1667 log_err("Error opening string search collator(\"%s\") %s\n", search
.collator
, u_errorName(status
));
1671 usearch_setCollator(strsrch
, coll
, &status
);
1672 if (U_FAILURE(status
)) {
1673 log_err("Error setting string search collator %s\n", u_errorName(status
));
1677 u_unescape(search
.text
, text
, 128);
1678 u_unescape(search
.pattern
, pattern
, 128);
1679 usearch_setText(strsrch
, text
, -1, &status
);
1680 usearch_setPattern(strsrch
, pattern
, -1, &status
);
1681 if (!assertEqualWithUStringSearch(strsrch
, search
)) {
1682 log_err("Error at test number %d\n", count
);
1686 search
= DIACRITICMATCH
[++count
];
1688 usearch_close(strsrch
);
1691 static void TestCanonical(void)
1694 UErrorCode status
= U_ZERO_ERROR
;
1696 if (U_FAILURE(status
)) {
1697 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
1700 while (BASICCANONICAL
[count
].text
!= NULL
) {
1701 if (!assertCanonicalEqual(BASICCANONICAL
[count
])) {
1702 log_err("Error at test number %d\n", count
);
1709 static void TestNormCanonical(void)
1712 UErrorCode status
= U_ZERO_ERROR
;
1714 if (U_FAILURE(status
)) {
1715 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
1718 ucol_setAttribute(EN_US_
, UCOL_NORMALIZATION_MODE
, UCOL_ON
, &status
);
1720 while (NORMCANONICAL
[count
].text
!= NULL
) {
1721 if (!assertCanonicalEqual(NORMCANONICAL
[count
])) {
1722 log_err("Error at test number %d\n", count
);
1726 ucol_setAttribute(EN_US_
, UCOL_NORMALIZATION_MODE
, UCOL_OFF
, &status
);
1730 static void TestStrengthCanonical(void)
1733 UErrorCode status
= U_ZERO_ERROR
;
1735 if (U_FAILURE(status
)) {
1736 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
1739 while (STRENGTHCANONICAL
[count
].text
!= NULL
) {
1740 if (!assertCanonicalEqual(STRENGTHCANONICAL
[count
])) {
1741 log_err("Error at test number %d\n", count
);
1748 static void TestBreakIteratorCanonical(void) {
1749 UErrorCode status
= U_ZERO_ERROR
;
1754 #if !UCONFIG_NO_BREAK_ITERATION
1757 if (U_FAILURE(status
)) {
1758 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
1762 /* 0-3 test are fixed */
1765 const SearchData
*search
= &(BREAKITERATORCANONICAL
[count
]);
1766 UCollator
*collator
= getCollator(search
->collator
);
1767 UBreakIterator
*breaker
= getBreakIterator(search
->breaker
);
1768 UStringSearch
*strsrch
;
1770 u_unescape(search
->text
, text
, 128);
1771 u_unescape(search
->pattern
, pattern
, 32);
1772 ucol_setStrength(collator
, search
->strength
);
1774 strsrch
= usearch_openFromCollator(pattern
, -1, text
, -1, collator
,
1776 if(status
== U_FILE_ACCESS_ERROR
) {
1777 log_data_err("Is your data around?\n");
1778 goto ENDTESTBREAKITERATOR
;
1779 } else if(U_FAILURE(status
)) {
1780 log_err("Error opening searcher\n");
1781 goto ENDTESTBREAKITERATOR
;
1783 usearch_setAttribute(strsrch
, USEARCH_CANONICAL_MATCH
, USEARCH_ON
,
1785 if (U_FAILURE(status
) ||
1786 usearch_getBreakIterator(strsrch
) != breaker
) {
1787 log_err("Error setting break iterator\n");
1788 usearch_close(strsrch
);
1789 goto ENDTESTBREAKITERATOR
;
1791 if (!assertEqualWithUStringSearch(strsrch
, *search
)) {
1792 ucol_setStrength(collator
, UCOL_TERTIARY
);
1793 usearch_close(strsrch
);
1794 goto ENDTESTBREAKITERATOR
;
1796 search
= &(BREAKITERATOREXACT
[count
+ 1]);
1797 breaker
= getBreakIterator(search
->breaker
);
1798 usearch_setBreakIterator(strsrch
, breaker
, &status
);
1799 if (U_FAILURE(status
) || usearch_getBreakIterator(strsrch
) != breaker
) {
1800 log_err("Error setting break iterator\n");
1801 usearch_close(strsrch
);
1802 goto ENDTESTBREAKITERATOR
;
1804 usearch_reset(strsrch
);
1805 usearch_setAttribute(strsrch
, USEARCH_CANONICAL_MATCH
, USEARCH_ON
,
1807 if (!assertEqualWithUStringSearch(strsrch
, *search
)) {
1808 log_err("Error at test number %d\n", count
);
1809 usearch_close(strsrch
);
1810 goto ENDTESTBREAKITERATOR
;
1812 usearch_close(strsrch
);
1816 while (BREAKITERATORCANONICAL
[count
].text
!= NULL
) {
1817 if (!assertEqual(BREAKITERATORCANONICAL
[count
])) {
1818 log_err("Error at test number %d\n", count
);
1819 goto ENDTESTBREAKITERATOR
;
1824 ENDTESTBREAKITERATOR
:
1829 static void TestVariableCanonical(void)
1832 UErrorCode status
= U_ZERO_ERROR
;
1834 if (U_FAILURE(status
)) {
1835 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
1838 ucol_setAttribute(EN_US_
, UCOL_ALTERNATE_HANDLING
, UCOL_SHIFTED
, &status
);
1839 if (U_FAILURE(status
)) {
1840 log_err("Error setting collation alternate attribute %s\n",
1841 u_errorName(status
));
1843 while (VARIABLE
[count
].text
!= NULL
) {
1844 log_verbose("variable %d\n", count
);
1845 if (!assertCanonicalEqual(VARIABLE
[count
])) {
1846 log_err("Error at test number %d\n", count
);
1850 ucol_setAttribute(EN_US_
, UCOL_ALTERNATE_HANDLING
,
1851 UCOL_NON_IGNORABLE
, &status
);
1855 static void TestOverlapCanonical(void)
1858 UErrorCode status
= U_ZERO_ERROR
;
1860 if (U_FAILURE(status
)) {
1861 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
1864 while (OVERLAPCANONICAL
[count
].text
!= NULL
) {
1865 if (!assertEqualWithAttribute(OVERLAPCANONICAL
[count
], USEARCH_ON
,
1867 log_err("Error at overlap test number %d\n", count
);
1872 while (NONOVERLAP
[count
].text
!= NULL
) {
1873 if (!assertCanonicalEqual(NONOVERLAPCANONICAL
[count
])) {
1874 log_err("Error at non overlap test number %d\n", count
);
1883 const SearchData
*search
= &(OVERLAPCANONICAL
[count
]);
1884 UCollator
*collator
= getCollator(search
->collator
);
1885 UStringSearch
*strsrch
;
1886 status
= U_ZERO_ERROR
;
1888 u_unescape(search
->text
, text
, 128);
1889 u_unescape(search
->pattern
, pattern
, 32);
1890 strsrch
= usearch_openFromCollator(pattern
, -1, text
, -1, collator
,
1892 if(status
== U_FILE_ACCESS_ERROR
) {
1893 log_data_err("Is your data around?\n");
1895 } else if(U_FAILURE(status
)) {
1896 log_err("Error opening searcher\n");
1899 usearch_setAttribute(strsrch
, USEARCH_CANONICAL_MATCH
, USEARCH_ON
,
1901 usearch_setAttribute(strsrch
, USEARCH_OVERLAP
, USEARCH_ON
, &status
);
1902 if (U_FAILURE(status
) ||
1903 usearch_getAttribute(strsrch
, USEARCH_OVERLAP
) != USEARCH_ON
) {
1904 log_err("Error setting overlap option\n");
1906 if (!assertEqualWithUStringSearch(strsrch
, *search
)) {
1907 usearch_close(strsrch
);
1910 search
= &(NONOVERLAPCANONICAL
[count
]);
1911 usearch_setAttribute(strsrch
, USEARCH_OVERLAP
, USEARCH_OFF
, &status
);
1912 if (U_FAILURE(status
) ||
1913 usearch_getAttribute(strsrch
, USEARCH_OVERLAP
) != USEARCH_OFF
) {
1914 log_err("Error setting overlap option\n");
1916 usearch_reset(strsrch
);
1917 if (!assertEqualWithUStringSearch(strsrch
, *search
)) {
1918 usearch_close(strsrch
);
1919 log_err("Error at test number %d\n", count
);
1923 usearch_close(strsrch
);
1928 static void TestCollatorCanonical(void)
1930 /* test collator that thinks "o" and "p" are the same thing */
1932 UCollator
*tailored
= NULL
;
1933 UErrorCode status
= U_ZERO_ERROR
;
1936 UStringSearch
*strsrch
;
1939 if (U_FAILURE(status
)) {
1940 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
1943 u_unescape(COLLATORCANONICAL
[0].text
, text
, 128);
1944 u_unescape(COLLATORCANONICAL
[0].pattern
, pattern
, 32);
1946 strsrch
= usearch_openFromCollator(pattern
, -1, text
, -1, EN_US_
,
1948 if(status
== U_FILE_ACCESS_ERROR
) {
1949 log_data_err("Is your data around?\n");
1951 } else if(U_FAILURE(status
)) {
1952 log_err("Error opening searcher\n");
1955 usearch_setAttribute(strsrch
, USEARCH_CANONICAL_MATCH
, USEARCH_ON
,
1957 if (U_FAILURE(status
)) {
1958 log_err("Error opening string search %s\n", u_errorName(status
));
1960 if (!assertEqualWithUStringSearch(strsrch
, COLLATORCANONICAL
[0])) {
1961 goto ENDTESTCOLLATOR
;
1964 u_unescape(TESTCOLLATORRULE
, rules
, 32);
1965 tailored
= ucol_openRules(rules
, -1, UCOL_ON
,
1966 COLLATORCANONICAL
[1].strength
, NULL
, &status
);
1967 if (U_FAILURE(status
)) {
1968 log_err("Error opening rule based collator %s\n", u_errorName(status
));
1971 usearch_setCollator(strsrch
, tailored
, &status
);
1972 if (U_FAILURE(status
) || usearch_getCollator(strsrch
) != tailored
) {
1973 log_err("Error setting rule based collator\n");
1975 usearch_reset(strsrch
);
1976 usearch_setAttribute(strsrch
, USEARCH_CANONICAL_MATCH
, USEARCH_ON
,
1978 if (!assertEqualWithUStringSearch(strsrch
, COLLATORCANONICAL
[1])) {
1979 goto ENDTESTCOLLATOR
;
1982 usearch_setCollator(strsrch
, EN_US_
, &status
);
1983 usearch_reset(strsrch
);
1984 usearch_setAttribute(strsrch
, USEARCH_CANONICAL_MATCH
, USEARCH_ON
,
1986 if (U_FAILURE(status
) || usearch_getCollator(strsrch
) != EN_US_
) {
1987 log_err("Error setting rule based collator\n");
1989 if (!assertEqualWithUStringSearch(strsrch
, COLLATORCANONICAL
[0])) {
1990 goto ENDTESTCOLLATOR
;
1994 usearch_close(strsrch
);
1995 if (tailored
!= NULL
) {
1996 ucol_close(tailored
);
2001 static void TestPatternCanonical(void)
2003 UStringSearch
*strsrch
;
2008 UErrorCode status
= U_ZERO_ERROR
;
2011 if (U_FAILURE(status
)) {
2012 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
2015 u_unescape(PATTERNCANONICAL
[0].text
, text
, 128);
2016 u_unescape(PATTERNCANONICAL
[0].pattern
, pattern
, 32);
2018 ucol_setStrength(EN_US_
, PATTERNCANONICAL
[0].strength
);
2019 strsrch
= usearch_openFromCollator(pattern
, -1, text
, -1, EN_US_
,
2021 usearch_setAttribute(strsrch
, USEARCH_CANONICAL_MATCH
, USEARCH_ON
,
2023 if (U_FAILURE(status
)) {
2024 log_err("Error opening string search %s\n", u_errorName(status
));
2025 goto ENDTESTPATTERN
;
2027 temp
= usearch_getPattern(strsrch
, &templength
);
2028 if (u_strcmp(pattern
, temp
) != 0) {
2029 log_err("Error setting pattern\n");
2031 if (!assertEqualWithUStringSearch(strsrch
, PATTERNCANONICAL
[0])) {
2032 goto ENDTESTPATTERN
;
2035 u_unescape(PATTERNCANONICAL
[1].pattern
, pattern
, 32);
2036 usearch_setPattern(strsrch
, pattern
, -1, &status
);
2037 temp
= usearch_getPattern(strsrch
, &templength
);
2038 if (u_strcmp(pattern
, temp
) != 0) {
2039 log_err("Error setting pattern\n");
2040 goto ENDTESTPATTERN
;
2042 usearch_reset(strsrch
);
2043 usearch_setAttribute(strsrch
, USEARCH_CANONICAL_MATCH
, USEARCH_ON
,
2045 if (U_FAILURE(status
)) {
2046 log_err("Error setting pattern %s\n", u_errorName(status
));
2048 if (!assertEqualWithUStringSearch(strsrch
, PATTERNCANONICAL
[1])) {
2049 goto ENDTESTPATTERN
;
2052 u_unescape(PATTERNCANONICAL
[0].pattern
, pattern
, 32);
2053 usearch_setPattern(strsrch
, pattern
, -1, &status
);
2054 temp
= usearch_getPattern(strsrch
, &templength
);
2055 if (u_strcmp(pattern
, temp
) != 0) {
2056 log_err("Error setting pattern\n");
2057 goto ENDTESTPATTERN
;
2059 usearch_reset(strsrch
);
2060 usearch_setAttribute(strsrch
, USEARCH_CANONICAL_MATCH
, USEARCH_ON
,
2062 if (U_FAILURE(status
)) {
2063 log_err("Error setting pattern %s\n", u_errorName(status
));
2065 if (!assertEqualWithUStringSearch(strsrch
, PATTERNCANONICAL
[0])) {
2066 goto ENDTESTPATTERN
;
2069 ucol_setStrength(EN_US_
, UCOL_TERTIARY
);
2070 if (strsrch
!= NULL
) {
2071 usearch_close(strsrch
);
2076 static void TestTextCanonical(void)
2078 UStringSearch
*strsrch
;
2083 UErrorCode status
= U_ZERO_ERROR
;
2085 u_unescape(TEXTCANONICAL
[0].text
, text
, 128);
2086 u_unescape(TEXTCANONICAL
[0].pattern
, pattern
, 32);
2089 if (U_FAILURE(status
)) {
2090 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
2093 strsrch
= usearch_openFromCollator(pattern
, -1, text
, -1, EN_US_
,
2095 usearch_setAttribute(strsrch
, USEARCH_CANONICAL_MATCH
, USEARCH_ON
,
2098 if (U_FAILURE(status
)) {
2099 log_err("Error opening string search %s\n", u_errorName(status
));
2100 goto ENDTESTPATTERN
;
2102 temp
= usearch_getText(strsrch
, &templength
);
2103 if (u_strcmp(text
, temp
) != 0) {
2104 log_err("Error setting text\n");
2106 if (!assertEqualWithUStringSearch(strsrch
, TEXTCANONICAL
[0])) {
2107 goto ENDTESTPATTERN
;
2110 u_unescape(TEXTCANONICAL
[1].text
, text
, 32);
2111 usearch_setText(strsrch
, text
, -1, &status
);
2112 temp
= usearch_getText(strsrch
, &templength
);
2113 if (u_strcmp(text
, temp
) != 0) {
2114 log_err("Error setting text\n");
2115 goto ENDTESTPATTERN
;
2117 if (U_FAILURE(status
)) {
2118 log_err("Error setting text %s\n", u_errorName(status
));
2120 if (!assertEqualWithUStringSearch(strsrch
, TEXTCANONICAL
[1])) {
2121 goto ENDTESTPATTERN
;
2124 u_unescape(TEXTCANONICAL
[0].text
, text
, 32);
2125 usearch_setText(strsrch
, text
, -1, &status
);
2126 temp
= usearch_getText(strsrch
, &templength
);
2127 if (u_strcmp(text
, temp
) != 0) {
2128 log_err("Error setting text\n");
2129 goto ENDTESTPATTERN
;
2131 if (U_FAILURE(status
)) {
2132 log_err("Error setting pattern %s\n", u_errorName(status
));
2134 if (!assertEqualWithUStringSearch(strsrch
, TEXTCANONICAL
[0])) {
2135 goto ENDTESTPATTERN
;
2138 if (strsrch
!= NULL
) {
2139 usearch_close(strsrch
);
2144 static void TestCompositeBoundariesCanonical(void)
2147 UErrorCode status
= U_ZERO_ERROR
;
2149 if (U_FAILURE(status
)) {
2150 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
2153 while (COMPOSITEBOUNDARIESCANONICAL
[count
].text
!= NULL
) {
2154 log_verbose("composite %d\n", count
);
2155 if (!assertCanonicalEqual(COMPOSITEBOUNDARIESCANONICAL
[count
])) {
2156 log_err("Error at test number %d\n", count
);
2163 static void TestGetSetOffsetCanonical(void)
2165 int searchDataIndex
= 0;
2168 UErrorCode status
= U_ZERO_ERROR
;
2169 UStringSearch
*strsrch
;
2170 UCollator
*collator
;
2172 memset(pattern
, 0, 32*sizeof(UChar
));
2173 memset(text
, 0, 128*sizeof(UChar
));
2176 if (U_FAILURE(status
)) {
2177 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
2180 strsrch
= usearch_openFromCollator(pattern
, 16, text
, 32, EN_US_
, NULL
,
2183 collator
= usearch_getCollator(strsrch
);
2184 ucol_setAttribute(collator
, UCOL_NORMALIZATION_MODE
, UCOL_ON
, &status
);
2186 usearch_setAttribute(strsrch
, USEARCH_CANONICAL_MATCH
, USEARCH_ON
,
2189 /* testing out of bounds error */
2190 usearch_setOffset(strsrch
, -1, &status
);
2191 if (U_SUCCESS(status
)) {
2192 log_err("Error expecting set offset error\n");
2194 usearch_setOffset(strsrch
, 128, &status
);
2195 if (U_SUCCESS(status
)) {
2196 log_err("Error expecting set offset error\n");
2198 while (BASICCANONICAL
[searchDataIndex
].text
!= NULL
) {
2200 SearchData search
= BASICCANONICAL
[searchDataIndex
++];
2201 int32_t matchindex
= search
.offset
[count
];
2204 if (BASICCANONICAL
[searchDataIndex
].text
== NULL
) {
2205 /* skip the last one */
2209 u_unescape(search
.text
, text
, 128);
2210 u_unescape(search
.pattern
, pattern
, 32);
2211 status
= U_ZERO_ERROR
;
2212 usearch_setText(strsrch
, text
, -1, &status
);
2213 usearch_setPattern(strsrch
, pattern
, -1, &status
);
2214 while (U_SUCCESS(status
) && matchindex
>= 0) {
2215 uint32_t matchlength
= search
.size
[count
];
2216 usearch_next(strsrch
, &status
);
2217 if (matchindex
!= usearch_getMatchedStart(strsrch
) ||
2218 matchlength
!= (uint32_t)usearch_getMatchedLength(strsrch
)) {
2219 char *str
= toCharString(usearch_getText(strsrch
,
2221 log_err("Text: %s\n", str
);
2222 str
= toCharString(usearch_getPattern(strsrch
, &textlength
));
2223 log_err("Pattern: %s\n", str
);
2224 log_err("Error match found at %d %d\n",
2225 usearch_getMatchedStart(strsrch
),
2226 usearch_getMatchedLength(strsrch
));
2229 matchindex
= search
.offset
[count
+ 1] == -1 ? -1 :
2230 search
.offset
[count
+ 2];
2231 if (search
.offset
[count
+ 1] != -1) {
2232 usearch_setOffset(strsrch
, search
.offset
[count
+ 1] + 1,
2234 if (usearch_getOffset(strsrch
) != search
.offset
[count
+ 1] + 1) {
2235 log_err("Error setting offset\n");
2242 usearch_next(strsrch
, &status
);
2243 if (usearch_getMatchedStart(strsrch
) != USEARCH_DONE
) {
2244 char *str
= toCharString(usearch_getText(strsrch
, &textlength
));
2245 log_err("Text: %s\n", str
);
2246 str
= toCharString(usearch_getPattern(strsrch
, &textlength
));
2247 log_err("Pattern: %s\n", str
);
2248 log_err("Error match found at %d %d\n",
2249 usearch_getMatchedStart(strsrch
),
2250 usearch_getMatchedLength(strsrch
));
2256 ucol_setAttribute(collator
, UCOL_NORMALIZATION_MODE
, UCOL_OFF
, &status
);
2257 usearch_close(strsrch
);
2261 static void TestSupplementaryCanonical(void)
2264 UErrorCode status
= U_ZERO_ERROR
;
2266 if (U_FAILURE(status
)) {
2267 log_err_status(status
, "Unable to open static collators %s\n", u_errorName(status
));
2270 while (SUPPLEMENTARYCANONICAL
[count
].text
!= NULL
) {
2271 if (!assertCanonicalEqual(SUPPLEMENTARYCANONICAL
[count
])) {
2272 log_err("Error at test number %d\n", count
);
2279 static void TestContractionCanonical(void)
2284 UCollator
*collator
= NULL
;
2285 UErrorCode status
= U_ZERO_ERROR
;
2287 UStringSearch
*strsrch
= NULL
;
2288 memset(rules
, 0, 128*sizeof(UChar
));
2289 memset(pattern
, 0, 128*sizeof(UChar
));
2290 memset(text
, 0, 128*sizeof(UChar
));
2292 u_unescape(CONTRACTIONRULE
, rules
, 128);
2293 collator
= ucol_openRules(rules
, u_strlen(rules
), UCOL_ON
,
2294 UCOL_TERTIARY
, NULL
, &status
);
2295 if(status
== U_FILE_ACCESS_ERROR
) {
2296 log_data_err("Is your data around?\n");
2298 } else if(U_FAILURE(status
)) {
2299 log_err("Error opening collator %s\n", u_errorName(status
));
2302 strsrch
= usearch_openFromCollator(pattern
, 1, text
, 1, collator
, NULL
,
2304 usearch_setAttribute(strsrch
, USEARCH_CANONICAL_MATCH
, USEARCH_ON
,
2306 if (U_FAILURE(status
)) {
2307 log_err("Error opening string search %s\n", u_errorName(status
));
2310 while (CONTRACTIONCANONICAL
[count
].text
!= NULL
) {
2311 u_unescape(CONTRACTIONCANONICAL
[count
].text
, text
, 128);
2312 u_unescape(CONTRACTIONCANONICAL
[count
].pattern
, pattern
, 128);
2313 usearch_setText(strsrch
, text
, -1, &status
);
2314 usearch_setPattern(strsrch
, pattern
, -1, &status
);
2315 if (!assertEqualWithUStringSearch(strsrch
,
2316 CONTRACTIONCANONICAL
[count
])) {
2317 log_err("Error at test number %d\n", count
);
2321 usearch_close(strsrch
);
2322 ucol_close(collator
);
2325 static void TestNumeric(void) {
2326 UCollator
*coll
= NULL
;
2327 UStringSearch
*strsrch
= NULL
;
2328 UErrorCode status
= U_ZERO_ERROR
;
2332 memset(pattern
, 0, 128*sizeof(UChar
));
2333 memset(text
, 0, 128*sizeof(UChar
));
2335 coll
= ucol_open("", &status
);
2336 if(U_FAILURE(status
)) {
2337 log_data_err("Could not open UCA. Is your data around?\n");
2341 ucol_setAttribute(coll
, UCOL_NUMERIC_COLLATION
, UCOL_ON
, &status
);
2343 strsrch
= usearch_openFromCollator(pattern
, 1, text
, 1, coll
, NULL
, &status
);
2345 if(status
!= U_UNSUPPORTED_ERROR
|| U_SUCCESS(status
)) {
2346 log_err("Expected U_UNSUPPORTED_ERROR when trying to instantiate a search object from a CODAN collator, got %s instead\n", u_errorName(status
));
2348 usearch_close(strsrch
);
2356 /* This test is for ticket 4038 due to incorrect backward searching when certain patterns have a length > 1 */
2357 static void TestForwardBackward(void) {
2358 UErrorCode status
= U_ZERO_ERROR
;
2359 UCollator
*coll
= NULL
;
2360 UStringSearch
*search
= NULL
;
2361 UChar usrcstr
[32], value
[4];
2363 int32_t expectedPos
= 9;
2365 coll
= ucol_open("en_GB", &status
);
2366 if (U_FAILURE(status
)) {
2367 log_err_status(status
, "ucol_open failed: %s\n", u_errorName(status
));
2368 goto exitTestForwardBackward
;
2370 ucol_setAttribute(coll
, UCOL_STRENGTH
, UCOL_PRIMARY
, &status
);
2371 ucol_setAttribute(coll
, UCOL_CASE_LEVEL
, UCOL_ON
, &status
);
2372 ucol_setAttribute(coll
, UCOL_ALTERNATE_HANDLING
, UCOL_NON_IGNORABLE
, &status
);
2374 u_uastrcpy(usrcstr
, "QBitArray::bitarr_data"); /* text */
2375 u_uastrcpy(value
, "::"); /* pattern */
2377 search
= usearch_openFromCollator(value
, 2, usrcstr
, 22, coll
, NULL
, &status
);
2378 if (U_FAILURE(status
)) {
2379 log_err("usearch_openFromCollator failed: %s\n", u_errorName(status
));
2380 goto exitTestForwardBackward
;
2383 usearch_reset(search
);
2384 /* forward search */
2385 pos
= usearch_first(search
, &status
);
2386 if (pos
!= expectedPos
) {
2387 log_err("Expected search result: %d; Got instead: %d\n", expectedPos
, pos
);
2388 goto exitTestForwardBackward
;
2392 usearch_reset(search
);
2393 /* backward search */
2394 pos
= usearch_last(search
, &status
);
2395 if (pos
!= expectedPos
) {
2396 log_err("Expected search result: %d; Got instead: %d\n", expectedPos
, pos
);
2399 exitTestForwardBackward
:
2403 if (search
!= NULL
) {
2404 usearch_close(search
);
2408 #define TEST_ASSERT(x) \
2409 {if (U_FAILURE(x)) {log_err_status(x, "%s:%d: FAIL: test assertion failure \n", __FILE__, __LINE__);\
2412 static void TestSearchForNull(void) {
2415 UStringSearch
*search
;
2422 const UChar zerodigit
= 0x0030; /* 0 */
2423 const UChar nulldigit
= 0x0000; /* null */
2425 /* static const UChar var[(length)+1]=U_DECLARE_UTF16(cs) */
2426 #define PATTERN_LEN 4
2429 U_STRING_DECL(_pattern
, "IS 0", PATTERN_LEN
);
2430 U_STRING_DECL(_text
, "_0IS 0 OK?", TEXT_LEN
);
2431 UChar pattern
[PATTERN_LEN
+ 1], text
[TEXT_LEN
+ 1];
2433 U_STRING_INIT(_pattern
, "IS 0", PATTERN_LEN
);
2434 U_STRING_INIT(_text
, "_0IS 0 OK?", TEXT_LEN
);
2439 for (pos
= 0; pos
< PATTERN_LEN
; pos
++) {
2440 if (_pattern
[pos
] == zerodigit
) {
2441 pattern
[pos
] = nulldigit
;
2443 pattern
[pos
] = _pattern
[pos
];
2446 pattern
[PATTERN_LEN
] = 0x0000;
2448 for (pos
= 0; pos
< TEXT_LEN
; pos
++) {
2449 if (_text
[pos
] == zerodigit
) {
2450 text
[pos
] = nulldigit
;
2452 text
[pos
] = _text
[pos
];
2455 text
[TEXT_LEN
] = 0x0000;
2459 /* create a US-English collator */
2460 coll
= ucol_open("en_US", &ec
);
2462 /* make sure we didn't fail. */
2465 ucol_setStrength(coll
, UCOL_IDENTICAL
);
2467 /* open a search looking for 0 */
2468 search
= usearch_openFromCollator(pattern
, PATTERN_LEN
, text
,
2469 TEXT_LEN
, coll
, NULL
, &ec
);
2472 if (coll
!= NULL
&& search
!= NULL
) {
2473 pos
= usearch_first(search
, &ec
);
2474 len
= usearch_getMatchedLength(search
);
2475 if (pos
!= expectedPos
) {
2476 log_err("Expected search result: %d; Got instead: %d\n", expectedPos
,
2480 if (len
!= expectedLen
) {
2481 log_err("Expected search result length: %d; Got instead: %d\n",
2485 for (pos
= usearch_first(search
, &ec
); pos
!= USEARCH_DONE
; pos
2486 = usearch_next(search
, &ec
)) {
2487 log_verbose("Match at %d\n", pos
);
2491 if (count
!= expectedNum
) {
2492 log_err("Expected %d search hits, found %d\n", expectedNum
, count
);
2497 usearch_close(search
);
2500 static void TestStrengthIdentical(void)
2503 UErrorCode ec
= U_ZERO_ERROR
;
2504 UStringSearch
*search
;
2506 UChar pattern
[] = {0x05E9, 0x0591, 0x05E9};
2507 UChar text
[] = {0x05E9, 0x0592, 0x05E9};
2508 int32_t pLen
= sizeof (pattern
) / sizeof(pattern
[0]);
2509 int32_t tLen
= sizeof(text
) / sizeof (text
[0]);
2510 int32_t expectedPos
= 0;
2511 int32_t expectedLen
= 3;
2516 /* create a US-English collator */
2517 coll
= ucol_open ("en_US", &ec
);
2519 /* make sure we didn't fail. */
2522 ucol_setStrength( coll
, UCOL_TERTIARY
);
2524 /* open a search looking for 0 */
2525 search
= usearch_openFromCollator (pattern
, pLen
, text
, tLen
, coll
, NULL
, &ec
);
2528 if (coll
!= NULL
&& search
!= NULL
) {
2529 pos
= usearch_first(search
, &ec
);
2530 len
= usearch_getMatchedLength(search
);
2532 if(pos
!= expectedPos
) {
2533 log_err("Expected search result: %d; Got instead: %d\n", expectedPos
, pos
);
2536 if(len
!= expectedLen
) {
2537 log_err("Expected search result length: %d; Got instead: %d\n", expectedLen
, len
);
2540 /* Now try it at strength == UCOL_IDENTICAL */
2541 ucol_setStrength(coll
, UCOL_IDENTICAL
);
2542 usearch_reset(search
);
2544 pos
= usearch_first(search
, &ec
);
2545 len
= usearch_getMatchedLength(search
);
2548 log_err("Expected failure for strentgh = UCOL_IDENTICAL: got %d instead.\n", pos
);
2552 usearch_close(search
);
2557 * TestUsingSearchCollator
2560 #define ARRAY_LENGTH(array) (sizeof(array)/sizeof(array[0]))
2563 const UChar
* pattern
;
2564 const int32_t * offsets
;
2566 } PatternAndOffsets
;
2568 static const UChar scKoText
[] = {
2570 /*01*/ 0xAC00, 0x0020, /* simple LV Hangul */
2571 /*03*/ 0xAC01, 0x0020, /* simple LVT Hangul */
2572 /*05*/ 0xAC0F, 0x0020, /* LVTT, last jamo expands for search */
2573 /*07*/ 0xAFFF, 0x0020, /* LLVVVTT, every jamo expands for search */
2574 /*09*/ 0x1100, 0x1161, 0x11A8, 0x0020, /* 0xAC01 as conjoining jamo */
2575 /*13*/ 0x1100, 0x1161, 0x1100, 0x0020, /* 0xAC01 as basic conjoining jamo (per search rules) */
2576 /*17*/ 0x3131, 0x314F, 0x3131, 0x0020, /* 0xAC01 as compatibility jamo */
2577 /*21*/ 0x1100, 0x1161, 0x11B6, 0x0020, /* 0xAC0F as conjoining jamo; last expands for search */
2578 /*25*/ 0x1100, 0x1161, 0x1105, 0x1112, 0x0020, /* 0xAC0F as basic conjoining jamo; last expands for search */
2579 /*30*/ 0x1101, 0x1170, 0x11B6, 0x0020, /* 0xAFFF as conjoining jamo; all expand for search */
2580 /*34*/ 0x00E6, 0x0020, /* small letter ae, expands */
2581 /*36*/ 0x1E4D, 0x0020, /* small letter o with tilde and acute, decomposes */
2585 static const UChar scKoPat0
[] = { 0xAC01, 0 };
2586 static const UChar scKoPat1
[] = { 0x1100, 0x1161, 0x11A8, 0 }; /* 0xAC01 as conjoining jamo */
2587 static const UChar scKoPat2
[] = { 0xAC0F, 0 };
2588 static const UChar scKoPat3
[] = { 0x1100, 0x1161, 0x1105, 0x1112, 0 }; /* 0xAC0F as basic conjoining jamo */
2589 static const UChar scKoPat4
[] = { 0xAFFF, 0 };
2590 static const UChar scKoPat5
[] = { 0x1101, 0x1170, 0x11B6, 0 }; /* 0xAFFF as conjoining jamo */
2592 static const int32_t scKoSrchOff01
[] = { 3, 9, 13 };
2593 static const int32_t scKoSrchOff23
[] = { 5, 21, 25 };
2594 static const int32_t scKoSrchOff45
[] = { 7, 30 };
2596 static const PatternAndOffsets scKoSrchPatternsOffsets
[] = {
2597 { scKoPat0
, scKoSrchOff01
, ARRAY_LENGTH(scKoSrchOff01
) },
2598 { scKoPat1
, scKoSrchOff01
, ARRAY_LENGTH(scKoSrchOff01
) },
2599 { scKoPat2
, scKoSrchOff23
, ARRAY_LENGTH(scKoSrchOff23
) },
2600 { scKoPat3
, scKoSrchOff23
, ARRAY_LENGTH(scKoSrchOff23
) },
2601 { scKoPat4
, scKoSrchOff45
, ARRAY_LENGTH(scKoSrchOff45
) },
2602 { scKoPat5
, scKoSrchOff45
, ARRAY_LENGTH(scKoSrchOff45
) },
2606 static const int32_t scKoStndOff01
[] = { 3, 9 };
2607 static const int32_t scKoStndOff2
[] = { 5, 21 };
2608 static const int32_t scKoStndOff3
[] = { 25 };
2609 static const int32_t scKoStndOff45
[] = { 7, 30 };
2611 static const PatternAndOffsets scKoStndPatternsOffsets
[] = {
2612 { scKoPat0
, scKoStndOff01
, ARRAY_LENGTH(scKoStndOff01
) },
2613 { scKoPat1
, scKoStndOff01
, ARRAY_LENGTH(scKoStndOff01
) },
2614 { scKoPat2
, scKoStndOff2
, ARRAY_LENGTH(scKoStndOff2
) },
2615 { scKoPat3
, scKoStndOff3
, ARRAY_LENGTH(scKoStndOff3
) },
2616 { scKoPat4
, scKoStndOff45
, ARRAY_LENGTH(scKoStndOff45
) },
2617 { scKoPat5
, scKoStndOff45
, ARRAY_LENGTH(scKoStndOff45
) },
2622 const char * locale
;
2624 const PatternAndOffsets
* patternsAndOffsets
;
2627 static const TUSCItem tuscItems
[] = {
2628 { "root", scKoText
, scKoStndPatternsOffsets
},
2630 /* No jamo tailorings in Apple version of search collator currently */
2631 { "root@collation=search", scKoText
, scKoStndPatternsOffsets
},
2632 { "ko@collation=search", scKoText
, scKoStndPatternsOffsets
},
2634 /* Use this when we do have jamo tailorings */
2635 { "root@collation=search", scKoText
, scKoSrchPatternsOffsets
},
2636 { "ko@collation=search", scKoText
, scKoSrchPatternsOffsets
},
2638 { NULL
, NULL
, NULL
}
2641 static const UChar dummyPat
[] = { 0x0061, 0 };
2643 static void TestUsingSearchCollator(void)
2645 const TUSCItem
* tuscItemPtr
;
2646 for (tuscItemPtr
= tuscItems
; tuscItemPtr
->locale
!= NULL
; tuscItemPtr
++) {
2647 UErrorCode status
= U_ZERO_ERROR
;
2648 UCollator
* ucol
= ucol_open(tuscItemPtr
->locale
, &status
);
2649 if ( U_SUCCESS(status
) ) {
2650 UStringSearch
* usrch
= usearch_openFromCollator(dummyPat
, -1, tuscItemPtr
->text
, -1, ucol
, NULL
, &status
);
2651 if ( U_SUCCESS(status
) ) {
2652 const PatternAndOffsets
* patternsOffsetsPtr
;
2653 for ( patternsOffsetsPtr
= tuscItemPtr
->patternsAndOffsets
; patternsOffsetsPtr
->pattern
!= NULL
; patternsOffsetsPtr
++) {
2654 usearch_setPattern(usrch
, patternsOffsetsPtr
->pattern
, -1, &status
);
2655 if ( U_SUCCESS(status
) ) {
2657 const int32_t * nextOffsetPtr
;
2658 const int32_t * limitOffsetPtr
;
2660 usearch_reset(usrch
);
2661 nextOffsetPtr
= patternsOffsetsPtr
->offsets
;
2662 limitOffsetPtr
= patternsOffsetsPtr
->offsets
+ patternsOffsetsPtr
->offsetsLen
;
2664 offset
= usearch_next(usrch
, &status
);
2665 if ( U_FAILURE(status
) || offset
== USEARCH_DONE
) {
2668 if ( nextOffsetPtr
< limitOffsetPtr
) {
2669 if (offset
!= *nextOffsetPtr
) {
2670 log_err("error, locale %s, expected usearch_next %d, got %d\n", tuscItemPtr
->locale
, *nextOffsetPtr
, offset
);
2671 nextOffsetPtr
= limitOffsetPtr
;
2676 log_err("error, locale %s, usearch_next returned more matches than expected\n", tuscItemPtr
->locale
);
2679 if ( U_FAILURE(status
) ) {
2680 log_err("error, locale %s, usearch_next failed: %s\n", tuscItemPtr
->locale
, u_errorName(status
) );
2681 } else if ( nextOffsetPtr
< limitOffsetPtr
) {
2682 log_err("error, locale %s, usearch_next returned fewer matches than expected\n", tuscItemPtr
->locale
);
2685 status
= U_ZERO_ERROR
;
2686 usearch_reset(usrch
);
2687 nextOffsetPtr
= patternsOffsetsPtr
->offsets
+ patternsOffsetsPtr
->offsetsLen
;
2688 limitOffsetPtr
= patternsOffsetsPtr
->offsets
;
2690 offset
= usearch_previous(usrch
, &status
);
2691 if ( U_FAILURE(status
) || offset
== USEARCH_DONE
) {
2694 if ( nextOffsetPtr
> limitOffsetPtr
) {
2696 if (offset
!= *nextOffsetPtr
) {
2697 log_err("error, locale %s, expected usearch_previous %d, got %d\n", tuscItemPtr
->locale
, *nextOffsetPtr
, offset
);
2698 nextOffsetPtr
= limitOffsetPtr
;
2702 log_err("error, locale %s, usearch_previous returned more matches than expected\n", tuscItemPtr
->locale
);
2705 if ( U_FAILURE(status
) ) {
2706 log_err("error, locale %s, usearch_previous failed: %s\n", tuscItemPtr
->locale
, u_errorName(status
) );
2707 } else if ( nextOffsetPtr
> limitOffsetPtr
) {
2708 log_err("error, locale %s, usearch_previous returned fewer matches than expected\n", tuscItemPtr
->locale
);
2712 log_err("error, locale %s, usearch_setPattern failed: %s\n", tuscItemPtr
->locale
, u_errorName(status
) );
2715 usearch_close(usrch
);
2717 log_err("error, locale %s, usearch_openFromCollator failed: %s\n", tuscItemPtr
->locale
, u_errorName(status
) );
2721 log_err("error, locale %s, ucol_open failed: %s\n", tuscItemPtr
->locale
, u_errorName(status
) );
2730 void addSearchTest(TestNode
** root
)
2732 addTest(root
, &TestStart
, "tscoll/usrchtst/TestStart");
2733 addTest(root
, &TestOpenClose
, "tscoll/usrchtst/TestOpenClose");
2734 addTest(root
, &TestInitialization
, "tscoll/usrchtst/TestInitialization");
2735 addTest(root
, &TestBasic
, "tscoll/usrchtst/TestBasic");
2736 addTest(root
, &TestNormExact
, "tscoll/usrchtst/TestNormExact");
2737 addTest(root
, &TestStrength
, "tscoll/usrchtst/TestStrength");
2738 addTest(root
, &TestBreakIterator
, "tscoll/usrchtst/TestBreakIterator");
2739 addTest(root
, &TestVariable
, "tscoll/usrchtst/TestVariable");
2740 addTest(root
, &TestOverlap
, "tscoll/usrchtst/TestOverlap");
2741 addTest(root
, &TestCollator
, "tscoll/usrchtst/TestCollator");
2742 addTest(root
, &TestPattern
, "tscoll/usrchtst/TestPattern");
2743 addTest(root
, &TestText
, "tscoll/usrchtst/TestText");
2744 addTest(root
, &TestCompositeBoundaries
,
2745 "tscoll/usrchtst/TestCompositeBoundaries");
2746 addTest(root
, &TestGetSetOffset
, "tscoll/usrchtst/TestGetSetOffset");
2747 addTest(root
, &TestGetSetAttribute
,
2748 "tscoll/usrchtst/TestGetSetAttribute");
2749 addTest(root
, &TestGetMatch
, "tscoll/usrchtst/TestGetMatch");
2750 addTest(root
, &TestSetMatch
, "tscoll/usrchtst/TestSetMatch");
2751 addTest(root
, &TestReset
, "tscoll/usrchtst/TestReset");
2752 addTest(root
, &TestSupplementary
, "tscoll/usrchtst/TestSupplementary");
2753 addTest(root
, &TestContraction
, "tscoll/usrchtst/TestContraction");
2754 addTest(root
, &TestIgnorable
, "tscoll/usrchtst/TestIgnorable");
2755 addTest(root
, &TestCanonical
, "tscoll/usrchtst/TestCanonical");
2756 addTest(root
, &TestNormCanonical
, "tscoll/usrchtst/TestNormCanonical");
2757 addTest(root
, &TestStrengthCanonical
,
2758 "tscoll/usrchtst/TestStrengthCanonical");
2759 addTest(root
, &TestBreakIteratorCanonical
,
2760 "tscoll/usrchtst/TestBreakIteratorCanonical");
2761 addTest(root
, &TestVariableCanonical
,
2762 "tscoll/usrchtst/TestVariableCanonical");
2763 addTest(root
, &TestOverlapCanonical
,
2764 "tscoll/usrchtst/TestOverlapCanonical");
2765 addTest(root
, &TestCollatorCanonical
,
2766 "tscoll/usrchtst/TestCollatorCanonical");
2767 addTest(root
, &TestPatternCanonical
,
2768 "tscoll/usrchtst/TestPatternCanonical");
2769 addTest(root
, &TestTextCanonical
, "tscoll/usrchtst/TestTextCanonical");
2770 addTest(root
, &TestCompositeBoundariesCanonical
,
2771 "tscoll/usrchtst/TestCompositeBoundariesCanonical");
2772 addTest(root
, &TestGetSetOffsetCanonical
,
2773 "tscoll/usrchtst/TestGetSetOffsetCanonical");
2774 addTest(root
, &TestSupplementaryCanonical
,
2775 "tscoll/usrchtst/TestSupplementaryCanonical");
2776 addTest(root
, &TestContractionCanonical
,
2777 "tscoll/usrchtst/TestContractionCanonical");
2778 addTest(root
, &TestEnd
, "tscoll/usrchtst/TestEnd");
2779 addTest(root
, &TestNumeric
, "tscoll/usrchtst/TestNumeric");
2780 addTest(root
, &TestDiacriticMatch
, "tscoll/usrchtst/TestDiacriticMatch");
2781 addTest(root
, &TestForwardBackward
, "tscoll/usrchtst/TestForwardBackward");
2782 addTest(root
, &TestSearchForNull
, "tscoll/usrchtst/TestSearchForNull");
2783 addTest(root
, &TestStrengthIdentical
, "tscoll/usrchtst/TestStrengthIdentical");
2784 addTest(root
, &TestUsingSearchCollator
, "tscoll/usrchtst/TestUsingSearchCollator");
2787 #endif /* #if !UCONFIG_NO_COLLATION */