OLD | NEW |
| (Empty) |
1 /******************************************************************** | |
2 * Copyright (c) 2001-2011,2015 International Business Machines | |
3 * Corporation and others. All Rights Reserved. | |
4 ******************************************************************** | |
5 * File usrchtst.c | |
6 * Modification History: | |
7 * Name Date Description | |
8 * synwee July 19 2001 creation | |
9 ********************************************************************/ | |
10 | |
11 #include "unicode/utypes.h" | |
12 | |
13 #if !UCONFIG_NO_COLLATION && !UCONFIG_NO_BREAK_ITERATION && !UCONFIG_NO_FILE_IO | |
14 | |
15 #include "unicode/usearch.h" | |
16 #include "unicode/ustring.h" | |
17 #include "ccolltst.h" | |
18 #include "cmemory.h" | |
19 #include <stdio.h> | |
20 #include "usrchdat.c" | |
21 #include "unicode/ubrk.h" | |
22 #include <assert.h> | |
23 | |
24 static UBool TOCLOSE_ = TRUE; | |
25 static UCollator *EN_US_; | |
26 static UCollator *FR_FR_; | |
27 static UCollator *DE_; | |
28 static UCollator *ES_; | |
29 | |
30 /** | |
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 | |
36 */ | |
37 | |
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) | |
43 #else | |
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 UC
ONFIG_NO_BREAK_ITERATION is on\n", __FILE__, __LINE__); return TRUE; } | |
46 #endif | |
47 | |
48 /** | |
49 * Opening all static collators and break iterators | |
50 */ | |
51 static void open(UErrorCode* status) | |
52 { | |
53 if (TOCLOSE_) { | |
54 UChar rules[1024]; | |
55 int32_t rulelength = 0; | |
56 *status = U_ZERO_ERROR; | |
57 | |
58 EN_US_ = ucol_open("en_US", status); | |
59 if(U_FAILURE(*status)) { | |
60 log_err_status(*status, "Error opening collator\n"); | |
61 return; | |
62 } | |
63 FR_FR_ = ucol_open("fr_FR", status); | |
64 DE_ = ucol_open("de_DE", status); | |
65 ES_ = ucol_open("es_ES", status); | |
66 | |
67 u_strcpy(rules, ucol_getRules(DE_, &rulelength)); | |
68 u_unescape(EXTRACOLLATIONRULE, rules + rulelength, 1024 - rulelength); | |
69 | |
70 ucol_close(DE_); | |
71 | |
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); | |
76 | |
77 ucol_close(ES_); | |
78 ES_ = ucol_openRules(rules, u_strlen(rules), UCOL_ON, UCOL_TERTIARY, | |
79 NULL, status); | |
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, | |
83 status); | |
84 #endif | |
85 TOCLOSE_ = TRUE; | |
86 } | |
87 } | |
88 | |
89 /** | |
90 * Start opening all static collators and break iterators | |
91 */ | |
92 static void TestStart(void) | |
93 { | |
94 UErrorCode status = U_ZERO_ERROR; | |
95 open(&status); | |
96 if (U_FAILURE(status)) { | |
97 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
98 return; | |
99 } | |
100 TOCLOSE_ = FALSE; | |
101 } | |
102 | |
103 /** | |
104 * Closing all static collators and break iterators | |
105 */ | |
106 static void close(void) | |
107 { | |
108 if (TOCLOSE_) { | |
109 ucol_close(EN_US_); | |
110 ucol_close(FR_FR_); | |
111 ucol_close(DE_); | |
112 ucol_close(ES_); | |
113 #if !UCONFIG_NO_BREAK_ITERATION | |
114 ubrk_close(EN_WORDBREAKER_); | |
115 ubrk_close(EN_CHARACTERBREAKER_); | |
116 #endif | |
117 } | |
118 TOCLOSE_ = FALSE; | |
119 } | |
120 | |
121 /** | |
122 * End closing all static collators and break iterators | |
123 */ | |
124 static void TestEnd(void) | |
125 { | |
126 TOCLOSE_ = TRUE; | |
127 close(); | |
128 TOCLOSE_ = TRUE; | |
129 } | |
130 | |
131 /** | |
132 * output UChar strings for printing. | |
133 */ | |
134 static char *toCharString(const UChar* unichars) | |
135 { | |
136 static char result[1024]; | |
137 char *temp = result; | |
138 int count = 0; | |
139 int length = u_strlen(unichars); | |
140 | |
141 for (; count < length; count ++) { | |
142 UChar ch = unichars[count]; | |
143 if (ch >= 0x20 && ch <= 0x7e) { | |
144 *temp ++ = (char)ch; | |
145 } | |
146 else { | |
147 sprintf(temp, "\\u%04x", ch); | |
148 temp += 6; /* \uxxxx */ | |
149 } | |
150 } | |
151 *temp = 0; | |
152 | |
153 return result; | |
154 } | |
155 | |
156 /** | |
157 * Getting the collator | |
158 */ | |
159 static UCollator *getCollator(const char *collator) | |
160 { | |
161 if (collator == NULL) { | |
162 return EN_US_; | |
163 } | |
164 if (strcmp(collator, "fr") == 0) { | |
165 return FR_FR_; | |
166 } | |
167 else if (strcmp(collator, "de") == 0) { | |
168 return DE_; | |
169 } | |
170 else if (strcmp(collator, "es") == 0) { | |
171 return ES_; | |
172 } | |
173 else { | |
174 return EN_US_; | |
175 } | |
176 } | |
177 | |
178 /** | |
179 * Getting the breakiterator | |
180 */ | |
181 static UBreakIterator *getBreakIterator(const char *breaker) | |
182 { | |
183 if (breaker == NULL) { | |
184 return NULL; | |
185 } | |
186 #if !UCONFIG_NO_BREAK_ITERATION | |
187 if (strcmp(breaker, "wordbreaker") == 0) { | |
188 return EN_WORDBREAKER_; | |
189 } | |
190 else { | |
191 return EN_CHARACTERBREAKER_; | |
192 } | |
193 #else | |
194 return NULL; | |
195 #endif | |
196 } | |
197 | |
198 static void TestOpenClose(void) | |
199 { | |
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", | |
206 text, 6, &status); | |
207 #endif | |
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"); | |
212 } | |
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"); | |
217 } | |
218 | |
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"); | |
223 } | |
224 status = U_ZERO_ERROR; | |
225 result = usearch_openFromCollator(pattern, 3, NULL, 0, NULL, NULL, | |
226 &status); | |
227 if (U_SUCCESS(status) || result != NULL) { | |
228 log_err("Error: NULL arguments should produce an error and a NULL result
\n"); | |
229 } | |
230 | |
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"); | |
235 } | |
236 status = U_ZERO_ERROR; | |
237 result = usearch_openFromCollator(pattern, 3, text, 6, NULL, NULL, | |
238 &status); | |
239 if (U_SUCCESS(status) || result != NULL) { | |
240 log_err("Error: NULL arguments should produce an error and a NULL result
\n"); | |
241 } | |
242 | |
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"); | |
247 } | |
248 else { | |
249 usearch_close(result); | |
250 } | |
251 open(&status); | |
252 if (U_FAILURE(status)) { | |
253 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
254 return; | |
255 } | |
256 status = U_ZERO_ERROR; | |
257 result = usearch_openFromCollator(pattern, 3, text, 6, EN_US_, NULL, | |
258 &status); | |
259 if (U_FAILURE(status) || result == NULL) { | |
260 if (EN_US_ == NULL) { | |
261 log_data_err("Opening collator failed.\n"); | |
262 } else { | |
263 log_err("Error: NULL break iterator is valid for opening search\n"); | |
264 } | |
265 } | |
266 else { | |
267 usearch_close(result); | |
268 } | |
269 | |
270 | |
271 status = U_ZERO_ERROR; | |
272 #if !UCONFIG_NO_BREAK_ITERATION | |
273 | |
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 searc
h\n"); | |
277 } | |
278 else { | |
279 usearch_close(result); | |
280 } | |
281 status = U_ZERO_ERROR; | |
282 result = usearch_openFromCollator(pattern, 3, text, 6, EN_US_, breakiter, | |
283 &status); | |
284 if (U_FAILURE(status) || result == NULL) { | |
285 if (EN_US_ == NULL) { | |
286 log_data_err("Opening collator failed.\n"); | |
287 } else { | |
288 log_err("Error: Break iterator is valid for opening search\n"); | |
289 } | |
290 } | |
291 else { | |
292 usearch_close(result); | |
293 } | |
294 ubrk_close(breakiter); | |
295 #endif | |
296 close(); | |
297 } | |
298 | |
299 static void TestInitialization(void) | |
300 { | |
301 UErrorCode status = U_ZERO_ERROR; | |
302 UChar pattern[512]; | |
303 const UChar text[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66}; | |
304 int32_t i = 0; | |
305 UStringSearch *result; | |
306 | |
307 /* simple test on the pattern ce construction */ | |
308 pattern[0] = 0x41; | |
309 pattern[1] = 0x42; | |
310 open(&status); | |
311 if (U_FAILURE(status)) { | |
312 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
313 return; | |
314 } | |
315 result = usearch_openFromCollator(pattern, 2, text, 3, EN_US_, NULL, | |
316 &status); | |
317 if (U_FAILURE(status)) { | |
318 log_err("Error opening search %s\n", u_errorName(status)); | |
319 } | |
320 usearch_close(result); | |
321 | |
322 /* testing if an extremely large pattern will fail the initialization */ | |
323 for(i = 0; i < 512; i++) { | |
324 pattern[i] = 0x41; | |
325 } | |
326 /*uprv_memset(pattern, 0x41, 512);*/ | |
327 result = usearch_openFromCollator(pattern, 512, text, 3, EN_US_, NULL, | |
328 &status); | |
329 if (U_FAILURE(status)) { | |
330 log_err("Error opening search %s\n", u_errorName(status)); | |
331 } | |
332 usearch_close(result); | |
333 close(); | |
334 } | |
335 | |
336 static UBool assertEqualWithUStringSearch( UStringSearch *strsrch, | |
337 const SearchData search) | |
338 { | |
339 int count = 0; | |
340 UErrorCode status = U_ZERO_ERROR; | |
341 int32_t matchindex = search.offset[count]; | |
342 int32_t textlength; | |
343 UChar matchtext[128]; | |
344 int32_t matchlength; | |
345 int32_t nextStart; | |
346 UBool isOverlap; | |
347 | |
348 usearch_setAttribute(strsrch, USEARCH_ELEMENT_COMPARISON, search.elemCompare
, &status); | |
349 if (U_FAILURE(status)) { | |
350 log_err("Error setting USEARCH_ELEMENT_COMPARISON attribute %s\n", u_err
orName(status)); | |
351 return FALSE; | |
352 } | |
353 | |
354 if (usearch_getMatchedStart(strsrch) != USEARCH_DONE || | |
355 usearch_getMatchedLength(strsrch) != 0) { | |
356 log_err("Error with the initialization of match start and length\n"); | |
357 } | |
358 /* start of next matches */ | |
359 while (U_SUCCESS(status) && matchindex >= 0) { | |
360 matchlength = search.size[count]; | |
361 usearch_next(strsrch, &status); | |
362 if (matchindex != usearch_getMatchedStart(strsrch) || | |
363 matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) { | |
364 char *str = toCharString(usearch_getText(strsrch, &textlength)); | |
365 log_err("Text: %s\n", str); | |
366 str = toCharString(usearch_getPattern(strsrch, &textlength)); | |
367 log_err("Pattern: %s\n", str); | |
368 log_err("Error next match found at idx %d (len:%d); expected %d (len
:%d)\n", | |
369 usearch_getMatchedStart(strsrch), usearch_getMatchedLength(s
trsrch), | |
370 matchindex, matchlength); | |
371 return FALSE; | |
372 } | |
373 count ++; | |
374 | |
375 if (usearch_getMatchedText(strsrch, matchtext, 128, &status) != | |
376 (int32_t) matchlength || U_FAILURE(status) || | |
377 memcmp(matchtext, | |
378 usearch_getText(strsrch, &textlength) + matchindex, | |
379 matchlength * sizeof(UChar)) != 0) { | |
380 log_err("Error getting next matched text\n"); | |
381 } | |
382 | |
383 matchindex = search.offset[count]; | |
384 } | |
385 usearch_next(strsrch, &status); | |
386 if (usearch_getMatchedStart(strsrch) != USEARCH_DONE || | |
387 usearch_getMatchedLength(strsrch) != 0) { | |
388 char *str = toCharString(usearch_getText(strsrch, &textlength)); | |
389 log_err("Text: %s\n", str); | |
390 str = toCharString(usearch_getPattern(strsrch, &textlength)); | |
391 log_err("Pattern: %s\n", str); | |
392 log_err("Error next match found at %d (len:%d); expected <NO MATCH>\n", | |
393 usearch_getMatchedStart(strsrch), | |
394 usearch_getMatchedLength(strsrch)); | |
395 return FALSE; | |
396 } | |
397 /* start of previous matches */ | |
398 count = count == 0 ? 0 : count - 1; | |
399 matchindex = search.offset[count]; | |
400 | |
401 while (U_SUCCESS(status) && matchindex >= 0) { | |
402 matchlength = search.size[count]; | |
403 usearch_previous(strsrch, &status); | |
404 if (matchindex != usearch_getMatchedStart(strsrch) || | |
405 matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) { | |
406 char *str = toCharString(usearch_getText(strsrch, &textlength)); | |
407 log_err("Text: %s\n", str); | |
408 str = toCharString(usearch_getPattern(strsrch, &textlength)); | |
409 log_err("Pattern: %s\n", str); | |
410 log_err("Error previous match found at %d (len:%d); expected %d (len
:%d)\n", | |
411 usearch_getMatchedStart(strsrch), usearch_getMatchedLength(s
trsrch), | |
412 matchindex, matchlength); | |
413 return FALSE; | |
414 } | |
415 | |
416 if (usearch_getMatchedText(strsrch, matchtext, 128, &status) != | |
417 (int32_t) matchlength || U_FAILURE(status) || | |
418 memcmp(matchtext, | |
419 usearch_getText(strsrch, &textlength) + matchindex, | |
420 matchlength * sizeof(UChar)) != 0) { | |
421 log_err("Error getting previous matched text\n"); | |
422 } | |
423 | |
424 matchindex = count > 0 ? search.offset[count - 1] : -1; | |
425 count --; | |
426 } | |
427 usearch_previous(strsrch, &status); | |
428 if (usearch_getMatchedStart(strsrch) != USEARCH_DONE || | |
429 usearch_getMatchedLength(strsrch) != 0) { | |
430 char *str = toCharString(usearch_getText(strsrch, &textlength)); | |
431 log_err("Text: %s\n", str); | |
432 str = toCharString(usearch_getPattern(strsrch, &textlength)); | |
433 log_err("Pattern: %s\n", str); | |
434 log_err("Error previous match found at %d (len:%d); expected <NO MATCH>\
n", | |
435 usearch_getMatchedStart(strsrch), | |
436 usearch_getMatchedLength(strsrch)); | |
437 return FALSE; | |
438 } | |
439 | |
440 | |
441 isOverlap = (usearch_getAttribute(strsrch, USEARCH_OVERLAP) == USEARCH_ON); | |
442 | |
443 /* start of following matches */ | |
444 count = 0; | |
445 matchindex = search.offset[count]; | |
446 nextStart = 0; | |
447 | |
448 while (TRUE) { | |
449 usearch_following(strsrch, nextStart, &status); | |
450 | |
451 if (matchindex < 0) { | |
452 if (usearch_getMatchedStart(strsrch) != USEARCH_DONE || usearch_getM
atchedLength(strsrch) != 0) { | |
453 char *str = toCharString(usearch_getText(strsrch, &textlength)); | |
454 log_err("Text: %s\n", str); | |
455 str = toCharString(usearch_getPattern(strsrch, &textlength)); | |
456 log_err("Pattern: %s\n", str); | |
457 log_err("Error following match starting at %d (overlap:%d) found
at %d (len:%d); expected <NO MATCH>\n", | |
458 nextStart, isOverlap, | |
459 usearch_getMatchedStart(strsrch), | |
460 usearch_getMatchedLength(strsrch)); | |
461 return FALSE; | |
462 } | |
463 /* no more matches */ | |
464 break; | |
465 } | |
466 | |
467 matchlength = search.size[count]; | |
468 if (usearch_getMatchedStart(strsrch) != matchindex | |
469 || usearch_getMatchedLength(strsrch) != matchlength | |
470 || U_FAILURE(status)) { | |
471 char *str = toCharString(usearch_getText(strsrch, &textlength)); | |
472 log_err("Text: %s\n", str); | |
473 str = toCharString(usearch_getPattern(strsrch, &textlength)); | |
474 log_err("Pattern: %s\n", str); | |
475 log_err("Error following match starting at %d (overlap: %d) found at
%d (len:%d); expected %d (len:%d)\n", | |
476 nextStart, isOverlap, | |
477 usearch_getMatchedStart(strsrch), usearch_getMatchedLeng
th(strsrch), | |
478 matchindex, matchlength); | |
479 return FALSE; | |
480 } | |
481 | |
482 if (isOverlap || usearch_getMatchedLength(strsrch) == 0) { | |
483 nextStart = usearch_getMatchedStart(strsrch) + 1; | |
484 } else { | |
485 nextStart = usearch_getMatchedStart(strsrch) + usearch_getMatchedLen
gth(strsrch); | |
486 } | |
487 | |
488 count++; | |
489 matchindex = search.offset[count]; | |
490 } | |
491 | |
492 /* start of preceding matches */ | |
493 count = -1; /* last non-negative offset index, could be -1 if no match */ | |
494 while (search.offset[count + 1] >= 0) { | |
495 count++; | |
496 } | |
497 usearch_getText(strsrch, &nextStart); | |
498 | |
499 while (TRUE) { | |
500 usearch_preceding(strsrch, nextStart, &status); | |
501 | |
502 if (count < 0) { | |
503 if (usearch_getMatchedStart(strsrch) != USEARCH_DONE || usearch_getM
atchedLength(strsrch) != 0) { | |
504 char *str = toCharString(usearch_getText(strsrch, &textlength)); | |
505 log_err("Text: %s\n", str); | |
506 str = toCharString(usearch_getPattern(strsrch, &textlength)); | |
507 log_err("Pattern: %s\n", str); | |
508 log_err("Error preceding match starting at %d (overlap: %d) foun
d at %d (len:%d); expected <NO MATCH>\n", | |
509 nextStart, isOverlap, | |
510 usearch_getMatchedStart(strsrch), | |
511 usearch_getMatchedLength(strsrch)); | |
512 return FALSE; | |
513 } | |
514 /* no more matches */ | |
515 break; | |
516 } | |
517 | |
518 matchindex = search.offset[count]; | |
519 matchlength = search.size[count]; | |
520 if (usearch_getMatchedStart(strsrch) != matchindex | |
521 || usearch_getMatchedLength(strsrch) != matchlength | |
522 || U_FAILURE(status)) { | |
523 char *str = toCharString(usearch_getText(strsrch, &textlength)); | |
524 log_err("Text: %s\n", str); | |
525 str = toCharString(usearch_getPattern(strsrch, &textlength)); | |
526 log_err("Pattern: %s\n", str); | |
527 log_err("Error preceding match starting at %d (overlap: %d) found at
%d (len:%d); expected %d (len:%d)\n", | |
528 nextStart, isOverlap, | |
529 usearch_getMatchedStart(strsrch), usearch_getMatchedLeng
th(strsrch), | |
530 matchindex, matchlength); | |
531 return FALSE; | |
532 } | |
533 | |
534 nextStart = matchindex; | |
535 count--; | |
536 } | |
537 | |
538 usearch_setAttribute(strsrch, USEARCH_ELEMENT_COMPARISON, USEARCH_STANDARD_E
LEMENT_COMPARISON, &status); | |
539 return TRUE; | |
540 } | |
541 | |
542 static UBool assertEqual(const SearchData search) | |
543 { | |
544 UErrorCode status = U_ZERO_ERROR; | |
545 UChar pattern[32]; | |
546 UChar text[128]; | |
547 UCollator *collator = getCollator(search.collator); | |
548 UBreakIterator *breaker = getBreakIterator(search.breaker); | |
549 UStringSearch *strsrch; | |
550 | |
551 CHECK_BREAK_BOOL(search.breaker); | |
552 | |
553 u_unescape(search.text, text, 128); | |
554 u_unescape(search.pattern, pattern, 32); | |
555 ucol_setStrength(collator, search.strength); | |
556 strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator, | |
557 breaker, &status); | |
558 if (U_FAILURE(status)) { | |
559 log_err("Error opening string search %s\n", u_errorName(status)); | |
560 return FALSE; | |
561 } | |
562 | |
563 if (!assertEqualWithUStringSearch(strsrch, search)) { | |
564 ucol_setStrength(collator, UCOL_TERTIARY); | |
565 usearch_close(strsrch); | |
566 return FALSE; | |
567 } | |
568 ucol_setStrength(collator, UCOL_TERTIARY); | |
569 usearch_close(strsrch); | |
570 return TRUE; | |
571 } | |
572 | |
573 static UBool assertCanonicalEqual(const SearchData search) | |
574 { | |
575 UErrorCode status = U_ZERO_ERROR; | |
576 UChar pattern[32]; | |
577 UChar text[128]; | |
578 UCollator *collator = getCollator(search.collator); | |
579 UBreakIterator *breaker = getBreakIterator(search.breaker); | |
580 UStringSearch *strsrch; | |
581 UBool result = TRUE; | |
582 | |
583 CHECK_BREAK_BOOL(search.breaker); | |
584 u_unescape(search.text, text, 128); | |
585 u_unescape(search.pattern, pattern, 32); | |
586 ucol_setStrength(collator, search.strength); | |
587 ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); | |
588 strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator, | |
589 breaker, &status);
| |
590 usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON, | |
591 &status); | |
592 if (U_FAILURE(status)) { | |
593 log_err("Error opening string search %s\n", u_errorName(status)); | |
594 result = FALSE; | |
595 goto bail; | |
596 } | |
597 | |
598 if (!assertEqualWithUStringSearch(strsrch, search)) { | |
599 ucol_setStrength(collator, UCOL_TERTIARY); | |
600 usearch_close(strsrch); | |
601 result = FALSE; | |
602 goto bail; | |
603 } | |
604 | |
605 bail: | |
606 ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status); | |
607 ucol_setStrength(collator, UCOL_TERTIARY); | |
608 usearch_close(strsrch); | |
609 return result; | |
610 } | |
611 | |
612 static UBool assertEqualWithAttribute(const SearchData search, | |
613 USearchAttributeValue canonical, | |
614 USearchAttributeValue overlap) | |
615 { | |
616 UErrorCode status = U_ZERO_ERROR; | |
617 UChar pattern[32]; | |
618 UChar text[128]; | |
619 UCollator *collator = getCollator(search.collator); | |
620 UBreakIterator *breaker = getBreakIterator(search.breaker); | |
621 UStringSearch *strsrch; | |
622 | |
623 CHECK_BREAK_BOOL(search.breaker); | |
624 u_unescape(search.text, text, 128); | |
625 u_unescape(search.pattern, pattern, 32); | |
626 ucol_setStrength(collator, search.strength); | |
627 strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator, | |
628 breaker, &status); | |
629 usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, canonical, | |
630 &status); | |
631 usearch_setAttribute(strsrch, USEARCH_OVERLAP, overlap, &status); | |
632 | |
633 if (U_FAILURE(status)) { | |
634 log_err("Error opening string search %s\n", u_errorName(status)); | |
635 return FALSE; | |
636 } | |
637 | |
638 if (!assertEqualWithUStringSearch(strsrch, search)) { | |
639 ucol_setStrength(collator, UCOL_TERTIARY); | |
640 usearch_close(strsrch); | |
641 return FALSE; | |
642 } | |
643 ucol_setStrength(collator, UCOL_TERTIARY); | |
644 usearch_close(strsrch); | |
645 return TRUE; | |
646 } | |
647 | |
648 static void TestBasic(void) | |
649 { | |
650 int count = 0; | |
651 UErrorCode status = U_ZERO_ERROR; | |
652 open(&status); | |
653 if (U_FAILURE(status)) { | |
654 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
655 return; | |
656 } | |
657 while (BASIC[count].text != NULL) { | |
658 if (!assertEqual(BASIC[count])) { | |
659 log_err("Error at test number %d\n", count); | |
660 } | |
661 count ++; | |
662 } | |
663 close(); | |
664 } | |
665 | |
666 static void TestNormExact(void) | |
667 { | |
668 int count = 0; | |
669 UErrorCode status = U_ZERO_ERROR; | |
670 open(&status); | |
671 if (U_FAILURE(status)) { | |
672 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
673 return; | |
674 } | |
675 ucol_setAttribute(EN_US_, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); | |
676 if (U_FAILURE(status)) { | |
677 log_err("Error setting collation normalization %s\n", | |
678 u_errorName(status)); | |
679 } | |
680 while (BASIC[count].text != NULL) { | |
681 if (!assertEqual(BASIC[count])) { | |
682 log_err("Error at test number %d\n", count); | |
683 } | |
684 count ++; | |
685 } | |
686 count = 0; | |
687 while (NORMEXACT[count].text != NULL) { | |
688 if (!assertEqual(NORMEXACT[count])) { | |
689 log_err("Error at test number %d\n", count); | |
690 } | |
691 count ++; | |
692 } | |
693 ucol_setAttribute(EN_US_, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status); | |
694 count = 0; | |
695 while (NONNORMEXACT[count].text != NULL) { | |
696 if (!assertEqual(NONNORMEXACT[count])) { | |
697 log_err("Error at test number %d\n", count); | |
698 } | |
699 count ++; | |
700 } | |
701 close(); | |
702 } | |
703 | |
704 static void TestStrength(void) | |
705 { | |
706 int count = 0; | |
707 UErrorCode status = U_ZERO_ERROR; | |
708 open(&status); | |
709 if (U_FAILURE(status)) { | |
710 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
711 return; | |
712 } | |
713 while (STRENGTH[count].text != NULL) { | |
714 if (!assertEqual(STRENGTH[count])) { | |
715 log_err("Error at test number %d\n", count); | |
716 } | |
717 count ++; | |
718 } | |
719 close(); | |
720 } | |
721 | |
722 static void TestBreakIterator(void) { | |
723 UErrorCode status = U_ZERO_ERROR; | |
724 UStringSearch *strsrch; | |
725 UChar text[128]; | |
726 UChar pattern[32]; | |
727 int count = 0; | |
728 | |
729 CHECK_BREAK("x"); | |
730 | |
731 #if !UCONFIG_NO_BREAK_ITERATION | |
732 open(&status); | |
733 if (U_FAILURE(status)) { | |
734 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
735 return; | |
736 } | |
737 if (usearch_getBreakIterator(NULL) != NULL) { | |
738 log_err("Expected NULL breakiterator from NULL string search\n"); | |
739 } | |
740 u_unescape(BREAKITERATOREXACT[0].text, text, 128); | |
741 u_unescape(BREAKITERATOREXACT[0].pattern, pattern, 32); | |
742 strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_, NULL, | |
743 &status); | |
744 if (U_FAILURE(status)) { | |
745 log_err("Error opening string search %s\n", u_errorName(status)); | |
746 goto ENDTESTBREAKITERATOR; | |
747 } | |
748 | |
749 usearch_setBreakIterator(strsrch, NULL, &status); | |
750 if (U_FAILURE(status) || usearch_getBreakIterator(strsrch) != NULL) { | |
751 log_err("Error usearch_getBreakIterator returned wrong object"); | |
752 goto ENDTESTBREAKITERATOR; | |
753 } | |
754 | |
755 usearch_setBreakIterator(strsrch, EN_CHARACTERBREAKER_, &status); | |
756 if (U_FAILURE(status) || | |
757 usearch_getBreakIterator(strsrch) != EN_CHARACTERBREAKER_) { | |
758 log_err("Error usearch_getBreakIterator returned wrong object"); | |
759 goto ENDTESTBREAKITERATOR; | |
760 } | |
761 | |
762 usearch_setBreakIterator(strsrch, EN_WORDBREAKER_, &status); | |
763 if (U_FAILURE(status) || | |
764 usearch_getBreakIterator(strsrch) != EN_WORDBREAKER_) { | |
765 log_err("Error usearch_getBreakIterator returned wrong object"); | |
766 goto ENDTESTBREAKITERATOR; | |
767 } | |
768 | |
769 usearch_close(strsrch); | |
770 | |
771 count = 0; | |
772 while (count < 4) { | |
773 /* 0-3 test are fixed */ | |
774 const SearchData *search = &(BREAKITERATOREXACT[count]); | |
775 UCollator *collator = getCollator(search->collator); | |
776 UBreakIterator *breaker = getBreakIterator(search->breaker); | |
777 | |
778 u_unescape(search->text, text, 128); | |
779 u_unescape(search->pattern, pattern, 32); | |
780 ucol_setStrength(collator, search->strength); | |
781 | |
782 strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator, | |
783 breaker, &status); | |
784 if (U_FAILURE(status) || | |
785 usearch_getBreakIterator(strsrch) != breaker) { | |
786 log_err("Error setting break iterator\n"); | |
787 if (strsrch != NULL) { | |
788 usearch_close(strsrch); | |
789 } | |
790 } | |
791 if (!assertEqualWithUStringSearch(strsrch, *search)) { | |
792 ucol_setStrength(collator, UCOL_TERTIARY); | |
793 usearch_close(strsrch); | |
794 goto ENDTESTBREAKITERATOR; | |
795 } | |
796 search = &(BREAKITERATOREXACT[count + 1]); | |
797 breaker = getBreakIterator(search->breaker); | |
798 usearch_setBreakIterator(strsrch, breaker, &status); | |
799 if (U_FAILURE(status) || usearch_getBreakIterator(strsrch) != breaker) { | |
800 log_err("Error setting break iterator\n"); | |
801 usearch_close(strsrch); | |
802 goto ENDTESTBREAKITERATOR; | |
803 } | |
804 usearch_reset(strsrch); | |
805 if (!assertEqualWithUStringSearch(strsrch, *search)) { | |
806 log_err("Error at test number %d\n", count); | |
807 usearch_close(strsrch); | |
808 goto ENDTESTBREAKITERATOR; | |
809 } | |
810 usearch_close(strsrch); | |
811 count += 2; | |
812 } | |
813 count = 0; | |
814 while (BREAKITERATOREXACT[count].text != NULL) { | |
815 if (!assertEqual(BREAKITERATOREXACT[count])) { | |
816 log_err("Error at test number %d\n", count); | |
817 goto ENDTESTBREAKITERATOR; | |
818 } | |
819 count ++; | |
820 } | |
821 | |
822 ENDTESTBREAKITERATOR: | |
823 close(); | |
824 #endif | |
825 } | |
826 | |
827 static void TestVariable(void) | |
828 { | |
829 int count = 0; | |
830 UErrorCode status = U_ZERO_ERROR; | |
831 open(&status); | |
832 if (U_FAILURE(status)) { | |
833 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
834 return; | |
835 } | |
836 ucol_setAttribute(EN_US_, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status); | |
837 if (U_FAILURE(status)) { | |
838 log_err("Error setting collation alternate attribute %s\n", | |
839 u_errorName(status)); | |
840 } | |
841 while (VARIABLE[count].text != NULL) { | |
842 log_verbose("variable %d\n", count); | |
843 if (!assertEqual(VARIABLE[count])) { | |
844 log_err("Error at test number %d\n", count); | |
845 } | |
846 count ++; | |
847 } | |
848 ucol_setAttribute(EN_US_, UCOL_ALTERNATE_HANDLING, | |
849 UCOL_NON_IGNORABLE, &status); | |
850 close(); | |
851 } | |
852 | |
853 static void TestOverlap(void) | |
854 { | |
855 int count = 0; | |
856 UErrorCode status = U_ZERO_ERROR; | |
857 open(&status); | |
858 if (U_FAILURE(status)) { | |
859 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
860 return; | |
861 } | |
862 while (OVERLAP[count].text != NULL) { | |
863 if (!assertEqualWithAttribute(OVERLAP[count], USEARCH_OFF, | |
864 USEARCH_ON)) { | |
865 log_err("Error at overlap test number %d\n", count); | |
866 } | |
867 count ++; | |
868 } | |
869 count = 0; | |
870 while (NONOVERLAP[count].text != NULL) { | |
871 if (!assertEqual(NONOVERLAP[count])) { | |
872 log_err("Error at non overlap test number %d\n", count); | |
873 } | |
874 count ++; | |
875 } | |
876 | |
877 count = 0; | |
878 while (count < 1) { | |
879 UChar pattern[32]; | |
880 UChar text[128]; | |
881 const SearchData *search = &(OVERLAP[count]); | |
882 UCollator *collator = getCollator(search->collator); | |
883 UStringSearch *strsrch; | |
884 status = U_ZERO_ERROR; | |
885 | |
886 u_unescape(search->text, text, 128); | |
887 u_unescape(search->pattern, pattern, 32); | |
888 strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator, | |
889 NULL, &status); | |
890 if(status == U_FILE_ACCESS_ERROR) { | |
891 log_data_err("Is your data around?\n"); | |
892 return; | |
893 } else if(U_FAILURE(status)) { | |
894 log_err("Error opening searcher\n"); | |
895 return; | |
896 } | |
897 usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_ON, &status); | |
898 if (U_FAILURE(status) || | |
899 usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_ON) { | |
900 log_err("Error setting overlap option\n"); | |
901 } | |
902 if (!assertEqualWithUStringSearch(strsrch, *search)) { | |
903 usearch_close(strsrch); | |
904 return; | |
905 } | |
906 search = &(NONOVERLAP[count]); | |
907 usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_OFF, &status); | |
908 if (U_FAILURE(status) || | |
909 usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF) { | |
910 log_err("Error setting overlap option\n"); | |
911 } | |
912 usearch_reset(strsrch); | |
913 if (!assertEqualWithUStringSearch(strsrch, *search)) { | |
914 usearch_close(strsrch); | |
915 log_err("Error at test number %d\n", count); | |
916 } | |
917 | |
918 count ++; | |
919 usearch_close(strsrch); | |
920 } | |
921 close(); | |
922 } | |
923 | |
924 static void TestCollator(void) | |
925 { | |
926 /* test collator that thinks "o" and "p" are the same thing */ | |
927 UChar rules[32]; | |
928 UCollator *tailored = NULL; | |
929 UErrorCode status = U_ZERO_ERROR; | |
930 UChar pattern[32]; | |
931 UChar text[128]; | |
932 UStringSearch *strsrch; | |
933 | |
934 text[0] = 0x41; | |
935 text[1] = 0x42; | |
936 text[2] = 0x43; | |
937 text[3] = 0x44; | |
938 text[4] = 0x45; | |
939 pattern[0] = 0x62; | |
940 pattern[1] = 0x63; | |
941 strsrch = usearch_open(pattern, 2, text, 5, "en_US", NULL, &status); | |
942 if(status == U_FILE_ACCESS_ERROR) { | |
943 log_data_err("Is your data around?\n"); | |
944 return; | |
945 } else if(U_FAILURE(status)) { | |
946 log_err("Error opening searcher\n"); | |
947 return; | |
948 } | |
949 tailored = usearch_getCollator(strsrch); | |
950 if (usearch_next(strsrch, &status) != -1) { | |
951 log_err("Error: Found case insensitive match, when we shouldn't\n"); | |
952 } | |
953 ucol_setStrength(tailored, UCOL_PRIMARY); | |
954 usearch_reset(strsrch); | |
955 if (usearch_next(strsrch, &status) != 1) { | |
956 log_err("Error: Found case insensitive match not found\n"); | |
957 } | |
958 usearch_close(strsrch); | |
959 | |
960 open(&status); | |
961 | |
962 if (usearch_getCollator(NULL) != NULL) { | |
963 log_err("Expected NULL collator from NULL string search\n"); | |
964 } | |
965 u_unescape(COLLATOR[0].text, text, 128); | |
966 u_unescape(COLLATOR[0].pattern, pattern, 32); | |
967 | |
968 strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_, | |
969 NULL, &status); | |
970 if (U_FAILURE(status)) { | |
971 log_err("Error opening string search %s\n", u_errorName(status)); | |
972 } | |
973 if (!assertEqualWithUStringSearch(strsrch, COLLATOR[0])) { | |
974 goto ENDTESTCOLLATOR; | |
975 } | |
976 | |
977 u_unescape(TESTCOLLATORRULE, rules, 32); | |
978 tailored = ucol_openRules(rules, -1, UCOL_ON, COLLATOR[1].strength, | |
979 NULL, &status); | |
980 if (U_FAILURE(status)) { | |
981 log_err("Error opening rule based collator %s\n", u_errorName(status)); | |
982 } | |
983 | |
984 usearch_setCollator(strsrch, tailored, &status); | |
985 if (U_FAILURE(status) || usearch_getCollator(strsrch) != tailored) { | |
986 log_err("Error setting rule based collator\n"); | |
987 } | |
988 usearch_reset(strsrch); | |
989 if (!assertEqualWithUStringSearch(strsrch, COLLATOR[1])) { | |
990 goto ENDTESTCOLLATOR; | |
991 } | |
992 | |
993 usearch_setCollator(strsrch, EN_US_, &status); | |
994 usearch_reset(strsrch); | |
995 if (U_FAILURE(status) || usearch_getCollator(strsrch) != EN_US_) { | |
996 log_err("Error setting rule based collator\n"); | |
997 } | |
998 if (!assertEqualWithUStringSearch(strsrch, COLLATOR[0])) { | |
999 goto ENDTESTCOLLATOR; | |
1000 } | |
1001 | |
1002 ENDTESTCOLLATOR: | |
1003 usearch_close(strsrch); | |
1004 if (tailored != NULL) { | |
1005 ucol_close(tailored); | |
1006 } | |
1007 close(); | |
1008 } | |
1009 | |
1010 static void TestPattern(void) | |
1011 { | |
1012 UStringSearch *strsrch; | |
1013 UChar pattern[32]; | |
1014 UChar bigpattern[512]; | |
1015 UChar text[128]; | |
1016 const UChar *temp; | |
1017 int32_t templength; | |
1018 UErrorCode status = U_ZERO_ERROR; | |
1019 | |
1020 open(&status); | |
1021 if (U_FAILURE(status)) { | |
1022 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
1023 return; | |
1024 } | |
1025 if (usearch_getPattern(NULL, &templength) != NULL) { | |
1026 log_err("Error NULL string search expected returning NULL pattern\n"); | |
1027 } | |
1028 usearch_setPattern(NULL, pattern, 3, &status); | |
1029 if (U_SUCCESS(status)) { | |
1030 log_err("Error expected setting pattern in NULL strings search\n"); | |
1031 } | |
1032 status = U_ZERO_ERROR; | |
1033 u_unescape(PATTERN[0].text, text, 128); | |
1034 u_unescape(PATTERN[0].pattern, pattern, 32); | |
1035 | |
1036 ucol_setStrength(EN_US_, PATTERN[0].strength); | |
1037 strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_, | |
1038 NULL, &status); | |
1039 if(status == U_FILE_ACCESS_ERROR) { | |
1040 log_data_err("Is your data around?\n"); | |
1041 return; | |
1042 } else if(U_FAILURE(status)) { | |
1043 log_err("Error opening searcher\n"); | |
1044 return; | |
1045 } | |
1046 | |
1047 status = U_ZERO_ERROR; | |
1048 usearch_setPattern(strsrch, NULL, 3, &status); | |
1049 if (U_SUCCESS(status)) { | |
1050 log_err("Error expected setting NULL pattern in strings search\n"); | |
1051 } | |
1052 status = U_ZERO_ERROR; | |
1053 usearch_setPattern(strsrch, pattern, 0, &status); | |
1054 if (U_SUCCESS(status)) { | |
1055 log_err("Error expected setting pattern with length 0 in strings search\
n"); | |
1056 } | |
1057 status = U_ZERO_ERROR; | |
1058 if (U_FAILURE(status)) { | |
1059 log_err("Error opening string search %s\n", u_errorName(status)); | |
1060 goto ENDTESTPATTERN; | |
1061 } | |
1062 temp = usearch_getPattern(strsrch, &templength); | |
1063 if (u_strcmp(pattern, temp) != 0) { | |
1064 log_err("Error setting pattern\n"); | |
1065 } | |
1066 if (!assertEqualWithUStringSearch(strsrch, PATTERN[0])) { | |
1067 goto ENDTESTPATTERN; | |
1068 } | |
1069 | |
1070 u_unescape(PATTERN[1].pattern, pattern, 32); | |
1071 usearch_setPattern(strsrch, pattern, -1, &status); | |
1072 temp = usearch_getPattern(strsrch, &templength); | |
1073 if (u_strcmp(pattern, temp) != 0) { | |
1074 log_err("Error setting pattern\n"); | |
1075 goto ENDTESTPATTERN; | |
1076 } | |
1077 usearch_reset(strsrch); | |
1078 if (U_FAILURE(status)) { | |
1079 log_err("Error setting pattern %s\n", u_errorName(status)); | |
1080 } | |
1081 if (!assertEqualWithUStringSearch(strsrch, PATTERN[1])) { | |
1082 goto ENDTESTPATTERN; | |
1083 } | |
1084 | |
1085 u_unescape(PATTERN[0].pattern, pattern, 32); | |
1086 usearch_setPattern(strsrch, pattern, -1, &status); | |
1087 temp = usearch_getPattern(strsrch, &templength); | |
1088 if (u_strcmp(pattern, temp) != 0) { | |
1089 log_err("Error setting pattern\n"); | |
1090 goto ENDTESTPATTERN; | |
1091 } | |
1092 usearch_reset(strsrch); | |
1093 if (U_FAILURE(status)) { | |
1094 log_err("Error setting pattern %s\n", u_errorName(status)); | |
1095 } | |
1096 if (!assertEqualWithUStringSearch(strsrch, PATTERN[0])) { | |
1097 goto ENDTESTPATTERN; | |
1098 } | |
1099 /* enormous pattern size to see if this crashes */ | |
1100 for (templength = 0; templength != 512; templength ++) { | |
1101 bigpattern[templength] = 0x61; | |
1102 } | |
1103 bigpattern[511] = 0; | |
1104 usearch_setPattern(strsrch, bigpattern, -1, &status); | |
1105 if (U_FAILURE(status)) { | |
1106 log_err("Error setting pattern with size 512, %s \n", | |
1107 u_errorName(status)); | |
1108 } | |
1109 ENDTESTPATTERN: | |
1110 ucol_setStrength(EN_US_, UCOL_TERTIARY); | |
1111 if (strsrch != NULL) { | |
1112 usearch_close(strsrch); | |
1113 } | |
1114 close(); | |
1115 } | |
1116 | |
1117 static void TestText(void) | |
1118 { | |
1119 UStringSearch *strsrch; | |
1120 UChar pattern[32]; | |
1121 UChar text[128]; | |
1122 const UChar *temp; | |
1123 int32_t templength; | |
1124 UErrorCode status = U_ZERO_ERROR; | |
1125 | |
1126 u_unescape(TEXT[0].text, text, 128); | |
1127 u_unescape(TEXT[0].pattern, pattern, 32); | |
1128 | |
1129 open(&status); | |
1130 if (U_FAILURE(status)) { | |
1131 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
1132 return; | |
1133 } | |
1134 | |
1135 if (usearch_getText(NULL, &templength) != NULL) { | |
1136 log_err("Error NULL string search should return NULL text\n"); | |
1137 } | |
1138 | |
1139 usearch_setText(NULL, text, 10, &status); | |
1140 if (U_SUCCESS(status)) { | |
1141 log_err("Error NULL string search should have an error when setting text
\n"); | |
1142 } | |
1143 | |
1144 status = U_ZERO_ERROR; | |
1145 strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_, | |
1146 NULL, &status); | |
1147 | |
1148 if (U_FAILURE(status)) { | |
1149 log_err("Error opening string search %s\n", u_errorName(status)); | |
1150 goto ENDTESTPATTERN; | |
1151 } | |
1152 temp = usearch_getText(strsrch, &templength); | |
1153 if (u_strcmp(text, temp) != 0) { | |
1154 log_err("Error setting text\n"); | |
1155 } | |
1156 if (!assertEqualWithUStringSearch(strsrch, TEXT[0])) { | |
1157 goto ENDTESTPATTERN; | |
1158 } | |
1159 | |
1160 u_unescape(TEXT[1].text, text, 32); | |
1161 usearch_setText(strsrch, text, -1, &status); | |
1162 temp = usearch_getText(strsrch, &templength); | |
1163 if (u_strcmp(text, temp) != 0) { | |
1164 log_err("Error setting text\n"); | |
1165 goto ENDTESTPATTERN; | |
1166 } | |
1167 if (U_FAILURE(status)) { | |
1168 log_err("Error setting text %s\n", u_errorName(status)); | |
1169 } | |
1170 if (!assertEqualWithUStringSearch(strsrch, TEXT[1])) { | |
1171 goto ENDTESTPATTERN; | |
1172 } | |
1173 | |
1174 u_unescape(TEXT[0].text, text, 32); | |
1175 usearch_setText(strsrch, text, -1, &status); | |
1176 temp = usearch_getText(strsrch, &templength); | |
1177 if (u_strcmp(text, temp) != 0) { | |
1178 log_err("Error setting text\n"); | |
1179 goto ENDTESTPATTERN; | |
1180 } | |
1181 if (U_FAILURE(status)) { | |
1182 log_err("Error setting pattern %s\n", u_errorName(status)); | |
1183 } | |
1184 if (!assertEqualWithUStringSearch(strsrch, TEXT[0])) { | |
1185 goto ENDTESTPATTERN; | |
1186 } | |
1187 ENDTESTPATTERN: | |
1188 if (strsrch != NULL) { | |
1189 usearch_close(strsrch); | |
1190 } | |
1191 close(); | |
1192 } | |
1193 | |
1194 static void TestCompositeBoundaries(void) | |
1195 { | |
1196 int count = 0; | |
1197 UErrorCode status = U_ZERO_ERROR; | |
1198 open(&status); | |
1199 if (U_FAILURE(status)) { | |
1200 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
1201 return; | |
1202 } | |
1203 while (COMPOSITEBOUNDARIES[count].text != NULL) { | |
1204 log_verbose("composite %d\n", count); | |
1205 if (!assertEqual(COMPOSITEBOUNDARIES[count])) { | |
1206 log_err("Error at test number %d\n", count); | |
1207 } | |
1208 count ++; | |
1209 } | |
1210 close(); | |
1211 } | |
1212 | |
1213 static void TestGetSetOffset(void) | |
1214 { | |
1215 int searchDataIndex = 0; | |
1216 UChar pattern[32]; | |
1217 UChar text[128]; | |
1218 UErrorCode status = U_ZERO_ERROR; | |
1219 UStringSearch *strsrch; | |
1220 memset(pattern, 0, 32*sizeof(UChar)); | |
1221 memset(text, 0, 128*sizeof(UChar)); | |
1222 | |
1223 open(&status); | |
1224 if (U_FAILURE(status)) { | |
1225 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
1226 return; | |
1227 } | |
1228 if (usearch_getOffset(NULL) != USEARCH_DONE) { | |
1229 log_err("usearch_getOffset(NULL) expected USEARCH_DONE\n"); | |
1230 } | |
1231 strsrch = usearch_openFromCollator(pattern, 16, text, 32, EN_US_, NULL, | |
1232 &status); | |
1233 /* testing out of bounds error */ | |
1234 usearch_setOffset(strsrch, -1, &status); | |
1235 if (U_SUCCESS(status)) { | |
1236 log_err("Error expecting set offset error\n"); | |
1237 } | |
1238 usearch_setOffset(strsrch, 128, &status); | |
1239 if (U_SUCCESS(status)) { | |
1240 log_err("Error expecting set offset error\n"); | |
1241 } | |
1242 while (BASIC[searchDataIndex].text != NULL) { | |
1243 int count = 0; | |
1244 SearchData search = BASIC[searchDataIndex ++]; | |
1245 int32_t matchindex = search.offset[count]; | |
1246 int32_t textlength; | |
1247 | |
1248 u_unescape(search.text, text, 128); | |
1249 u_unescape(search.pattern, pattern, 32); | |
1250 status = U_ZERO_ERROR; | |
1251 usearch_setText(strsrch, text, -1, &status); | |
1252 usearch_setPattern(strsrch, pattern, -1, &status); | |
1253 ucol_setStrength(usearch_getCollator(strsrch), search.strength); | |
1254 usearch_reset(strsrch); | |
1255 while (U_SUCCESS(status) && matchindex >= 0) { | |
1256 uint32_t matchlength = search.size[count]; | |
1257 usearch_next(strsrch, &status); | |
1258 if (matchindex != usearch_getMatchedStart(strsrch) || | |
1259 matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) { | |
1260 char *str = toCharString(usearch_getText(strsrch, | |
1261 &textlength)); | |
1262 log_err("Text: %s\n", str); | |
1263 str = toCharString(usearch_getPattern(strsrch, &textlength)); | |
1264 log_err("Pattern: %s\n", str); | |
1265 log_err("Error match found at %d %d\n", | |
1266 usearch_getMatchedStart(strsrch), | |
1267 usearch_getMatchedLength(strsrch)); | |
1268 return; | |
1269 } | |
1270 usearch_setOffset(strsrch, matchindex + matchlength, &status); | |
1271 usearch_previous(strsrch, &status); | |
1272 if (matchindex != usearch_getMatchedStart(strsrch) || | |
1273 matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) { | |
1274 char *str = toCharString(usearch_getText(strsrch, | |
1275 &textlength)); | |
1276 log_err("Text: %s\n", str); | |
1277 str = toCharString(usearch_getPattern(strsrch, &textlength)); | |
1278 log_err("Pattern: %s\n", str); | |
1279 log_err("Error match found at %d %d\n", | |
1280 usearch_getMatchedStart(strsrch), | |
1281 usearch_getMatchedLength(strsrch)); | |
1282 return; | |
1283 } | |
1284 usearch_setOffset(strsrch, matchindex + matchlength, &status); | |
1285 matchindex = search.offset[count + 1] == -1 ? -1 : | |
1286 search.offset[count + 2]; | |
1287 if (search.offset[count + 1] != -1) { | |
1288 usearch_setOffset(strsrch, search.offset[count + 1] + 1, | |
1289 &status); | |
1290 if (usearch_getOffset(strsrch) != search.offset[count + 1] + 1)
{ | |
1291 log_err("Error setting offset\n"); | |
1292 return; | |
1293 } | |
1294 } | |
1295 | |
1296 count += 2; | |
1297 } | |
1298 usearch_next(strsrch, &status); | |
1299 if (usearch_getMatchedStart(strsrch) != USEARCH_DONE) { | |
1300 char *str = toCharString(usearch_getText(strsrch, &textlength)); | |
1301 log_err("Text: %s\n", str); | |
1302 str = toCharString(usearch_getPattern(strsrch, &textlength)); | |
1303 log_err("Pattern: %s\n", str); | |
1304 log_err("Error match found at %d %d\n", | |
1305 usearch_getMatchedStart(strsrch), | |
1306 usearch_getMatchedLength(strsrch)); | |
1307 return; | |
1308 } | |
1309 } | |
1310 ucol_setStrength(usearch_getCollator(strsrch), UCOL_TERTIARY); | |
1311 usearch_close(strsrch); | |
1312 close(); | |
1313 } | |
1314 | |
1315 static void TestGetSetAttribute(void) | |
1316 { | |
1317 UErrorCode status = U_ZERO_ERROR; | |
1318 UChar pattern[32]; | |
1319 UChar text[128]; | |
1320 UStringSearch *strsrch; | |
1321 | |
1322 memset(pattern, 0, 32*sizeof(UChar)); | |
1323 memset(text, 0, 128*sizeof(UChar)); | |
1324 | |
1325 open(&status); | |
1326 if (U_FAILURE(status)) { | |
1327 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
1328 return; | |
1329 } | |
1330 if (usearch_getAttribute(NULL, USEARCH_OVERLAP) != USEARCH_DEFAULT || | |
1331 usearch_getAttribute(NULL, USEARCH_CANONICAL_MATCH) != | |
1332 USEARCH_DEFAULT) { | |
1333 log_err( | |
1334 "Attributes for NULL string search should be USEARCH_DEFAULT\n"); | |
1335 } | |
1336 strsrch = usearch_openFromCollator(pattern, 16, text, 32, EN_US_, NULL, | |
1337 &status); | |
1338 if (U_FAILURE(status)) { | |
1339 log_err("Error opening search %s\n", u_errorName(status)); | |
1340 return; | |
1341 } | |
1342 | |
1343 usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_DEFAULT, &status); | |
1344 if (U_FAILURE(status) || | |
1345 usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF) { | |
1346 log_err("Error setting overlap to the default\n"); | |
1347 } | |
1348 usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_ON, &status); | |
1349 if (U_FAILURE(status) || | |
1350 usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_ON) { | |
1351 log_err("Error setting overlap true\n"); | |
1352 } | |
1353 usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_OFF, &status); | |
1354 if (U_FAILURE(status) || | |
1355 usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF) { | |
1356 log_err("Error setting overlap false\n"); | |
1357 } | |
1358 usearch_setAttribute(strsrch, USEARCH_OVERLAP, | |
1359 USEARCH_ATTRIBUTE_VALUE_COUNT, &status); | |
1360 if (U_SUCCESS(status)) { | |
1361 log_err("Error setting overlap to illegal value\n"); | |
1362 } | |
1363 status = U_ZERO_ERROR; | |
1364 usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_DEFAULT, | |
1365 &status); | |
1366 if (U_FAILURE(status) || | |
1367 usearch_getAttribute(strsrch, USEARCH_CANONICAL_MATCH) != | |
1368 USEARCH_OFF) { | |
1369 log_err("Error setting canonical match to the default\n"); | |
1370 } | |
1371 usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON, | |
1372 &status); | |
1373 if (U_FAILURE(status) || | |
1374 usearch_getAttribute(strsrch, USEARCH_CANONICAL_MATCH) != | |
1375 USEARCH_ON) { | |
1376 log_err("Error setting canonical match true\n"); | |
1377 } | |
1378 usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_OFF, | |
1379 &status); | |
1380 if (U_FAILURE(status) || | |
1381 usearch_getAttribute(strsrch, USEARCH_CANONICAL_MATCH) != | |
1382 USEARCH_OFF) { | |
1383 log_err("Error setting canonical match false\n"); | |
1384 } | |
1385 usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, | |
1386 USEARCH_ATTRIBUTE_VALUE_COUNT, &status); | |
1387 if (U_SUCCESS(status)) { | |
1388 log_err("Error setting canonical match to illegal value\n"); | |
1389 } | |
1390 status = U_ZERO_ERROR; | |
1391 usearch_setAttribute(strsrch, USEARCH_ATTRIBUTE_COUNT, USEARCH_DEFAULT, | |
1392 &status); | |
1393 if (U_SUCCESS(status)) { | |
1394 log_err("Error setting illegal attribute success\n"); | |
1395 } | |
1396 | |
1397 usearch_close(strsrch); | |
1398 close(); | |
1399 } | |
1400 | |
1401 static void TestGetMatch(void) | |
1402 { | |
1403 int count = 0; | |
1404 UErrorCode status = U_ZERO_ERROR; | |
1405 UChar text[128]; | |
1406 UChar pattern[32]; | |
1407 SearchData search = MATCH[0]; | |
1408 int32_t matchindex = search.offset[count]; | |
1409 UStringSearch *strsrch; | |
1410 int32_t textlength; | |
1411 UChar matchtext[128]; | |
1412 | |
1413 open(&status); | |
1414 if (U_FAILURE(status)) { | |
1415 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
1416 return; | |
1417 } | |
1418 | |
1419 if (usearch_getMatchedStart(NULL) != USEARCH_DONE || | |
1420 usearch_getMatchedLength(NULL) != USEARCH_DONE) { | |
1421 log_err( | |
1422 "Expected start and length of NULL string search should be USEARCH_DONE\n"); | |
1423 } | |
1424 | |
1425 u_unescape(search.text, text, 128); | |
1426 u_unescape(search.pattern, pattern, 32); | |
1427 strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_, | |
1428 NULL, &status); | |
1429 if (U_FAILURE(status)) { | |
1430 log_err("Error opening string search %s\n", u_errorName(status)); | |
1431 if (strsrch != NULL) { | |
1432 usearch_close(strsrch); | |
1433 } | |
1434 return; | |
1435 } | |
1436 | |
1437 while (U_SUCCESS(status) && matchindex >= 0) { | |
1438 int32_t matchlength = search.size[count]; | |
1439 usearch_next(strsrch, &status); | |
1440 if (matchindex != usearch_getMatchedStart(strsrch) || | |
1441 matchlength != usearch_getMatchedLength(strsrch)) { | |
1442 char *str = toCharString(usearch_getText(strsrch, &textlength)); | |
1443 log_err("Text: %s\n", str); | |
1444 str = toCharString(usearch_getPattern(strsrch, &textlength)); | |
1445 log_err("Pattern: %s\n", str); | |
1446 log_err("Error match found at %d %d\n", | |
1447 usearch_getMatchedStart(strsrch), | |
1448 usearch_getMatchedLength(strsrch)); | |
1449 return; | |
1450 } | |
1451 count ++; | |
1452 | |
1453 status = U_ZERO_ERROR; | |
1454 if (usearch_getMatchedText(NULL, matchtext, 128, &status) != | |
1455 USEARCH_DONE || U_SUCCESS(status)){ | |
1456 log_err("Error expecting errors with NULL string search\n"); | |
1457 } | |
1458 status = U_ZERO_ERROR; | |
1459 if (usearch_getMatchedText(strsrch, NULL, 0, &status) != | |
1460 (int32_t)matchlength || U_SUCCESS(status)){ | |
1461 log_err("Error pre-flighting match length\n"); | |
1462 } | |
1463 status = U_ZERO_ERROR; | |
1464 if (usearch_getMatchedText(strsrch, matchtext, 0, &status) != | |
1465 (int32_t)matchlength || U_SUCCESS(status)){ | |
1466 log_err("Error getting match text with buffer size 0\n"); | |
1467 } | |
1468 status = U_ZERO_ERROR; | |
1469 if (usearch_getMatchedText(strsrch, matchtext, matchlength, &status) | |
1470 != (int32_t)matchlength || matchtext[matchlength - 1] == 0 || | |
1471 U_FAILURE(status)){ | |
1472 log_err("Error getting match text with exact size\n"); | |
1473 } | |
1474 status = U_ZERO_ERROR; | |
1475 if (usearch_getMatchedText(strsrch, matchtext, 128, &status) != | |
1476 (int32_t) matchlength || U_FAILURE(status) || | |
1477 memcmp(matchtext, | |
1478 usearch_getText(strsrch, &textlength) + matchindex, | |
1479 matchlength * sizeof(UChar)) != 0 || | |
1480 matchtext[matchlength] != 0) { | |
1481 log_err("Error getting matched text\n"); | |
1482 } | |
1483 | |
1484 matchindex = search.offset[count]; | |
1485 } | |
1486 status = U_ZERO_ERROR; | |
1487 usearch_next(strsrch, &status); | |
1488 if (usearch_getMatchedStart(strsrch) != USEARCH_DONE || | |
1489 usearch_getMatchedLength(strsrch) != 0) { | |
1490 log_err("Error end of match not found\n"); | |
1491 } | |
1492 status = U_ZERO_ERROR; | |
1493 if (usearch_getMatchedText(strsrch, matchtext, 128, &status) != | |
1494 USEARCH_DONE) { | |
1495 log_err("Error getting null matches\n"); | |
1496 } | |
1497 usearch_close(strsrch); | |
1498 close(); | |
1499 } | |
1500 | |
1501 static void TestSetMatch(void) | |
1502 { | |
1503 int count = 0; | |
1504 UErrorCode status = U_ZERO_ERROR; | |
1505 open(&status); | |
1506 if (U_FAILURE(status)) { | |
1507 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
1508 return; | |
1509 } | |
1510 while (MATCH[count].text != NULL) { | |
1511 SearchData search = MATCH[count]; | |
1512 int size = 0; | |
1513 int offsetIndex = 0; | |
1514 UChar text[128]; | |
1515 UChar pattern[32]; | |
1516 UStringSearch *strsrch; | |
1517 status = U_ZERO_ERROR; | |
1518 | |
1519 if (usearch_first(NULL, &status) != USEARCH_DONE || | |
1520 usearch_last(NULL, &status) != USEARCH_DONE) { | |
1521 log_err("Error getting the first and last match of a NULL string sea
rch\n"); | |
1522 } | |
1523 u_unescape(search.text, text, 128); | |
1524 u_unescape(search.pattern, pattern, 32); | |
1525 strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_, | |
1526 NULL, &status); | |
1527 if (U_FAILURE(status)) { | |
1528 log_err("Error opening string search %s\n", u_errorName(status)); | |
1529 if (strsrch != NULL) { | |
1530 usearch_close(strsrch); | |
1531 } | |
1532 return; | |
1533 } | |
1534 | |
1535 size = 0; | |
1536 while (search.offset[size] != -1) { | |
1537 size ++; | |
1538 } | |
1539 | |
1540 if (usearch_first(strsrch, &status) != search.offset[0] || | |
1541 U_FAILURE(status)) { | |
1542 log_err("Error getting first match\n"); | |
1543 } | |
1544 if (usearch_last(strsrch, &status) != search.offset[size -1] || | |
1545 U_FAILURE(status)) { | |
1546 log_err("Error getting last match\n"); | |
1547 } | |
1548 | |
1549 while (offsetIndex < size) { | |
1550 if (offsetIndex + 2 < size) { | |
1551 if (usearch_following(strsrch, search.offset[offsetIndex + 2] -
1, | |
1552 &status) != search.offset[offsetIndex + 2]
|| | |
1553 U_FAILURE(status)) { | |
1554 log_err("Error getting following match at index %d\n", | |
1555 search.offset[offsetIndex + 2] - 1); | |
1556 } | |
1557 } | |
1558 if (offsetIndex + 1 < size) { | |
1559 if (usearch_preceding(strsrch, search.offset[offsetIndex + 1] + | |
1560 search.size[offsetIndex + 1] + 1,
| |
1561 &status) != search.offset[offsetIndex + 1]
|| | |
1562 U_FAILURE(status)) { | |
1563 log_err("Error getting preceeding match at index %d\n", | |
1564 search.offset[offsetIndex + 1] + 1); | |
1565 } | |
1566 } | |
1567 offsetIndex += 2; | |
1568 } | |
1569 status = U_ZERO_ERROR; | |
1570 if (usearch_following(strsrch, u_strlen(text), &status) != | |
1571 USEARCH_DONE) { | |
1572 log_err("Error expecting out of bounds match\n"); | |
1573 } | |
1574 if (usearch_preceding(strsrch, 0, &status) != USEARCH_DONE) { | |
1575 log_err("Error expecting out of bounds match\n"); | |
1576 } | |
1577 count ++; | |
1578 usearch_close(strsrch); | |
1579 } | |
1580 close(); | |
1581 } | |
1582 | |
1583 static void TestReset(void) | |
1584 { | |
1585 UErrorCode status = U_ZERO_ERROR; | |
1586 UChar text[] = {0x66, 0x69, 0x73, 0x68, 0x20, | |
1587 0x66, 0x69, 0x73, 0x68}; | |
1588 UChar pattern[] = {0x73}; | |
1589 UStringSearch *strsrch; | |
1590 | |
1591 open(&status); | |
1592 if (U_FAILURE(status)) { | |
1593 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
1594 return; | |
1595 } | |
1596 strsrch = usearch_openFromCollator(pattern, 1, text, 9, | |
1597 EN_US_, NULL, &status); | |
1598 if (U_FAILURE(status)) { | |
1599 log_err("Error opening string search %s\n", u_errorName(status)); | |
1600 if (strsrch != NULL) { | |
1601 usearch_close(strsrch); | |
1602 } | |
1603 return; | |
1604 } | |
1605 usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_ON, &status); | |
1606 usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON, | |
1607 &status); | |
1608 usearch_setOffset(strsrch, 9, &status); | |
1609 if (U_FAILURE(status)) { | |
1610 log_err("Error setting attributes and offsets\n"); | |
1611 } | |
1612 else { | |
1613 usearch_reset(strsrch); | |
1614 if (usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF || | |
1615 usearch_getAttribute(strsrch, USEARCH_CANONICAL_MATCH) != | |
1616 USEARCH_OFF || | |
1617 usearch_getOffset(strsrch) != 0 || | |
1618 usearch_getMatchedLength(strsrch) != 0 || | |
1619 usearch_getMatchedStart(strsrch) != USEARCH_DONE) { | |
1620 log_err("Error resetting string search\n"); | |
1621 } | |
1622 usearch_previous(strsrch, &status); | |
1623 if (usearch_getMatchedStart(strsrch) != 7 || | |
1624 usearch_getMatchedLength(strsrch) != 1) { | |
1625 log_err("Error resetting string search\n"); | |
1626 } | |
1627 } | |
1628 usearch_close(strsrch); | |
1629 close(); | |
1630 } | |
1631 | |
1632 static void TestSupplementary(void) | |
1633 { | |
1634 int count = 0; | |
1635 UErrorCode status = U_ZERO_ERROR; | |
1636 open(&status); | |
1637 if (U_FAILURE(status)) { | |
1638 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
1639 return; | |
1640 } | |
1641 while (SUPPLEMENTARY[count].text != NULL) { | |
1642 if (!assertEqual(SUPPLEMENTARY[count])) { | |
1643 log_err("Error at test number %d\n", count); | |
1644 } | |
1645 count ++; | |
1646 } | |
1647 close(); | |
1648 } | |
1649 | |
1650 static void TestContraction(void) | |
1651 { | |
1652 UChar rules[128]; | |
1653 UChar pattern[128]; | |
1654 UChar text[128]; | |
1655 UCollator *collator; | |
1656 UErrorCode status = U_ZERO_ERROR; | |
1657 int count = 0; | |
1658 UStringSearch *strsrch; | |
1659 memset(rules, 0, 128*sizeof(UChar)); | |
1660 memset(pattern, 0, 128*sizeof(UChar)); | |
1661 memset(text, 0, 128*sizeof(UChar)); | |
1662 | |
1663 u_unescape(CONTRACTIONRULE, rules, 128); | |
1664 collator = ucol_openRules(rules, u_strlen(rules), UCOL_ON, | |
1665 UCOL_TERTIARY, NULL, &status); | |
1666 if(status == U_FILE_ACCESS_ERROR) { | |
1667 log_data_err("Is your data around?\n"); | |
1668 return; | |
1669 } else if(U_FAILURE(status)) { | |
1670 log_err("Error opening collator %s\n", u_errorName(status)); | |
1671 return; | |
1672 } | |
1673 strsrch = usearch_openFromCollator(pattern, 1, text, 1, collator, NULL, | |
1674 &status); | |
1675 if (U_FAILURE(status)) { | |
1676 log_err("Error opening string search %s\n", u_errorName(status)); | |
1677 } | |
1678 | |
1679 while (CONTRACTION[count].text != NULL) { | |
1680 u_unescape(CONTRACTION[count].text, text, 128); | |
1681 u_unescape(CONTRACTION[count].pattern, pattern, 128); | |
1682 usearch_setText(strsrch, text, -1, &status); | |
1683 usearch_setPattern(strsrch, pattern, -1, &status); | |
1684 if (!assertEqualWithUStringSearch(strsrch, CONTRACTION[count])) { | |
1685 log_err("Error at test number %d\n", count); | |
1686 } | |
1687 count ++; | |
1688 } | |
1689 usearch_close(strsrch); | |
1690 ucol_close(collator); | |
1691 } | |
1692 | |
1693 static void TestIgnorable(void) | |
1694 { | |
1695 UChar rules[128]; | |
1696 UChar pattern[128]; | |
1697 UChar text[128]; | |
1698 UCollator *collator; | |
1699 UErrorCode status = U_ZERO_ERROR; | |
1700 UStringSearch *strsrch; | |
1701 uint32_t count = 0; | |
1702 | |
1703 memset(rules, 0, 128*sizeof(UChar)); | |
1704 memset(pattern, 0, 128*sizeof(UChar)); | |
1705 memset(text, 0, 128*sizeof(UChar)); | |
1706 | |
1707 u_unescape(IGNORABLERULE, rules, 128); | |
1708 collator = ucol_openRules(rules, u_strlen(rules), UCOL_ON, | |
1709 IGNORABLE[count].strength, NULL, &status); | |
1710 if(status == U_FILE_ACCESS_ERROR) { | |
1711 log_data_err("Is your data around?\n"); | |
1712 return; | |
1713 } else if(U_FAILURE(status)) { | |
1714 log_err("Error opening collator %s\n", u_errorName(status)); | |
1715 return; | |
1716 } | |
1717 strsrch = usearch_openFromCollator(pattern, 1, text, 1, collator, NULL, | |
1718 &status); | |
1719 if (U_FAILURE(status)) { | |
1720 log_err("Error opening string search %s\n", u_errorName(status)); | |
1721 } | |
1722 | |
1723 while (IGNORABLE[count].text != NULL) { | |
1724 u_unescape(IGNORABLE[count].text, text, 128); | |
1725 u_unescape(IGNORABLE[count].pattern, pattern, 128); | |
1726 usearch_setText(strsrch, text, -1, &status); | |
1727 usearch_setPattern(strsrch, pattern, -1, &status); | |
1728 if (!assertEqualWithUStringSearch(strsrch, IGNORABLE[count])) { | |
1729 log_err("Error at test number %d\n", count); | |
1730 } | |
1731 count ++; | |
1732 } | |
1733 usearch_close(strsrch); | |
1734 ucol_close(collator); | |
1735 } | |
1736 | |
1737 static void TestDiacriticMatch(void) | |
1738 { | |
1739 UChar pattern[128]; | |
1740 UChar text[128]; | |
1741 UErrorCode status = U_ZERO_ERROR; | |
1742 UStringSearch *strsrch = NULL; | |
1743 UCollator *coll = NULL; | |
1744 uint32_t count = 0; | |
1745 SearchData search; | |
1746 | |
1747 memset(pattern, 0, 128*sizeof(UChar)); | |
1748 memset(text, 0, 128*sizeof(UChar)); | |
1749 | |
1750 strsrch = usearch_open(pattern, 1, text, 1, uloc_getDefault(), NULL, &status
); | |
1751 if (U_FAILURE(status)) { | |
1752 log_err_status(status, "Error opening string search %s\n", u_errorName(s
tatus)); | |
1753 return; | |
1754 } | |
1755 | |
1756 search = DIACRITICMATCH[count]; | |
1757 while (search.text != NULL) { | |
1758 if (search.collator != NULL) { | |
1759 coll = ucol_openFromShortString(search.collator, FALSE, NULL, &statu
s); | |
1760 } else { | |
1761 /* Always use "en_US" because some of these tests fail in Danish loc
ales. */ | |
1762 coll = ucol_open("en_US"/*uloc_getDefault()*/, &status); | |
1763 ucol_setStrength(coll, search.strength); | |
1764 } | |
1765 if (U_FAILURE(status)) { | |
1766 log_err("Error opening string search collator(\"%s\") %s\n", search.
collator, u_errorName(status)); | |
1767 return; | |
1768 } | |
1769 | |
1770 usearch_setCollator(strsrch, coll, &status); | |
1771 if (U_FAILURE(status)) { | |
1772 log_err("Error setting string search collator %s\n", u_errorName(sta
tus)); | |
1773 return; | |
1774 } | |
1775 | |
1776 u_unescape(search.text, text, 128); | |
1777 u_unescape(search.pattern, pattern, 128); | |
1778 usearch_setText(strsrch, text, -1, &status); | |
1779 usearch_setPattern(strsrch, pattern, -1, &status); | |
1780 if (!assertEqualWithUStringSearch(strsrch, search)) { | |
1781 log_err("Error at test number %d\n", count); | |
1782 } | |
1783 ucol_close(coll); | |
1784 | |
1785 search = DIACRITICMATCH[++count]; | |
1786 } | |
1787 usearch_close(strsrch); | |
1788 } | |
1789 | |
1790 static void TestCanonical(void) | |
1791 { | |
1792 int count = 0; | |
1793 UErrorCode status = U_ZERO_ERROR; | |
1794 open(&status); | |
1795 if (U_FAILURE(status)) { | |
1796 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
1797 return; | |
1798 } | |
1799 while (BASICCANONICAL[count].text != NULL) { | |
1800 if (!assertCanonicalEqual(BASICCANONICAL[count])) { | |
1801 log_err("Error at test number %d\n", count); | |
1802 } | |
1803 count ++; | |
1804 } | |
1805 close(); | |
1806 } | |
1807 | |
1808 static void TestNormCanonical(void) | |
1809 { | |
1810 int count = 0; | |
1811 UErrorCode status = U_ZERO_ERROR; | |
1812 open(&status); | |
1813 if (U_FAILURE(status)) { | |
1814 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
1815 return; | |
1816 } | |
1817 ucol_setAttribute(EN_US_, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); | |
1818 count = 0; | |
1819 while (NORMCANONICAL[count].text != NULL) { | |
1820 if (!assertCanonicalEqual(NORMCANONICAL[count])) { | |
1821 log_err("Error at test number %d\n", count); | |
1822 } | |
1823 count ++; | |
1824 } | |
1825 ucol_setAttribute(EN_US_, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status); | |
1826 close(); | |
1827 } | |
1828 | |
1829 static void TestStrengthCanonical(void) | |
1830 { | |
1831 int count = 0; | |
1832 UErrorCode status = U_ZERO_ERROR; | |
1833 open(&status); | |
1834 if (U_FAILURE(status)) { | |
1835 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
1836 return; | |
1837 } | |
1838 while (STRENGTHCANONICAL[count].text != NULL) { | |
1839 if (!assertCanonicalEqual(STRENGTHCANONICAL[count])) { | |
1840 log_err("Error at test number %d\n", count); | |
1841 } | |
1842 count ++; | |
1843 } | |
1844 close(); | |
1845 } | |
1846 | |
1847 static void TestBreakIteratorCanonical(void) { | |
1848 UErrorCode status = U_ZERO_ERROR; | |
1849 int count = 0; | |
1850 | |
1851 CHECK_BREAK("x"); | |
1852 | |
1853 #if !UCONFIG_NO_BREAK_ITERATION | |
1854 | |
1855 open(&status); | |
1856 if (U_FAILURE(status)) { | |
1857 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
1858 return; | |
1859 } | |
1860 while (count < 4) { | |
1861 /* 0-3 test are fixed */ | |
1862 UChar pattern[32]; | |
1863 UChar text[128]; | |
1864 const SearchData *search = &(BREAKITERATORCANONICAL[count]); | |
1865 UCollator *collator = getCollator(search->collator); | |
1866 UBreakIterator *breaker = getBreakIterator(search->breaker); | |
1867 UStringSearch *strsrch; | |
1868 | |
1869 u_unescape(search->text, text, 128); | |
1870 u_unescape(search->pattern, pattern, 32); | |
1871 ucol_setStrength(collator, search->strength); | |
1872 | |
1873 strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator, | |
1874 breaker, &status); | |
1875 if(status == U_FILE_ACCESS_ERROR) { | |
1876 log_data_err("Is your data around?\n"); | |
1877 goto ENDTESTBREAKITERATOR; | |
1878 } else if(U_FAILURE(status)) { | |
1879 log_err("Error opening searcher\n"); | |
1880 goto ENDTESTBREAKITERATOR; | |
1881 } | |
1882 usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON, | |
1883 &status); | |
1884 if (U_FAILURE(status) || | |
1885 usearch_getBreakIterator(strsrch) != breaker) { | |
1886 log_err("Error setting break iterator\n"); | |
1887 usearch_close(strsrch); | |
1888 goto ENDTESTBREAKITERATOR; | |
1889 } | |
1890 if (!assertEqualWithUStringSearch(strsrch, *search)) { | |
1891 ucol_setStrength(collator, UCOL_TERTIARY); | |
1892 usearch_close(strsrch); | |
1893 goto ENDTESTBREAKITERATOR; | |
1894 } | |
1895 search = &(BREAKITERATOREXACT[count + 1]); | |
1896 breaker = getBreakIterator(search->breaker); | |
1897 usearch_setBreakIterator(strsrch, breaker, &status); | |
1898 if (U_FAILURE(status) || usearch_getBreakIterator(strsrch) != breaker) { | |
1899 log_err("Error setting break iterator\n"); | |
1900 usearch_close(strsrch); | |
1901 goto ENDTESTBREAKITERATOR; | |
1902 } | |
1903 usearch_reset(strsrch); | |
1904 usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON, | |
1905 &status); | |
1906 if (!assertEqualWithUStringSearch(strsrch, *search)) { | |
1907 log_err("Error at test number %d\n", count); | |
1908 usearch_close(strsrch); | |
1909 goto ENDTESTBREAKITERATOR; | |
1910 } | |
1911 usearch_close(strsrch); | |
1912 count += 2; | |
1913 } | |
1914 count = 0; | |
1915 while (BREAKITERATORCANONICAL[count].text != NULL) { | |
1916 if (!assertEqual(BREAKITERATORCANONICAL[count])) { | |
1917 log_err("Error at test number %d\n", count); | |
1918 goto ENDTESTBREAKITERATOR; | |
1919 } | |
1920 count ++; | |
1921 } | |
1922 | |
1923 ENDTESTBREAKITERATOR: | |
1924 close(); | |
1925 #endif | |
1926 } | |
1927 | |
1928 static void TestVariableCanonical(void) | |
1929 { | |
1930 int count = 0; | |
1931 UErrorCode status = U_ZERO_ERROR; | |
1932 open(&status); | |
1933 if (U_FAILURE(status)) { | |
1934 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
1935 return; | |
1936 } | |
1937 ucol_setAttribute(EN_US_, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status); | |
1938 if (U_FAILURE(status)) { | |
1939 log_err("Error setting collation alternate attribute %s\n", | |
1940 u_errorName(status)); | |
1941 } | |
1942 while (VARIABLE[count].text != NULL) { | |
1943 log_verbose("variable %d\n", count); | |
1944 if (!assertCanonicalEqual(VARIABLE[count])) { | |
1945 log_err("Error at test number %d\n", count); | |
1946 } | |
1947 count ++; | |
1948 } | |
1949 ucol_setAttribute(EN_US_, UCOL_ALTERNATE_HANDLING, | |
1950 UCOL_NON_IGNORABLE, &status); | |
1951 close(); | |
1952 } | |
1953 | |
1954 static void TestOverlapCanonical(void) | |
1955 { | |
1956 int count = 0; | |
1957 UErrorCode status = U_ZERO_ERROR; | |
1958 open(&status); | |
1959 if (U_FAILURE(status)) { | |
1960 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
1961 return; | |
1962 } | |
1963 while (OVERLAPCANONICAL[count].text != NULL) { | |
1964 if (!assertEqualWithAttribute(OVERLAPCANONICAL[count], USEARCH_ON, | |
1965 USEARCH_ON)) { | |
1966 log_err("Error at overlap test number %d\n", count); | |
1967 } | |
1968 count ++; | |
1969 } | |
1970 count = 0; | |
1971 while (NONOVERLAP[count].text != NULL) { | |
1972 if (!assertCanonicalEqual(NONOVERLAPCANONICAL[count])) { | |
1973 log_err("Error at non overlap test number %d\n", count); | |
1974 } | |
1975 count ++; | |
1976 } | |
1977 | |
1978 count = 0; | |
1979 while (count < 1) { | |
1980 UChar pattern[32]; | |
1981 UChar text[128]; | |
1982 const SearchData *search = &(OVERLAPCANONICAL[count]); | |
1983 UCollator *collator = getCollator(search->collator); | |
1984 UStringSearch *strsrch; | |
1985 status = U_ZERO_ERROR; | |
1986 | |
1987 u_unescape(search->text, text, 128); | |
1988 u_unescape(search->pattern, pattern, 32); | |
1989 strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator, | |
1990 NULL, &status); | |
1991 if(status == U_FILE_ACCESS_ERROR) { | |
1992 log_data_err("Is your data around?\n"); | |
1993 return; | |
1994 } else if(U_FAILURE(status)) { | |
1995 log_err("Error opening searcher\n"); | |
1996 return; | |
1997 } | |
1998 usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON, | |
1999 &status); | |
2000 usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_ON, &status); | |
2001 if (U_FAILURE(status) || | |
2002 usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_ON) { | |
2003 log_err("Error setting overlap option\n"); | |
2004 } | |
2005 if (!assertEqualWithUStringSearch(strsrch, *search)) { | |
2006 usearch_close(strsrch); | |
2007 return; | |
2008 } | |
2009 search = &(NONOVERLAPCANONICAL[count]); | |
2010 usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_OFF, &status); | |
2011 if (U_FAILURE(status) || | |
2012 usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF) { | |
2013 log_err("Error setting overlap option\n"); | |
2014 } | |
2015 usearch_reset(strsrch); | |
2016 if (!assertEqualWithUStringSearch(strsrch, *search)) { | |
2017 usearch_close(strsrch); | |
2018 log_err("Error at test number %d\n", count); | |
2019 } | |
2020 | |
2021 count ++; | |
2022 usearch_close(strsrch); | |
2023 } | |
2024 close(); | |
2025 } | |
2026 | |
2027 static void TestCollatorCanonical(void) | |
2028 { | |
2029 /* test collator that thinks "o" and "p" are the same thing */ | |
2030 UChar rules[32]; | |
2031 UCollator *tailored = NULL; | |
2032 UErrorCode status = U_ZERO_ERROR; | |
2033 UChar pattern[32]; | |
2034 UChar text[128]; | |
2035 UStringSearch *strsrch; | |
2036 | |
2037 open(&status); | |
2038 if (U_FAILURE(status)) { | |
2039 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
2040 return; | |
2041 } | |
2042 u_unescape(COLLATORCANONICAL[0].text, text, 128); | |
2043 u_unescape(COLLATORCANONICAL[0].pattern, pattern, 32); | |
2044 | |
2045 strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_, | |
2046 NULL, &status); | |
2047 if(status == U_FILE_ACCESS_ERROR) { | |
2048 log_data_err("Is your data around?\n"); | |
2049 return; | |
2050 } else if(U_FAILURE(status)) { | |
2051 log_err("Error opening searcher\n"); | |
2052 return; | |
2053 } | |
2054 usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON, | |
2055 &status); | |
2056 if (U_FAILURE(status)) { | |
2057 log_err("Error opening string search %s\n", u_errorName(status)); | |
2058 } | |
2059 if (!assertEqualWithUStringSearch(strsrch, COLLATORCANONICAL[0])) { | |
2060 goto ENDTESTCOLLATOR; | |
2061 } | |
2062 | |
2063 u_unescape(TESTCOLLATORRULE, rules, 32); | |
2064 tailored = ucol_openRules(rules, -1, UCOL_ON, | |
2065 COLLATORCANONICAL[1].strength, NULL, &status); | |
2066 if (U_FAILURE(status)) { | |
2067 log_err("Error opening rule based collator %s\n", u_errorName(status)); | |
2068 } | |
2069 | |
2070 usearch_setCollator(strsrch, tailored, &status); | |
2071 if (U_FAILURE(status) || usearch_getCollator(strsrch) != tailored) { | |
2072 log_err("Error setting rule based collator\n"); | |
2073 } | |
2074 usearch_reset(strsrch); | |
2075 usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON, | |
2076 &status); | |
2077 if (!assertEqualWithUStringSearch(strsrch, COLLATORCANONICAL[1])) { | |
2078 goto ENDTESTCOLLATOR; | |
2079 } | |
2080 | |
2081 usearch_setCollator(strsrch, EN_US_, &status); | |
2082 usearch_reset(strsrch); | |
2083 usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON, | |
2084 &status); | |
2085 if (U_FAILURE(status) || usearch_getCollator(strsrch) != EN_US_) { | |
2086 log_err("Error setting rule based collator\n"); | |
2087 } | |
2088 if (!assertEqualWithUStringSearch(strsrch, COLLATORCANONICAL[0])) { | |
2089 goto ENDTESTCOLLATOR; | |
2090 } | |
2091 | |
2092 ENDTESTCOLLATOR: | |
2093 usearch_close(strsrch); | |
2094 if (tailored != NULL) { | |
2095 ucol_close(tailored); | |
2096 } | |
2097 close(); | |
2098 } | |
2099 | |
2100 static void TestPatternCanonical(void) | |
2101 { | |
2102 UStringSearch *strsrch; | |
2103 UChar pattern[32]; | |
2104 UChar text[128]; | |
2105 const UChar *temp; | |
2106 int32_t templength; | |
2107 UErrorCode status = U_ZERO_ERROR; | |
2108 | |
2109 open(&status); | |
2110 if (U_FAILURE(status)) { | |
2111 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
2112 return; | |
2113 } | |
2114 u_unescape(PATTERNCANONICAL[0].text, text, 128); | |
2115 u_unescape(PATTERNCANONICAL[0].pattern, pattern, 32); | |
2116 | |
2117 ucol_setStrength(EN_US_, PATTERNCANONICAL[0].strength); | |
2118 strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_, | |
2119 NULL, &status); | |
2120 usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON, | |
2121 &status); | |
2122 if (U_FAILURE(status)) { | |
2123 log_err("Error opening string search %s\n", u_errorName(status)); | |
2124 goto ENDTESTPATTERN; | |
2125 } | |
2126 temp = usearch_getPattern(strsrch, &templength); | |
2127 if (u_strcmp(pattern, temp) != 0) { | |
2128 log_err("Error setting pattern\n"); | |
2129 } | |
2130 if (!assertEqualWithUStringSearch(strsrch, PATTERNCANONICAL[0])) { | |
2131 goto ENDTESTPATTERN; | |
2132 } | |
2133 | |
2134 u_unescape(PATTERNCANONICAL[1].pattern, pattern, 32); | |
2135 usearch_setPattern(strsrch, pattern, -1, &status); | |
2136 temp = usearch_getPattern(strsrch, &templength); | |
2137 if (u_strcmp(pattern, temp) != 0) { | |
2138 log_err("Error setting pattern\n"); | |
2139 goto ENDTESTPATTERN; | |
2140 } | |
2141 usearch_reset(strsrch); | |
2142 usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON, | |
2143 &status); | |
2144 if (U_FAILURE(status)) { | |
2145 log_err("Error setting pattern %s\n", u_errorName(status)); | |
2146 } | |
2147 if (!assertEqualWithUStringSearch(strsrch, PATTERNCANONICAL[1])) { | |
2148 goto ENDTESTPATTERN; | |
2149 } | |
2150 | |
2151 u_unescape(PATTERNCANONICAL[0].pattern, pattern, 32); | |
2152 usearch_setPattern(strsrch, pattern, -1, &status); | |
2153 temp = usearch_getPattern(strsrch, &templength); | |
2154 if (u_strcmp(pattern, temp) != 0) { | |
2155 log_err("Error setting pattern\n"); | |
2156 goto ENDTESTPATTERN; | |
2157 } | |
2158 usearch_reset(strsrch); | |
2159 usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON, | |
2160 &status); | |
2161 if (U_FAILURE(status)) { | |
2162 log_err("Error setting pattern %s\n", u_errorName(status)); | |
2163 } | |
2164 if (!assertEqualWithUStringSearch(strsrch, PATTERNCANONICAL[0])) { | |
2165 goto ENDTESTPATTERN; | |
2166 } | |
2167 ENDTESTPATTERN: | |
2168 ucol_setStrength(EN_US_, UCOL_TERTIARY); | |
2169 if (strsrch != NULL) { | |
2170 usearch_close(strsrch); | |
2171 } | |
2172 close(); | |
2173 } | |
2174 | |
2175 static void TestTextCanonical(void) | |
2176 { | |
2177 UStringSearch *strsrch; | |
2178 UChar pattern[32]; | |
2179 UChar text[128]; | |
2180 const UChar *temp; | |
2181 int32_t templength; | |
2182 UErrorCode status = U_ZERO_ERROR; | |
2183 | |
2184 u_unescape(TEXTCANONICAL[0].text, text, 128); | |
2185 u_unescape(TEXTCANONICAL[0].pattern, pattern, 32); | |
2186 | |
2187 open(&status); | |
2188 if (U_FAILURE(status)) { | |
2189 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
2190 return; | |
2191 } | |
2192 strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_, | |
2193 NULL, &status); | |
2194 usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON, | |
2195 &status); | |
2196 | |
2197 if (U_FAILURE(status)) { | |
2198 log_err("Error opening string search %s\n", u_errorName(status)); | |
2199 goto ENDTESTPATTERN; | |
2200 } | |
2201 temp = usearch_getText(strsrch, &templength); | |
2202 if (u_strcmp(text, temp) != 0) { | |
2203 log_err("Error setting text\n"); | |
2204 } | |
2205 if (!assertEqualWithUStringSearch(strsrch, TEXTCANONICAL[0])) { | |
2206 goto ENDTESTPATTERN; | |
2207 } | |
2208 | |
2209 u_unescape(TEXTCANONICAL[1].text, text, 32); | |
2210 usearch_setText(strsrch, text, -1, &status); | |
2211 temp = usearch_getText(strsrch, &templength); | |
2212 if (u_strcmp(text, temp) != 0) { | |
2213 log_err("Error setting text\n"); | |
2214 goto ENDTESTPATTERN; | |
2215 } | |
2216 if (U_FAILURE(status)) { | |
2217 log_err("Error setting text %s\n", u_errorName(status)); | |
2218 } | |
2219 if (!assertEqualWithUStringSearch(strsrch, TEXTCANONICAL[1])) { | |
2220 goto ENDTESTPATTERN; | |
2221 } | |
2222 | |
2223 u_unescape(TEXTCANONICAL[0].text, text, 32); | |
2224 usearch_setText(strsrch, text, -1, &status); | |
2225 temp = usearch_getText(strsrch, &templength); | |
2226 if (u_strcmp(text, temp) != 0) { | |
2227 log_err("Error setting text\n"); | |
2228 goto ENDTESTPATTERN; | |
2229 } | |
2230 if (U_FAILURE(status)) { | |
2231 log_err("Error setting pattern %s\n", u_errorName(status)); | |
2232 } | |
2233 if (!assertEqualWithUStringSearch(strsrch, TEXTCANONICAL[0])) { | |
2234 goto ENDTESTPATTERN; | |
2235 } | |
2236 ENDTESTPATTERN: | |
2237 if (strsrch != NULL) { | |
2238 usearch_close(strsrch); | |
2239 } | |
2240 close(); | |
2241 } | |
2242 | |
2243 static void TestCompositeBoundariesCanonical(void) | |
2244 { | |
2245 int count = 0; | |
2246 UErrorCode status = U_ZERO_ERROR; | |
2247 open(&status); | |
2248 if (U_FAILURE(status)) { | |
2249 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
2250 return; | |
2251 } | |
2252 while (COMPOSITEBOUNDARIESCANONICAL[count].text != NULL) { | |
2253 log_verbose("composite %d\n", count); | |
2254 if (!assertCanonicalEqual(COMPOSITEBOUNDARIESCANONICAL[count])) { | |
2255 log_err("Error at test number %d\n", count); | |
2256 } | |
2257 count ++; | |
2258 } | |
2259 close(); | |
2260 } | |
2261 | |
2262 static void TestGetSetOffsetCanonical(void) | |
2263 { | |
2264 int searchDataIndex = 0; | |
2265 UChar pattern[32]; | |
2266 UChar text[128]; | |
2267 UErrorCode status = U_ZERO_ERROR; | |
2268 UStringSearch *strsrch; | |
2269 UCollator *collator; | |
2270 | |
2271 memset(pattern, 0, 32*sizeof(UChar)); | |
2272 memset(text, 0, 128*sizeof(UChar)); | |
2273 | |
2274 open(&status); | |
2275 if (U_FAILURE(status)) { | |
2276 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
2277 return; | |
2278 } | |
2279 strsrch = usearch_openFromCollator(pattern, 16, text, 32, EN_US_, NULL, | |
2280 &status); | |
2281 | |
2282 collator = usearch_getCollator(strsrch); | |
2283 ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); | |
2284 | |
2285 usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON, | |
2286 &status); | |
2287 | |
2288 /* testing out of bounds error */ | |
2289 usearch_setOffset(strsrch, -1, &status); | |
2290 if (U_SUCCESS(status)) { | |
2291 log_err("Error expecting set offset error\n"); | |
2292 } | |
2293 usearch_setOffset(strsrch, 128, &status); | |
2294 if (U_SUCCESS(status)) { | |
2295 log_err("Error expecting set offset error\n"); | |
2296 } | |
2297 while (BASICCANONICAL[searchDataIndex].text != NULL) { | |
2298 int count = 0; | |
2299 SearchData search = BASICCANONICAL[searchDataIndex ++]; | |
2300 int32_t matchindex = search.offset[count]; | |
2301 int32_t textlength; | |
2302 | |
2303 if (BASICCANONICAL[searchDataIndex].text == NULL) { | |
2304 /* skip the last one */ | |
2305 break; | |
2306 } | |
2307 | |
2308 u_unescape(search.text, text, 128); | |
2309 u_unescape(search.pattern, pattern, 32); | |
2310 status = U_ZERO_ERROR; | |
2311 usearch_setText(strsrch, text, -1, &status); | |
2312 usearch_setPattern(strsrch, pattern, -1, &status); | |
2313 while (U_SUCCESS(status) && matchindex >= 0) { | |
2314 uint32_t matchlength = search.size[count]; | |
2315 usearch_next(strsrch, &status); | |
2316 if (matchindex != usearch_getMatchedStart(strsrch) || | |
2317 matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) { | |
2318 char *str = toCharString(usearch_getText(strsrch, | |
2319 &textlength)); | |
2320 log_err("Text: %s\n", str); | |
2321 str = toCharString(usearch_getPattern(strsrch, &textlength)); | |
2322 log_err("Pattern: %s\n", str); | |
2323 log_err("Error match found at %d %d\n", | |
2324 usearch_getMatchedStart(strsrch), | |
2325 usearch_getMatchedLength(strsrch)); | |
2326 goto bail; | |
2327 } | |
2328 matchindex = search.offset[count + 1] == -1 ? -1 : | |
2329 search.offset[count + 2]; | |
2330 if (search.offset[count + 1] != -1) { | |
2331 usearch_setOffset(strsrch, search.offset[count + 1] + 1, | |
2332 &status); | |
2333 if (usearch_getOffset(strsrch) != search.offset[count + 1] + 1)
{ | |
2334 log_err("Error setting offset\n"); | |
2335 goto bail; | |
2336 } | |
2337 } | |
2338 | |
2339 count += 2; | |
2340 } | |
2341 usearch_next(strsrch, &status); | |
2342 if (usearch_getMatchedStart(strsrch) != USEARCH_DONE) { | |
2343 char *str = toCharString(usearch_getText(strsrch, &textlength)); | |
2344 log_err("Text: %s\n", str); | |
2345 str = toCharString(usearch_getPattern(strsrch, &textlength)); | |
2346 log_err("Pattern: %s\n", str); | |
2347 log_err("Error match found at %d %d\n", | |
2348 usearch_getMatchedStart(strsrch), | |
2349 usearch_getMatchedLength(strsrch)); | |
2350 goto bail; | |
2351 } | |
2352 } | |
2353 | |
2354 bail: | |
2355 ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status); | |
2356 usearch_close(strsrch); | |
2357 close(); | |
2358 } | |
2359 | |
2360 static void TestSupplementaryCanonical(void) | |
2361 { | |
2362 int count = 0; | |
2363 UErrorCode status = U_ZERO_ERROR; | |
2364 open(&status); | |
2365 if (U_FAILURE(status)) { | |
2366 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
2367 return; | |
2368 } | |
2369 while (SUPPLEMENTARYCANONICAL[count].text != NULL) { | |
2370 if (!assertCanonicalEqual(SUPPLEMENTARYCANONICAL[count])) { | |
2371 log_err("Error at test number %d\n", count); | |
2372 } | |
2373 count ++; | |
2374 } | |
2375 close(); | |
2376 } | |
2377 | |
2378 static void TestContractionCanonical(void) | |
2379 { | |
2380 UChar rules[128]; | |
2381 UChar pattern[128]; | |
2382 UChar text[128]; | |
2383 UCollator *collator = NULL; | |
2384 UErrorCode status = U_ZERO_ERROR; | |
2385 int count = 0; | |
2386 UStringSearch *strsrch = NULL; | |
2387 memset(rules, 0, 128*sizeof(UChar)); | |
2388 memset(pattern, 0, 128*sizeof(UChar)); | |
2389 memset(text, 0, 128*sizeof(UChar)); | |
2390 | |
2391 u_unescape(CONTRACTIONRULE, rules, 128); | |
2392 collator = ucol_openRules(rules, u_strlen(rules), UCOL_ON, | |
2393 UCOL_TERTIARY, NULL, &status); | |
2394 if(status == U_FILE_ACCESS_ERROR) { | |
2395 log_data_err("Is your data around?\n"); | |
2396 return; | |
2397 } else if(U_FAILURE(status)) { | |
2398 log_err("Error opening collator %s\n", u_errorName(status)); | |
2399 return; | |
2400 } | |
2401 strsrch = usearch_openFromCollator(pattern, 1, text, 1, collator, NULL, | |
2402 &status); | |
2403 usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON, | |
2404 &status); | |
2405 if (U_FAILURE(status)) { | |
2406 log_err("Error opening string search %s\n", u_errorName(status)); | |
2407 } | |
2408 | |
2409 while (CONTRACTIONCANONICAL[count].text != NULL) { | |
2410 u_unescape(CONTRACTIONCANONICAL[count].text, text, 128); | |
2411 u_unescape(CONTRACTIONCANONICAL[count].pattern, pattern, 128); | |
2412 usearch_setText(strsrch, text, -1, &status); | |
2413 usearch_setPattern(strsrch, pattern, -1, &status); | |
2414 if (!assertEqualWithUStringSearch(strsrch, | |
2415 CONTRACTIONCANONICAL[count])) { | |
2416 log_err("Error at test number %d\n", count); | |
2417 } | |
2418 count ++; | |
2419 } | |
2420 usearch_close(strsrch); | |
2421 ucol_close(collator); | |
2422 } | |
2423 | |
2424 static void TestNumeric(void) { | |
2425 UCollator *coll = NULL; | |
2426 UStringSearch *strsrch = NULL; | |
2427 UErrorCode status = U_ZERO_ERROR; | |
2428 | |
2429 UChar pattern[128]; | |
2430 UChar text[128]; | |
2431 memset(pattern, 0, 128*sizeof(UChar)); | |
2432 memset(text, 0, 128*sizeof(UChar)); | |
2433 | |
2434 coll = ucol_open("", &status); | |
2435 if(U_FAILURE(status)) { | |
2436 log_data_err("Could not open UCA. Is your data around?\n"); | |
2437 return; | |
2438 } | |
2439 | |
2440 ucol_setAttribute(coll, UCOL_NUMERIC_COLLATION, UCOL_ON, &status); | |
2441 | |
2442 strsrch = usearch_openFromCollator(pattern, 1, text, 1, coll, NULL, &status)
; | |
2443 | |
2444 if(status != U_UNSUPPORTED_ERROR || U_SUCCESS(status)) { | |
2445 log_err("Expected U_UNSUPPORTED_ERROR when trying to instantiate a searc
h object from a CODAN collator, got %s instead\n", u_errorName(status)); | |
2446 if(strsrch) { | |
2447 usearch_close(strsrch); | |
2448 } | |
2449 } | |
2450 | |
2451 ucol_close(coll); | |
2452 | |
2453 } | |
2454 | |
2455 /* This test is for ticket 4038 due to incorrect backward searching when certain
patterns have a length > 1 */ | |
2456 static void TestForwardBackward(void) { | |
2457 UErrorCode status = U_ZERO_ERROR; | |
2458 UCollator *coll = NULL; | |
2459 UStringSearch *search = NULL; | |
2460 UChar usrcstr[32], value[4]; | |
2461 int32_t pos= -1; | |
2462 int32_t expectedPos = 9; | |
2463 | |
2464 coll = ucol_open("en_GB", &status); | |
2465 if (U_FAILURE(status)) { | |
2466 log_err_status(status, "ucol_open failed: %s\n", u_errorName(status)); | |
2467 goto exitTestForwardBackward; | |
2468 } | |
2469 ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_PRIMARY, &status); | |
2470 ucol_setAttribute(coll, UCOL_CASE_LEVEL, UCOL_ON, &status); | |
2471 ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, &status
); | |
2472 | |
2473 u_uastrcpy(usrcstr, "QBitArray::bitarr_data"); /* text */ | |
2474 u_uastrcpy(value, "::"); /* pattern */ | |
2475 | |
2476 search = usearch_openFromCollator(value, 2, usrcstr, 22, coll, NULL, &status
); | |
2477 if (U_FAILURE(status)) { | |
2478 log_err("usearch_openFromCollator failed: %s\n", u_errorName(status)); | |
2479 goto exitTestForwardBackward; | |
2480 } | |
2481 | |
2482 usearch_reset(search); | |
2483 /* forward search */ | |
2484 pos = usearch_first(search, &status); | |
2485 if (pos != expectedPos) { | |
2486 log_err("Expected search result: %d; Got instead: %d\n", expectedPos, po
s); | |
2487 goto exitTestForwardBackward; | |
2488 } | |
2489 | |
2490 pos = -1; | |
2491 usearch_reset(search); | |
2492 /* backward search */ | |
2493 pos = usearch_last(search, &status); | |
2494 if (pos != expectedPos) { | |
2495 log_err("Expected search result: %d; Got instead: %d\n", expectedPos, po
s); | |
2496 } | |
2497 | |
2498 exitTestForwardBackward : | |
2499 if (coll != NULL) { | |
2500 ucol_close(coll); | |
2501 } | |
2502 if (search != NULL) { | |
2503 usearch_close(search); | |
2504 } | |
2505 } | |
2506 | |
2507 #define TEST_ASSERT(x) \ | |
2508 {if (U_FAILURE(x)) {log_err_status(x, "%s:%d: FAIL: test assertion failure \n
", __FILE__, __LINE__);\ | |
2509 }} | |
2510 | |
2511 static void TestSearchForNull(void) { | |
2512 UCollator *coll; | |
2513 UErrorCode ec; | |
2514 UStringSearch *search; | |
2515 int pos; | |
2516 int len; | |
2517 int expectedPos; | |
2518 int expectedLen; | |
2519 int expectedNum; | |
2520 int count = 0; | |
2521 const UChar zerodigit = 0x0030; /* 0 */ | |
2522 const UChar nulldigit = 0x0000; /* null */ | |
2523 | |
2524 /* static const UChar var[(length)+1]=U_DECLARE_UTF16(cs) */ | |
2525 #define PATTERN_LEN 4 | |
2526 #define TEXT_LEN 10 | |
2527 | |
2528 U_STRING_DECL(_pattern, "IS 0", PATTERN_LEN); | |
2529 U_STRING_DECL(_text, "_0IS 0 OK?", TEXT_LEN); | |
2530 UChar pattern[PATTERN_LEN + 1], text[TEXT_LEN + 1]; | |
2531 | |
2532 U_STRING_INIT(_pattern, "IS 0", PATTERN_LEN); | |
2533 U_STRING_INIT(_text, "_0IS 0 OK?", TEXT_LEN); | |
2534 expectedPos = 2; | |
2535 expectedLen = 4; | |
2536 expectedNum = 1; | |
2537 | |
2538 for (pos = 0; pos < PATTERN_LEN; pos++) { | |
2539 if (_pattern[pos] == zerodigit) { | |
2540 pattern[pos] = nulldigit; | |
2541 } else { | |
2542 pattern[pos] = _pattern[pos]; | |
2543 } | |
2544 } | |
2545 pattern[PATTERN_LEN] = 0x0000; | |
2546 | |
2547 for (pos = 0; pos < TEXT_LEN; pos++) { | |
2548 if (_text[pos] == zerodigit) { | |
2549 text[pos] = nulldigit; | |
2550 } else { | |
2551 text[pos] = _text[pos]; | |
2552 } | |
2553 } | |
2554 text[TEXT_LEN] = 0x0000; | |
2555 | |
2556 ec = U_ZERO_ERROR; | |
2557 | |
2558 /* create a US-English collator */ | |
2559 coll = ucol_open("en_US", &ec); | |
2560 | |
2561 /* make sure we didn't fail. */ | |
2562 TEST_ASSERT (ec); | |
2563 | |
2564 ucol_setStrength(coll, UCOL_IDENTICAL); | |
2565 | |
2566 /* open a search looking for 0 */ | |
2567 search = usearch_openFromCollator(pattern, PATTERN_LEN, text, | |
2568 TEXT_LEN, coll, NULL, &ec); | |
2569 TEST_ASSERT (ec); | |
2570 | |
2571 if (coll != NULL && search != NULL) { | |
2572 pos = usearch_first(search, &ec); | |
2573 len = usearch_getMatchedLength(search); | |
2574 if (pos != expectedPos) { | |
2575 log_err("Expected search result: %d; Got instead: %d\n", expectedPos
, | |
2576 pos); | |
2577 } | |
2578 | |
2579 if (len != expectedLen) { | |
2580 log_err("Expected search result length: %d; Got instead: %d\n", | |
2581 expectedLen, len); | |
2582 } | |
2583 | |
2584 for (pos = usearch_first(search, &ec); pos != USEARCH_DONE; pos | |
2585 = usearch_next(search, &ec)) { | |
2586 log_verbose("Match at %d\n", pos); | |
2587 count += 1; | |
2588 } | |
2589 | |
2590 if (count != expectedNum) { | |
2591 log_err("Expected %d search hits, found %d\n", expectedNum, count); | |
2592 } | |
2593 } | |
2594 | |
2595 ucol_close(coll); | |
2596 usearch_close(search); | |
2597 } | |
2598 | |
2599 static void TestStrengthIdentical(void) | |
2600 { | |
2601 UCollator *coll; | |
2602 UErrorCode ec = U_ZERO_ERROR; | |
2603 UStringSearch *search; | |
2604 | |
2605 UChar pattern[] = {0x05E9, 0x0591, 0x05E9}; | |
2606 UChar text[] = {0x05E9, 0x0592, 0x05E9}; | |
2607 int32_t pLen = sizeof (pattern) / sizeof(pattern[0]); | |
2608 int32_t tLen = sizeof(text) / sizeof (text[0]); | |
2609 int32_t expectedPos = 0; | |
2610 int32_t expectedLen = 3; | |
2611 | |
2612 int32_t pos; | |
2613 int32_t len; | |
2614 | |
2615 /* create a US-English collator */ | |
2616 coll = ucol_open ("en_US", &ec); | |
2617 | |
2618 /* make sure we didn't fail. */ | |
2619 TEST_ASSERT (ec); | |
2620 | |
2621 ucol_setStrength( coll, UCOL_TERTIARY); | |
2622 | |
2623 /* open a search looking for 0 */ | |
2624 search = usearch_openFromCollator (pattern, pLen, text, tLen, coll, NULL, &e
c); | |
2625 TEST_ASSERT (ec); | |
2626 | |
2627 if (coll != NULL && search != NULL) { | |
2628 pos = usearch_first(search, &ec); | |
2629 len = usearch_getMatchedLength(search); | |
2630 | |
2631 if(pos != expectedPos) { | |
2632 log_err("Expected search result: %d; Got instead: %d\n", expectedPos
, pos); | |
2633 } | |
2634 | |
2635 if(len != expectedLen) { | |
2636 log_err("Expected search result length: %d; Got instead: %d\n", expe
ctedLen, len); | |
2637 } | |
2638 | |
2639 /* Now try it at strength == UCOL_IDENTICAL */ | |
2640 ucol_setStrength(coll, UCOL_IDENTICAL); | |
2641 usearch_reset(search); | |
2642 | |
2643 pos = usearch_first(search, &ec); | |
2644 len = usearch_getMatchedLength(search); | |
2645 | |
2646 if(pos != -1) { | |
2647 log_err("Expected failure for strentgh = UCOL_IDENTICAL: got %d inst
ead.\n", pos); | |
2648 } | |
2649 } | |
2650 | |
2651 usearch_close(search); | |
2652 ucol_close(coll); | |
2653 } | |
2654 | |
2655 /** | |
2656 * TestUsingSearchCollator | |
2657 */ | |
2658 | |
2659 #define ARRAY_LENGTH(array) (sizeof(array)/sizeof(array[0])) | |
2660 | |
2661 typedef struct { | |
2662 const UChar * pattern; | |
2663 const int32_t * offsets; | |
2664 int32_t offsetsLen; | |
2665 } PatternAndOffsets; | |
2666 | |
2667 static const UChar scKoText[] = { | |
2668 0x0020, | |
2669 /*01*/ 0xAC00, 0x0020, /* simple LV Hangul */ | |
2670 /*03*/ 0xAC01, 0x0020, /* simple LVT Hangul */ | |
2671 /*05*/ 0xAC0F, 0x0020, /* LVTT, last jamo expands for se
arch */ | |
2672 /*07*/ 0xAFFF, 0x0020, /* LLVVVTT, every jamo expands fo
r search */ | |
2673 /*09*/ 0x1100, 0x1161, 0x11A8, 0x0020, /* 0xAC01 as conjoining jamo */ | |
2674 /*13*/ 0x1100, 0x1161, 0x1100, 0x0020, /* 0xAC01 as basic conjoining jam
o (per search rules) */ | |
2675 /*17*/ 0x3131, 0x314F, 0x3131, 0x0020, /* 0xAC01 as compatibility jamo *
/ | |
2676 /*21*/ 0x1100, 0x1161, 0x11B6, 0x0020, /* 0xAC0F as conjoining jamo; las
t expands for search */ | |
2677 /*25*/ 0x1100, 0x1161, 0x1105, 0x1112, 0x0020, /* 0xAC0F as basic conjoining jam
o; last expands for search */ | |
2678 /*30*/ 0x1101, 0x1170, 0x11B6, 0x0020, /* 0xAFFF as conjoining jamo; all
expand for search */ | |
2679 /*34*/ 0x00E6, 0x0020, /* small letter ae, expands */ | |
2680 /*36*/ 0x1E4D, 0x0020, /* small letter o with tilde and
acute, decomposes */ | |
2681 0 | |
2682 }; | |
2683 | |
2684 static const UChar scKoPat0[] = { 0xAC01, 0 }; | |
2685 static const UChar scKoPat1[] = { 0x1100, 0x1161, 0x11A8, 0 }; /* 0xAC01 as conj
oining jamo */ | |
2686 static const UChar scKoPat2[] = { 0xAC0F, 0 }; | |
2687 static const UChar scKoPat3[] = { 0x1100, 0x1161, 0x1105, 0x1112, 0 }; /* 0xAC0F
as basic conjoining jamo */ | |
2688 static const UChar scKoPat4[] = { 0xAFFF, 0 }; | |
2689 static const UChar scKoPat5[] = { 0x1101, 0x1170, 0x11B6, 0 }; /* 0xAFFF as conj
oining jamo */ | |
2690 | |
2691 static const int32_t scKoSrchOff01[] = { 3, 9, 13 }; | |
2692 static const int32_t scKoSrchOff23[] = { 5, 21, 25 }; | |
2693 static const int32_t scKoSrchOff45[] = { 7, 30 }; | |
2694 | |
2695 static const PatternAndOffsets scKoSrchPatternsOffsets[] = { | |
2696 { scKoPat0, scKoSrchOff01, ARRAY_LENGTH(scKoSrchOff01) }, | |
2697 { scKoPat1, scKoSrchOff01, ARRAY_LENGTH(scKoSrchOff01) }, | |
2698 { scKoPat2, scKoSrchOff23, ARRAY_LENGTH(scKoSrchOff23) }, | |
2699 { scKoPat3, scKoSrchOff23, ARRAY_LENGTH(scKoSrchOff23) }, | |
2700 { scKoPat4, scKoSrchOff45, ARRAY_LENGTH(scKoSrchOff45) }, | |
2701 { scKoPat5, scKoSrchOff45, ARRAY_LENGTH(scKoSrchOff45) }, | |
2702 { NULL, NULL, 0 } | |
2703 }; | |
2704 | |
2705 static const int32_t scKoStndOff01[] = { 3, 9 }; | |
2706 static const int32_t scKoStndOff2[] = { 5, 21 }; | |
2707 static const int32_t scKoStndOff3[] = { 25 }; | |
2708 static const int32_t scKoStndOff45[] = { 7, 30 }; | |
2709 | |
2710 static const PatternAndOffsets scKoStndPatternsOffsets[] = { | |
2711 { scKoPat0, scKoStndOff01, ARRAY_LENGTH(scKoStndOff01) }, | |
2712 { scKoPat1, scKoStndOff01, ARRAY_LENGTH(scKoStndOff01) }, | |
2713 { scKoPat2, scKoStndOff2, ARRAY_LENGTH(scKoStndOff2) }, | |
2714 { scKoPat3, scKoStndOff3, ARRAY_LENGTH(scKoStndOff3) }, | |
2715 { scKoPat4, scKoStndOff45, ARRAY_LENGTH(scKoStndOff45) }, | |
2716 { scKoPat5, scKoStndOff45, ARRAY_LENGTH(scKoStndOff45) }, | |
2717 { NULL, NULL, 0 } | |
2718 }; | |
2719 | |
2720 typedef struct { | |
2721 const char * locale; | |
2722 const UChar * text; | |
2723 const PatternAndOffsets * patternsAndOffsets; | |
2724 } TUSCItem; | |
2725 | |
2726 static const TUSCItem tuscItems[] = { | |
2727 { "root", scKoText, scKoStndPatternsOffsets }, | |
2728 { "root@collation=search", scKoText, scKoSrchPatternsOffsets }, | |
2729 { "ko@collation=search", scKoText, scKoSrchPatternsOffsets }, | |
2730 { NULL, NULL, NULL } | |
2731 }; | |
2732 | |
2733 static const UChar dummyPat[] = { 0x0061, 0 }; | |
2734 | |
2735 static void TestUsingSearchCollator(void) | |
2736 { | |
2737 const TUSCItem * tuscItemPtr; | |
2738 for (tuscItemPtr = tuscItems; tuscItemPtr->locale != NULL; tuscItemPtr++) { | |
2739 UErrorCode status = U_ZERO_ERROR; | |
2740 UCollator* ucol = ucol_open(tuscItemPtr->locale, &status); | |
2741 if ( U_SUCCESS(status) ) { | |
2742 UStringSearch* usrch = usearch_openFromCollator(dummyPat, -1, tuscIt
emPtr->text, -1, ucol, NULL, &status); | |
2743 if ( U_SUCCESS(status) ) { | |
2744 const PatternAndOffsets * patternsOffsetsPtr; | |
2745 for ( patternsOffsetsPtr = tuscItemPtr->patternsAndOffsets; patt
ernsOffsetsPtr->pattern != NULL; patternsOffsetsPtr++) { | |
2746 usearch_setPattern(usrch, patternsOffsetsPtr->pattern, -1, &
status); | |
2747 if ( U_SUCCESS(status) ) { | |
2748 int32_t offset; | |
2749 const int32_t * nextOffsetPtr; | |
2750 const int32_t * limitOffsetPtr; | |
2751 | |
2752 usearch_reset(usrch); | |
2753 nextOffsetPtr = patternsOffsetsPtr->offsets; | |
2754 limitOffsetPtr = patternsOffsetsPtr->offsets + patternsO
ffsetsPtr->offsetsLen; | |
2755 while (TRUE) { | |
2756 offset = usearch_next(usrch, &status); | |
2757 if ( U_FAILURE(status) || offset == USEARCH_DONE ) { | |
2758 break; | |
2759 } | |
2760 if ( nextOffsetPtr < limitOffsetPtr ) { | |
2761 if (offset != *nextOffsetPtr) { | |
2762 log_err("error, locale %s, expected usearch
_next %d, got %d\n", tuscItemPtr->locale, *nextOffsetPtr, offset); | |
2763 nextOffsetPtr = limitOffsetPtr; | |
2764 break; | |
2765 } | |
2766 nextOffsetPtr++; | |
2767 } else { | |
2768 log_err("error, locale %s, usearch_next returned
more matches than expected\n", tuscItemPtr->locale ); | |
2769 } | |
2770 } | |
2771 if ( U_FAILURE(status) ) { | |
2772 log_err("error, locale %s, usearch_next failed: %s\n
", tuscItemPtr->locale, u_errorName(status) ); | |
2773 } else if ( nextOffsetPtr < limitOffsetPtr ) { | |
2774 log_err("error, locale %s, usearch_next returned few
er matches than expected\n", tuscItemPtr->locale ); | |
2775 } | |
2776 | |
2777 status = U_ZERO_ERROR; | |
2778 usearch_reset(usrch); | |
2779 nextOffsetPtr = patternsOffsetsPtr->offsets + patternsOf
fsetsPtr->offsetsLen; | |
2780 limitOffsetPtr = patternsOffsetsPtr->offsets; | |
2781 while (TRUE) { | |
2782 offset = usearch_previous(usrch, &status); | |
2783 if ( U_FAILURE(status) || offset == USEARCH_DONE ) { | |
2784 break; | |
2785 } | |
2786 if ( nextOffsetPtr > limitOffsetPtr ) { | |
2787 nextOffsetPtr--; | |
2788 if (offset != *nextOffsetPtr) { | |
2789 log_err("error, locale %s, expected usearch
_previous %d, got %d\n", tuscItemPtr->locale, *nextOffsetPtr, offset); | |
2790 nextOffsetPtr = limitOffsetPtr; | |
2791 break; | |
2792 } | |
2793 } else { | |
2794 log_err("error, locale %s, usearch_previous retu
rned more matches than expected\n", tuscItemPtr->locale ); | |
2795 } | |
2796 } | |
2797 if ( U_FAILURE(status) ) { | |
2798 log_err("error, locale %s, usearch_previous failed:
%s\n", tuscItemPtr->locale, u_errorName(status) ); | |
2799 } else if ( nextOffsetPtr > limitOffsetPtr ) { | |
2800 log_err("error, locale %s, usearch_previous returned
fewer matches than expected\n", tuscItemPtr->locale ); | |
2801 } | |
2802 | |
2803 } else { | |
2804 log_err("error, locale %s, usearch_setPattern failed: %s
\n", tuscItemPtr->locale, u_errorName(status) ); | |
2805 } | |
2806 } | |
2807 usearch_close(usrch); | |
2808 } else { | |
2809 log_err("error, locale %s, usearch_openFromCollator failed: %s\n
", tuscItemPtr->locale, u_errorName(status) ); | |
2810 } | |
2811 ucol_close(ucol); | |
2812 } else { | |
2813 log_data_err("error, locale %s, ucol_open failed: %s\n", tuscItemPtr
->locale, u_errorName(status) ); | |
2814 } | |
2815 } | |
2816 } | |
2817 | |
2818 | |
2819 static void TestPCEBuffer_with(const UChar *search, uint32_t searchLen, const UC
har *source, uint32_t sourceLen) { | |
2820 UErrorCode icuStatus = U_ZERO_ERROR; | |
2821 UCollator *coll; | |
2822 const char *locale; | |
2823 UBreakIterator *ubrk; | |
2824 UStringSearch *usearch; | |
2825 int32_t match = 0; | |
2826 | |
2827 | |
2828 coll = ucol_openFromShortString( "LSK_AS_CX_EX_FX_HX_NX_S4", | |
2829 FALSE, | |
2830 NULL, | |
2831 &icuStatus ); | |
2832 if ( U_FAILURE(icuStatus) ) | |
2833 { | |
2834 log_data_err( "ucol_openFromShortString error %s\n" , u_errorName(icuStatus
)); | |
2835 goto exit; | |
2836 } | |
2837 | |
2838 locale = ucol_getLocaleByType( coll, | |
2839 ULOC_VALID_LOCALE, | |
2840 &icuStatus ); | |
2841 if ( U_FAILURE(icuStatus) ) | |
2842 { | |
2843 log_err( "ucol_getLocaleByType error %s\n", u_errorName(icuStatus) ); | |
2844 goto exit; | |
2845 } | |
2846 | |
2847 log_verbose("locale=%s\n", locale); | |
2848 | |
2849 ubrk = ubrk_open( UBRK_CHARACTER, | |
2850 locale, | |
2851 source, | |
2852 sourceLen, | |
2853 &icuStatus ); | |
2854 if ( U_FAILURE(icuStatus) ) | |
2855 { | |
2856 log_err( "ubrk_open error %s\n", u_errorName(icuStatus) ); | |
2857 goto exit; | |
2858 } | |
2859 | |
2860 usearch = usearch_openFromCollator( search, | |
2861 searchLen, | |
2862 source, | |
2863 sourceLen, | |
2864 coll, | |
2865 ubrk, | |
2866 &icuStatus ); | |
2867 if ( U_FAILURE(icuStatus) ) | |
2868 { | |
2869 log_err( "usearch_openFromCollator error %s\n", u_errorName(icuStatus) ); | |
2870 goto exit; | |
2871 } | |
2872 | |
2873 match = usearch_first( usearch, | |
2874 &icuStatus ); | |
2875 if ( U_FAILURE(icuStatus) ) | |
2876 { | |
2877 log_err( "usearch_first error %s\n", u_errorName(icuStatus) ); | |
2878 goto exit; | |
2879 } | |
2880 | |
2881 if(match==0) { | |
2882 log_verbose("OK: match=%d\n", match); | |
2883 } else { | |
2884 log_err("Err: match expected 0 got %d\n", match); | |
2885 } | |
2886 | |
2887 usearch_close(usearch); | |
2888 ubrk_close(ubrk); | |
2889 ucol_close(coll); | |
2890 | |
2891 exit: | |
2892 return; | |
2893 } | |
2894 | |
2895 | |
2896 static void TestPCEBuffer_100df(void) { | |
2897 UChar search[] = | |
2898 { 0x0020, 0x0020, 0x00df, 0x0020, 0x0041, 0x00df, 0x0020, 0x0061, 0x00df, 0x
0020, 0x00c5, 0x00df, 0x0020, 0x212b, 0x00df, 0x0020, 0x0041, 0x030a, 0x00df, 0x
0020, 0x00e5, 0x00df, 0x0020, 0x0061, 0x02da, 0x00df, 0x0020, 0x0061, 0x030a, 0x
00df, 0x0020, 0xd8fa, 0xdeae, 0x00df, 0x0020, 0x2027, 0x00df }; /* 38 cp, 9 of t
hem unpaired surrogates */ | |
2899 UChar source[] = | |
2900 { 0x0020, 0x0020, 0x00df, 0x0020, 0x0041, 0x00df, 0x0020, 0x0061, 0x00df, 0x
0020, 0x00c5, 0x00df, 0x0020, 0x212b, 0x00df, 0x0020, 0x0041, 0x030a, 0x00df, 0x
0020, 0x00e5, 0x00df, 0x0020, 0x0061, 0x02da, 0x00df, 0x0020, 0x0061, 0x030a, 0x
00df, 0x0020, 0xd8fa, 0xdeae, 0x00df, 0x0020, 0x2027, 0x00df }; | |
2901 uint32_t searchLen = sizeof(search)/sizeof(UChar); | |
2902 uint32_t sourceLen = sizeof(source)/sizeof(UChar); | |
2903 TestPCEBuffer_with(search,searchLen,source,sourceLen); | |
2904 } | |
2905 | |
2906 | |
2907 static void TestPCEBuffer_2surr(void) { | |
2908 UChar search[] = | |
2909 { 0x0020, 0x0020, 0xdfff, 0x0020, 0x0041, 0xdfff, 0x0020, 0x0061, 0xdfff, 0x
0020, 0x00c5, 0xdfff, 0x0020, 0x212b, 0xdfff, 0x0020, 0x0041, 0x030a, 0xdfff, 0x
0020, 0x00e5, 0xdfff, 0x0020, 0x0061, 0x02da, 0xdfff, 0x0020, 0x0061, 0x030a, 0x
dfff, 0x0020, 0xd8fa, 0xdeae, 0xdfff, 0x0020, 0x2027, 0xdfff }; /* 38 cp, 9 of t
hem unpaired surrogates */ | |
2910 UChar source[] = | |
2911 { 0x0020, 0x0020, 0xdfff, 0x0020, 0x0041, 0xdfff, 0x0020, 0x0061, 0xdfff, 0x
0020, 0x00c5, 0xdfff, 0x0020, 0x212b, 0xdfff, 0x0020, 0x0041, 0x030a, 0xdfff, 0x
0020, 0x00e5, 0xdfff, 0x0020, 0x0061, 0x02da, 0xdfff, 0x0020, 0x0061, 0x030a, 0x
dfff, 0x0020, 0xd8fa, 0xdeae, 0xdfff, 0x0020, 0x2027, 0xdfff }; | |
2912 uint32_t searchLen = sizeof(search)/sizeof(UChar); | |
2913 uint32_t sourceLen = sizeof(source)/sizeof(UChar); | |
2914 TestPCEBuffer_with(search,searchLen,source,sourceLen); | |
2915 } | |
2916 | |
2917 static void TestMatchFollowedByIgnorables(void) { | |
2918 /* test case for ticket#8482 */ | |
2919 UChar search[] = { 0x00c9 }; | |
2920 UChar source[] = { 0x00c9, 0x0000, 0x0041 }; | |
2921 int32_t searchLen; | |
2922 int32_t sourceLen; | |
2923 UErrorCode icuStatus = U_ZERO_ERROR; | |
2924 UCollator *coll; | |
2925 const char *locale; | |
2926 UBreakIterator *ubrk; | |
2927 UStringSearch *usearch; | |
2928 int32_t match = 0; | |
2929 int32_t matchLength = 0; | |
2930 const int32_t expectedMatchLength = 1; | |
2931 | |
2932 searchLen = sizeof(search)/sizeof(UChar); | |
2933 sourceLen = sizeof(source)/sizeof(UChar); | |
2934 | |
2935 coll = ucol_openFromShortString("LHR_AN_CX_EX_FX_HX_NX_S3", | |
2936 FALSE, | |
2937 NULL, | |
2938 &icuStatus); | |
2939 if (U_FAILURE(icuStatus)) { | |
2940 log_data_err("ucol_openFromShortString error - %s\n", u_errorName(icuSta
tus)); | |
2941 } | |
2942 | |
2943 locale = ucol_getLocaleByType(coll, | |
2944 ULOC_VALID_LOCALE, | |
2945 &icuStatus); | |
2946 if (U_FAILURE(icuStatus)) { | |
2947 log_data_err("ucol_getLocaleByType error - %s\n", u_errorName(icuStatus)
); | |
2948 } | |
2949 | |
2950 ubrk = ubrk_open(UBRK_CHARACTER, | |
2951 locale, | |
2952 source, | |
2953 sourceLen, | |
2954 &icuStatus); | |
2955 if (U_FAILURE(icuStatus)) { | |
2956 log_data_err("ubrk_open error - %s\n", u_errorName(icuStatus)); | |
2957 } | |
2958 | |
2959 usearch = usearch_openFromCollator(search, | |
2960 searchLen, | |
2961 source, | |
2962 sourceLen, | |
2963 coll, | |
2964 ubrk, | |
2965 &icuStatus); | |
2966 if (U_FAILURE(icuStatus)) { | |
2967 log_data_err("usearch_openFromCollator error - %s\n", u_errorName(icuSta
tus)); | |
2968 } | |
2969 | |
2970 match = usearch_first(usearch, | |
2971 &icuStatus); | |
2972 if (U_FAILURE(icuStatus)) { | |
2973 log_data_err("usearch_first error - %s\n", u_errorName(icuStatus)); | |
2974 } else { | |
2975 | |
2976 log_verbose("match=%d\n", match); | |
2977 | |
2978 matchLength = usearch_getMatchedLength(usearch); | |
2979 | |
2980 if (matchLength != expectedMatchLength) { | |
2981 log_err("Error: matchLength=%d, expected=%d\n", matchLength, expecte
dMatchLength); | |
2982 } | |
2983 } | |
2984 | |
2985 usearch_close(usearch); | |
2986 ubrk_close(ubrk); | |
2987 ucol_close(coll); | |
2988 } | |
2989 | |
2990 static void TestIndicPrefixMatch(void) | |
2991 { | |
2992 int count = 0; | |
2993 UErrorCode status = U_ZERO_ERROR; | |
2994 open(&status); | |
2995 if (U_FAILURE(status)) { | |
2996 log_err_status(status, "Unable to open static collators %s\n", u_errorNa
me(status)); | |
2997 return; | |
2998 } | |
2999 while (INDICPREFIXMATCH[count].text != NULL) { | |
3000 if (!assertEqual(INDICPREFIXMATCH[count])) { | |
3001 log_err("Error at test number %d\n", count); | |
3002 } | |
3003 count ++; | |
3004 } | |
3005 close(); | |
3006 } | |
3007 | |
3008 /** | |
3009 * addSearchTest | |
3010 */ | |
3011 | |
3012 void addSearchTest(TestNode** root) | |
3013 { | |
3014 addTest(root, &TestStart, "tscoll/usrchtst/TestStart"); | |
3015 addTest(root, &TestOpenClose, "tscoll/usrchtst/TestOpenClose"); | |
3016 addTest(root, &TestInitialization, "tscoll/usrchtst/TestInitialization"); | |
3017 addTest(root, &TestBasic, "tscoll/usrchtst/TestBasic"); | |
3018 addTest(root, &TestNormExact, "tscoll/usrchtst/TestNormExact"); | |
3019 addTest(root, &TestStrength, "tscoll/usrchtst/TestStrength"); | |
3020 addTest(root, &TestBreakIterator, "tscoll/usrchtst/TestBreakIterator"); | |
3021 addTest(root, &TestVariable, "tscoll/usrchtst/TestVariable"); | |
3022 addTest(root, &TestOverlap, "tscoll/usrchtst/TestOverlap"); | |
3023 addTest(root, &TestCollator, "tscoll/usrchtst/TestCollator"); | |
3024 addTest(root, &TestPattern, "tscoll/usrchtst/TestPattern"); | |
3025 addTest(root, &TestText, "tscoll/usrchtst/TestText"); | |
3026 addTest(root, &TestCompositeBoundaries, | |
3027 "tscoll/usrchtst/TestCompositeBoundaries"); | |
3028 addTest(root, &TestGetSetOffset, "tscoll/usrchtst/TestGetSetOffset"); | |
3029 addTest(root, &TestGetSetAttribute, | |
3030 "tscoll/usrchtst/TestGetSetAttribute"); | |
3031 addTest(root, &TestGetMatch, "tscoll/usrchtst/TestGetMatch"); | |
3032 addTest(root, &TestSetMatch, "tscoll/usrchtst/TestSetMatch"); | |
3033 addTest(root, &TestReset, "tscoll/usrchtst/TestReset"); | |
3034 addTest(root, &TestSupplementary, "tscoll/usrchtst/TestSupplementary"); | |
3035 addTest(root, &TestContraction, "tscoll/usrchtst/TestContraction"); | |
3036 addTest(root, &TestIgnorable, "tscoll/usrchtst/TestIgnorable"); | |
3037 addTest(root, &TestCanonical, "tscoll/usrchtst/TestCanonical"); | |
3038 addTest(root, &TestNormCanonical, "tscoll/usrchtst/TestNormCanonical"); | |
3039 addTest(root, &TestStrengthCanonical, | |
3040 "tscoll/usrchtst/TestStrengthCanonical"); | |
3041 addTest(root, &TestBreakIteratorCanonical, | |
3042 "tscoll/usrchtst/TestBreakIteratorCanonical"); | |
3043 addTest(root, &TestVariableCanonical, | |
3044 "tscoll/usrchtst/TestVariableCanonical"); | |
3045 addTest(root, &TestOverlapCanonical, | |
3046 "tscoll/usrchtst/TestOverlapCanonical"); | |
3047 addTest(root, &TestCollatorCanonical, | |
3048 "tscoll/usrchtst/TestCollatorCanonical"); | |
3049 addTest(root, &TestPatternCanonical, | |
3050 "tscoll/usrchtst/TestPatternCanonical"); | |
3051 addTest(root, &TestTextCanonical, "tscoll/usrchtst/TestTextCanonical"); | |
3052 addTest(root, &TestCompositeBoundariesCanonical, | |
3053 "tscoll/usrchtst/TestCompositeBoundariesCanonical"); | |
3054 addTest(root, &TestGetSetOffsetCanonical, | |
3055 "tscoll/usrchtst/TestGetSetOffsetCanonical"); | |
3056 addTest(root, &TestSupplementaryCanonical, | |
3057 "tscoll/usrchtst/TestSupplementaryCanonical"); | |
3058 addTest(root, &TestContractionCanonical, | |
3059 "tscoll/usrchtst/TestContractionCanonical"); | |
3060 addTest(root, &TestEnd, "tscoll/usrchtst/TestEnd"); | |
3061 addTest(root, &TestNumeric, "tscoll/usrchtst/TestNumeric"); | |
3062 addTest(root, &TestDiacriticMatch, "tscoll/usrchtst/TestDiacriticMatch"); | |
3063 addTest(root, &TestForwardBackward, "tscoll/usrchtst/TestForwardBackward"); | |
3064 addTest(root, &TestSearchForNull, "tscoll/usrchtst/TestSearchForNull"); | |
3065 addTest(root, &TestStrengthIdentical, "tscoll/usrchtst/TestStrengthIdentical
"); | |
3066 addTest(root, &TestUsingSearchCollator, "tscoll/usrchtst/TestUsingSearchColl
ator"); | |
3067 addTest(root, &TestPCEBuffer_100df, "tscoll/usrchtst/TestPCEBuffer/1_00df"); | |
3068 addTest(root, &TestPCEBuffer_2surr, "tscoll/usrchtst/TestPCEBuffer/2_dfff"); | |
3069 addTest(root, &TestMatchFollowedByIgnorables, "tscoll/usrchtst/TestMatchFoll
owedByIgnorables"); | |
3070 addTest(root, &TestIndicPrefixMatch, "tscoll/usrchtst/TestIndicPrefixMatch")
; | |
3071 } | |
3072 | |
3073 #endif /* #if !UCONFIG_NO_COLLATION */ | |
OLD | NEW |