usrchtst.c revision 50294ead5e5d23f5bbfed76e00e6b510bd41eee1
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Copyright (c) 2001-2010 International Business Machines
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Corporation and others. All Rights Reserved.
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * File usrchtst.c
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Modification History:
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Name           Date             Description
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * synwee         July 19 2001     creation
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_COLLATION && !UCONFIG_NO_BREAK_ITERATION && !UCONFIG_NO_FILE_IO
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/usearch.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ccolltst.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h>
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "usrchdat.c"
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ubrk.h"
22b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include <assert.h>
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool      TOCLOSE_ = TRUE;
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UCollator *EN_US_;
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UCollator *FR_FR_;
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UCollator *DE_;
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UCollator *ES_;
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * CHECK_BREAK(char *brk)
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *     Test if a break iterator is passed in AND break iteration is disabled.
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *     Skip the test if so.
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * CHECK_BREAK_BOOL(char *brk)
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *     Same as above, but returns 'TRUE' as a passing result
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBreakIterator *EN_WORDBREAKER_;
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBreakIterator *EN_CHARACTERBREAKER_;
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CHECK_BREAK(x)
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CHECK_BREAK_BOOL(x)
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CHECK_BREAK(x)  if(x) { log_info("Skipping test on %s:%d because UCONFIG_NO_BREAK_ITERATION is on\n", __FILE__, __LINE__); return; }
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CHECK_BREAK_BOOL(x)  if(x) { log_info("Skipping test on %s:%d because UCONFIG_NO_BREAK_ITERATION is on\n", __FILE__, __LINE__); return TRUE; }
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Opening all static collators and break iterators
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Querustatic void open(UErrorCode* status)
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (TOCLOSE_) {
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar      rules[1024];
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t    rulelength = 0;
566d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        *status = U_ZERO_ERROR;
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        EN_US_ = ucol_open("en_US", status);
596d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if(U_FAILURE(*status)) {
606d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru          log_err_status(*status, "Error opening collator\n");
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return;
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        FR_FR_ = ucol_open("fr_FR", status);
646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        DE_ = ucol_open("de_DE", status);
656d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        ES_ = ucol_open("es_ES", status);
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strcpy(rules, ucol_getRules(DE_, &rulelength));
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(EXTRACOLLATIONRULE, rules + rulelength, 1024 - rulelength);
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(DE_);
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        DE_ = ucol_openRules(rules, u_strlen(rules), UCOL_ON, UCOL_TERTIARY,
736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                             (UParseError *)NULL, status);
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strcpy(rules, ucol_getRules(ES_, &rulelength));
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(EXTRACOLLATIONRULE, rules + rulelength, 1024 - rulelength);
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(ES_);
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ES_ = ucol_openRules(rules, u_strlen(rules), UCOL_ON, UCOL_TERTIARY,
796d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                             NULL, status);
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        EN_WORDBREAKER_     = ubrk_open(UBRK_WORD, "en_US", NULL, 0, status);
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        EN_CHARACTERBREAKER_ = ubrk_open(UBRK_CHARACTER, "en_US", NULL, 0,
836d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                                        status);
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TOCLOSE_ = TRUE;
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Start opening all static collators and break iterators
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestStart(void)
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
966d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
976d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TOCLOSE_ = FALSE;
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Closing all static collators and break iterators
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void close(void)
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (TOCLOSE_) {
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(EN_US_);
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(FR_FR_);
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(DE_);
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(ES_);
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubrk_close(EN_WORDBREAKER_);
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubrk_close(EN_CHARACTERBREAKER_);
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TOCLOSE_ = FALSE;
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* End closing all static collators and break iterators
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestEnd(void)
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TOCLOSE_ = TRUE;
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TOCLOSE_ = TRUE;
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* output UChar strings for printing.
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char *toCharString(const UChar* unichars)
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static char result[1024];
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char *temp   = result;
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int   count  = 0;
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int   length = u_strlen(unichars);
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (; count < length; count ++) {
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar ch = unichars[count];
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (ch >= 0x20 && ch <= 0x7e) {
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *temp ++ = (char)ch;
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            sprintf(temp, "\\u%04x", ch);
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            temp += 6; /* \uxxxx */
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *temp = 0;
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return result;
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Getting the collator
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UCollator *getCollator(const char *collator)
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (collator == NULL) {
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return EN_US_;
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(collator, "fr") == 0) {
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FR_FR_;
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else if (strcmp(collator, "de") == 0) {
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return DE_;
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else if (strcmp(collator, "es") == 0) {
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return ES_;
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return EN_US_;
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Getting the breakiterator
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBreakIterator *getBreakIterator(const char *breaker)
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (breaker == NULL) {
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NULL;
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(breaker, "wordbreaker") == 0) {
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return EN_WORDBREAKER_;
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return EN_CHARACTERBREAKER_;
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return NULL;
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestOpenClose(void)
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UErrorCode      status    = U_ZERO_ERROR;
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UStringSearch  *result;
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar           pattern[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66};
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar           text[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67};
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UBreakIterator *breakiter = ubrk_open(UBRK_WORD, "en_US",
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                text, 6, &status);
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* testing null arguments */
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = usearch_open(NULL, 0, NULL, 0, NULL, NULL, &status);
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status) || result != NULL) {
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: NULL arguments should produce an error and a NULL result\n");
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = usearch_openFromCollator(NULL, 0, NULL, 0, NULL, NULL, &status);
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status) || result != NULL) {
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: NULL arguments should produce an error and a NULL result\n");
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = usearch_open(pattern, 3, NULL, 0, NULL, NULL, &status);
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status) || result != NULL) {
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: NULL arguments should produce an error and a NULL result\n");
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = usearch_openFromCollator(pattern, 3, NULL, 0, NULL, NULL,
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      &status);
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status) || result != NULL) {
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: NULL arguments should produce an error and a NULL result\n");
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = usearch_open(pattern, 3, text, 6, NULL, NULL, &status);
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status) || result != NULL) {
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: NULL arguments should produce an error and a NULL result\n");
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = usearch_openFromCollator(pattern, 3, text, 6, NULL, NULL,
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      &status);
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status) || result != NULL) {
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: NULL arguments should produce an error and a NULL result\n");
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = usearch_open(pattern, 3, text, 6, "en_US", NULL, &status);
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || result == NULL) {
2466d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Error: NULL break iterator is valid for opening search\n");
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(result);
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
2526d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
2536d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
2546d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
2556d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = usearch_openFromCollator(pattern, 3, text, 6, EN_US_, NULL,
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      &status);
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || result == NULL) {
2606d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (EN_US_ == NULL) {
2616d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_data_err("Opening collator failed.\n");
2626d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        } else {
2636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err("Error: NULL break iterator is valid for opening search\n");
2646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(result);
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = usearch_open(pattern, 3, text, 6, "en_US", breakiter, &status);
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || result == NULL) {
2766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Error: Break iterator is valid for opening search\n");
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(result);
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = usearch_openFromCollator(pattern, 3, text, 6, EN_US_, breakiter,
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      &status);
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || result == NULL) {
2856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (EN_US_ == NULL) {
2866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_data_err("Opening collator failed.\n");
2876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        } else {
2886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err("Error: Break iterator is valid for opening search\n");
2896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(result);
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubrk_close(breakiter);
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestInitialization(void)
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UErrorCode      status = U_ZERO_ERROR;
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar           pattern[512];
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar           text[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66};
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i = 0;
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch  *result;
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* simple test on the pattern ce construction */
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern[0] = 0x41;
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern[1] = 0x42;
3106d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
3116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
3126d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
3136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
3146d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = usearch_openFromCollator(pattern, 2, text, 3, EN_US_, NULL,
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      &status);
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening search %s\n", u_errorName(status));
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(result);
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* testing if an extremely large pattern will fail the initialization */
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < 512; i++) {
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      pattern[i] = 0x41;
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*uprv_memset(pattern, 0x41, 512);*/
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = usearch_openFromCollator(pattern, 512, text, 3, EN_US_, NULL,
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      &status);
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening search %s\n", u_errorName(status));
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(result);
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool assertEqualWithUStringSearch(      UStringSearch *strsrch,
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                          const SearchData     search)
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int         count       = 0;
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int         matchlimit  = 0;
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode  status      = U_ZERO_ERROR;
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t matchindex  = search.offset[count];
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t     textlength;
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar       matchtext[128];
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
34650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    usearch_setAttribute(strsrch, USEARCH_ELEMENT_COMPARISON, search.elemCompare, &status);
34750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (U_FAILURE(status)) {
34850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_err("Error setting USEARCH_ELEMENT_COMPARISON attribute %s\n", u_errorName(status));
34950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return FALSE;
35050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
35150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getMatchedStart(strsrch) != USEARCH_DONE ||
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getMatchedLength(strsrch) != 0) {
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error with the initialization of match start and length\n");
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* start of following matches */
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (U_SUCCESS(status) && matchindex >= 0) {
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uint32_t matchlength = search.size[count];
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_next(strsrch, &status);
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (matchindex != usearch_getMatchedStart(strsrch) ||
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char *str = toCharString(usearch_getText(strsrch, &textlength));
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Text: %s\n", str);
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = toCharString(usearch_getPattern(strsrch, &textlength));
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Pattern: %s\n", str);
36650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_err("Error following match found at idx,len %d,%d; expected %d,%d\n",
36750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    usearch_getMatchedStart(strsrch), usearch_getMatchedLength(strsrch),
36850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    matchindex, matchlength);
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return FALSE;
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (int32_t) matchlength || U_FAILURE(status) ||
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            memcmp(matchtext,
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   usearch_getText(strsrch, &textlength) + matchindex,
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   matchlength * sizeof(UChar)) != 0) {
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error getting following matched text\n");
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        matchindex = search.offset[count];
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_next(strsrch, &status);
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getMatchedStart(strsrch) != USEARCH_DONE ||
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getMatchedLength(strsrch) != 0) {
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char *str = toCharString(usearch_getText(strsrch, &textlength));
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Text: %s\n", str);
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        str = toCharString(usearch_getPattern(strsrch, &textlength));
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Pattern: %s\n", str);
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error following match found at %d %d\n",
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    usearch_getMatchedStart(strsrch),
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    usearch_getMatchedLength(strsrch));
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* start of preceding matches */
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = count == 0 ? 0 : count - 1;
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    matchlimit = count;
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    matchindex = search.offset[count];
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (U_SUCCESS(status) && matchindex >= 0) {
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uint32_t matchlength = search.size[count];
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_previous(strsrch, &status);
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (matchindex != usearch_getMatchedStart(strsrch) ||
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char *str = toCharString(usearch_getText(strsrch, &textlength));
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Text: %s\n", str);
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = toCharString(usearch_getPattern(strsrch, &textlength));
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Pattern: %s\n", str);
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error preceding match found at %d %d\n",
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    usearch_getMatchedStart(strsrch),
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    usearch_getMatchedLength(strsrch));
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return FALSE;
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (int32_t) matchlength || U_FAILURE(status) ||
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            memcmp(matchtext,
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   usearch_getText(strsrch, &textlength) + matchindex,
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   matchlength * sizeof(UChar)) != 0) {
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error getting preceding matched text\n");
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        matchindex = count > 0 ? search.offset[count - 1] : -1;
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count --;
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_previous(strsrch, &status);
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getMatchedStart(strsrch) != USEARCH_DONE ||
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getMatchedLength(strsrch) != 0) {
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char *str = toCharString(usearch_getText(strsrch, &textlength));
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Text: %s\n", str);
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        str = toCharString(usearch_getPattern(strsrch, &textlength));
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Pattern: %s\n", str);
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error preceding match found at %d %d\n",
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    usearch_getMatchedStart(strsrch),
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    usearch_getMatchedLength(strsrch));
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
43950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    usearch_setAttribute(strsrch, USEARCH_ELEMENT_COMPARISON, USEARCH_STANDARD_ELEMENT_COMPARISON, &status);
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool assertEqual(const SearchData search)
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode      status      = U_ZERO_ERROR;
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           pattern[32];
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           text[128];
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator      *collator = getCollator(search.collator);
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBreakIterator *breaker  = getBreakIterator(search.breaker);
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch  *strsrch;
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK_BREAK_BOOL(search.breaker);
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search.text, text, 128);
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search.pattern, pattern, 32);
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(collator, search.strength);
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       breaker, &status);
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, search)) {
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setStrength(collator, UCOL_TERTIARY);
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(collator, UCOL_TERTIARY);
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool assertCanonicalEqual(const SearchData search)
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode      status      = U_ZERO_ERROR;
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           pattern[32];
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           text[128];
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator      *collator = getCollator(search.collator);
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBreakIterator *breaker  = getBreakIterator(search.breaker);
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch  *strsrch;
482c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UBool           result = TRUE;
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK_BREAK_BOOL(search.breaker);
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search.text, text, 128);
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search.pattern, pattern, 32);
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(collator, search.strength);
488c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
4906d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                                       breaker, &status);
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
495c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        result = FALSE;
496c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        goto bail;
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, search)) {
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setStrength(collator, UCOL_TERTIARY);
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
502c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        result = FALSE;
503c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        goto bail;
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
505c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
506c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querubail:
507c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status);
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(collator, UCOL_TERTIARY);
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
510c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    return result;
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool assertEqualWithAttribute(const SearchData            search,
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                            USearchAttributeValue canonical,
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                            USearchAttributeValue overlap)
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode      status      = U_ZERO_ERROR;
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           pattern[32];
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           text[128];
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator      *collator = getCollator(search.collator);
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBreakIterator *breaker  = getBreakIterator(search.breaker);
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch  *strsrch;
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK_BREAK_BOOL(search.breaker);
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search.text, text, 128);
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search.pattern, pattern, 32);
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(collator, search.strength);
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       breaker, &status);
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, canonical,
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_OVERLAP, overlap, &status);
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, search)) {
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucol_setStrength(collator, UCOL_TERTIARY);
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return FALSE;
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(collator, UCOL_TERTIARY);
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBasic(void)
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
5526d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
5536d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
5546d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
5556d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
5566d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
5576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (BASIC[count].text != NULL) {
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(BASIC[count])) {
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNormExact(void)
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
5716d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
5726d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
5736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
5746d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
5756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(EN_US_, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting collation normalization %s\n",
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(status));
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (BASIC[count].text != NULL) {
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(BASIC[count])) {
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (NORMEXACT[count].text != NULL) {
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(NORMEXACT[count])) {
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(EN_US_, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status);
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (NONNORMEXACT[count].text != NULL) {
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(NONNORMEXACT[count])) {
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestStrength(void)
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
6086d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
6096d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
6106d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
6116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
6126d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
6136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (STRENGTH[count].text != NULL) {
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(STRENGTH[count])) {
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBreakIterator(void) {
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode      status      = U_ZERO_ERROR;
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch  *strsrch;
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           text[128];
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           pattern[32];
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int             count = 0;
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK_BREAK("x");
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
6336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
6346d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
6356d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
6366d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
6376d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getBreakIterator(NULL) != NULL) {
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Expected NULL breakiterator from NULL string search\n");
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(BREAKITERATOREXACT[0].text, text, 128);
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(BREAKITERATOREXACT[0].pattern, pattern, 32);
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_, NULL,
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       &status);
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTBREAKITERATOR;
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setBreakIterator(strsrch, NULL, &status);
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || usearch_getBreakIterator(strsrch) != NULL) {
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error usearch_getBreakIterator returned wrong object");
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTBREAKITERATOR;
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setBreakIterator(strsrch, EN_CHARACTERBREAKER_, &status);
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getBreakIterator(strsrch) != EN_CHARACTERBREAKER_) {
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error usearch_getBreakIterator returned wrong object");
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTBREAKITERATOR;
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setBreakIterator(strsrch, EN_WORDBREAKER_, &status);
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getBreakIterator(strsrch) != EN_WORDBREAKER_) {
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error usearch_getBreakIterator returned wrong object");
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTBREAKITERATOR;
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (count < 4) {
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* 0-3 test are fixed */
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const SearchData     *search   = &(BREAKITERATOREXACT[count]);
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UCollator      *collator = getCollator(search->collator);
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UBreakIterator *breaker  = getBreakIterator(search->breaker);
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->text, text, 128);
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->pattern, pattern, 32);
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setStrength(collator, search->strength);
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                           breaker, &status);
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getBreakIterator(strsrch) != breaker) {
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error setting break iterator\n");
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (strsrch != NULL) {
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                usearch_close(strsrch);
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, *search)) {
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucol_setStrength(collator, UCOL_TERTIARY);
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            goto ENDTESTBREAKITERATOR;
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        search   = &(BREAKITERATOREXACT[count + 1]);
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        breaker  = getBreakIterator(search->breaker);
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setBreakIterator(strsrch, breaker, &status);
700c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (U_FAILURE(status) || usearch_getBreakIterator(strsrch) != breaker) {
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error setting break iterator\n");
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            goto ENDTESTBREAKITERATOR;
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_reset(strsrch);
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, *search)) {
707c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
708c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            usearch_close(strsrch);
709c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            goto ENDTESTBREAKITERATOR;
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count += 2;
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (BREAKITERATOREXACT[count].text != NULL) {
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         if (!assertEqual(BREAKITERATOREXACT[count])) {
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             log_err("Error at test number %d\n", count);
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             goto ENDTESTBREAKITERATOR;
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         }
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         count ++;
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruENDTESTBREAKITERATOR:
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestVariable(void)
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
7326d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
7336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
7346d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
7356d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
7366d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(EN_US_, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status);
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting collation alternate attribute %s\n",
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(status));
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (VARIABLE[count].text != NULL) {
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("variable %d\n", count);
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(VARIABLE[count])) {
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(EN_US_, UCOL_ALTERNATE_HANDLING,
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      UCOL_NON_IGNORABLE, &status);
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestOverlap(void)
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
7576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
7586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
7596d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
7606d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
7616d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
7626d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (OVERLAP[count].text != NULL) {
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithAttribute(OVERLAP[count], USEARCH_OFF,
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      USEARCH_ON)) {
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at overlap test number %d\n", count);
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (NONOVERLAP[count].text != NULL) {
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(NONOVERLAP[count])) {
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at non overlap test number %d\n", count);
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (count < 1) {
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UChar           pattern[32];
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UChar           text[128];
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const SearchData     *search   = &(OVERLAP[count]);
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UCollator      *collator = getCollator(search->collator);
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UStringSearch  *strsrch;
7856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru              status   = U_ZERO_ERROR;
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->text, text, 128);
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->pattern, pattern, 32);
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                           NULL, &status);
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status == U_FILE_ACCESS_ERROR) {
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_data_err("Is your data around?\n");
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return;
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if(U_FAILURE(status)) {
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_err("Error opening searcher\n");
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return;
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_ON, &status);
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_ON) {
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error setting overlap option\n");
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, *search)) {
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        search   = &(NONOVERLAP[count]);
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_OFF, &status);
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF) {
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error setting overlap option\n");
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_reset(strsrch);
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, *search)) {
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         }
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCollator(void)
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test collator that thinks "o" and "p" are the same thing */
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          rules[32];
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UCollator     *tailored = NULL;
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UErrorCode     status   = U_ZERO_ERROR;
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          pattern[32];
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          text[128];
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UStringSearch *strsrch;
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text[0] = 0x41;
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text[1] = 0x42;
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text[2] = 0x43;
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text[3] = 0x44;
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text[4] = 0x45;
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern[0] = 0x62;
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern[1] = 0x63;
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch  = usearch_open(pattern, 2, text, 5, "en_US",  NULL,  &status);
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status == U_FILE_ACCESS_ERROR) {
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_data_err("Is your data around?\n");
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(U_FAILURE(status)) {
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("Error opening searcher\n");
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tailored = usearch_getCollator(strsrch);
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_next(strsrch, &status) != -1) {
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: Found case insensitive match, when we shouldn't\n");
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(tailored, UCOL_PRIMARY);
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_reset(strsrch);
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_next(strsrch, &status) != 1) {
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: Found case insensitive match not found\n");
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
8616d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getCollator(NULL) != NULL) {
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Expected NULL collator from NULL string search\n");
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(COLLATOR[0].text, text, 128);
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(COLLATOR[0].pattern, pattern, 32);
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       NULL, &status);
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, COLLATOR[0])) {
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTCOLLATOR;
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TESTCOLLATORRULE, rules, 32);
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tailored = ucol_openRules(rules, -1, UCOL_ON, COLLATOR[1].strength,
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              NULL, &status);
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening rule based collator %s\n", u_errorName(status));
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setCollator(strsrch, tailored, &status);
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || usearch_getCollator(strsrch) != tailored) {
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting rule based collator\n");
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_reset(strsrch);
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, COLLATOR[1])) {
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTCOLLATOR;
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setCollator(strsrch, EN_US_, &status);
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_reset(strsrch);
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || usearch_getCollator(strsrch) != EN_US_) {
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting rule based collator\n");
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, COLLATOR[0])) {
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTCOLLATOR;
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruENDTESTCOLLATOR:
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tailored != NULL) {
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(tailored);
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestPattern(void)
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UStringSearch *strsrch;
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          pattern[32];
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          bigpattern[512];
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          text[128];
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar         *temp;
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          int32_t        templength;
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UErrorCode     status = U_ZERO_ERROR;
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
9216d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
9226d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
9236d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
9246d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
9256d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getPattern(NULL, &templength) != NULL) {
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error NULL string search expected returning NULL pattern\n");
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setPattern(NULL, pattern, 3, &status);
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error expected setting pattern in NULL strings search\n");
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERN[0].text, text, 128);
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERN[0].pattern, pattern, 32);
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(EN_US_, PATTERN[0].strength);
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       NULL, &status);
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status == U_FILE_ACCESS_ERROR) {
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_data_err("Is your data around?\n");
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(U_FAILURE(status)) {
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("Error opening searcher\n");
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setPattern(strsrch, NULL, 3, &status);
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error expected setting NULL pattern in strings search\n");
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setPattern(strsrch, pattern, 0, &status);
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error expected setting pattern with length 0 in strings search\n");
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getPattern(strsrch, &templength);
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(pattern, temp) != 0) {
965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern\n");
966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, PATTERN[0])) {
968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERN[1].pattern, pattern, 32);
972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setPattern(strsrch, pattern, -1, &status);
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getPattern(strsrch, &templength);
974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(pattern, temp) != 0) {
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern\n");
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_reset(strsrch);
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern %s\n", u_errorName(status));
981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, PATTERN[1])) {
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERN[0].pattern, pattern, 32);
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setPattern(strsrch, pattern, -1, &status);
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getPattern(strsrch, &templength);
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(pattern, temp) != 0) {
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern\n");
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_reset(strsrch);
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern %s\n", u_errorName(status));
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, PATTERN[0])) {
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* enormous pattern size to see if this crashes */
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (templength = 0; templength != 512; templength ++) {
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        bigpattern[templength] = 0x61;
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bigpattern[511] = 0;
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setPattern(strsrch, bigpattern, -1, &status);
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern with size 512, %s \n",
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(status));
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruENDTESTPATTERN:
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(EN_US_, UCOL_TERTIARY);
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strsrch != NULL) {
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestText(void)
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UStringSearch *strsrch;
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          pattern[32];
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          text[128];
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar         *temp;
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          int32_t        templength;
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UErrorCode     status = U_ZERO_ERROR;
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXT[0].text, text, 128);
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXT[0].pattern, pattern, 32);
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
10306d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
10316d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
10326d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
10336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
10346d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getText(NULL, &templength) != NULL) {
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error NULL string search should return NULL text\n");
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setText(NULL, text, 10, &status);
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error NULL string search should have an error when setting text\n");
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       NULL, &status);
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getText(strsrch, &templength);
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(text, temp) != 0) {
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting text\n");
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, TEXT[0])) {
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXT[1].text, text, 32);
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setText(strsrch, text, -1, &status);
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getText(strsrch, &templength);
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(text, temp) != 0) {
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting text\n");
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting text %s\n", u_errorName(status));
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, TEXT[1])) {
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXT[0].text, text, 32);
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setText(strsrch, text, -1, &status);
1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getText(strsrch, &templength);
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(text, temp) != 0) {
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting text\n");
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern %s\n", u_errorName(status));
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, TEXT[0])) {
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruENDTESTPATTERN:
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strsrch != NULL) {
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCompositeBoundaries(void)
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
10986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
10996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
11006d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
11016d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
11026d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
11036d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (COMPOSITEBOUNDARIES[count].text != NULL) {
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("composite %d\n", count);
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(COMPOSITEBOUNDARIES[count])) {
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestGetSetOffset(void)
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
111650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int            searchDataIndex   = 0;
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          pattern[32];
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          text[128];
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status  = U_ZERO_ERROR;
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch *strsrch;
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(pattern, 0, 32*sizeof(UChar));
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(text, 0, 128*sizeof(UChar));
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
11246d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
11256d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
11266d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
11276d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
11286d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getOffset(NULL) != USEARCH_DONE) {
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("usearch_getOffset(NULL) expected USEARCH_DONE\n");
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, 16, text, 32, EN_US_, NULL,
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       &status);
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* testing out of bounds error */
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setOffset(strsrch, -1, &status);
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error expecting set offset error\n");
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setOffset(strsrch, 128, &status);
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error expecting set offset error\n");
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
114350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    while (BASIC[searchDataIndex].text != NULL) {
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int         count       = 0;
114550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        SearchData  search      = BASIC[searchDataIndex ++];
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t matchindex  = search.offset[count];
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t     textlength;
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.text, text, 128);
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.pattern, pattern, 32);
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setText(strsrch, text, -1, &status);
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setPattern(strsrch, pattern, -1, &status);
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setStrength(usearch_getCollator(strsrch), search.strength);
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_reset(strsrch);
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while (U_SUCCESS(status) && matchindex >= 0) {
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uint32_t matchlength = search.size[count];
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_next(strsrch, &status);
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (matchindex != usearch_getMatchedStart(strsrch) ||
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                char *str = toCharString(usearch_getText(strsrch,
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                         &textlength));
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Text: %s\n", str);
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                str = toCharString(usearch_getPattern(strsrch, &textlength));
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Pattern: %s\n", str);
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Error match found at %d %d\n",
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        usearch_getMatchedStart(strsrch),
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        usearch_getMatchedLength(strsrch));
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return;
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_setOffset(strsrch, matchindex + matchlength, &status);
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_previous(strsrch, &status);
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (matchindex != usearch_getMatchedStart(strsrch) ||
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                char *str = toCharString(usearch_getText(strsrch,
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                         &textlength));
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Text: %s\n", str);
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                str = toCharString(usearch_getPattern(strsrch, &textlength));
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Pattern: %s\n", str);
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Error match found at %d %d\n",
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        usearch_getMatchedStart(strsrch),
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        usearch_getMatchedLength(strsrch));
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return;
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_setOffset(strsrch, matchindex + matchlength, &status);
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            matchindex = search.offset[count + 1] == -1 ? -1 :
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         search.offset[count + 2];
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (search.offset[count + 1] != -1) {
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                usearch_setOffset(strsrch, search.offset[count + 1] + 1,
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  &status);
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (usearch_getOffset(strsrch) != search.offset[count + 1] + 1) {
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("Error setting offset\n");
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    return;
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            count += 2;
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_next(strsrch, &status);
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getMatchedStart(strsrch) != USEARCH_DONE) {
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char *str = toCharString(usearch_getText(strsrch, &textlength));
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Text: %s\n", str);
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = toCharString(usearch_getPattern(strsrch, &textlength));
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Pattern: %s\n", str);
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error match found at %d %d\n",
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        usearch_getMatchedStart(strsrch),
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        usearch_getMatchedLength(strsrch));
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(usearch_getCollator(strsrch), UCOL_TERTIARY);
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestGetSetAttribute(void)
1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode      status    = U_ZERO_ERROR;
1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           pattern[32];
1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           text[128];
1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch  *strsrch;
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(pattern, 0, 32*sizeof(UChar));
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(text, 0, 128*sizeof(UChar));
1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
12266d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
12276d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
12286d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
12296d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
12306d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getAttribute(NULL, USEARCH_OVERLAP) != USEARCH_DEFAULT ||
1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getAttribute(NULL, USEARCH_CANONICAL_MATCH) !=
1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                         USEARCH_DEFAULT) {
1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err(
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "Attributes for NULL string search should be USEARCH_DEFAULT\n");
1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, 16, text, 32, EN_US_, NULL,
1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       &status);
1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening search %s\n", u_errorName(status));
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_DEFAULT, &status);
1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF) {
1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting overlap to the default\n");
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_ON, &status);
1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_ON) {
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting overlap true\n");
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_OFF, &status);
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF) {
1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting overlap false\n");
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_OVERLAP,
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         USEARCH_ATTRIBUTE_VALUE_COUNT, &status);
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting overlap to illegal value\n");
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_DEFAULT,
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getAttribute(strsrch, USEARCH_CANONICAL_MATCH) !=
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                        USEARCH_OFF) {
1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting canonical match to the default\n");
1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getAttribute(strsrch, USEARCH_CANONICAL_MATCH) !=
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                         USEARCH_ON) {
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting canonical match true\n");
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_OFF,
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getAttribute(strsrch, USEARCH_CANONICAL_MATCH) !=
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                        USEARCH_OFF) {
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting canonical match false\n");
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH,
1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         USEARCH_ATTRIBUTE_VALUE_COUNT, &status);
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting canonical match to illegal value\n");
1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_ATTRIBUTE_COUNT, USEARCH_DEFAULT,
1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting illegal attribute success\n");
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestGetMatch(void)
1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int            count       = 0;
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status      = U_ZERO_ERROR;
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          text[128];
1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          pattern[32];
1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SearchData     search      = MATCH[0];
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t    matchindex  = search.offset[count];
1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch *strsrch;
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t        textlength;
1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          matchtext[128];
1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
13146d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
13156d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
13166d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
13176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
13186d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getMatchedStart(NULL) != USEARCH_DONE ||
1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getMatchedLength(NULL) != USEARCH_DONE) {
1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err(
1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   "Expected start and length of NULL string search should be USEARCH_DONE\n");
1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search.text, text, 128);
1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search.pattern, pattern, 32);
1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       NULL, &status);
1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strsrch != NULL) {
1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (U_SUCCESS(status) && matchindex >= 0) {
1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t matchlength = search.size[count];
1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_next(strsrch, &status);
1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (matchindex != usearch_getMatchedStart(strsrch) ||
1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            matchlength != usearch_getMatchedLength(strsrch)) {
1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char *str = toCharString(usearch_getText(strsrch, &textlength));
1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Text: %s\n", str);
1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = toCharString(usearch_getPattern(strsrch, &textlength));
1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Pattern: %s\n", str);
1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error match found at %d %d\n",
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    usearch_getMatchedStart(strsrch),
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    usearch_getMatchedLength(strsrch));
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getMatchedText(NULL, matchtext, 128, &status) !=
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            USEARCH_DONE || U_SUCCESS(status)){
1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error expecting errors with NULL string search\n");
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getMatchedText(strsrch, NULL, 0, &status) !=
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (int32_t)matchlength || U_SUCCESS(status)){
1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error pre-flighting match length\n");
1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getMatchedText(strsrch, matchtext, 0, &status) !=
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (int32_t)matchlength || U_SUCCESS(status)){
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error getting match text with buffer size 0\n");
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getMatchedText(strsrch, matchtext, matchlength, &status)
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            != (int32_t)matchlength || matchtext[matchlength - 1] == 0 ||
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            U_FAILURE(status)){
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error getting match text with exact size\n");
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (int32_t) matchlength || U_FAILURE(status) ||
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            memcmp(matchtext,
1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   usearch_getText(strsrch, &textlength) + matchindex,
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   matchlength * sizeof(UChar)) != 0 ||
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            matchtext[matchlength] != 0) {
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error getting matched text\n");
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        matchindex = search.offset[count];
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_next(strsrch, &status);
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getMatchedStart(strsrch)  != USEARCH_DONE ||
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getMatchedLength(strsrch) != 0) {
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error end of match not found\n");
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        USEARCH_DONE) {
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error getting null matches\n");
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSetMatch(void)
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int            count       = 0;
14056d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
14066d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
14076d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
14086d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
14096d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
14106d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (MATCH[count].text != NULL) {
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        SearchData     search = MATCH[count];
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int            size   = 0;
141450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        int            offsetIndex = 0;
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar          text[128];
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar          pattern[32];
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UStringSearch *strsrch;
14186d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        status = U_ZERO_ERROR;
1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_first(NULL, &status) != USEARCH_DONE ||
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_last(NULL, &status) != USEARCH_DONE) {
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error getting the first and last match of a NULL string search\n");
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.text, text, 128);
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.pattern, pattern, 32);
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                           NULL, &status);
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error opening string search %s\n", u_errorName(status));
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (strsrch != NULL) {
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                usearch_close(strsrch);
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        size = 0;
1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while (search.offset[size] != -1) {
1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            size ++;
1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_first(strsrch, &status) != search.offset[0] ||
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            U_FAILURE(status)) {
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error getting first match\n");
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_last(strsrch, &status) != search.offset[size -1] ||
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            U_FAILURE(status)) {
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error getting last match\n");
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
145050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        while (offsetIndex < size) {
145150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (offsetIndex + 2 < size) {
145250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                if (usearch_following(strsrch, search.offset[offsetIndex + 2] - 1,
145350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                      &status) != search.offset[offsetIndex + 2] ||
1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    U_FAILURE(status)) {
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("Error getting following match at index %d\n",
145650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                            search.offset[offsetIndex + 2] - 1);
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
145950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (offsetIndex + 1 < size) {
146050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                if (usearch_preceding(strsrch, search.offset[offsetIndex + 1] +
146150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                               search.size[offsetIndex + 1] + 1,
146250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                      &status) != search.offset[offsetIndex + 1] ||
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    U_FAILURE(status)) {
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("Error getting preceeding match at index %d\n",
146550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                            search.offset[offsetIndex + 1] + 1);
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
146850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            offsetIndex += 2;
1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_following(strsrch, u_strlen(text), &status) !=
1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            USEARCH_DONE) {
1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error expecting out of bounds match\n");
1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_preceding(strsrch, 0, &status) != USEARCH_DONE) {
1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error expecting out of bounds match\n");
1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestReset(void)
1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status    = U_ZERO_ERROR;
1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          text[]    = {0x66, 0x69, 0x73, 0x68, 0x20,
1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                0x66, 0x69, 0x73, 0x68};
1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          pattern[] = {0x73};
1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch *strsrch;
1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
14926d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
14936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
14946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
14956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
14966d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, 1, text, 9,
1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                      EN_US_, NULL, &status);
1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strsrch != NULL) {
1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_ON, &status);
1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setOffset(strsrch, 9, &status);
1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting attributes and offsets\n");
1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_reset(strsrch);
1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF ||
1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getAttribute(strsrch, USEARCH_CANONICAL_MATCH) !=
1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 USEARCH_OFF ||
1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getOffset(strsrch) != 0 ||
1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getMatchedLength(strsrch) != 0 ||
1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getMatchedStart(strsrch) != USEARCH_DONE) {
1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error resetting string search\n");
1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_previous(strsrch, &status);
1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getMatchedStart(strsrch) != 7 ||
1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getMatchedLength(strsrch) != 1) {
1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error resetting string search\n");
1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSupplementary(void)
1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
15366d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
15376d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
15386d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
15396d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
15406d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
15416d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (SUPPLEMENTARY[count].text != NULL) {
1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(SUPPLEMENTARY[count])) {
1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestContraction(void)
1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          rules[128];
1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          pattern[128];
1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          text[128];
1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator     *collator;
1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status = U_ZERO_ERROR;
1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int            count = 0;
1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch *strsrch;
1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(rules, 0, 128*sizeof(UChar));
1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(pattern, 0, 128*sizeof(UChar));
1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(text, 0, 128*sizeof(UChar));
1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(CONTRACTIONRULE, rules, 128);
1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    collator = ucol_openRules(rules, u_strlen(rules), UCOL_ON,
1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              UCOL_TERTIARY, NULL, &status);
1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status == U_FILE_ACCESS_ERROR) {
1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_data_err("Is your data around?\n");
1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(U_FAILURE(status)) {
1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("Error opening collator %s\n", u_errorName(status));
1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, 1, text, 1, collator, NULL,
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       &status);
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (CONTRACTION[count].text != NULL) {
1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(CONTRACTION[count].text, text, 128);
1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(CONTRACTION[count].pattern, pattern, 128);
1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setText(strsrch, text, -1, &status);
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setPattern(strsrch, pattern, -1, &status);
1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, CONTRACTION[count])) {
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(collator);
1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestIgnorable(void)
1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          rules[128];
1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          pattern[128];
1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          text[128];
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator     *collator;
1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status = U_ZERO_ERROR;
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch *strsrch;
1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t       count = 0;
1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(rules, 0, 128*sizeof(UChar));
1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(pattern, 0, 128*sizeof(UChar));
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(text, 0, 128*sizeof(UChar));
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(IGNORABLERULE, rules, 128);
1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    collator = ucol_openRules(rules, u_strlen(rules), UCOL_ON,
1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              IGNORABLE[count].strength, NULL, &status);
1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status == U_FILE_ACCESS_ERROR) {
1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_data_err("Is your data around?\n");
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(U_FAILURE(status)) {
1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening collator %s\n", u_errorName(status));
1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, 1, text, 1, collator, NULL,
1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       &status);
1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (IGNORABLE[count].text != NULL) {
1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(IGNORABLE[count].text, text, 128);
1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(IGNORABLE[count].pattern, pattern, 128);
1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setText(strsrch, text, -1, &status);
1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setPattern(strsrch, pattern, -1, &status);
1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, IGNORABLE[count])) {
1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(collator);
1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1638c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic void TestDiacriticMatch(void)
1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          pattern[128];
1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          text[128];
1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status = U_ZERO_ERROR;
1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch *strsrch = NULL;
1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *coll = NULL;
1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t       count = 0;
1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SearchData search;
1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(pattern, 0, 128*sizeof(UChar));
1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(text, 0, 128*sizeof(UChar));
1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_open(pattern, 1, text, 1, uloc_getDefault(), NULL, &status);
1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru	if (U_FAILURE(status)) {
16536d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Error opening string search %s\n", u_errorName(status));
1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1657c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    search = DIACRITICMATCH[count];
1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (search.text != NULL) {
1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    	if (search.collator != NULL) {
1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    		coll = ucol_openFromShortString(search.collator, FALSE, NULL, &status);
1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    	} else {
1662c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            /* Always use "en_US" because some of these tests fail in Danish locales. */
1663c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    		coll = ucol_open("en_US"/*uloc_getDefault()*/, &status);
1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    		ucol_setStrength(coll, search.strength);
1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    	}
1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    	if (U_FAILURE(status)) {
1667c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru	        log_err("Error opening string search collator(\"%s\") %s\n", search.collator, u_errorName(status));
1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru	        return;
1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru	    }
1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    	usearch_setCollator(strsrch, coll, &status);
1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    	if (U_FAILURE(status)) {
1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru	        log_err("Error setting string search collator %s\n", u_errorName(status));
1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru	        return;
1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru	    }
1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.text, text, 128);
1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.pattern, pattern, 128);
1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setText(strsrch, text, -1, &status);
1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setPattern(strsrch, pattern, -1, &status);
1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, search)) {
1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(coll);
1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1686c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        search = DIACRITICMATCH[++count];
1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCanonical(void)
1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
16946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
16956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
16966d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
16976d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
16986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
16996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (BASICCANONICAL[count].text != NULL) {
1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(BASICCANONICAL[count])) {
1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNormCanonical(void)
1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
17136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
17146d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
17156d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
17166d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
17176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(EN_US_, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (NORMCANONICAL[count].text != NULL) {
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(NORMCANONICAL[count])) {
1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(EN_US_, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status);
1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestStrengthCanonical(void)
1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
17336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
17346d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
17356d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
17366d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
17376d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
17386d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (STRENGTHCANONICAL[count].text != NULL) {
1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(STRENGTHCANONICAL[count])) {
1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBreakIteratorCanonical(void) {
1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode      status      = U_ZERO_ERROR;
1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int             count = 0;
1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK_BREAK("x");
1753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17566d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
17576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
17586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
17596d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
17606d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (count < 4) {
1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* 0-3 test are fixed */
1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UChar           pattern[32];
1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UChar           text[128];
1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const SearchData     *search   = &(BREAKITERATORCANONICAL[count]);
1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UCollator      *collator = getCollator(search->collator);
1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UBreakIterator *breaker  = getBreakIterator(search->breaker);
1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UStringSearch  *strsrch;
1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->text, text, 128);
1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->pattern, pattern, 32);
1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setStrength(collator, search->strength);
1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                           breaker, &status);
1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status == U_FILE_ACCESS_ERROR) {
1777c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_data_err("Is your data around?\n");
1778c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            goto ENDTESTBREAKITERATOR;
1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if(U_FAILURE(status)) {
1780c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_err("Error opening searcher\n");
1781c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            goto ENDTESTBREAKITERATOR;
1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             &status);
1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getBreakIterator(strsrch) != breaker) {
1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error setting break iterator\n");
1788c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            usearch_close(strsrch);
1789c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            goto ENDTESTBREAKITERATOR;
1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, *search)) {
1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucol_setStrength(collator, UCOL_TERTIARY);
1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            goto ENDTESTBREAKITERATOR;
1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        search   = &(BREAKITERATOREXACT[count + 1]);
1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        breaker  = getBreakIterator(search->breaker);
1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setBreakIterator(strsrch, breaker, &status);
1799c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (U_FAILURE(status) || usearch_getBreakIterator(strsrch) != breaker) {
1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error setting break iterator\n");
1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            goto ENDTESTBREAKITERATOR;
1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_reset(strsrch);
1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             &status);
1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, *search)) {
1808c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1809c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            usearch_close(strsrch);
1810c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            goto ENDTESTBREAKITERATOR;
1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count += 2;
1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (BREAKITERATORCANONICAL[count].text != NULL) {
1817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         if (!assertEqual(BREAKITERATORCANONICAL[count])) {
1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             log_err("Error at test number %d\n", count);
1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             goto ENDTESTBREAKITERATOR;
1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         }
1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         count ++;
1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruENDTESTBREAKITERATOR:
1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestVariableCanonical(void)
1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
18336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
18346d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
18356d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
18366d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
18376d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(EN_US_, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status);
1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting collation alternate attribute %s\n",
1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(status));
1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (VARIABLE[count].text != NULL) {
1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("variable %d\n", count);
1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(VARIABLE[count])) {
1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(EN_US_, UCOL_ALTERNATE_HANDLING,
1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      UCOL_NON_IGNORABLE, &status);
1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestOverlapCanonical(void)
1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
18586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
18596d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
18606d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
18616d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
18626d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
18636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (OVERLAPCANONICAL[count].text != NULL) {
1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithAttribute(OVERLAPCANONICAL[count], USEARCH_ON,
1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      USEARCH_ON)) {
1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at overlap test number %d\n", count);
1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
1872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (NONOVERLAP[count].text != NULL) {
1873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(NONOVERLAPCANONICAL[count])) {
1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at non overlap test number %d\n", count);
1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
1880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (count < 1) {
1881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UChar           pattern[32];
1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UChar           text[128];
1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const SearchData     *search   = &(OVERLAPCANONICAL[count]);
1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UCollator      *collator = getCollator(search->collator);
1885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UStringSearch  *strsrch;
18866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru              status   = U_ZERO_ERROR;
1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->text, text, 128);
1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->pattern, pattern, 32);
1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                           NULL, &status);
1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status == U_FILE_ACCESS_ERROR) {
1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_data_err("Is your data around?\n");
1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return;
1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if(U_FAILURE(status)) {
1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_err("Error opening searcher\n");
1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return;
1898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             &status);
1901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_ON, &status);
1902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
1903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_ON) {
1904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error setting overlap option\n");
1905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, *search)) {
1907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
1908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        search   = &(NONOVERLAPCANONICAL[count]);
1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_OFF, &status);
1912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
1913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF) {
1914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error setting overlap option\n");
1915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_reset(strsrch);
1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, *search)) {
1918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
1919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         }
1921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
1924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCollatorCanonical(void)
1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test collator that thinks "o" and "p" are the same thing */
1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          rules[32];
1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UCollator     *tailored = NULL;
1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UErrorCode     status = U_ZERO_ERROR;
1934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          pattern[32];
1935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          text[128];
1936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UStringSearch *strsrch;
1937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19386d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
19396d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
19406d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
19416d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
19426d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(COLLATORCANONICAL[0].text, text, 128);
1944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(COLLATORCANONICAL[0].pattern, pattern, 32);
1945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
1947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       NULL, &status);
1948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status == U_FILE_ACCESS_ERROR) {
1949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_data_err("Is your data around?\n");
1950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
1951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(U_FAILURE(status)) {
1952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("Error opening searcher\n");
1953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
1954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, COLLATORCANONICAL[0])) {
1961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTCOLLATOR;
1962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TESTCOLLATORRULE, rules, 32);
1965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tailored = ucol_openRules(rules, -1, UCOL_ON,
1966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              COLLATORCANONICAL[1].strength, NULL, &status);
1967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening rule based collator %s\n", u_errorName(status));
1969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setCollator(strsrch, tailored, &status);
1972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || usearch_getCollator(strsrch) != tailored) {
1973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting rule based collator\n");
1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_reset(strsrch);
1976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
1978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, COLLATORCANONICAL[1])) {
1979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTCOLLATOR;
1980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setCollator(strsrch, EN_US_, &status);
1983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_reset(strsrch);
1984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
1986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || usearch_getCollator(strsrch) != EN_US_) {
1987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting rule based collator\n");
1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, COLLATORCANONICAL[0])) {
1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTCOLLATOR;
1991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruENDTESTCOLLATOR:
1994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
1995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tailored != NULL) {
1996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(tailored);
1997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestPatternCanonical(void)
2002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UStringSearch *strsrch;
2004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          pattern[32];
2005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          text[128];
2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar         *temp;
2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          int32_t        templength;
2008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UErrorCode     status = U_ZERO_ERROR;
2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20106d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
20116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
20126d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
20136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
20146d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERNCANONICAL[0].text, text, 128);
2016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERNCANONICAL[0].pattern, pattern, 32);
2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(EN_US_, PATTERNCANONICAL[0].strength);
2019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
2020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       NULL, &status);
2021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getPattern(strsrch, &templength);
2028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(pattern, temp) != 0) {
2029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern\n");
2030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, PATTERNCANONICAL[0])) {
2032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERNCANONICAL[1].pattern, pattern, 32);
2036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setPattern(strsrch, pattern, -1, &status);
2037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getPattern(strsrch, &templength);
2038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(pattern, temp) != 0) {
2039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern\n");
2040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_reset(strsrch);
2043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern %s\n", u_errorName(status));
2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, PATTERNCANONICAL[1])) {
2049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERNCANONICAL[0].pattern, pattern, 32);
2053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setPattern(strsrch, pattern, -1, &status);
2054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getPattern(strsrch, &templength);
2055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(pattern, temp) != 0) {
2056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern\n");
2057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_reset(strsrch);
2060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
2062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern %s\n", u_errorName(status));
2064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, PATTERNCANONICAL[0])) {
2066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruENDTESTPATTERN:
2069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(EN_US_, UCOL_TERTIARY);
2070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strsrch != NULL) {
2071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
2072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
2074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestTextCanonical(void)
2077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UStringSearch *strsrch;
2079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          pattern[32];
2080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          text[128];
2081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar         *temp;
2082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          int32_t        templength;
2083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UErrorCode     status = U_ZERO_ERROR;
2084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXTCANONICAL[0].text, text, 128);
2086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXTCANONICAL[0].pattern, pattern, 32);
2087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
20896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
20906d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
20916d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
20926d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
2093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
2094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       NULL, &status);
2095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
2097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
2100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getText(strsrch, &templength);
2103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(text, temp) != 0) {
2104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting text\n");
2105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, TEXTCANONICAL[0])) {
2107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXTCANONICAL[1].text, text, 32);
2111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setText(strsrch, text, -1, &status);
2112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getText(strsrch, &templength);
2113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(text, temp) != 0) {
2114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting text\n");
2115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting text %s\n", u_errorName(status));
2119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, TEXTCANONICAL[1])) {
2121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXTCANONICAL[0].text, text, 32);
2125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setText(strsrch, text, -1, &status);
2126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getText(strsrch, &templength);
2127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(text, temp) != 0) {
2128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting text\n");
2129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern %s\n", u_errorName(status));
2133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, TEXTCANONICAL[0])) {
2135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruENDTESTPATTERN:
2138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strsrch != NULL) {
2139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
2140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
2142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCompositeBoundariesCanonical(void)
2145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
21476d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
21486d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
21496d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
21506d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
21516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
21526d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
2153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (COMPOSITEBOUNDARIESCANONICAL[count].text != NULL) {
2154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("composite %d\n", count);
2155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(COMPOSITEBOUNDARIESCANONICAL[count])) {
2156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
2157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
2159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
2161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestGetSetOffsetCanonical(void)
2164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
216550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int            searchDataIndex   = 0;
2166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          pattern[32];
2167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          text[128];
2168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status  = U_ZERO_ERROR;
2169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch *strsrch;
2170c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UCollator     *collator;
2171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(pattern, 0, 32*sizeof(UChar));
2173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(text, 0, 128*sizeof(UChar));
2174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
21766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
21776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
21786d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
21796d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
2180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, 16, text, 32, EN_US_, NULL,
2181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       &status);
2182c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2183c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    collator = usearch_getCollator(strsrch);
2184c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
2185c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
2188c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* testing out of bounds error */
2190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setOffset(strsrch, -1, &status);
2191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
2192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error expecting set offset error\n");
2193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setOffset(strsrch, 128, &status);
2195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
2196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error expecting set offset error\n");
2197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
219850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    while (BASICCANONICAL[searchDataIndex].text != NULL) {
2199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int         count       = 0;
220050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        SearchData  search      = BASICCANONICAL[searchDataIndex ++];
2201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t matchindex  = search.offset[count];
2202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t     textlength;
2203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
220450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (BASICCANONICAL[searchDataIndex].text == NULL) {
2205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* skip the last one */
2206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
2207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.text, text, 128);
2210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.pattern, pattern, 32);
2211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
2212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setText(strsrch, text, -1, &status);
2213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setPattern(strsrch, pattern, -1, &status);
2214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while (U_SUCCESS(status) && matchindex >= 0) {
2215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uint32_t matchlength = search.size[count];
2216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_next(strsrch, &status);
2217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (matchindex != usearch_getMatchedStart(strsrch) ||
2218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
2219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                char *str = toCharString(usearch_getText(strsrch,
2220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                         &textlength));
2221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Text: %s\n", str);
2222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                str = toCharString(usearch_getPattern(strsrch, &textlength));
2223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Pattern: %s\n", str);
2224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Error match found at %d %d\n",
2225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        usearch_getMatchedStart(strsrch),
2226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        usearch_getMatchedLength(strsrch));
2227c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                goto bail;
2228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            matchindex = search.offset[count + 1] == -1 ? -1 :
2230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         search.offset[count + 2];
2231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (search.offset[count + 1] != -1) {
2232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                usearch_setOffset(strsrch, search.offset[count + 1] + 1,
2233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  &status);
2234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (usearch_getOffset(strsrch) != search.offset[count + 1] + 1) {
2235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("Error setting offset\n");
2236c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    goto bail;
2237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
2238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            count += 2;
2241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_next(strsrch, &status);
2243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getMatchedStart(strsrch) != USEARCH_DONE) {
2244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char *str = toCharString(usearch_getText(strsrch, &textlength));
2245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Text: %s\n", str);
2246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = toCharString(usearch_getPattern(strsrch, &textlength));
2247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Pattern: %s\n", str);
2248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error match found at %d %d\n",
2249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        usearch_getMatchedStart(strsrch),
2250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        usearch_getMatchedLength(strsrch));
2251c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            goto bail;
2252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2254c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2255c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querubail:
2256c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status);
2257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
2258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
2259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSupplementaryCanonical(void)
2262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
22646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
22656d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
22666d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
22676d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
22686d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
22696d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
2270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (SUPPLEMENTARYCANONICAL[count].text != NULL) {
2271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(SUPPLEMENTARYCANONICAL[count])) {
2272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
2273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
2275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
2277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestContractionCanonical(void)
2280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          rules[128];
2282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          pattern[128];
2283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          text[128];
2284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator     *collator = NULL;
2285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status = U_ZERO_ERROR;
2286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int            count = 0;
2287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch *strsrch = NULL;
2288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(rules, 0, 128*sizeof(UChar));
2289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(pattern, 0, 128*sizeof(UChar));
2290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(text, 0, 128*sizeof(UChar));
2291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(CONTRACTIONRULE, rules, 128);
2293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    collator = ucol_openRules(rules, u_strlen(rules), UCOL_ON,
2294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              UCOL_TERTIARY, NULL, &status);
2295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status == U_FILE_ACCESS_ERROR) {
2296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_data_err("Is your data around?\n");
2297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
2298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(U_FAILURE(status)) {
2299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("Error opening collator %s\n", u_errorName(status));
2300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
2301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, 1, text, 1, collator, NULL,
2303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       &status);
2304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
2306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
2308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (CONTRACTIONCANONICAL[count].text != NULL) {
2311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(CONTRACTIONCANONICAL[count].text, text, 128);
2312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(CONTRACTIONCANONICAL[count].pattern, pattern, 128);
2313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setText(strsrch, text, -1, &status);
2314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setPattern(strsrch, pattern, -1, &status);
2315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch,
2316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                              CONTRACTIONCANONICAL[count])) {
2317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
2318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
2320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
2322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(collator);
2323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNumeric(void) {
2326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator     *coll = NULL;
2327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch *strsrch = NULL;
2328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status = U_ZERO_ERROR;
2329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          pattern[128];
2331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          text[128];
2332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(pattern, 0, 128*sizeof(UChar));
2333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(text, 0, 128*sizeof(UChar));
2334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    coll = ucol_open("", &status);
2336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
2337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("Could not open UCA. Is your data around?\n");
2338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_NUMERIC_COLLATION, UCOL_ON, &status);
2342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, 1, text, 1, coll, NULL, &status);
2344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status != U_UNSUPPORTED_ERROR || U_SUCCESS(status)) {
2346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Expected U_UNSUPPORTED_ERROR when trying to instantiate a search object from a CODAN collator, got %s instead\n", u_errorName(status));
2347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strsrch) {
2348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
2349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
2353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2356c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/* This test is for ticket 4038 due to incorrect backward searching when certain patterns have a length > 1 */
2357c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic void TestForwardBackward(void) {
2358c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2359c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UCollator *coll = NULL;
2360c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UStringSearch *search = NULL;
2361c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UChar usrcstr[32], value[4];
2362c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t pos= -1;
2363c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t expectedPos = 9;
2364c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2365c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    coll = ucol_open("en_GB", &status);
2366c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (U_FAILURE(status)) {
23676d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "ucol_open failed: %s\n", u_errorName(status));
2368c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        goto exitTestForwardBackward;
2369c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2370c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_PRIMARY, &status);
2371c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_CASE_LEVEL, UCOL_ON, &status);
2372c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, &status);
2373c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2374c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    u_uastrcpy(usrcstr, "QBitArray::bitarr_data"); /* text */
2375c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    u_uastrcpy(value, "::");                       /* pattern */
2376c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2377c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    search = usearch_openFromCollator(value, 2, usrcstr, 22, coll, NULL, &status);
2378c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (U_FAILURE(status)) {
2379c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_err("usearch_openFromCollator failed: %s\n", u_errorName(status));
2380c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        goto exitTestForwardBackward;
2381c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2382c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2383c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    usearch_reset(search);
2384c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    /* forward search */
2385c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    pos = usearch_first(search, &status);
2386c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (pos != expectedPos) {
2387c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_err("Expected search result: %d; Got instead: %d\n", expectedPos, pos);
2388c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        goto exitTestForwardBackward;
2389c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2390c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2391c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    pos = -1;
2392c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    usearch_reset(search);
2393c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    /* backward search */
2394c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    pos = usearch_last(search, &status);
2395c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (pos != expectedPos) {
2396c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_err("Expected search result: %d; Got instead: %d\n", expectedPos, pos);
2397c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2398c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2399c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruexitTestForwardBackward :
2400c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (coll != NULL) {
2401c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        ucol_close(coll);
2402c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2403c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (search != NULL) {
2404c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        usearch_close(search);
2405c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2406c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
2407c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2408b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define TEST_ASSERT(x) \
24096d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru   {if (U_FAILURE(x)) {log_err_status(x, "%s:%d: FAIL: test assertion failure \n", __FILE__, __LINE__);\
2410b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru   }}
2411b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2412b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestSearchForNull(void) {
2413b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UCollator *coll;
2414b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode ec;
2415b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UStringSearch *search;
2416b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int pos;
2417b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int len;
2418b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int expectedPos;
2419b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int expectedLen;
2420b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int expectedNum;
2421b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int count = 0;
2422b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const UChar zerodigit = 0x0030; /* 0 */
2423b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const UChar nulldigit = 0x0000; /* null */
2424b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2425b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* static const UChar var[(length)+1]=U_DECLARE_UTF16(cs) */
2426b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define PATTERN_LEN 4
2427b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define TEXT_LEN 10
2428b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2429b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    U_STRING_DECL(_pattern, "IS 0", PATTERN_LEN);
2430b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    U_STRING_DECL(_text, "_0IS 0 OK?", TEXT_LEN);
2431b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UChar pattern[PATTERN_LEN + 1], text[TEXT_LEN + 1];
2432b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2433b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    U_STRING_INIT(_pattern, "IS 0", PATTERN_LEN);
2434b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    U_STRING_INIT(_text, "_0IS 0 OK?", TEXT_LEN);
2435b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    expectedPos = 2;
2436b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    expectedLen = 4;
2437b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    expectedNum = 1;
2438b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2439b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (pos = 0; pos < PATTERN_LEN; pos++) {
2440b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (_pattern[pos] == zerodigit) {
2441b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            pattern[pos] = nulldigit;
2442b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        } else {
2443b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            pattern[pos] = _pattern[pos];
2444b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
2445b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
2446b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    pattern[PATTERN_LEN] = 0x0000;
2447b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2448b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (pos = 0; pos < TEXT_LEN; pos++) {
2449b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (_text[pos] == zerodigit) {
2450b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            text[pos] = nulldigit;
2451b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        } else {
2452b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            text[pos] = _text[pos];
2453b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
2454b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
2455b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    text[TEXT_LEN] = 0x0000;
2456b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2457b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ec = U_ZERO_ERROR;
2458b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2459b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* create a US-English collator */
2460b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    coll = ucol_open("en_US", &ec);
2461b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2462b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* make sure we didn't fail. */
24636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru     TEST_ASSERT (ec);
2464b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2465b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ucol_setStrength(coll, UCOL_IDENTICAL);
2466b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2467b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* open a search looking for 0 */
2468b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    search = usearch_openFromCollator(pattern, PATTERN_LEN, text,
2469b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            TEXT_LEN, coll, NULL, &ec);
24706d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru     TEST_ASSERT (ec);
24716d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
24726d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (coll != NULL && search != NULL) {
24736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        pos = usearch_first(search, &ec);
24746d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        len = usearch_getMatchedLength(search);
24756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (pos != expectedPos) {
24766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err("Expected search result: %d; Got instead: %d\n", expectedPos,
24776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                    pos);
24786d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
2479b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
24806d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (len != expectedLen) {
24816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err("Expected search result length: %d; Got instead: %d\n",
24826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                    expectedLen, len);
24836d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
2484b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
24856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        for (pos = usearch_first(search, &ec); pos != USEARCH_DONE; pos
24866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                = usearch_next(search, &ec)) {
24876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_verbose("Match at %d\n", pos);
24886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            count += 1;
24896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
2490b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
24916d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (count != expectedNum) {
24926d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err("Expected %d search hits, found %d\n", expectedNum, count);
24936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
2494b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
2495b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2496b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ucol_close(coll);
2497b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    usearch_close(search);
2498b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
2499b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2500b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestStrengthIdentical(void)
2501b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
2502b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	UCollator *coll;
2503b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	UErrorCode ec = U_ZERO_ERROR;
2504b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	UStringSearch *search;
2505b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2506b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UChar pattern[] = {0x05E9, 0x0591, 0x05E9};
2507b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UChar text[]    = {0x05E9, 0x0592, 0x05E9};
2508b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t pLen = sizeof (pattern) / sizeof(pattern[0]);
2509b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t tLen = sizeof(text) / sizeof (text[0]);
2510b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	int32_t expectedPos = 0;
2511b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	int32_t expectedLen = 3;
2512b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2513b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	int32_t pos;
2514b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	int32_t len;
2515b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2516b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* create a US-English collator */
2517b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	coll = ucol_open ("en_US", &ec);
2518b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2519b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	/* make sure we didn't fail. */
25206d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru	TEST_ASSERT (ec);
2521b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2522b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ucol_setStrength( coll, UCOL_TERTIARY);
2523b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2524b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	/* open a search looking for 0 */
2525b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	search = usearch_openFromCollator (pattern, pLen, text, tLen, coll, NULL, &ec);
25266d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru	TEST_ASSERT (ec);
2527b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
25286d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (coll != NULL && search != NULL) {
25296d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru	    pos = usearch_first(search, &ec);
25306d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru	    len = usearch_getMatchedLength(search);
2531b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
25326d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru	    if(pos != expectedPos) {
25336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		    log_err("Expected search result: %d; Got instead: %d\n", expectedPos, pos);
25346d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru	    }
2535b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
25366d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru	    if(len != expectedLen) {
25376d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		    log_err("Expected search result length: %d; Got instead: %d\n", expectedLen, len);
25386d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru	    }
2539b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
25406d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        /* Now try it at strength == UCOL_IDENTICAL */
25416d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        ucol_setStrength(coll, UCOL_IDENTICAL);
25426d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru	    usearch_reset(search);
2543b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
25446d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru	    pos = usearch_first(search, &ec);
25456d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru	    len = usearch_getMatchedLength(search);
2546b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
25476d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru	    if(pos != -1) {
25486d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru		    log_err("Expected failure for strentgh = UCOL_IDENTICAL: got %d instead.\n", pos);
25496d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru	    }
25506d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
2551b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2552b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    usearch_close(search);
2553b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ucol_close(coll);
2554b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
2555b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2556b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addSearchTest(TestNode** root)
2558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestStart, "tscoll/usrchtst/TestStart");
2560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestOpenClose, "tscoll/usrchtst/TestOpenClose");
2561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestInitialization, "tscoll/usrchtst/TestInitialization");
2562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestBasic, "tscoll/usrchtst/TestBasic");
2563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestNormExact, "tscoll/usrchtst/TestNormExact");
2564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestStrength, "tscoll/usrchtst/TestStrength");
2565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestBreakIterator, "tscoll/usrchtst/TestBreakIterator");
2566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestVariable, "tscoll/usrchtst/TestVariable");
2567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestOverlap, "tscoll/usrchtst/TestOverlap");
2568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestCollator, "tscoll/usrchtst/TestCollator");
2569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestPattern, "tscoll/usrchtst/TestPattern");
2570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestText, "tscoll/usrchtst/TestText");
2571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestCompositeBoundaries,
2572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  "tscoll/usrchtst/TestCompositeBoundaries");
2573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestGetSetOffset, "tscoll/usrchtst/TestGetSetOffset");
2574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestGetSetAttribute,
2575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      "tscoll/usrchtst/TestGetSetAttribute");
2576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestGetMatch, "tscoll/usrchtst/TestGetMatch");
2577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestSetMatch, "tscoll/usrchtst/TestSetMatch");
2578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestReset, "tscoll/usrchtst/TestReset");
2579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestSupplementary, "tscoll/usrchtst/TestSupplementary");
2580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestContraction, "tscoll/usrchtst/TestContraction");
2581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestIgnorable, "tscoll/usrchtst/TestIgnorable");
2582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestCanonical, "tscoll/usrchtst/TestCanonical");
2583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestNormCanonical, "tscoll/usrchtst/TestNormCanonical");
2584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestStrengthCanonical,
2585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "tscoll/usrchtst/TestStrengthCanonical");
2586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestBreakIteratorCanonical,
2587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               "tscoll/usrchtst/TestBreakIteratorCanonical");
2588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestVariableCanonical,
2589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "tscoll/usrchtst/TestVariableCanonical");
2590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestOverlapCanonical,
2591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "tscoll/usrchtst/TestOverlapCanonical");
2592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestCollatorCanonical,
2593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "tscoll/usrchtst/TestCollatorCanonical");
2594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestPatternCanonical,
2595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "tscoll/usrchtst/TestPatternCanonical");
2596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestTextCanonical, "tscoll/usrchtst/TestTextCanonical");
2597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestCompositeBoundariesCanonical,
2598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         "tscoll/usrchtst/TestCompositeBoundariesCanonical");
2599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestGetSetOffsetCanonical,
2600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                "tscoll/usrchtst/TestGetSetOffsetCanonical");
2601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestSupplementaryCanonical,
2602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               "tscoll/usrchtst/TestSupplementaryCanonical");
2603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestContractionCanonical,
2604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 "tscoll/usrchtst/TestContractionCanonical");
2605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestEnd, "tscoll/usrchtst/TestEnd");
2606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestNumeric, "tscoll/usrchtst/TestNumeric");
2607c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    addTest(root, &TestDiacriticMatch, "tscoll/usrchtst/TestDiacriticMatch");
2608c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    addTest(root, &TestForwardBackward, "tscoll/usrchtst/TestForwardBackward");
2609b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	addTest(root, &TestSearchForNull, "tscoll/usrchtst/TestSearchForNull");
2610b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    addTest(root, &TestStrengthIdentical, "tscoll/usrchtst/TestStrengthIdentical");
2611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_COLLATION */
2614