1
/********************************************************************
2
* Copyright (c) 2001-2009 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
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
if (usearch_getMatchedStart(strsrch) != USEARCH_DONE ||
347
usearch_getMatchedLength(strsrch) != 0) {
348
log_err("Error with the initialization of match start and length\n");
350
/* start of following matches */
351
while (U_SUCCESS(status) && matchindex >= 0) {
352
uint32_t matchlength = search.size[count];
353
usearch_next(strsrch, &status);
354
if (matchindex != usearch_getMatchedStart(strsrch) ||
355
matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
356
char *str = toCharString(usearch_getText(strsrch, &textlength));
357
log_err("Text: %s\n", str);
358
str = toCharString(usearch_getPattern(strsrch, &textlength));
359
log_err("Pattern: %s\n", str);
360
log_err("Error following match found at %d %d\n",
361
usearch_getMatchedStart(strsrch),
362
usearch_getMatchedLength(strsrch));
367
if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
368
(int32_t) matchlength || U_FAILURE(status) ||
370
usearch_getText(strsrch, &textlength) + matchindex,
371
matchlength * sizeof(UChar)) != 0) {
372
log_err("Error getting following matched text\n");
375
matchindex = search.offset[count];
377
usearch_next(strsrch, &status);
378
if (usearch_getMatchedStart(strsrch) != USEARCH_DONE ||
379
usearch_getMatchedLength(strsrch) != 0) {
380
char *str = toCharString(usearch_getText(strsrch, &textlength));
381
log_err("Text: %s\n", str);
382
str = toCharString(usearch_getPattern(strsrch, &textlength));
383
log_err("Pattern: %s\n", str);
384
log_err("Error following match found at %d %d\n",
385
usearch_getMatchedStart(strsrch),
386
usearch_getMatchedLength(strsrch));
389
/* start of preceding matches */
390
count = count == 0 ? 0 : count - 1;
392
matchindex = search.offset[count];
394
while (U_SUCCESS(status) && matchindex >= 0) {
395
uint32_t matchlength = search.size[count];
396
usearch_previous(strsrch, &status);
397
if (matchindex != usearch_getMatchedStart(strsrch) ||
398
matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
399
char *str = toCharString(usearch_getText(strsrch, &textlength));
400
log_err("Text: %s\n", str);
401
str = toCharString(usearch_getPattern(strsrch, &textlength));
402
log_err("Pattern: %s\n", str);
403
log_err("Error preceding match found at %d %d\n",
404
usearch_getMatchedStart(strsrch),
405
usearch_getMatchedLength(strsrch));
409
if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
410
(int32_t) matchlength || U_FAILURE(status) ||
412
usearch_getText(strsrch, &textlength) + matchindex,
413
matchlength * sizeof(UChar)) != 0) {
414
log_err("Error getting preceding matched text\n");
417
matchindex = count > 0 ? search.offset[count - 1] : -1;
420
usearch_previous(strsrch, &status);
421
if (usearch_getMatchedStart(strsrch) != USEARCH_DONE ||
422
usearch_getMatchedLength(strsrch) != 0) {
423
char *str = toCharString(usearch_getText(strsrch, &textlength));
424
log_err("Text: %s\n", str);
425
str = toCharString(usearch_getPattern(strsrch, &textlength));
426
log_err("Pattern: %s\n", str);
427
log_err("Error preceding match found at %d %d\n",
428
usearch_getMatchedStart(strsrch),
429
usearch_getMatchedLength(strsrch));
436
static UBool assertEqual(const SearchData search)
438
UErrorCode status = U_ZERO_ERROR;
441
UCollator *collator = getCollator(search.collator);
442
UBreakIterator *breaker = getBreakIterator(search.breaker);
443
UStringSearch *strsrch;
445
CHECK_BREAK_BOOL(search.breaker);
447
u_unescape(search.text, text, 128);
448
u_unescape(search.pattern, pattern, 32);
449
ucol_setStrength(collator, search.strength);
450
strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
452
if (U_FAILURE(status)) {
453
log_err("Error opening string search %s\n", u_errorName(status));
457
if (!assertEqualWithUStringSearch(strsrch, search)) {
458
ucol_setStrength(collator, UCOL_TERTIARY);
459
usearch_close(strsrch);
462
ucol_setStrength(collator, UCOL_TERTIARY);
463
usearch_close(strsrch);
467
static UBool assertCanonicalEqual(const SearchData search)
469
UErrorCode status = U_ZERO_ERROR;
472
UCollator *collator = getCollator(search.collator);
473
UBreakIterator *breaker = getBreakIterator(search.breaker);
474
UStringSearch *strsrch;
477
CHECK_BREAK_BOOL(search.breaker);
478
u_unescape(search.text, text, 128);
479
u_unescape(search.pattern, pattern, 32);
480
ucol_setStrength(collator, search.strength);
481
ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
482
strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
484
usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
486
if (U_FAILURE(status)) {
487
log_err("Error opening string search %s\n", u_errorName(status));
492
if (!assertEqualWithUStringSearch(strsrch, search)) {
493
ucol_setStrength(collator, UCOL_TERTIARY);
494
usearch_close(strsrch);
500
ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status);
501
ucol_setStrength(collator, UCOL_TERTIARY);
502
usearch_close(strsrch);
506
static UBool assertEqualWithAttribute(const SearchData search,
507
USearchAttributeValue canonical,
508
USearchAttributeValue overlap)
510
UErrorCode status = U_ZERO_ERROR;
513
UCollator *collator = getCollator(search.collator);
514
UBreakIterator *breaker = getBreakIterator(search.breaker);
515
UStringSearch *strsrch;
517
CHECK_BREAK_BOOL(search.breaker);
518
u_unescape(search.text, text, 128);
519
u_unescape(search.pattern, pattern, 32);
520
ucol_setStrength(collator, search.strength);
521
strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
523
usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, canonical,
525
usearch_setAttribute(strsrch, USEARCH_OVERLAP, overlap, &status);
527
if (U_FAILURE(status)) {
528
log_err("Error opening string search %s\n", u_errorName(status));
532
if (!assertEqualWithUStringSearch(strsrch, search)) {
533
ucol_setStrength(collator, UCOL_TERTIARY);
534
usearch_close(strsrch);
537
ucol_setStrength(collator, UCOL_TERTIARY);
538
usearch_close(strsrch);
542
static void TestBasic(void)
545
UErrorCode status = U_ZERO_ERROR;
547
if (U_FAILURE(status)) {
548
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
551
while (BASIC[count].text != NULL) {
552
if (!assertEqual(BASIC[count])) {
553
log_err("Error at test number %d\n", count);
560
static void TestNormExact(void)
563
UErrorCode status = U_ZERO_ERROR;
565
if (U_FAILURE(status)) {
566
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
569
ucol_setAttribute(EN_US_, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
570
if (U_FAILURE(status)) {
571
log_err("Error setting collation normalization %s\n",
572
u_errorName(status));
574
while (BASIC[count].text != NULL) {
575
if (!assertEqual(BASIC[count])) {
576
log_err("Error at test number %d\n", count);
581
while (NORMEXACT[count].text != NULL) {
582
if (!assertEqual(NORMEXACT[count])) {
583
log_err("Error at test number %d\n", count);
587
ucol_setAttribute(EN_US_, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status);
589
while (NONNORMEXACT[count].text != NULL) {
590
if (!assertEqual(NONNORMEXACT[count])) {
591
log_err("Error at test number %d\n", count);
598
static void TestStrength(void)
601
UErrorCode status = U_ZERO_ERROR;
603
if (U_FAILURE(status)) {
604
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
607
while (STRENGTH[count].text != NULL) {
608
if (!assertEqual(STRENGTH[count])) {
609
log_err("Error at test number %d\n", count);
616
static void TestBreakIterator(void) {
617
UErrorCode status = U_ZERO_ERROR;
618
UStringSearch *strsrch;
625
#if !UCONFIG_NO_BREAK_ITERATION
627
if (U_FAILURE(status)) {
628
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
631
if (usearch_getBreakIterator(NULL) != NULL) {
632
log_err("Expected NULL breakiterator from NULL string search\n");
634
u_unescape(BREAKITERATOREXACT[0].text, text, 128);
635
u_unescape(BREAKITERATOREXACT[0].pattern, pattern, 32);
636
strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_, NULL,
638
if (U_FAILURE(status)) {
639
log_err("Error opening string search %s\n", u_errorName(status));
640
goto ENDTESTBREAKITERATOR;
643
usearch_setBreakIterator(strsrch, NULL, &status);
644
if (U_FAILURE(status) || usearch_getBreakIterator(strsrch) != NULL) {
645
log_err("Error usearch_getBreakIterator returned wrong object");
646
goto ENDTESTBREAKITERATOR;
649
usearch_setBreakIterator(strsrch, EN_CHARACTERBREAKER_, &status);
650
if (U_FAILURE(status) ||
651
usearch_getBreakIterator(strsrch) != EN_CHARACTERBREAKER_) {
652
log_err("Error usearch_getBreakIterator returned wrong object");
653
goto ENDTESTBREAKITERATOR;
656
usearch_setBreakIterator(strsrch, EN_WORDBREAKER_, &status);
657
if (U_FAILURE(status) ||
658
usearch_getBreakIterator(strsrch) != EN_WORDBREAKER_) {
659
log_err("Error usearch_getBreakIterator returned wrong object");
660
goto ENDTESTBREAKITERATOR;
663
usearch_close(strsrch);
667
/* 0-3 test are fixed */
668
const SearchData *search = &(BREAKITERATOREXACT[count]);
669
UCollator *collator = getCollator(search->collator);
670
UBreakIterator *breaker = getBreakIterator(search->breaker);
672
u_unescape(search->text, text, 128);
673
u_unescape(search->pattern, pattern, 32);
674
ucol_setStrength(collator, search->strength);
676
strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
678
if (U_FAILURE(status) ||
679
usearch_getBreakIterator(strsrch) != breaker) {
680
log_err("Error setting break iterator\n");
681
if (strsrch != NULL) {
682
usearch_close(strsrch);
685
if (!assertEqualWithUStringSearch(strsrch, *search)) {
686
ucol_setStrength(collator, UCOL_TERTIARY);
687
usearch_close(strsrch);
688
goto ENDTESTBREAKITERATOR;
690
search = &(BREAKITERATOREXACT[count + 1]);
691
breaker = getBreakIterator(search->breaker);
692
usearch_setBreakIterator(strsrch, breaker, &status);
693
if (U_FAILURE(status) || usearch_getBreakIterator(strsrch) != breaker) {
694
log_err("Error setting break iterator\n");
695
usearch_close(strsrch);
696
goto ENDTESTBREAKITERATOR;
698
usearch_reset(strsrch);
699
if (!assertEqualWithUStringSearch(strsrch, *search)) {
700
log_err("Error at test number %d\n", count);
701
usearch_close(strsrch);
702
goto ENDTESTBREAKITERATOR;
704
usearch_close(strsrch);
708
while (BREAKITERATOREXACT[count].text != NULL) {
709
if (!assertEqual(BREAKITERATOREXACT[count])) {
710
log_err("Error at test number %d\n", count);
711
goto ENDTESTBREAKITERATOR;
716
ENDTESTBREAKITERATOR:
721
static void TestVariable(void)
724
UErrorCode status = U_ZERO_ERROR;
726
if (U_FAILURE(status)) {
727
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
730
ucol_setAttribute(EN_US_, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status);
731
if (U_FAILURE(status)) {
732
log_err("Error setting collation alternate attribute %s\n",
733
u_errorName(status));
735
while (VARIABLE[count].text != NULL) {
736
log_verbose("variable %d\n", count);
737
if (!assertEqual(VARIABLE[count])) {
738
log_err("Error at test number %d\n", count);
742
ucol_setAttribute(EN_US_, UCOL_ALTERNATE_HANDLING,
743
UCOL_NON_IGNORABLE, &status);
747
static void TestOverlap(void)
750
UErrorCode status = U_ZERO_ERROR;
752
if (U_FAILURE(status)) {
753
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
756
while (OVERLAP[count].text != NULL) {
757
if (!assertEqualWithAttribute(OVERLAP[count], USEARCH_OFF,
759
log_err("Error at overlap test number %d\n", count);
764
while (NONOVERLAP[count].text != NULL) {
765
if (!assertEqual(NONOVERLAP[count])) {
766
log_err("Error at non overlap test number %d\n", count);
775
const SearchData *search = &(OVERLAP[count]);
776
UCollator *collator = getCollator(search->collator);
777
UStringSearch *strsrch;
778
status = U_ZERO_ERROR;
780
u_unescape(search->text, text, 128);
781
u_unescape(search->pattern, pattern, 32);
782
strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
784
if(status == U_FILE_ACCESS_ERROR) {
785
log_data_err("Is your data around?\n");
787
} else if(U_FAILURE(status)) {
788
log_err("Error opening searcher\n");
791
usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_ON, &status);
792
if (U_FAILURE(status) ||
793
usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_ON) {
794
log_err("Error setting overlap option\n");
796
if (!assertEqualWithUStringSearch(strsrch, *search)) {
797
usearch_close(strsrch);
800
search = &(NONOVERLAP[count]);
801
usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_OFF, &status);
802
if (U_FAILURE(status) ||
803
usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF) {
804
log_err("Error setting overlap option\n");
806
usearch_reset(strsrch);
807
if (!assertEqualWithUStringSearch(strsrch, *search)) {
808
usearch_close(strsrch);
809
log_err("Error at test number %d\n", count);
813
usearch_close(strsrch);
818
static void TestCollator(void)
820
/* test collator that thinks "o" and "p" are the same thing */
822
UCollator *tailored = NULL;
823
UErrorCode status = U_ZERO_ERROR;
826
UStringSearch *strsrch;
835
strsrch = usearch_open(pattern, 2, text, 5, "en_US", NULL, &status);
836
if(status == U_FILE_ACCESS_ERROR) {
837
log_data_err("Is your data around?\n");
839
} else if(U_FAILURE(status)) {
840
log_err("Error opening searcher\n");
843
tailored = usearch_getCollator(strsrch);
844
if (usearch_next(strsrch, &status) != -1) {
845
log_err("Error: Found case insensitive match, when we shouldn't\n");
847
ucol_setStrength(tailored, UCOL_PRIMARY);
848
usearch_reset(strsrch);
849
if (usearch_next(strsrch, &status) != 1) {
850
log_err("Error: Found case insensitive match not found\n");
852
usearch_close(strsrch);
856
if (usearch_getCollator(NULL) != NULL) {
857
log_err("Expected NULL collator from NULL string search\n");
859
u_unescape(COLLATOR[0].text, text, 128);
860
u_unescape(COLLATOR[0].pattern, pattern, 32);
862
strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
864
if (U_FAILURE(status)) {
865
log_err("Error opening string search %s\n", u_errorName(status));
867
if (!assertEqualWithUStringSearch(strsrch, COLLATOR[0])) {
868
goto ENDTESTCOLLATOR;
871
u_unescape(TESTCOLLATORRULE, rules, 32);
872
tailored = ucol_openRules(rules, -1, UCOL_ON, COLLATOR[1].strength,
874
if (U_FAILURE(status)) {
875
log_err("Error opening rule based collator %s\n", u_errorName(status));
878
usearch_setCollator(strsrch, tailored, &status);
879
if (U_FAILURE(status) || usearch_getCollator(strsrch) != tailored) {
880
log_err("Error setting rule based collator\n");
882
usearch_reset(strsrch);
883
if (!assertEqualWithUStringSearch(strsrch, COLLATOR[1])) {
884
goto ENDTESTCOLLATOR;
887
usearch_setCollator(strsrch, EN_US_, &status);
888
usearch_reset(strsrch);
889
if (U_FAILURE(status) || usearch_getCollator(strsrch) != EN_US_) {
890
log_err("Error setting rule based collator\n");
892
if (!assertEqualWithUStringSearch(strsrch, COLLATOR[0])) {
893
goto ENDTESTCOLLATOR;
897
usearch_close(strsrch);
898
if (tailored != NULL) {
899
ucol_close(tailored);
904
static void TestPattern(void)
906
UStringSearch *strsrch;
908
UChar bigpattern[512];
912
UErrorCode status = U_ZERO_ERROR;
915
if (U_FAILURE(status)) {
916
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
919
if (usearch_getPattern(NULL, &templength) != NULL) {
920
log_err("Error NULL string search expected returning NULL pattern\n");
922
usearch_setPattern(NULL, pattern, 3, &status);
923
if (U_SUCCESS(status)) {
924
log_err("Error expected setting pattern in NULL strings search\n");
926
status = U_ZERO_ERROR;
927
u_unescape(PATTERN[0].text, text, 128);
928
u_unescape(PATTERN[0].pattern, pattern, 32);
930
ucol_setStrength(EN_US_, PATTERN[0].strength);
931
strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
933
if(status == U_FILE_ACCESS_ERROR) {
934
log_data_err("Is your data around?\n");
936
} else if(U_FAILURE(status)) {
937
log_err("Error opening searcher\n");
941
status = U_ZERO_ERROR;
942
usearch_setPattern(strsrch, NULL, 3, &status);
943
if (U_SUCCESS(status)) {
944
log_err("Error expected setting NULL pattern in strings search\n");
946
status = U_ZERO_ERROR;
947
usearch_setPattern(strsrch, pattern, 0, &status);
948
if (U_SUCCESS(status)) {
949
log_err("Error expected setting pattern with length 0 in strings search\n");
951
status = U_ZERO_ERROR;
952
if (U_FAILURE(status)) {
953
log_err("Error opening string search %s\n", u_errorName(status));
956
temp = usearch_getPattern(strsrch, &templength);
957
if (u_strcmp(pattern, temp) != 0) {
958
log_err("Error setting pattern\n");
960
if (!assertEqualWithUStringSearch(strsrch, PATTERN[0])) {
964
u_unescape(PATTERN[1].pattern, pattern, 32);
965
usearch_setPattern(strsrch, pattern, -1, &status);
966
temp = usearch_getPattern(strsrch, &templength);
967
if (u_strcmp(pattern, temp) != 0) {
968
log_err("Error setting pattern\n");
971
usearch_reset(strsrch);
972
if (U_FAILURE(status)) {
973
log_err("Error setting pattern %s\n", u_errorName(status));
975
if (!assertEqualWithUStringSearch(strsrch, PATTERN[1])) {
979
u_unescape(PATTERN[0].pattern, pattern, 32);
980
usearch_setPattern(strsrch, pattern, -1, &status);
981
temp = usearch_getPattern(strsrch, &templength);
982
if (u_strcmp(pattern, temp) != 0) {
983
log_err("Error setting pattern\n");
986
usearch_reset(strsrch);
987
if (U_FAILURE(status)) {
988
log_err("Error setting pattern %s\n", u_errorName(status));
990
if (!assertEqualWithUStringSearch(strsrch, PATTERN[0])) {
993
/* enormous pattern size to see if this crashes */
994
for (templength = 0; templength != 512; templength ++) {
995
bigpattern[templength] = 0x61;
998
usearch_setPattern(strsrch, bigpattern, -1, &status);
999
if (U_FAILURE(status)) {
1000
log_err("Error setting pattern with size 512, %s \n",
1001
u_errorName(status));
1004
ucol_setStrength(EN_US_, UCOL_TERTIARY);
1005
if (strsrch != NULL) {
1006
usearch_close(strsrch);
1011
static void TestText(void)
1013
UStringSearch *strsrch;
1018
UErrorCode status = U_ZERO_ERROR;
1020
u_unescape(TEXT[0].text, text, 128);
1021
u_unescape(TEXT[0].pattern, pattern, 32);
1024
if (U_FAILURE(status)) {
1025
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
1029
if (usearch_getText(NULL, &templength) != NULL) {
1030
log_err("Error NULL string search should return NULL text\n");
1033
usearch_setText(NULL, text, 10, &status);
1034
if (U_SUCCESS(status)) {
1035
log_err("Error NULL string search should have an error when setting text\n");
1038
status = U_ZERO_ERROR;
1039
strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
1042
if (U_FAILURE(status)) {
1043
log_err("Error opening string search %s\n", u_errorName(status));
1044
goto ENDTESTPATTERN;
1046
temp = usearch_getText(strsrch, &templength);
1047
if (u_strcmp(text, temp) != 0) {
1048
log_err("Error setting text\n");
1050
if (!assertEqualWithUStringSearch(strsrch, TEXT[0])) {
1051
goto ENDTESTPATTERN;
1054
u_unescape(TEXT[1].text, text, 32);
1055
usearch_setText(strsrch, text, -1, &status);
1056
temp = usearch_getText(strsrch, &templength);
1057
if (u_strcmp(text, temp) != 0) {
1058
log_err("Error setting text\n");
1059
goto ENDTESTPATTERN;
1061
if (U_FAILURE(status)) {
1062
log_err("Error setting text %s\n", u_errorName(status));
1064
if (!assertEqualWithUStringSearch(strsrch, TEXT[1])) {
1065
goto ENDTESTPATTERN;
1068
u_unescape(TEXT[0].text, text, 32);
1069
usearch_setText(strsrch, text, -1, &status);
1070
temp = usearch_getText(strsrch, &templength);
1071
if (u_strcmp(text, temp) != 0) {
1072
log_err("Error setting text\n");
1073
goto ENDTESTPATTERN;
1075
if (U_FAILURE(status)) {
1076
log_err("Error setting pattern %s\n", u_errorName(status));
1078
if (!assertEqualWithUStringSearch(strsrch, TEXT[0])) {
1079
goto ENDTESTPATTERN;
1082
if (strsrch != NULL) {
1083
usearch_close(strsrch);
1088
static void TestCompositeBoundaries(void)
1091
UErrorCode status = U_ZERO_ERROR;
1093
if (U_FAILURE(status)) {
1094
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
1097
while (COMPOSITEBOUNDARIES[count].text != NULL) {
1098
log_verbose("composite %d\n", count);
1099
if (!assertEqual(COMPOSITEBOUNDARIES[count])) {
1100
log_err("Error at test number %d\n", count);
1107
static void TestGetSetOffset(void)
1112
UErrorCode status = U_ZERO_ERROR;
1113
UStringSearch *strsrch;
1114
memset(pattern, 0, 32*sizeof(UChar));
1115
memset(text, 0, 128*sizeof(UChar));
1118
if (U_FAILURE(status)) {
1119
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
1122
if (usearch_getOffset(NULL) != USEARCH_DONE) {
1123
log_err("usearch_getOffset(NULL) expected USEARCH_DONE\n");
1125
strsrch = usearch_openFromCollator(pattern, 16, text, 32, EN_US_, NULL,
1127
/* testing out of bounds error */
1128
usearch_setOffset(strsrch, -1, &status);
1129
if (U_SUCCESS(status)) {
1130
log_err("Error expecting set offset error\n");
1132
usearch_setOffset(strsrch, 128, &status);
1133
if (U_SUCCESS(status)) {
1134
log_err("Error expecting set offset error\n");
1136
while (BASIC[index].text != NULL) {
1138
SearchData search = BASIC[index ++];
1139
int32_t matchindex = search.offset[count];
1142
u_unescape(search.text, text, 128);
1143
u_unescape(search.pattern, pattern, 32);
1144
status = U_ZERO_ERROR;
1145
usearch_setText(strsrch, text, -1, &status);
1146
usearch_setPattern(strsrch, pattern, -1, &status);
1147
ucol_setStrength(usearch_getCollator(strsrch), search.strength);
1148
usearch_reset(strsrch);
1149
while (U_SUCCESS(status) && matchindex >= 0) {
1150
uint32_t matchlength = search.size[count];
1151
usearch_next(strsrch, &status);
1152
if (matchindex != usearch_getMatchedStart(strsrch) ||
1153
matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
1154
char *str = toCharString(usearch_getText(strsrch,
1156
log_err("Text: %s\n", str);
1157
str = toCharString(usearch_getPattern(strsrch, &textlength));
1158
log_err("Pattern: %s\n", str);
1159
log_err("Error match found at %d %d\n",
1160
usearch_getMatchedStart(strsrch),
1161
usearch_getMatchedLength(strsrch));
1164
usearch_setOffset(strsrch, matchindex + matchlength, &status);
1165
usearch_previous(strsrch, &status);
1166
if (matchindex != usearch_getMatchedStart(strsrch) ||
1167
matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
1168
char *str = toCharString(usearch_getText(strsrch,
1170
log_err("Text: %s\n", str);
1171
str = toCharString(usearch_getPattern(strsrch, &textlength));
1172
log_err("Pattern: %s\n", str);
1173
log_err("Error match found at %d %d\n",
1174
usearch_getMatchedStart(strsrch),
1175
usearch_getMatchedLength(strsrch));
1178
usearch_setOffset(strsrch, matchindex + matchlength, &status);
1179
matchindex = search.offset[count + 1] == -1 ? -1 :
1180
search.offset[count + 2];
1181
if (search.offset[count + 1] != -1) {
1182
usearch_setOffset(strsrch, search.offset[count + 1] + 1,
1184
if (usearch_getOffset(strsrch) != search.offset[count + 1] + 1) {
1185
log_err("Error setting offset\n");
1192
usearch_next(strsrch, &status);
1193
if (usearch_getMatchedStart(strsrch) != USEARCH_DONE) {
1194
char *str = toCharString(usearch_getText(strsrch, &textlength));
1195
log_err("Text: %s\n", str);
1196
str = toCharString(usearch_getPattern(strsrch, &textlength));
1197
log_err("Pattern: %s\n", str);
1198
log_err("Error match found at %d %d\n",
1199
usearch_getMatchedStart(strsrch),
1200
usearch_getMatchedLength(strsrch));
1204
ucol_setStrength(usearch_getCollator(strsrch), UCOL_TERTIARY);
1205
usearch_close(strsrch);
1209
static void TestGetSetAttribute(void)
1211
UErrorCode status = U_ZERO_ERROR;
1214
UStringSearch *strsrch;
1216
memset(pattern, 0, 32*sizeof(UChar));
1217
memset(text, 0, 128*sizeof(UChar));
1220
if (U_FAILURE(status)) {
1221
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
1224
if (usearch_getAttribute(NULL, USEARCH_OVERLAP) != USEARCH_DEFAULT ||
1225
usearch_getAttribute(NULL, USEARCH_CANONICAL_MATCH) !=
1228
"Attributes for NULL string search should be USEARCH_DEFAULT\n");
1230
strsrch = usearch_openFromCollator(pattern, 16, text, 32, EN_US_, NULL,
1232
if (U_FAILURE(status)) {
1233
log_err("Error opening search %s\n", u_errorName(status));
1237
usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_DEFAULT, &status);
1238
if (U_FAILURE(status) ||
1239
usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF) {
1240
log_err("Error setting overlap to the default\n");
1242
usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_ON, &status);
1243
if (U_FAILURE(status) ||
1244
usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_ON) {
1245
log_err("Error setting overlap true\n");
1247
usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_OFF, &status);
1248
if (U_FAILURE(status) ||
1249
usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF) {
1250
log_err("Error setting overlap false\n");
1252
usearch_setAttribute(strsrch, USEARCH_OVERLAP,
1253
USEARCH_ATTRIBUTE_VALUE_COUNT, &status);
1254
if (U_SUCCESS(status)) {
1255
log_err("Error setting overlap to illegal value\n");
1257
status = U_ZERO_ERROR;
1258
usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_DEFAULT,
1260
if (U_FAILURE(status) ||
1261
usearch_getAttribute(strsrch, USEARCH_CANONICAL_MATCH) !=
1263
log_err("Error setting canonical match to the default\n");
1265
usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1267
if (U_FAILURE(status) ||
1268
usearch_getAttribute(strsrch, USEARCH_CANONICAL_MATCH) !=
1270
log_err("Error setting canonical match true\n");
1272
usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_OFF,
1274
if (U_FAILURE(status) ||
1275
usearch_getAttribute(strsrch, USEARCH_CANONICAL_MATCH) !=
1277
log_err("Error setting canonical match false\n");
1279
usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH,
1280
USEARCH_ATTRIBUTE_VALUE_COUNT, &status);
1281
if (U_SUCCESS(status)) {
1282
log_err("Error setting canonical match to illegal value\n");
1284
status = U_ZERO_ERROR;
1285
usearch_setAttribute(strsrch, USEARCH_ATTRIBUTE_COUNT, USEARCH_DEFAULT,
1287
if (U_SUCCESS(status)) {
1288
log_err("Error setting illegal attribute success\n");
1291
usearch_close(strsrch);
1295
static void TestGetMatch(void)
1298
UErrorCode status = U_ZERO_ERROR;
1301
SearchData search = MATCH[0];
1302
int32_t matchindex = search.offset[count];
1303
UStringSearch *strsrch;
1305
UChar matchtext[128];
1308
if (U_FAILURE(status)) {
1309
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
1313
if (usearch_getMatchedStart(NULL) != USEARCH_DONE ||
1314
usearch_getMatchedLength(NULL) != USEARCH_DONE) {
1316
"Expected start and length of NULL string search should be USEARCH_DONE\n");
1319
u_unescape(search.text, text, 128);
1320
u_unescape(search.pattern, pattern, 32);
1321
strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
1323
if (U_FAILURE(status)) {
1324
log_err("Error opening string search %s\n", u_errorName(status));
1325
if (strsrch != NULL) {
1326
usearch_close(strsrch);
1331
while (U_SUCCESS(status) && matchindex >= 0) {
1332
int32_t matchlength = search.size[count];
1333
usearch_next(strsrch, &status);
1334
if (matchindex != usearch_getMatchedStart(strsrch) ||
1335
matchlength != usearch_getMatchedLength(strsrch)) {
1336
char *str = toCharString(usearch_getText(strsrch, &textlength));
1337
log_err("Text: %s\n", str);
1338
str = toCharString(usearch_getPattern(strsrch, &textlength));
1339
log_err("Pattern: %s\n", str);
1340
log_err("Error match found at %d %d\n",
1341
usearch_getMatchedStart(strsrch),
1342
usearch_getMatchedLength(strsrch));
1347
status = U_ZERO_ERROR;
1348
if (usearch_getMatchedText(NULL, matchtext, 128, &status) !=
1349
USEARCH_DONE || U_SUCCESS(status)){
1350
log_err("Error expecting errors with NULL string search\n");
1352
status = U_ZERO_ERROR;
1353
if (usearch_getMatchedText(strsrch, NULL, 0, &status) !=
1354
(int32_t)matchlength || U_SUCCESS(status)){
1355
log_err("Error pre-flighting match length\n");
1357
status = U_ZERO_ERROR;
1358
if (usearch_getMatchedText(strsrch, matchtext, 0, &status) !=
1359
(int32_t)matchlength || U_SUCCESS(status)){
1360
log_err("Error getting match text with buffer size 0\n");
1362
status = U_ZERO_ERROR;
1363
if (usearch_getMatchedText(strsrch, matchtext, matchlength, &status)
1364
!= (int32_t)matchlength || matchtext[matchlength - 1] == 0 ||
1366
log_err("Error getting match text with exact size\n");
1368
status = U_ZERO_ERROR;
1369
if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
1370
(int32_t) matchlength || U_FAILURE(status) ||
1372
usearch_getText(strsrch, &textlength) + matchindex,
1373
matchlength * sizeof(UChar)) != 0 ||
1374
matchtext[matchlength] != 0) {
1375
log_err("Error getting matched text\n");
1378
matchindex = search.offset[count];
1380
status = U_ZERO_ERROR;
1381
usearch_next(strsrch, &status);
1382
if (usearch_getMatchedStart(strsrch) != USEARCH_DONE ||
1383
usearch_getMatchedLength(strsrch) != 0) {
1384
log_err("Error end of match not found\n");
1386
status = U_ZERO_ERROR;
1387
if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
1389
log_err("Error getting null matches\n");
1391
usearch_close(strsrch);
1395
static void TestSetMatch(void)
1398
UErrorCode status = U_ZERO_ERROR;
1400
if (U_FAILURE(status)) {
1401
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
1404
while (MATCH[count].text != NULL) {
1405
SearchData search = MATCH[count];
1410
UStringSearch *strsrch;
1411
status = U_ZERO_ERROR;
1413
if (usearch_first(NULL, &status) != USEARCH_DONE ||
1414
usearch_last(NULL, &status) != USEARCH_DONE) {
1415
log_err("Error getting the first and last match of a NULL string search\n");
1417
u_unescape(search.text, text, 128);
1418
u_unescape(search.pattern, pattern, 32);
1419
strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
1421
if (U_FAILURE(status)) {
1422
log_err("Error opening string search %s\n", u_errorName(status));
1423
if (strsrch != NULL) {
1424
usearch_close(strsrch);
1430
while (search.offset[size] != -1) {
1434
if (usearch_first(strsrch, &status) != search.offset[0] ||
1435
U_FAILURE(status)) {
1436
log_err("Error getting first match\n");
1438
if (usearch_last(strsrch, &status) != search.offset[size -1] ||
1439
U_FAILURE(status)) {
1440
log_err("Error getting last match\n");
1443
while (index < size) {
1444
if (index + 2 < size) {
1445
if (usearch_following(strsrch, search.offset[index + 2] - 1,
1446
&status) != search.offset[index + 2] ||
1447
U_FAILURE(status)) {
1448
log_err("Error getting following match at index %d\n",
1449
search.offset[index + 2] - 1);
1452
if (index + 1 < size) {
1453
if (usearch_preceding(strsrch, search.offset[index + 1] +
1454
search.size[index + 1] + 1,
1455
&status) != search.offset[index + 1] ||
1456
U_FAILURE(status)) {
1457
log_err("Error getting preceeding match at index %d\n",
1458
search.offset[index + 1] + 1);
1463
status = U_ZERO_ERROR;
1464
if (usearch_following(strsrch, u_strlen(text), &status) !=
1466
log_err("Error expecting out of bounds match\n");
1468
if (usearch_preceding(strsrch, 0, &status) != USEARCH_DONE) {
1469
log_err("Error expecting out of bounds match\n");
1472
usearch_close(strsrch);
1477
static void TestReset(void)
1479
UErrorCode status = U_ZERO_ERROR;
1480
UChar text[] = {0x66, 0x69, 0x73, 0x68, 0x20,
1481
0x66, 0x69, 0x73, 0x68};
1482
UChar pattern[] = {0x73};
1483
UStringSearch *strsrch;
1486
if (U_FAILURE(status)) {
1487
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
1490
strsrch = usearch_openFromCollator(pattern, 1, text, 9,
1491
EN_US_, NULL, &status);
1492
if (U_FAILURE(status)) {
1493
log_err("Error opening string search %s\n", u_errorName(status));
1494
if (strsrch != NULL) {
1495
usearch_close(strsrch);
1499
usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_ON, &status);
1500
usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1502
usearch_setOffset(strsrch, 9, &status);
1503
if (U_FAILURE(status)) {
1504
log_err("Error setting attributes and offsets\n");
1507
usearch_reset(strsrch);
1508
if (usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF ||
1509
usearch_getAttribute(strsrch, USEARCH_CANONICAL_MATCH) !=
1511
usearch_getOffset(strsrch) != 0 ||
1512
usearch_getMatchedLength(strsrch) != 0 ||
1513
usearch_getMatchedStart(strsrch) != USEARCH_DONE) {
1514
log_err("Error resetting string search\n");
1516
usearch_previous(strsrch, &status);
1517
if (usearch_getMatchedStart(strsrch) != 7 ||
1518
usearch_getMatchedLength(strsrch) != 1) {
1519
log_err("Error resetting string search\n");
1522
usearch_close(strsrch);
1526
static void TestSupplementary(void)
1529
UErrorCode status = U_ZERO_ERROR;
1531
if (U_FAILURE(status)) {
1532
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
1535
while (SUPPLEMENTARY[count].text != NULL) {
1536
if (!assertEqual(SUPPLEMENTARY[count])) {
1537
log_err("Error at test number %d\n", count);
1544
static void TestContraction(void)
1549
UCollator *collator;
1550
UErrorCode status = U_ZERO_ERROR;
1552
UStringSearch *strsrch;
1553
memset(rules, 0, 128*sizeof(UChar));
1554
memset(pattern, 0, 128*sizeof(UChar));
1555
memset(text, 0, 128*sizeof(UChar));
1557
u_unescape(CONTRACTIONRULE, rules, 128);
1558
collator = ucol_openRules(rules, u_strlen(rules), UCOL_ON,
1559
UCOL_TERTIARY, NULL, &status);
1560
if(status == U_FILE_ACCESS_ERROR) {
1561
log_data_err("Is your data around?\n");
1563
} else if(U_FAILURE(status)) {
1564
log_err("Error opening collator %s\n", u_errorName(status));
1567
strsrch = usearch_openFromCollator(pattern, 1, text, 1, collator, NULL,
1569
if (U_FAILURE(status)) {
1570
log_err("Error opening string search %s\n", u_errorName(status));
1573
while (CONTRACTION[count].text != NULL) {
1574
u_unescape(CONTRACTION[count].text, text, 128);
1575
u_unescape(CONTRACTION[count].pattern, pattern, 128);
1576
usearch_setText(strsrch, text, -1, &status);
1577
usearch_setPattern(strsrch, pattern, -1, &status);
1578
if (!assertEqualWithUStringSearch(strsrch, CONTRACTION[count])) {
1579
log_err("Error at test number %d\n", count);
1583
usearch_close(strsrch);
1584
ucol_close(collator);
1587
static void TestIgnorable(void)
1592
UCollator *collator;
1593
UErrorCode status = U_ZERO_ERROR;
1594
UStringSearch *strsrch;
1597
memset(rules, 0, 128*sizeof(UChar));
1598
memset(pattern, 0, 128*sizeof(UChar));
1599
memset(text, 0, 128*sizeof(UChar));
1601
u_unescape(IGNORABLERULE, rules, 128);
1602
collator = ucol_openRules(rules, u_strlen(rules), UCOL_ON,
1603
IGNORABLE[count].strength, NULL, &status);
1604
if(status == U_FILE_ACCESS_ERROR) {
1605
log_data_err("Is your data around?\n");
1607
} else if(U_FAILURE(status)) {
1608
log_err("Error opening collator %s\n", u_errorName(status));
1611
strsrch = usearch_openFromCollator(pattern, 1, text, 1, collator, NULL,
1613
if (U_FAILURE(status)) {
1614
log_err("Error opening string search %s\n", u_errorName(status));
1617
while (IGNORABLE[count].text != NULL) {
1618
u_unescape(IGNORABLE[count].text, text, 128);
1619
u_unescape(IGNORABLE[count].pattern, pattern, 128);
1620
usearch_setText(strsrch, text, -1, &status);
1621
usearch_setPattern(strsrch, pattern, -1, &status);
1622
if (!assertEqualWithUStringSearch(strsrch, IGNORABLE[count])) {
1623
log_err("Error at test number %d\n", count);
1627
usearch_close(strsrch);
1628
ucol_close(collator);
1631
static void TestDiacriticMatch(void)
1635
UErrorCode status = U_ZERO_ERROR;
1636
UStringSearch *strsrch = NULL;
1637
UCollator *coll = NULL;
1641
memset(pattern, 0, 128*sizeof(UChar));
1642
memset(text, 0, 128*sizeof(UChar));
1644
strsrch = usearch_open(pattern, 1, text, 1, uloc_getDefault(), NULL, &status);
1645
if (U_FAILURE(status)) {
1646
log_err_status(status, "Error opening string search %s\n", u_errorName(status));
1650
search = DIACRITICMATCH[count];
1651
while (search.text != NULL) {
1652
if (search.collator != NULL) {
1653
coll = ucol_openFromShortString(search.collator, FALSE, NULL, &status);
1655
/* Always use "en_US" because some of these tests fail in Danish locales. */
1656
coll = ucol_open("en_US"/*uloc_getDefault()*/, &status);
1657
ucol_setStrength(coll, search.strength);
1659
if (U_FAILURE(status)) {
1660
log_err("Error opening string search collator(\"%s\") %s\n", search.collator, u_errorName(status));
1664
usearch_setCollator(strsrch, coll, &status);
1665
if (U_FAILURE(status)) {
1666
log_err("Error setting string search collator %s\n", u_errorName(status));
1670
u_unescape(search.text, text, 128);
1671
u_unescape(search.pattern, pattern, 128);
1672
usearch_setText(strsrch, text, -1, &status);
1673
usearch_setPattern(strsrch, pattern, -1, &status);
1674
if (!assertEqualWithUStringSearch(strsrch, search)) {
1675
log_err("Error at test number %d\n", count);
1679
search = DIACRITICMATCH[++count];
1681
usearch_close(strsrch);
1684
static void TestCanonical(void)
1687
UErrorCode status = U_ZERO_ERROR;
1689
if (U_FAILURE(status)) {
1690
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
1693
while (BASICCANONICAL[count].text != NULL) {
1694
if (!assertCanonicalEqual(BASICCANONICAL[count])) {
1695
log_err("Error at test number %d\n", count);
1702
static void TestNormCanonical(void)
1705
UErrorCode status = U_ZERO_ERROR;
1707
if (U_FAILURE(status)) {
1708
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
1711
ucol_setAttribute(EN_US_, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
1713
while (NORMCANONICAL[count].text != NULL) {
1714
if (!assertCanonicalEqual(NORMCANONICAL[count])) {
1715
log_err("Error at test number %d\n", count);
1719
ucol_setAttribute(EN_US_, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status);
1723
static void TestStrengthCanonical(void)
1726
UErrorCode status = U_ZERO_ERROR;
1728
if (U_FAILURE(status)) {
1729
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
1732
while (STRENGTHCANONICAL[count].text != NULL) {
1733
if (!assertCanonicalEqual(STRENGTHCANONICAL[count])) {
1734
log_err("Error at test number %d\n", count);
1741
static void TestBreakIteratorCanonical(void) {
1742
UErrorCode status = U_ZERO_ERROR;
1747
#if !UCONFIG_NO_BREAK_ITERATION
1750
if (U_FAILURE(status)) {
1751
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
1755
/* 0-3 test are fixed */
1758
const SearchData *search = &(BREAKITERATORCANONICAL[count]);
1759
UCollator *collator = getCollator(search->collator);
1760
UBreakIterator *breaker = getBreakIterator(search->breaker);
1761
UStringSearch *strsrch;
1763
u_unescape(search->text, text, 128);
1764
u_unescape(search->pattern, pattern, 32);
1765
ucol_setStrength(collator, search->strength);
1767
strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
1769
if(status == U_FILE_ACCESS_ERROR) {
1770
log_data_err("Is your data around?\n");
1771
goto ENDTESTBREAKITERATOR;
1772
} else if(U_FAILURE(status)) {
1773
log_err("Error opening searcher\n");
1774
goto ENDTESTBREAKITERATOR;
1776
usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1778
if (U_FAILURE(status) ||
1779
usearch_getBreakIterator(strsrch) != breaker) {
1780
log_err("Error setting break iterator\n");
1781
usearch_close(strsrch);
1782
goto ENDTESTBREAKITERATOR;
1784
if (!assertEqualWithUStringSearch(strsrch, *search)) {
1785
ucol_setStrength(collator, UCOL_TERTIARY);
1786
usearch_close(strsrch);
1787
goto ENDTESTBREAKITERATOR;
1789
search = &(BREAKITERATOREXACT[count + 1]);
1790
breaker = getBreakIterator(search->breaker);
1791
usearch_setBreakIterator(strsrch, breaker, &status);
1792
if (U_FAILURE(status) || usearch_getBreakIterator(strsrch) != breaker) {
1793
log_err("Error setting break iterator\n");
1794
usearch_close(strsrch);
1795
goto ENDTESTBREAKITERATOR;
1797
usearch_reset(strsrch);
1798
usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1800
if (!assertEqualWithUStringSearch(strsrch, *search)) {
1801
log_err("Error at test number %d\n", count);
1802
usearch_close(strsrch);
1803
goto ENDTESTBREAKITERATOR;
1805
usearch_close(strsrch);
1809
while (BREAKITERATORCANONICAL[count].text != NULL) {
1810
if (!assertEqual(BREAKITERATORCANONICAL[count])) {
1811
log_err("Error at test number %d\n", count);
1812
goto ENDTESTBREAKITERATOR;
1817
ENDTESTBREAKITERATOR:
1822
static void TestVariableCanonical(void)
1825
UErrorCode status = U_ZERO_ERROR;
1827
if (U_FAILURE(status)) {
1828
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
1831
ucol_setAttribute(EN_US_, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status);
1832
if (U_FAILURE(status)) {
1833
log_err("Error setting collation alternate attribute %s\n",
1834
u_errorName(status));
1836
while (VARIABLE[count].text != NULL) {
1837
log_verbose("variable %d\n", count);
1838
if (!assertCanonicalEqual(VARIABLE[count])) {
1839
log_err("Error at test number %d\n", count);
1843
ucol_setAttribute(EN_US_, UCOL_ALTERNATE_HANDLING,
1844
UCOL_NON_IGNORABLE, &status);
1848
static void TestOverlapCanonical(void)
1851
UErrorCode status = U_ZERO_ERROR;
1853
if (U_FAILURE(status)) {
1854
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
1857
while (OVERLAPCANONICAL[count].text != NULL) {
1858
if (!assertEqualWithAttribute(OVERLAPCANONICAL[count], USEARCH_ON,
1860
log_err("Error at overlap test number %d\n", count);
1865
while (NONOVERLAP[count].text != NULL) {
1866
if (!assertCanonicalEqual(NONOVERLAPCANONICAL[count])) {
1867
log_err("Error at non overlap test number %d\n", count);
1876
const SearchData *search = &(OVERLAPCANONICAL[count]);
1877
UCollator *collator = getCollator(search->collator);
1878
UStringSearch *strsrch;
1879
status = U_ZERO_ERROR;
1881
u_unescape(search->text, text, 128);
1882
u_unescape(search->pattern, pattern, 32);
1883
strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
1885
if(status == U_FILE_ACCESS_ERROR) {
1886
log_data_err("Is your data around?\n");
1888
} else if(U_FAILURE(status)) {
1889
log_err("Error opening searcher\n");
1892
usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1894
usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_ON, &status);
1895
if (U_FAILURE(status) ||
1896
usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_ON) {
1897
log_err("Error setting overlap option\n");
1899
if (!assertEqualWithUStringSearch(strsrch, *search)) {
1900
usearch_close(strsrch);
1903
search = &(NONOVERLAPCANONICAL[count]);
1904
usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_OFF, &status);
1905
if (U_FAILURE(status) ||
1906
usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF) {
1907
log_err("Error setting overlap option\n");
1909
usearch_reset(strsrch);
1910
if (!assertEqualWithUStringSearch(strsrch, *search)) {
1911
usearch_close(strsrch);
1912
log_err("Error at test number %d\n", count);
1916
usearch_close(strsrch);
1921
static void TestCollatorCanonical(void)
1923
/* test collator that thinks "o" and "p" are the same thing */
1925
UCollator *tailored = NULL;
1926
UErrorCode status = U_ZERO_ERROR;
1929
UStringSearch *strsrch;
1932
if (U_FAILURE(status)) {
1933
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
1936
u_unescape(COLLATORCANONICAL[0].text, text, 128);
1937
u_unescape(COLLATORCANONICAL[0].pattern, pattern, 32);
1939
strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
1941
if(status == U_FILE_ACCESS_ERROR) {
1942
log_data_err("Is your data around?\n");
1944
} else if(U_FAILURE(status)) {
1945
log_err("Error opening searcher\n");
1948
usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1950
if (U_FAILURE(status)) {
1951
log_err("Error opening string search %s\n", u_errorName(status));
1953
if (!assertEqualWithUStringSearch(strsrch, COLLATORCANONICAL[0])) {
1954
goto ENDTESTCOLLATOR;
1957
u_unescape(TESTCOLLATORRULE, rules, 32);
1958
tailored = ucol_openRules(rules, -1, UCOL_ON,
1959
COLLATORCANONICAL[1].strength, NULL, &status);
1960
if (U_FAILURE(status)) {
1961
log_err("Error opening rule based collator %s\n", u_errorName(status));
1964
usearch_setCollator(strsrch, tailored, &status);
1965
if (U_FAILURE(status) || usearch_getCollator(strsrch) != tailored) {
1966
log_err("Error setting rule based collator\n");
1968
usearch_reset(strsrch);
1969
usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1971
if (!assertEqualWithUStringSearch(strsrch, COLLATORCANONICAL[1])) {
1972
goto ENDTESTCOLLATOR;
1975
usearch_setCollator(strsrch, EN_US_, &status);
1976
usearch_reset(strsrch);
1977
usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1979
if (U_FAILURE(status) || usearch_getCollator(strsrch) != EN_US_) {
1980
log_err("Error setting rule based collator\n");
1982
if (!assertEqualWithUStringSearch(strsrch, COLLATORCANONICAL[0])) {
1983
goto ENDTESTCOLLATOR;
1987
usearch_close(strsrch);
1988
if (tailored != NULL) {
1989
ucol_close(tailored);
1994
static void TestPatternCanonical(void)
1996
UStringSearch *strsrch;
2001
UErrorCode status = U_ZERO_ERROR;
2004
if (U_FAILURE(status)) {
2005
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
2008
u_unescape(PATTERNCANONICAL[0].text, text, 128);
2009
u_unescape(PATTERNCANONICAL[0].pattern, pattern, 32);
2011
ucol_setStrength(EN_US_, PATTERNCANONICAL[0].strength);
2012
strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
2014
usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2016
if (U_FAILURE(status)) {
2017
log_err("Error opening string search %s\n", u_errorName(status));
2018
goto ENDTESTPATTERN;
2020
temp = usearch_getPattern(strsrch, &templength);
2021
if (u_strcmp(pattern, temp) != 0) {
2022
log_err("Error setting pattern\n");
2024
if (!assertEqualWithUStringSearch(strsrch, PATTERNCANONICAL[0])) {
2025
goto ENDTESTPATTERN;
2028
u_unescape(PATTERNCANONICAL[1].pattern, pattern, 32);
2029
usearch_setPattern(strsrch, pattern, -1, &status);
2030
temp = usearch_getPattern(strsrch, &templength);
2031
if (u_strcmp(pattern, temp) != 0) {
2032
log_err("Error setting pattern\n");
2033
goto ENDTESTPATTERN;
2035
usearch_reset(strsrch);
2036
usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2038
if (U_FAILURE(status)) {
2039
log_err("Error setting pattern %s\n", u_errorName(status));
2041
if (!assertEqualWithUStringSearch(strsrch, PATTERNCANONICAL[1])) {
2042
goto ENDTESTPATTERN;
2045
u_unescape(PATTERNCANONICAL[0].pattern, pattern, 32);
2046
usearch_setPattern(strsrch, pattern, -1, &status);
2047
temp = usearch_getPattern(strsrch, &templength);
2048
if (u_strcmp(pattern, temp) != 0) {
2049
log_err("Error setting pattern\n");
2050
goto ENDTESTPATTERN;
2052
usearch_reset(strsrch);
2053
usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2055
if (U_FAILURE(status)) {
2056
log_err("Error setting pattern %s\n", u_errorName(status));
2058
if (!assertEqualWithUStringSearch(strsrch, PATTERNCANONICAL[0])) {
2059
goto ENDTESTPATTERN;
2062
ucol_setStrength(EN_US_, UCOL_TERTIARY);
2063
if (strsrch != NULL) {
2064
usearch_close(strsrch);
2069
static void TestTextCanonical(void)
2071
UStringSearch *strsrch;
2076
UErrorCode status = U_ZERO_ERROR;
2078
u_unescape(TEXTCANONICAL[0].text, text, 128);
2079
u_unescape(TEXTCANONICAL[0].pattern, pattern, 32);
2082
if (U_FAILURE(status)) {
2083
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
2086
strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
2088
usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2091
if (U_FAILURE(status)) {
2092
log_err("Error opening string search %s\n", u_errorName(status));
2093
goto ENDTESTPATTERN;
2095
temp = usearch_getText(strsrch, &templength);
2096
if (u_strcmp(text, temp) != 0) {
2097
log_err("Error setting text\n");
2099
if (!assertEqualWithUStringSearch(strsrch, TEXTCANONICAL[0])) {
2100
goto ENDTESTPATTERN;
2103
u_unescape(TEXTCANONICAL[1].text, text, 32);
2104
usearch_setText(strsrch, text, -1, &status);
2105
temp = usearch_getText(strsrch, &templength);
2106
if (u_strcmp(text, temp) != 0) {
2107
log_err("Error setting text\n");
2108
goto ENDTESTPATTERN;
2110
if (U_FAILURE(status)) {
2111
log_err("Error setting text %s\n", u_errorName(status));
2113
if (!assertEqualWithUStringSearch(strsrch, TEXTCANONICAL[1])) {
2114
goto ENDTESTPATTERN;
2117
u_unescape(TEXTCANONICAL[0].text, text, 32);
2118
usearch_setText(strsrch, text, -1, &status);
2119
temp = usearch_getText(strsrch, &templength);
2120
if (u_strcmp(text, temp) != 0) {
2121
log_err("Error setting text\n");
2122
goto ENDTESTPATTERN;
2124
if (U_FAILURE(status)) {
2125
log_err("Error setting pattern %s\n", u_errorName(status));
2127
if (!assertEqualWithUStringSearch(strsrch, TEXTCANONICAL[0])) {
2128
goto ENDTESTPATTERN;
2131
if (strsrch != NULL) {
2132
usearch_close(strsrch);
2137
static void TestCompositeBoundariesCanonical(void)
2140
UErrorCode status = U_ZERO_ERROR;
2142
if (U_FAILURE(status)) {
2143
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
2146
while (COMPOSITEBOUNDARIESCANONICAL[count].text != NULL) {
2147
log_verbose("composite %d\n", count);
2148
if (!assertCanonicalEqual(COMPOSITEBOUNDARIESCANONICAL[count])) {
2149
log_err("Error at test number %d\n", count);
2156
static void TestGetSetOffsetCanonical(void)
2161
UErrorCode status = U_ZERO_ERROR;
2162
UStringSearch *strsrch;
2163
UCollator *collator;
2165
memset(pattern, 0, 32*sizeof(UChar));
2166
memset(text, 0, 128*sizeof(UChar));
2169
if (U_FAILURE(status)) {
2170
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
2173
strsrch = usearch_openFromCollator(pattern, 16, text, 32, EN_US_, NULL,
2176
collator = usearch_getCollator(strsrch);
2177
ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
2179
usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2182
/* testing out of bounds error */
2183
usearch_setOffset(strsrch, -1, &status);
2184
if (U_SUCCESS(status)) {
2185
log_err("Error expecting set offset error\n");
2187
usearch_setOffset(strsrch, 128, &status);
2188
if (U_SUCCESS(status)) {
2189
log_err("Error expecting set offset error\n");
2191
while (BASICCANONICAL[index].text != NULL) {
2193
SearchData search = BASICCANONICAL[index ++];
2194
int32_t matchindex = search.offset[count];
2197
if (BASICCANONICAL[index].text == NULL) {
2198
/* skip the last one */
2202
u_unescape(search.text, text, 128);
2203
u_unescape(search.pattern, pattern, 32);
2204
status = U_ZERO_ERROR;
2205
usearch_setText(strsrch, text, -1, &status);
2206
usearch_setPattern(strsrch, pattern, -1, &status);
2207
while (U_SUCCESS(status) && matchindex >= 0) {
2208
uint32_t matchlength = search.size[count];
2209
usearch_next(strsrch, &status);
2210
if (matchindex != usearch_getMatchedStart(strsrch) ||
2211
matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
2212
char *str = toCharString(usearch_getText(strsrch,
2214
log_err("Text: %s\n", str);
2215
str = toCharString(usearch_getPattern(strsrch, &textlength));
2216
log_err("Pattern: %s\n", str);
2217
log_err("Error match found at %d %d\n",
2218
usearch_getMatchedStart(strsrch),
2219
usearch_getMatchedLength(strsrch));
2222
matchindex = search.offset[count + 1] == -1 ? -1 :
2223
search.offset[count + 2];
2224
if (search.offset[count + 1] != -1) {
2225
usearch_setOffset(strsrch, search.offset[count + 1] + 1,
2227
if (usearch_getOffset(strsrch) != search.offset[count + 1] + 1) {
2228
log_err("Error setting offset\n");
2235
usearch_next(strsrch, &status);
2236
if (usearch_getMatchedStart(strsrch) != USEARCH_DONE) {
2237
char *str = toCharString(usearch_getText(strsrch, &textlength));
2238
log_err("Text: %s\n", str);
2239
str = toCharString(usearch_getPattern(strsrch, &textlength));
2240
log_err("Pattern: %s\n", str);
2241
log_err("Error match found at %d %d\n",
2242
usearch_getMatchedStart(strsrch),
2243
usearch_getMatchedLength(strsrch));
2249
ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status);
2250
usearch_close(strsrch);
2254
static void TestSupplementaryCanonical(void)
2257
UErrorCode status = U_ZERO_ERROR;
2259
if (U_FAILURE(status)) {
2260
log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
2263
while (SUPPLEMENTARYCANONICAL[count].text != NULL) {
2264
if (!assertCanonicalEqual(SUPPLEMENTARYCANONICAL[count])) {
2265
log_err("Error at test number %d\n", count);
2272
static void TestContractionCanonical(void)
2277
UCollator *collator = NULL;
2278
UErrorCode status = U_ZERO_ERROR;
2280
UStringSearch *strsrch = NULL;
2281
memset(rules, 0, 128*sizeof(UChar));
2282
memset(pattern, 0, 128*sizeof(UChar));
2283
memset(text, 0, 128*sizeof(UChar));
2285
u_unescape(CONTRACTIONRULE, rules, 128);
2286
collator = ucol_openRules(rules, u_strlen(rules), UCOL_ON,
2287
UCOL_TERTIARY, NULL, &status);
2288
if(status == U_FILE_ACCESS_ERROR) {
2289
log_data_err("Is your data around?\n");
2291
} else if(U_FAILURE(status)) {
2292
log_err("Error opening collator %s\n", u_errorName(status));
2295
strsrch = usearch_openFromCollator(pattern, 1, text, 1, collator, NULL,
2297
usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2299
if (U_FAILURE(status)) {
2300
log_err("Error opening string search %s\n", u_errorName(status));
2303
while (CONTRACTIONCANONICAL[count].text != NULL) {
2304
u_unescape(CONTRACTIONCANONICAL[count].text, text, 128);
2305
u_unescape(CONTRACTIONCANONICAL[count].pattern, pattern, 128);
2306
usearch_setText(strsrch, text, -1, &status);
2307
usearch_setPattern(strsrch, pattern, -1, &status);
2308
if (!assertEqualWithUStringSearch(strsrch,
2309
CONTRACTIONCANONICAL[count])) {
2310
log_err("Error at test number %d\n", count);
2314
usearch_close(strsrch);
2315
ucol_close(collator);
2318
static void TestNumeric(void) {
2319
UCollator *coll = NULL;
2320
UStringSearch *strsrch = NULL;
2321
UErrorCode status = U_ZERO_ERROR;
2325
memset(pattern, 0, 128*sizeof(UChar));
2326
memset(text, 0, 128*sizeof(UChar));
2328
coll = ucol_open("", &status);
2329
if(U_FAILURE(status)) {
2330
log_data_err("Could not open UCA. Is your data around?\n");
2334
ucol_setAttribute(coll, UCOL_NUMERIC_COLLATION, UCOL_ON, &status);
2336
strsrch = usearch_openFromCollator(pattern, 1, text, 1, coll, NULL, &status);
2338
if(status != U_UNSUPPORTED_ERROR || U_SUCCESS(status)) {
2339
log_err("Expected U_UNSUPPORTED_ERROR when trying to instantiate a search object from a CODAN collator, got %s instead\n", u_errorName(status));
2341
usearch_close(strsrch);
2349
/* This test is for ticket 4038 due to incorrect backward searching when certain patterns have a length > 1 */
2350
static void TestForwardBackward(void) {
2351
UErrorCode status = U_ZERO_ERROR;
2352
UCollator *coll = NULL;
2353
UStringSearch *search = NULL;
2354
UChar usrcstr[32], value[4];
2356
int32_t expectedPos = 9;
2358
coll = ucol_open("en_GB", &status);
2359
if (U_FAILURE(status)) {
2360
log_err_status(status, "ucol_open failed: %s\n", u_errorName(status));
2361
goto exitTestForwardBackward;
2363
ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_PRIMARY, &status);
2364
ucol_setAttribute(coll, UCOL_CASE_LEVEL, UCOL_ON, &status);
2365
ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, &status);
2367
u_uastrcpy(usrcstr, "QBitArray::bitarr_data"); /* text */
2368
u_uastrcpy(value, "::"); /* pattern */
2370
search = usearch_openFromCollator(value, 2, usrcstr, 22, coll, NULL, &status);
2371
if (U_FAILURE(status)) {
2372
log_err("usearch_openFromCollator failed: %s\n", u_errorName(status));
2373
goto exitTestForwardBackward;
2376
usearch_reset(search);
2377
/* forward search */
2378
pos = usearch_first(search, &status);
2379
if (pos != expectedPos) {
2380
log_err("Expected search result: %d; Got instead: %d\n", expectedPos, pos);
2381
goto exitTestForwardBackward;
2385
usearch_reset(search);
2386
/* backward search */
2387
pos = usearch_last(search, &status);
2388
if (pos != expectedPos) {
2389
log_err("Expected search result: %d; Got instead: %d\n", expectedPos, pos);
2392
exitTestForwardBackward :
2396
if (search != NULL) {
2397
usearch_close(search);
2401
#define TEST_ASSERT(x) \
2402
{if (U_FAILURE(x)) {log_err_status(x, "%s:%d: FAIL: test assertion failure \n", __FILE__, __LINE__);\
2405
static void TestSearchForNull(void) {
2408
UStringSearch *search;
2415
const UChar zerodigit = 0x0030; /* 0 */
2416
const UChar nulldigit = 0x0000; /* null */
2418
/* static const UChar var[(length)+1]=U_DECLARE_UTF16(cs) */
2419
#define PATTERN_LEN 4
2422
U_STRING_DECL(_pattern, "IS 0", PATTERN_LEN);
2423
U_STRING_DECL(_text, "_0IS 0 OK?", TEXT_LEN);
2424
UChar pattern[PATTERN_LEN + 1], text[TEXT_LEN + 1];
2426
U_STRING_INIT(_pattern, "IS 0", PATTERN_LEN);
2427
U_STRING_INIT(_text, "_0IS 0 OK?", TEXT_LEN);
2432
for (pos = 0; pos < PATTERN_LEN; pos++) {
2433
if (_pattern[pos] == zerodigit) {
2434
pattern[pos] = nulldigit;
2436
pattern[pos] = _pattern[pos];
2439
pattern[PATTERN_LEN] = 0x0000;
2441
for (pos = 0; pos < TEXT_LEN; pos++) {
2442
if (_text[pos] == zerodigit) {
2443
text[pos] = nulldigit;
2445
text[pos] = _text[pos];
2448
text[TEXT_LEN] = 0x0000;
2452
/* create a US-English collator */
2453
coll = ucol_open("en_US", &ec);
2455
/* make sure we didn't fail. */
2458
ucol_setStrength(coll, UCOL_IDENTICAL);
2460
/* open a search looking for 0 */
2461
search = usearch_openFromCollator(pattern, PATTERN_LEN, text,
2462
TEXT_LEN, coll, NULL, &ec);
2465
if (coll != NULL && search != NULL) {
2466
pos = usearch_first(search, &ec);
2467
len = usearch_getMatchedLength(search);
2468
if (pos != expectedPos) {
2469
log_err("Expected search result: %d; Got instead: %d\n", expectedPos,
2473
if (len != expectedLen) {
2474
log_err("Expected search result length: %d; Got instead: %d\n",
2478
for (pos = usearch_first(search, &ec); pos != USEARCH_DONE; pos
2479
= usearch_next(search, &ec)) {
2480
log_verbose("Match at %d\n", pos);
2484
if (count != expectedNum) {
2485
log_err("Expected %d search hits, found %d\n", expectedNum, count);
2490
usearch_close(search);
2493
static void TestStrengthIdentical(void)
2496
UErrorCode ec = U_ZERO_ERROR;
2497
UStringSearch *search;
2499
UChar pattern[] = {0x05E9, 0x0591, 0x05E9};
2500
UChar text[] = {0x05E9, 0x0592, 0x05E9};
2501
int32_t pLen = sizeof (pattern) / sizeof(pattern[0]);
2502
int32_t tLen = sizeof(text) / sizeof (text[0]);
2503
int32_t expectedPos = 0;
2504
int32_t expectedLen = 3;
2509
/* create a US-English collator */
2510
coll = ucol_open ("en_US", &ec);
2512
/* make sure we didn't fail. */
2515
ucol_setStrength( coll, UCOL_TERTIARY);
2517
/* open a search looking for 0 */
2518
search = usearch_openFromCollator (pattern, pLen, text, tLen, coll, NULL, &ec);
2521
if (coll != NULL && search != NULL) {
2522
pos = usearch_first(search, &ec);
2523
len = usearch_getMatchedLength(search);
2525
if(pos != expectedPos) {
2526
log_err("Expected search result: %d; Got instead: %d\n", expectedPos, pos);
2529
if(len != expectedLen) {
2530
log_err("Expected search result length: %d; Got instead: %d\n", expectedLen, len);
2533
/* Now try it at strength == UCOL_IDENTICAL */
2534
ucol_setStrength(coll, UCOL_IDENTICAL);
2535
usearch_reset(search);
2537
pos = usearch_first(search, &ec);
2538
len = usearch_getMatchedLength(search);
2541
log_err("Expected failure for strentgh = UCOL_IDENTICAL: got %d instead.\n", pos);
2545
usearch_close(search);
2550
void addSearchTest(TestNode** root)
2552
addTest(root, &TestStart, "tscoll/usrchtst/TestStart");
2553
addTest(root, &TestOpenClose, "tscoll/usrchtst/TestOpenClose");
2554
addTest(root, &TestInitialization, "tscoll/usrchtst/TestInitialization");
2555
addTest(root, &TestBasic, "tscoll/usrchtst/TestBasic");
2556
addTest(root, &TestNormExact, "tscoll/usrchtst/TestNormExact");
2557
addTest(root, &TestStrength, "tscoll/usrchtst/TestStrength");
2558
addTest(root, &TestBreakIterator, "tscoll/usrchtst/TestBreakIterator");
2559
addTest(root, &TestVariable, "tscoll/usrchtst/TestVariable");
2560
addTest(root, &TestOverlap, "tscoll/usrchtst/TestOverlap");
2561
addTest(root, &TestCollator, "tscoll/usrchtst/TestCollator");
2562
addTest(root, &TestPattern, "tscoll/usrchtst/TestPattern");
2563
addTest(root, &TestText, "tscoll/usrchtst/TestText");
2564
addTest(root, &TestCompositeBoundaries,
2565
"tscoll/usrchtst/TestCompositeBoundaries");
2566
addTest(root, &TestGetSetOffset, "tscoll/usrchtst/TestGetSetOffset");
2567
addTest(root, &TestGetSetAttribute,
2568
"tscoll/usrchtst/TestGetSetAttribute");
2569
addTest(root, &TestGetMatch, "tscoll/usrchtst/TestGetMatch");
2570
addTest(root, &TestSetMatch, "tscoll/usrchtst/TestSetMatch");
2571
addTest(root, &TestReset, "tscoll/usrchtst/TestReset");
2572
addTest(root, &TestSupplementary, "tscoll/usrchtst/TestSupplementary");
2573
addTest(root, &TestContraction, "tscoll/usrchtst/TestContraction");
2574
addTest(root, &TestIgnorable, "tscoll/usrchtst/TestIgnorable");
2575
addTest(root, &TestCanonical, "tscoll/usrchtst/TestCanonical");
2576
addTest(root, &TestNormCanonical, "tscoll/usrchtst/TestNormCanonical");
2577
addTest(root, &TestStrengthCanonical,
2578
"tscoll/usrchtst/TestStrengthCanonical");
2579
addTest(root, &TestBreakIteratorCanonical,
2580
"tscoll/usrchtst/TestBreakIteratorCanonical");
2581
addTest(root, &TestVariableCanonical,
2582
"tscoll/usrchtst/TestVariableCanonical");
2583
addTest(root, &TestOverlapCanonical,
2584
"tscoll/usrchtst/TestOverlapCanonical");
2585
addTest(root, &TestCollatorCanonical,
2586
"tscoll/usrchtst/TestCollatorCanonical");
2587
addTest(root, &TestPatternCanonical,
2588
"tscoll/usrchtst/TestPatternCanonical");
2589
addTest(root, &TestTextCanonical, "tscoll/usrchtst/TestTextCanonical");
2590
addTest(root, &TestCompositeBoundariesCanonical,
2591
"tscoll/usrchtst/TestCompositeBoundariesCanonical");
2592
addTest(root, &TestGetSetOffsetCanonical,
2593
"tscoll/usrchtst/TestGetSetOffsetCanonical");
2594
addTest(root, &TestSupplementaryCanonical,
2595
"tscoll/usrchtst/TestSupplementaryCanonical");
2596
addTest(root, &TestContractionCanonical,
2597
"tscoll/usrchtst/TestContractionCanonical");
2598
addTest(root, &TestEnd, "tscoll/usrchtst/TestEnd");
2599
addTest(root, &TestNumeric, "tscoll/usrchtst/TestNumeric");
2600
addTest(root, &TestDiacriticMatch, "tscoll/usrchtst/TestDiacriticMatch");
2601
addTest(root, &TestForwardBackward, "tscoll/usrchtst/TestForwardBackward");
2602
addTest(root, &TestSearchForNull, "tscoll/usrchtst/TestSearchForNull");
2603
addTest(root, &TestStrengthIdentical, "tscoll/usrchtst/TestStrengthIdentical");
2606
#endif /* #if !UCONFIG_NO_COLLATION */