1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Copyright (c) 2001-2011 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    UErrorCode  status      = U_ZERO_ERROR;
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t matchindex  = search.offset[count];
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t     textlength;
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar       matchtext[128];
344b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t     matchlength;
345b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t     nextStart;
346b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool       isOverlap;
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
34850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    usearch_setAttribute(strsrch, USEARCH_ELEMENT_COMPARISON, search.elemCompare, &status);
34950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (U_FAILURE(status)) {
35050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_err("Error setting USEARCH_ELEMENT_COMPARISON attribute %s\n", u_errorName(status));
35150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return FALSE;
352b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
35350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getMatchedStart(strsrch) != USEARCH_DONE ||
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getMatchedLength(strsrch) != 0) {
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error with the initialization of match start and length\n");
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
358b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* start of next matches */
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (U_SUCCESS(status) && matchindex >= 0) {
360b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        matchlength = search.size[count];
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_next(strsrch, &status);
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (matchindex != usearch_getMatchedStart(strsrch) ||
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char *str = toCharString(usearch_getText(strsrch, &textlength));
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Text: %s\n", str);
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = toCharString(usearch_getPattern(strsrch, &textlength));
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Pattern: %s\n", str);
368b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("Error next match found at idx %d (len:%d); expected %d (len:%d)\n",
36950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    usearch_getMatchedStart(strsrch), usearch_getMatchedLength(strsrch),
37050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    matchindex, matchlength);
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return FALSE;
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (int32_t) matchlength || U_FAILURE(status) ||
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            memcmp(matchtext,
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   usearch_getText(strsrch, &textlength) + matchindex,
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   matchlength * sizeof(UChar)) != 0) {
380b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("Error getting next matched text\n");
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        matchindex = search.offset[count];
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_next(strsrch, &status);
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getMatchedStart(strsrch) != USEARCH_DONE ||
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getMatchedLength(strsrch) != 0) {
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char *str = toCharString(usearch_getText(strsrch, &textlength));
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Text: %s\n", str);
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        str = toCharString(usearch_getPattern(strsrch, &textlength));
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Pattern: %s\n", str);
392b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err("Error next match found at %d (len:%d); expected <NO MATCH>\n",
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    usearch_getMatchedStart(strsrch),
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    usearch_getMatchedLength(strsrch));
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
397b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* start of previous matches */
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = count == 0 ? 0 : count - 1;
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    matchindex = search.offset[count];
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (U_SUCCESS(status) && matchindex >= 0) {
402b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        matchlength = search.size[count];
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_previous(strsrch, &status);
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (matchindex != usearch_getMatchedStart(strsrch) ||
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char *str = toCharString(usearch_getText(strsrch, &textlength));
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Text: %s\n", str);
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = toCharString(usearch_getPattern(strsrch, &textlength));
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Pattern: %s\n", str);
410b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("Error previous match found at %d (len:%d); expected %d (len:%d)\n",
411b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    usearch_getMatchedStart(strsrch), usearch_getMatchedLength(strsrch),
412b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    matchindex, matchlength);
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return FALSE;
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (int32_t) matchlength || U_FAILURE(status) ||
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            memcmp(matchtext,
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   usearch_getText(strsrch, &textlength) + matchindex,
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   matchlength * sizeof(UChar)) != 0) {
421b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("Error getting previous matched text\n");
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        matchindex = count > 0 ? search.offset[count - 1] : -1;
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count --;
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_previous(strsrch, &status);
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getMatchedStart(strsrch) != USEARCH_DONE ||
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getMatchedLength(strsrch) != 0) {
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char *str = toCharString(usearch_getText(strsrch, &textlength));
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Text: %s\n", str);
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        str = toCharString(usearch_getPattern(strsrch, &textlength));
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Pattern: %s\n", str);
434b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err("Error previous match found at %d (len:%d); expected <NO MATCH>\n",
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    usearch_getMatchedStart(strsrch),
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    usearch_getMatchedLength(strsrch));
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
440b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
441b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    isOverlap = (usearch_getAttribute(strsrch, USEARCH_OVERLAP) == USEARCH_ON);
442b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
443b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* start of following matches */
444b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    count = 0;
445b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    matchindex  = search.offset[count];
446b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    nextStart = 0;
447b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
448b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    while (TRUE) {
449b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        usearch_following(strsrch, nextStart, &status);
450b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
451b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (matchindex < 0) {
452b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (usearch_getMatchedStart(strsrch) != USEARCH_DONE || usearch_getMatchedLength(strsrch) != 0) {
453b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                char *str = toCharString(usearch_getText(strsrch, &textlength));
454b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_err("Text: %s\n", str);
455b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                str = toCharString(usearch_getPattern(strsrch, &textlength));
456b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_err("Pattern: %s\n", str);
457b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_err("Error following match starting at %d (overlap:%d) found at %d (len:%d); expected <NO MATCH>\n",
458b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            nextStart, isOverlap,
459b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            usearch_getMatchedStart(strsrch),
460b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            usearch_getMatchedLength(strsrch));
461b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                return FALSE;
462b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
463b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            /* no more matches */
464b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            break;
465b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
466b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
467b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        matchlength = search.size[count];
468b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (usearch_getMatchedStart(strsrch) != matchindex
469b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                || usearch_getMatchedLength(strsrch) != matchlength
470b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                || U_FAILURE(status)) {
471b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            char *str = toCharString(usearch_getText(strsrch, &textlength));
472b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("Text: %s\n", str);
473b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            str = toCharString(usearch_getPattern(strsrch, &textlength));
474b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("Pattern: %s\n", str);
475b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("Error following match starting at %d (overlap: %d) found at %d (len:%d); expected %d (len:%d)\n",
476b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        nextStart, isOverlap,
477b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        usearch_getMatchedStart(strsrch), usearch_getMatchedLength(strsrch),
478b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        matchindex, matchlength);
479b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return FALSE;
480b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
481b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
482b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (isOverlap || usearch_getMatchedLength(strsrch) == 0) {
483b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            nextStart = usearch_getMatchedStart(strsrch) + 1;
484b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else {
485b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            nextStart = usearch_getMatchedStart(strsrch) + usearch_getMatchedLength(strsrch);
486b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
487b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
488b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        count++;
489b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        matchindex = search.offset[count];
490b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
491b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
492b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* start of preceding matches */
493b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    count = -1; /* last non-negative offset index, could be -1 if no match */
494b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    while (search.offset[count + 1] >= 0) {
495b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        count++;
496b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
497b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    usearch_getText(strsrch, &nextStart);
498b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
499b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    while (TRUE) {
500b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        usearch_preceding(strsrch, nextStart, &status);
501b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
502b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (count < 0) {
503b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (usearch_getMatchedStart(strsrch) != USEARCH_DONE || usearch_getMatchedLength(strsrch) != 0) {
504b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                char *str = toCharString(usearch_getText(strsrch, &textlength));
505b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_err("Text: %s\n", str);
506b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                str = toCharString(usearch_getPattern(strsrch, &textlength));
507b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_err("Pattern: %s\n", str);
508b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_err("Error preceding match starting at %d (overlap: %d) found at %d (len:%d); expected <NO MATCH>\n",
509b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            nextStart, isOverlap,
510b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            usearch_getMatchedStart(strsrch),
511b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            usearch_getMatchedLength(strsrch));
512b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                return FALSE;
513b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
514b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            /* no more matches */
515b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            break;
516b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
517b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
518b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        matchindex = search.offset[count];
519b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        matchlength = search.size[count];
520b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (usearch_getMatchedStart(strsrch) != matchindex
521b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                || usearch_getMatchedLength(strsrch) != matchlength
522b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                || U_FAILURE(status)) {
523b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            char *str = toCharString(usearch_getText(strsrch, &textlength));
524b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("Text: %s\n", str);
525b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            str = toCharString(usearch_getPattern(strsrch, &textlength));
526b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("Pattern: %s\n", str);
527b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("Error preceding match starting at %d (overlap: %d) found at %d (len:%d); expected %d (len:%d)\n",
528b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        nextStart, isOverlap,
529b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        usearch_getMatchedStart(strsrch), usearch_getMatchedLength(strsrch),
530b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        matchindex, matchlength);
531b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return FALSE;
532b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
533b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
534b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        nextStart = matchindex;
535b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        count--;
536b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
537b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
53850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    usearch_setAttribute(strsrch, USEARCH_ELEMENT_COMPARISON, USEARCH_STANDARD_ELEMENT_COMPARISON, &status);
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool assertEqual(const SearchData search)
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode      status      = U_ZERO_ERROR;
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           pattern[32];
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           text[128];
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator      *collator = getCollator(search.collator);
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBreakIterator *breaker  = getBreakIterator(search.breaker);
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch  *strsrch;
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK_BREAK_BOOL(search.breaker);
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search.text, text, 128);
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search.pattern, pattern, 32);
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(collator, search.strength);
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       breaker, &status);
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, search)) {
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setStrength(collator, UCOL_TERTIARY);
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(collator, UCOL_TERTIARY);
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool assertCanonicalEqual(const SearchData search)
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode      status      = U_ZERO_ERROR;
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           pattern[32];
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           text[128];
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator      *collator = getCollator(search.collator);
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBreakIterator *breaker  = getBreakIterator(search.breaker);
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch  *strsrch;
581c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UBool           result = TRUE;
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK_BREAK_BOOL(search.breaker);
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search.text, text, 128);
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search.pattern, pattern, 32);
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(collator, search.strength);
587c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
5896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                                       breaker, &status);
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
594c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        result = FALSE;
595c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        goto bail;
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, search)) {
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setStrength(collator, UCOL_TERTIARY);
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
601c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        result = FALSE;
602c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        goto bail;
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
604c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
605c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querubail:
606c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status);
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(collator, UCOL_TERTIARY);
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
609c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    return result;
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool assertEqualWithAttribute(const SearchData            search,
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                            USearchAttributeValue canonical,
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                            USearchAttributeValue overlap)
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode      status      = U_ZERO_ERROR;
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           pattern[32];
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           text[128];
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator      *collator = getCollator(search.collator);
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBreakIterator *breaker  = getBreakIterator(search.breaker);
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch  *strsrch;
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK_BREAK_BOOL(search.breaker);
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search.text, text, 128);
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search.pattern, pattern, 32);
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(collator, search.strength);
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       breaker, &status);
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, canonical,
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_OVERLAP, overlap, &status);
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, search)) {
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucol_setStrength(collator, UCOL_TERTIARY);
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return FALSE;
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(collator, UCOL_TERTIARY);
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBasic(void)
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
6516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
6526d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
6536d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
6546d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
6556d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
6566d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (BASIC[count].text != NULL) {
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(BASIC[count])) {
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNormExact(void)
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
6706d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
6716d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
6726d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
6736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
6746d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(EN_US_, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting collation normalization %s\n",
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(status));
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (BASIC[count].text != NULL) {
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(BASIC[count])) {
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (NORMEXACT[count].text != NULL) {
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(NORMEXACT[count])) {
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(EN_US_, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status);
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (NONNORMEXACT[count].text != NULL) {
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(NONNORMEXACT[count])) {
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestStrength(void)
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
7076d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
7086d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
7096d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
7106d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
7116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
7126d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (STRENGTH[count].text != NULL) {
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(STRENGTH[count])) {
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBreakIterator(void) {
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode      status      = U_ZERO_ERROR;
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch  *strsrch;
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           text[128];
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           pattern[32];
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int             count = 0;
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK_BREAK("x");
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
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    if (usearch_getBreakIterator(NULL) != NULL) {
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Expected NULL breakiterator from NULL string search\n");
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(BREAKITERATOREXACT[0].text, text, 128);
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(BREAKITERATOREXACT[0].pattern, pattern, 32);
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_, NULL,
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       &status);
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTBREAKITERATOR;
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setBreakIterator(strsrch, NULL, &status);
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || usearch_getBreakIterator(strsrch) != NULL) {
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error usearch_getBreakIterator returned wrong object");
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTBREAKITERATOR;
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setBreakIterator(strsrch, EN_CHARACTERBREAKER_, &status);
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getBreakIterator(strsrch) != EN_CHARACTERBREAKER_) {
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error usearch_getBreakIterator returned wrong object");
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTBREAKITERATOR;
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setBreakIterator(strsrch, EN_WORDBREAKER_, &status);
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getBreakIterator(strsrch) != EN_WORDBREAKER_) {
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error usearch_getBreakIterator returned wrong object");
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTBREAKITERATOR;
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (count < 4) {
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* 0-3 test are fixed */
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const SearchData     *search   = &(BREAKITERATOREXACT[count]);
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UCollator      *collator = getCollator(search->collator);
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UBreakIterator *breaker  = getBreakIterator(search->breaker);
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->text, text, 128);
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->pattern, pattern, 32);
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setStrength(collator, search->strength);
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                           breaker, &status);
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getBreakIterator(strsrch) != breaker) {
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error setting break iterator\n");
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (strsrch != NULL) {
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                usearch_close(strsrch);
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, *search)) {
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucol_setStrength(collator, UCOL_TERTIARY);
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            goto ENDTESTBREAKITERATOR;
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        search   = &(BREAKITERATOREXACT[count + 1]);
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        breaker  = getBreakIterator(search->breaker);
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setBreakIterator(strsrch, breaker, &status);
799c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (U_FAILURE(status) || usearch_getBreakIterator(strsrch) != breaker) {
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error setting break iterator\n");
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            goto ENDTESTBREAKITERATOR;
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_reset(strsrch);
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, *search)) {
806c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
807c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            usearch_close(strsrch);
808c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            goto ENDTESTBREAKITERATOR;
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count += 2;
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (BREAKITERATOREXACT[count].text != NULL) {
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         if (!assertEqual(BREAKITERATOREXACT[count])) {
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             log_err("Error at test number %d\n", count);
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             goto ENDTESTBREAKITERATOR;
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         }
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         count ++;
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruENDTESTBREAKITERATOR:
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestVariable(void)
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
8316d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
8326d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
8336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
8346d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
8356d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(EN_US_, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status);
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting collation alternate attribute %s\n",
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(status));
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (VARIABLE[count].text != NULL) {
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("variable %d\n", count);
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(VARIABLE[count])) {
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(EN_US_, UCOL_ALTERNATE_HANDLING,
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      UCOL_NON_IGNORABLE, &status);
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestOverlap(void)
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
8566d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
8576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
8586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
8596d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
8606d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
8616d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (OVERLAP[count].text != NULL) {
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithAttribute(OVERLAP[count], USEARCH_OFF,
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      USEARCH_ON)) {
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at overlap test number %d\n", count);
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (NONOVERLAP[count].text != NULL) {
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(NONOVERLAP[count])) {
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at non overlap test number %d\n", count);
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (count < 1) {
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UChar           pattern[32];
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UChar           text[128];
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const SearchData     *search   = &(OVERLAP[count]);
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UCollator      *collator = getCollator(search->collator);
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UStringSearch  *strsrch;
8846d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru              status   = U_ZERO_ERROR;
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->text, text, 128);
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->pattern, pattern, 32);
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                           NULL, &status);
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status == U_FILE_ACCESS_ERROR) {
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_data_err("Is your data around?\n");
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return;
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if(U_FAILURE(status)) {
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_err("Error opening searcher\n");
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return;
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_ON, &status);
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_ON) {
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error setting overlap option\n");
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, *search)) {
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        search   = &(NONOVERLAP[count]);
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_OFF, &status);
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF) {
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error setting overlap option\n");
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_reset(strsrch);
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, *search)) {
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         }
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCollator(void)
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test collator that thinks "o" and "p" are the same thing */
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          rules[32];
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UCollator     *tailored = NULL;
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UErrorCode     status   = U_ZERO_ERROR;
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          pattern[32];
931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          text[128];
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UStringSearch *strsrch;
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text[0] = 0x41;
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text[1] = 0x42;
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text[2] = 0x43;
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text[3] = 0x44;
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text[4] = 0x45;
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern[0] = 0x62;
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern[1] = 0x63;
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch  = usearch_open(pattern, 2, text, 5, "en_US",  NULL,  &status);
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status == U_FILE_ACCESS_ERROR) {
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_data_err("Is your data around?\n");
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(U_FAILURE(status)) {
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("Error opening searcher\n");
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tailored = usearch_getCollator(strsrch);
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_next(strsrch, &status) != -1) {
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: Found case insensitive match, when we shouldn't\n");
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(tailored, UCOL_PRIMARY);
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_reset(strsrch);
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_next(strsrch, &status) != 1) {
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: Found case insensitive match not found\n");
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
9606d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getCollator(NULL) != NULL) {
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Expected NULL collator from NULL string search\n");
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(COLLATOR[0].text, text, 128);
966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(COLLATOR[0].pattern, pattern, 32);
967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       NULL, &status);
970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, COLLATOR[0])) {
974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTCOLLATOR;
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TESTCOLLATORRULE, rules, 32);
978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tailored = ucol_openRules(rules, -1, UCOL_ON, COLLATOR[1].strength,
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              NULL, &status);
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening rule based collator %s\n", u_errorName(status));
982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setCollator(strsrch, tailored, &status);
985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || usearch_getCollator(strsrch) != tailored) {
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting rule based collator\n");
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_reset(strsrch);
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, COLLATOR[1])) {
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTCOLLATOR;
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setCollator(strsrch, EN_US_, &status);
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_reset(strsrch);
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || usearch_getCollator(strsrch) != EN_US_) {
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting rule based collator\n");
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, COLLATOR[0])) {
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTCOLLATOR;
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruENDTESTCOLLATOR:
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tailored != NULL) {
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(tailored);
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestPattern(void)
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UStringSearch *strsrch;
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          pattern[32];
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          bigpattern[512];
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          text[128];
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar         *temp;
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          int32_t        templength;
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UErrorCode     status = U_ZERO_ERROR;
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
10206d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
10216d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
10226d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
10236d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
10246d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getPattern(NULL, &templength) != NULL) {
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error NULL string search expected returning NULL pattern\n");
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setPattern(NULL, pattern, 3, &status);
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error expected setting pattern in NULL strings search\n");
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERN[0].text, text, 128);
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERN[0].pattern, pattern, 32);
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(EN_US_, PATTERN[0].strength);
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       NULL, &status);
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status == U_FILE_ACCESS_ERROR) {
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_data_err("Is your data around?\n");
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(U_FAILURE(status)) {
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("Error opening searcher\n");
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setPattern(strsrch, NULL, 3, &status);
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error expected setting NULL pattern in strings search\n");
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setPattern(strsrch, pattern, 0, &status);
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error expected setting pattern with length 0 in strings search\n");
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getPattern(strsrch, &templength);
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(pattern, temp) != 0) {
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern\n");
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, PATTERN[0])) {
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERN[1].pattern, pattern, 32);
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setPattern(strsrch, pattern, -1, &status);
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getPattern(strsrch, &templength);
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(pattern, temp) != 0) {
1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern\n");
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_reset(strsrch);
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern %s\n", u_errorName(status));
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, PATTERN[1])) {
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERN[0].pattern, pattern, 32);
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setPattern(strsrch, pattern, -1, &status);
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getPattern(strsrch, &templength);
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(pattern, temp) != 0) {
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern\n");
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_reset(strsrch);
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern %s\n", u_errorName(status));
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, PATTERN[0])) {
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* enormous pattern size to see if this crashes */
1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (templength = 0; templength != 512; templength ++) {
1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        bigpattern[templength] = 0x61;
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bigpattern[511] = 0;
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setPattern(strsrch, bigpattern, -1, &status);
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern with size 512, %s \n",
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(status));
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruENDTESTPATTERN:
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(EN_US_, UCOL_TERTIARY);
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strsrch != NULL) {
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestText(void)
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UStringSearch *strsrch;
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          pattern[32];
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          text[128];
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar         *temp;
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          int32_t        templength;
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UErrorCode     status = U_ZERO_ERROR;
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXT[0].text, text, 128);
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXT[0].pattern, pattern, 32);
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
11296d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
11306d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
11316d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
11326d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
11336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getText(NULL, &templength) != NULL) {
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error NULL string search should return NULL text\n");
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setText(NULL, text, 10, &status);
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error NULL string search should have an error when setting text\n");
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       NULL, &status);
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getText(strsrch, &templength);
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(text, temp) != 0) {
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting text\n");
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, TEXT[0])) {
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXT[1].text, text, 32);
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setText(strsrch, text, -1, &status);
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getText(strsrch, &templength);
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(text, temp) != 0) {
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting text\n");
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting text %s\n", u_errorName(status));
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, TEXT[1])) {
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXT[0].text, text, 32);
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setText(strsrch, text, -1, &status);
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getText(strsrch, &templength);
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(text, temp) != 0) {
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting text\n");
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern %s\n", u_errorName(status));
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, TEXT[0])) {
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruENDTESTPATTERN:
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strsrch != NULL) {
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCompositeBoundaries(void)
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
11976d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
11986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
11996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
12006d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
12016d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
12026d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (COMPOSITEBOUNDARIES[count].text != NULL) {
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("composite %d\n", count);
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(COMPOSITEBOUNDARIES[count])) {
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestGetSetOffset(void)
1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
121550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int            searchDataIndex   = 0;
1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          pattern[32];
1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          text[128];
1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status  = U_ZERO_ERROR;
1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch *strsrch;
1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(pattern, 0, 32*sizeof(UChar));
1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(text, 0, 128*sizeof(UChar));
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
12236d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
12246d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
12256d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
12266d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
12276d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getOffset(NULL) != USEARCH_DONE) {
1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("usearch_getOffset(NULL) expected USEARCH_DONE\n");
1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, 16, text, 32, EN_US_, NULL,
1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       &status);
1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* testing out of bounds error */
1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setOffset(strsrch, -1, &status);
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error expecting set offset error\n");
1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setOffset(strsrch, 128, &status);
1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error expecting set offset error\n");
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
124250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    while (BASIC[searchDataIndex].text != NULL) {
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int         count       = 0;
124450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        SearchData  search      = BASIC[searchDataIndex ++];
1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t matchindex  = search.offset[count];
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t     textlength;
1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.text, text, 128);
1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.pattern, pattern, 32);
1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setText(strsrch, text, -1, &status);
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setPattern(strsrch, pattern, -1, &status);
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setStrength(usearch_getCollator(strsrch), search.strength);
1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_reset(strsrch);
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while (U_SUCCESS(status) && matchindex >= 0) {
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uint32_t matchlength = search.size[count];
1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_next(strsrch, &status);
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (matchindex != usearch_getMatchedStart(strsrch) ||
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                char *str = toCharString(usearch_getText(strsrch,
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                         &textlength));
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Text: %s\n", str);
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                str = toCharString(usearch_getPattern(strsrch, &textlength));
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Pattern: %s\n", str);
1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Error match found at %d %d\n",
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        usearch_getMatchedStart(strsrch),
1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        usearch_getMatchedLength(strsrch));
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return;
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_setOffset(strsrch, matchindex + matchlength, &status);
1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_previous(strsrch, &status);
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (matchindex != usearch_getMatchedStart(strsrch) ||
1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                char *str = toCharString(usearch_getText(strsrch,
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                         &textlength));
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Text: %s\n", str);
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                str = toCharString(usearch_getPattern(strsrch, &textlength));
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Pattern: %s\n", str);
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Error match found at %d %d\n",
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        usearch_getMatchedStart(strsrch),
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        usearch_getMatchedLength(strsrch));
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return;
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_setOffset(strsrch, matchindex + matchlength, &status);
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            matchindex = search.offset[count + 1] == -1 ? -1 :
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         search.offset[count + 2];
1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (search.offset[count + 1] != -1) {
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                usearch_setOffset(strsrch, search.offset[count + 1] + 1,
1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  &status);
1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (usearch_getOffset(strsrch) != search.offset[count + 1] + 1) {
1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("Error setting offset\n");
1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    return;
1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            count += 2;
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_next(strsrch, &status);
1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getMatchedStart(strsrch) != USEARCH_DONE) {
1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char *str = toCharString(usearch_getText(strsrch, &textlength));
1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Text: %s\n", str);
1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = toCharString(usearch_getPattern(strsrch, &textlength));
1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Pattern: %s\n", str);
1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error match found at %d %d\n",
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        usearch_getMatchedStart(strsrch),
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        usearch_getMatchedLength(strsrch));
1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(usearch_getCollator(strsrch), UCOL_TERTIARY);
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestGetSetAttribute(void)
1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode      status    = U_ZERO_ERROR;
1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           pattern[32];
1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           text[128];
1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch  *strsrch;
1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(pattern, 0, 32*sizeof(UChar));
1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(text, 0, 128*sizeof(UChar));
1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
13256d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
13266d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
13276d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
13286d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
13296d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getAttribute(NULL, USEARCH_OVERLAP) != USEARCH_DEFAULT ||
1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getAttribute(NULL, USEARCH_CANONICAL_MATCH) !=
1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                         USEARCH_DEFAULT) {
1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err(
1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "Attributes for NULL string search should be USEARCH_DEFAULT\n");
1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, 16, text, 32, EN_US_, NULL,
1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       &status);
1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening search %s\n", u_errorName(status));
1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_DEFAULT, &status);
1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF) {
1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting overlap to the default\n");
1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_ON, &status);
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_ON) {
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting overlap true\n");
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_OFF, &status);
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF) {
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting overlap false\n");
1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_OVERLAP,
1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         USEARCH_ATTRIBUTE_VALUE_COUNT, &status);
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting overlap to illegal value\n");
1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_DEFAULT,
1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getAttribute(strsrch, USEARCH_CANONICAL_MATCH) !=
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                        USEARCH_OFF) {
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting canonical match to the default\n");
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getAttribute(strsrch, USEARCH_CANONICAL_MATCH) !=
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                         USEARCH_ON) {
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting canonical match true\n");
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_OFF,
1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getAttribute(strsrch, USEARCH_CANONICAL_MATCH) !=
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                        USEARCH_OFF) {
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting canonical match false\n");
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH,
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         USEARCH_ATTRIBUTE_VALUE_COUNT, &status);
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting canonical match to illegal value\n");
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_ATTRIBUTE_COUNT, USEARCH_DEFAULT,
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting illegal attribute success\n");
1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestGetMatch(void)
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int            count       = 0;
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status      = U_ZERO_ERROR;
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          text[128];
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          pattern[32];
1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SearchData     search      = MATCH[0];
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t    matchindex  = search.offset[count];
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch *strsrch;
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t        textlength;
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          matchtext[128];
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
14136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
14146d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
14156d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
14166d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
14176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getMatchedStart(NULL) != USEARCH_DONE ||
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getMatchedLength(NULL) != USEARCH_DONE) {
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err(
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   "Expected start and length of NULL string search should be USEARCH_DONE\n");
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search.text, text, 128);
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search.pattern, pattern, 32);
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       NULL, &status);
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strsrch != NULL) {
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (U_SUCCESS(status) && matchindex >= 0) {
1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t matchlength = search.size[count];
1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_next(strsrch, &status);
1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (matchindex != usearch_getMatchedStart(strsrch) ||
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            matchlength != usearch_getMatchedLength(strsrch)) {
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char *str = toCharString(usearch_getText(strsrch, &textlength));
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Text: %s\n", str);
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = toCharString(usearch_getPattern(strsrch, &textlength));
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Pattern: %s\n", str);
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error match found at %d %d\n",
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    usearch_getMatchedStart(strsrch),
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    usearch_getMatchedLength(strsrch));
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getMatchedText(NULL, matchtext, 128, &status) !=
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            USEARCH_DONE || U_SUCCESS(status)){
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error expecting errors with NULL string search\n");
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getMatchedText(strsrch, NULL, 0, &status) !=
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (int32_t)matchlength || U_SUCCESS(status)){
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error pre-flighting match length\n");
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getMatchedText(strsrch, matchtext, 0, &status) !=
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (int32_t)matchlength || U_SUCCESS(status)){
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error getting match text with buffer size 0\n");
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getMatchedText(strsrch, matchtext, matchlength, &status)
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            != (int32_t)matchlength || matchtext[matchlength - 1] == 0 ||
1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            U_FAILURE(status)){
1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error getting match text with exact size\n");
1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (int32_t) matchlength || U_FAILURE(status) ||
1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            memcmp(matchtext,
1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   usearch_getText(strsrch, &textlength) + matchindex,
1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   matchlength * sizeof(UChar)) != 0 ||
1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            matchtext[matchlength] != 0) {
1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error getting matched text\n");
1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        matchindex = search.offset[count];
1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_next(strsrch, &status);
1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getMatchedStart(strsrch)  != USEARCH_DONE ||
1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_getMatchedLength(strsrch) != 0) {
1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error end of match not found\n");
1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        USEARCH_DONE) {
1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error getting null matches\n");
1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSetMatch(void)
1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int            count       = 0;
15046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
15056d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
15066d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
15076d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
15086d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
15096d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (MATCH[count].text != NULL) {
1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        SearchData     search = MATCH[count];
1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int            size   = 0;
151350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        int            offsetIndex = 0;
1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar          text[128];
1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar          pattern[32];
1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UStringSearch *strsrch;
15176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        status = U_ZERO_ERROR;
1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_first(NULL, &status) != USEARCH_DONE ||
1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_last(NULL, &status) != USEARCH_DONE) {
1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error getting the first and last match of a NULL string search\n");
1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.text, text, 128);
1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.pattern, pattern, 32);
1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                           NULL, &status);
1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error opening string search %s\n", u_errorName(status));
1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (strsrch != NULL) {
1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                usearch_close(strsrch);
1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        size = 0;
1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while (search.offset[size] != -1) {
1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            size ++;
1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_first(strsrch, &status) != search.offset[0] ||
1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            U_FAILURE(status)) {
1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error getting first match\n");
1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_last(strsrch, &status) != search.offset[size -1] ||
1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            U_FAILURE(status)) {
1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error getting last match\n");
1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
154950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        while (offsetIndex < size) {
155050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (offsetIndex + 2 < size) {
155150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                if (usearch_following(strsrch, search.offset[offsetIndex + 2] - 1,
155250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                      &status) != search.offset[offsetIndex + 2] ||
1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    U_FAILURE(status)) {
1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("Error getting following match at index %d\n",
155550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                            search.offset[offsetIndex + 2] - 1);
1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
155850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (offsetIndex + 1 < size) {
155950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                if (usearch_preceding(strsrch, search.offset[offsetIndex + 1] +
156050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                               search.size[offsetIndex + 1] + 1,
156150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                      &status) != search.offset[offsetIndex + 1] ||
1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    U_FAILURE(status)) {
1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("Error getting preceeding match at index %d\n",
156450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                            search.offset[offsetIndex + 1] + 1);
1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
156750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            offsetIndex += 2;
1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_following(strsrch, u_strlen(text), &status) !=
1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            USEARCH_DONE) {
1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error expecting out of bounds match\n");
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_preceding(strsrch, 0, &status) != USEARCH_DONE) {
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error expecting out of bounds match\n");
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestReset(void)
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status    = U_ZERO_ERROR;
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          text[]    = {0x66, 0x69, 0x73, 0x68, 0x20,
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                0x66, 0x69, 0x73, 0x68};
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          pattern[] = {0x73};
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch *strsrch;
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
15916d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
15926d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
15936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
15946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
15956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, 1, text, 9,
1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                      EN_US_, NULL, &status);
1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strsrch != NULL) {
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_ON, &status);
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setOffset(strsrch, 9, &status);
1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting attributes and offsets\n");
1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_reset(strsrch);
1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF ||
1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getAttribute(strsrch, USEARCH_CANONICAL_MATCH) !=
1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 USEARCH_OFF ||
1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getOffset(strsrch) != 0 ||
1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getMatchedLength(strsrch) != 0 ||
1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getMatchedStart(strsrch) != USEARCH_DONE) {
1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error resetting string search\n");
1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_previous(strsrch, &status);
1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getMatchedStart(strsrch) != 7 ||
1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getMatchedLength(strsrch) != 1) {
1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error resetting string search\n");
1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSupplementary(void)
1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
16356d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
16366d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
16376d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
16386d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
16396d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
16406d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (SUPPLEMENTARY[count].text != NULL) {
1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(SUPPLEMENTARY[count])) {
1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestContraction(void)
1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          rules[128];
1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          pattern[128];
1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          text[128];
1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator     *collator;
1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status = U_ZERO_ERROR;
1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int            count = 0;
1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch *strsrch;
1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(rules, 0, 128*sizeof(UChar));
1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(pattern, 0, 128*sizeof(UChar));
1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(text, 0, 128*sizeof(UChar));
1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(CONTRACTIONRULE, rules, 128);
1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    collator = ucol_openRules(rules, u_strlen(rules), UCOL_ON,
1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              UCOL_TERTIARY, NULL, &status);
1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status == U_FILE_ACCESS_ERROR) {
1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_data_err("Is your data around?\n");
1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(U_FAILURE(status)) {
1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("Error opening collator %s\n", u_errorName(status));
1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, 1, text, 1, collator, NULL,
1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       &status);
1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (CONTRACTION[count].text != NULL) {
1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(CONTRACTION[count].text, text, 128);
1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(CONTRACTION[count].pattern, pattern, 128);
1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setText(strsrch, text, -1, &status);
1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setPattern(strsrch, pattern, -1, &status);
1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, CONTRACTION[count])) {
1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(collator);
1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestIgnorable(void)
1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          rules[128];
1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          pattern[128];
1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          text[128];
1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator     *collator;
1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status = U_ZERO_ERROR;
1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch *strsrch;
1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t       count = 0;
1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(rules, 0, 128*sizeof(UChar));
1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(pattern, 0, 128*sizeof(UChar));
1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(text, 0, 128*sizeof(UChar));
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(IGNORABLERULE, rules, 128);
1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    collator = ucol_openRules(rules, u_strlen(rules), UCOL_ON,
1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              IGNORABLE[count].strength, NULL, &status);
1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status == U_FILE_ACCESS_ERROR) {
1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_data_err("Is your data around?\n");
1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(U_FAILURE(status)) {
1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening collator %s\n", u_errorName(status));
1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, 1, text, 1, collator, NULL,
1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       &status);
1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (IGNORABLE[count].text != NULL) {
1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(IGNORABLE[count].text, text, 128);
1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(IGNORABLE[count].pattern, pattern, 128);
1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setText(strsrch, text, -1, &status);
1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setPattern(strsrch, pattern, -1, &status);
1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, IGNORABLE[count])) {
1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(collator);
1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1737c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic void TestDiacriticMatch(void)
1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          pattern[128];
1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          text[128];
1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status = U_ZERO_ERROR;
1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch *strsrch = NULL;
1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator *coll = NULL;
1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t       count = 0;
1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SearchData search;
1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(pattern, 0, 128*sizeof(UChar));
1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(text, 0, 128*sizeof(UChar));
1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_open(pattern, 1, text, 1, uloc_getDefault(), NULL, &status);
1751b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(status)) {
17526d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Error opening string search %s\n", u_errorName(status));
1753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1756c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    search = DIACRITICMATCH[count];
1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (search.text != NULL) {
1758b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (search.collator != NULL) {
1759b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            coll = ucol_openFromShortString(search.collator, FALSE, NULL, &status);
1760b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else {
1761c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            /* Always use "en_US" because some of these tests fail in Danish locales. */
1762b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            coll = ucol_open("en_US"/*uloc_getDefault()*/, &status);
1763b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            ucol_setStrength(coll, search.strength);
1764b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1765b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (U_FAILURE(status)) {
1766b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("Error opening string search collator(\"%s\") %s\n", search.collator, u_errorName(status));
1767b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return;
1768b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1769b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1770b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        usearch_setCollator(strsrch, coll, &status);
1771b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (U_FAILURE(status)) {
1772b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("Error setting string search collator %s\n", u_errorName(status));
1773b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return;
1774b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.text, text, 128);
1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.pattern, pattern, 128);
1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setText(strsrch, text, -1, &status);
1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setPattern(strsrch, pattern, -1, &status);
1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, search)) {
1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(coll);
1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1785c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        search = DIACRITICMATCH[++count];
1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCanonical(void)
1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
17936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
17946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
17956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
17966d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
17976d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
17986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (BASICCANONICAL[count].text != NULL) {
1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(BASICCANONICAL[count])) {
1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNormCanonical(void)
1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
18126d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
18136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
18146d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
18156d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
18166d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(EN_US_, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (NORMCANONICAL[count].text != NULL) {
1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(NORMCANONICAL[count])) {
1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(EN_US_, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status);
1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestStrengthCanonical(void)
1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
18326d5deb12725f146643d443090dfa11b206df528aJean-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    while (STRENGTHCANONICAL[count].text != NULL) {
1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(STRENGTHCANONICAL[count])) {
1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBreakIteratorCanonical(void) {
1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode      status      = U_ZERO_ERROR;
1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int             count = 0;
1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK_BREAK("x");
1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
18556d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
18566d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
18576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
18586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
18596d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (count < 4) {
1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* 0-3 test are fixed */
1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UChar           pattern[32];
1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UChar           text[128];
1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const SearchData     *search   = &(BREAKITERATORCANONICAL[count]);
1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UCollator      *collator = getCollator(search->collator);
1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UBreakIterator *breaker  = getBreakIterator(search->breaker);
1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UStringSearch  *strsrch;
1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->text, text, 128);
1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->pattern, pattern, 32);
1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_setStrength(collator, search->strength);
1872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                           breaker, &status);
1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status == U_FILE_ACCESS_ERROR) {
1876c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_data_err("Is your data around?\n");
1877c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            goto ENDTESTBREAKITERATOR;
1878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if(U_FAILURE(status)) {
1879c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_err("Error opening searcher\n");
1880c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            goto ENDTESTBREAKITERATOR;
1881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             &status);
1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
1885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getBreakIterator(strsrch) != breaker) {
1886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error setting break iterator\n");
1887c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            usearch_close(strsrch);
1888c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            goto ENDTESTBREAKITERATOR;
1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, *search)) {
1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucol_setStrength(collator, UCOL_TERTIARY);
1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            goto ENDTESTBREAKITERATOR;
1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        search   = &(BREAKITERATOREXACT[count + 1]);
1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        breaker  = getBreakIterator(search->breaker);
1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setBreakIterator(strsrch, breaker, &status);
1898c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (U_FAILURE(status) || usearch_getBreakIterator(strsrch) != breaker) {
1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error setting break iterator\n");
1900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
1901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            goto ENDTESTBREAKITERATOR;
1902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_reset(strsrch);
1904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             &status);
1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, *search)) {
1907c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1908c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            usearch_close(strsrch);
1909c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            goto ENDTESTBREAKITERATOR;
1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
1912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count += 2;
1913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
1915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (BREAKITERATORCANONICAL[count].text != NULL) {
1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         if (!assertEqual(BREAKITERATORCANONICAL[count])) {
1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             log_err("Error at test number %d\n", count);
1918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             goto ENDTESTBREAKITERATOR;
1919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         }
1920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         count ++;
1921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruENDTESTBREAKITERATOR:
1924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestVariableCanonical(void)
1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
19326d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
19336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
19346d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
19356d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
19366d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(EN_US_, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status);
1938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting collation alternate attribute %s\n",
1940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_errorName(status));
1941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (VARIABLE[count].text != NULL) {
1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("variable %d\n", count);
1944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(VARIABLE[count])) {
1945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
1946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(EN_US_, UCOL_ALTERNATE_HANDLING,
1950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      UCOL_NON_IGNORABLE, &status);
1951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
1952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestOverlapCanonical(void)
1955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
19576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
19586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
19596d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
19606d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
19616d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
19626d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (OVERLAPCANONICAL[count].text != NULL) {
1964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithAttribute(OVERLAPCANONICAL[count], USEARCH_ON,
1965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      USEARCH_ON)) {
1966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at overlap test number %d\n", count);
1967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
1971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (NONOVERLAP[count].text != NULL) {
1972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(NONOVERLAPCANONICAL[count])) {
1973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at non overlap test number %d\n", count);
1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
1979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (count < 1) {
1980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UChar           pattern[32];
1981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UChar           text[128];
1982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const SearchData     *search   = &(OVERLAPCANONICAL[count]);
1983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UCollator      *collator = getCollator(search->collator);
1984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UStringSearch  *strsrch;
19856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru              status   = U_ZERO_ERROR;
1986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->text, text, 128);
1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->pattern, pattern, 32);
1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                           NULL, &status);
1991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status == U_FILE_ACCESS_ERROR) {
1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_data_err("Is your data around?\n");
1993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return;
1994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if(U_FAILURE(status)) {
1995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_err("Error opening searcher\n");
1996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return;
1997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
1999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             &status);
2000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_ON, &status);
2001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
2002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_ON) {
2003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error setting overlap option\n");
2004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, *search)) {
2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        search   = &(NONOVERLAPCANONICAL[count]);
2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_OFF, &status);
2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF) {
2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error setting overlap option\n");
2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_reset(strsrch);
2016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch, *search)) {
2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
2019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         }
2020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
2022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCollatorCanonical(void)
2028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test collator that thinks "o" and "p" are the same thing */
2030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          rules[32];
2031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UCollator     *tailored = NULL;
2032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UErrorCode     status = U_ZERO_ERROR;
2033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          pattern[32];
2034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          text[128];
2035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UStringSearch *strsrch;
2036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20376d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
20386d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
20396d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
20406d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
20416d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
2042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(COLLATORCANONICAL[0].text, text, 128);
2043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(COLLATORCANONICAL[0].pattern, pattern, 32);
2044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
2046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       NULL, &status);
2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status == U_FILE_ACCESS_ERROR) {
2048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_data_err("Is your data around?\n");
2049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
2050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(U_FAILURE(status)) {
2051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("Error opening searcher\n");
2052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
2053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
2056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
2058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, COLLATORCANONICAL[0])) {
2060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTCOLLATOR;
2061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TESTCOLLATORRULE, rules, 32);
2064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tailored = ucol_openRules(rules, -1, UCOL_ON,
2065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              COLLATORCANONICAL[1].strength, NULL, &status);
2066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening rule based collator %s\n", u_errorName(status));
2068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setCollator(strsrch, tailored, &status);
2071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || usearch_getCollator(strsrch) != tailored) {
2072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting rule based collator\n");
2073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_reset(strsrch);
2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
2077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, COLLATORCANONICAL[1])) {
2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTCOLLATOR;
2079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setCollator(strsrch, EN_US_, &status);
2082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_reset(strsrch);
2083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
2085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || usearch_getCollator(strsrch) != EN_US_) {
2086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting rule based collator\n");
2087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, COLLATORCANONICAL[0])) {
2089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTCOLLATOR;
2090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruENDTESTCOLLATOR:
2093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
2094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tailored != NULL) {
2095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucol_close(tailored);
2096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
2098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestPatternCanonical(void)
2101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UStringSearch *strsrch;
2103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          pattern[32];
2104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          text[128];
2105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar         *temp;
2106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          int32_t        templength;
2107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UErrorCode     status = U_ZERO_ERROR;
2108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21096d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
21106d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
21116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
21126d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
21136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
2114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERNCANONICAL[0].text, text, 128);
2115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERNCANONICAL[0].pattern, pattern, 32);
2116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(EN_US_, PATTERNCANONICAL[0].strength);
2118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
2119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       NULL, &status);
2120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
2122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
2124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getPattern(strsrch, &templength);
2127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(pattern, temp) != 0) {
2128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern\n");
2129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, PATTERNCANONICAL[0])) {
2131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERNCANONICAL[1].pattern, pattern, 32);
2135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setPattern(strsrch, pattern, -1, &status);
2136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getPattern(strsrch, &templength);
2137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(pattern, temp) != 0) {
2138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern\n");
2139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_reset(strsrch);
2142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
2144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern %s\n", u_errorName(status));
2146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, PATTERNCANONICAL[1])) {
2148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERNCANONICAL[0].pattern, pattern, 32);
2152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setPattern(strsrch, pattern, -1, &status);
2153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getPattern(strsrch, &templength);
2154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(pattern, temp) != 0) {
2155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern\n");
2156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_reset(strsrch);
2159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
2161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern %s\n", u_errorName(status));
2163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, PATTERNCANONICAL[0])) {
2165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruENDTESTPATTERN:
2168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setStrength(EN_US_, UCOL_TERTIARY);
2169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strsrch != NULL) {
2170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
2171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
2173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestTextCanonical(void)
2176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UStringSearch *strsrch;
2178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          pattern[32];
2179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UChar          text[128];
2180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar         *temp;
2181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          int32_t        templength;
2182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UErrorCode     status = U_ZERO_ERROR;
2183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXTCANONICAL[0].text, text, 128);
2185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXTCANONICAL[0].pattern, pattern, 32);
2186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
21886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
21896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
21906d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
21916d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
2192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
2193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       NULL, &status);
2194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
2196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
2199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getText(strsrch, &templength);
2202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(text, temp) != 0) {
2203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting text\n");
2204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, TEXTCANONICAL[0])) {
2206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXTCANONICAL[1].text, text, 32);
2210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setText(strsrch, text, -1, &status);
2211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getText(strsrch, &templength);
2212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(text, temp) != 0) {
2213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting text\n");
2214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting text %s\n", u_errorName(status));
2218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, TEXTCANONICAL[1])) {
2220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXTCANONICAL[0].text, text, 32);
2224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setText(strsrch, text, -1, &status);
2225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = usearch_getText(strsrch, &templength);
2226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(text, temp) != 0) {
2227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting text\n");
2228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error setting pattern %s\n", u_errorName(status));
2232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithUStringSearch(strsrch, TEXTCANONICAL[0])) {
2234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruENDTESTPATTERN:
2237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strsrch != NULL) {
2238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_close(strsrch);
2239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
2241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCompositeBoundariesCanonical(void)
2244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
22466d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
22476d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
22486d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
22496d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
22506d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
22516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
2252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (COMPOSITEBOUNDARIESCANONICAL[count].text != NULL) {
2253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("composite %d\n", count);
2254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(COMPOSITEBOUNDARIESCANONICAL[count])) {
2255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
2256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
2258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
2260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestGetSetOffsetCanonical(void)
2263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
226450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int            searchDataIndex   = 0;
2265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          pattern[32];
2266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          text[128];
2267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status  = U_ZERO_ERROR;
2268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch *strsrch;
2269c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UCollator     *collator;
2270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(pattern, 0, 32*sizeof(UChar));
2272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(text, 0, 128*sizeof(UChar));
2273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
22746d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
22756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
22766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
22776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
22786d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
2279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, 16, text, 32, EN_US_, NULL,
2280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       &status);
2281c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2282c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    collator = usearch_getCollator(strsrch);
2283c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
2284c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
2287c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* testing out of bounds error */
2289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setOffset(strsrch, -1, &status);
2290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
2291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error expecting set offset error\n");
2292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setOffset(strsrch, 128, &status);
2294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
2295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error expecting set offset error\n");
2296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
229750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    while (BASICCANONICAL[searchDataIndex].text != NULL) {
2298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int         count       = 0;
229950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        SearchData  search      = BASICCANONICAL[searchDataIndex ++];
2300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t matchindex  = search.offset[count];
2301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t     textlength;
2302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
230350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (BASICCANONICAL[searchDataIndex].text == NULL) {
2304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* skip the last one */
2305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
2306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.text, text, 128);
2309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.pattern, pattern, 32);
2310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
2311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setText(strsrch, text, -1, &status);
2312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setPattern(strsrch, pattern, -1, &status);
2313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while (U_SUCCESS(status) && matchindex >= 0) {
2314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uint32_t matchlength = search.size[count];
2315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_next(strsrch, &status);
2316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (matchindex != usearch_getMatchedStart(strsrch) ||
2317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
2318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                char *str = toCharString(usearch_getText(strsrch,
2319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                         &textlength));
2320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Text: %s\n", str);
2321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                str = toCharString(usearch_getPattern(strsrch, &textlength));
2322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Pattern: %s\n", str);
2323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Error match found at %d %d\n",
2324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        usearch_getMatchedStart(strsrch),
2325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        usearch_getMatchedLength(strsrch));
2326c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                goto bail;
2327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            matchindex = search.offset[count + 1] == -1 ? -1 :
2329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         search.offset[count + 2];
2330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (search.offset[count + 1] != -1) {
2331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                usearch_setOffset(strsrch, search.offset[count + 1] + 1,
2332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  &status);
2333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (usearch_getOffset(strsrch) != search.offset[count + 1] + 1) {
2334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("Error setting offset\n");
2335c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    goto bail;
2336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
2337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            count += 2;
2340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_next(strsrch, &status);
2342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usearch_getMatchedStart(strsrch) != USEARCH_DONE) {
2343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char *str = toCharString(usearch_getText(strsrch, &textlength));
2344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Text: %s\n", str);
2345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = toCharString(usearch_getPattern(strsrch, &textlength));
2346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Pattern: %s\n", str);
2347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error match found at %d %d\n",
2348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        usearch_getMatchedStart(strsrch),
2349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        usearch_getMatchedLength(strsrch));
2350c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            goto bail;
2351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2353c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2354c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querubail:
2355c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status);
2356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
2357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
2358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSupplementaryCanonical(void)
2361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
23636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
23646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    open(&status);
23656d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(status)) {
23666d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
23676d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
23686d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
2369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (SUPPLEMENTARYCANONICAL[count].text != NULL) {
2370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(SUPPLEMENTARYCANONICAL[count])) {
2371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
2372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
2374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    close();
2376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestContractionCanonical(void)
2379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          rules[128];
2381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          pattern[128];
2382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          text[128];
2383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator     *collator = NULL;
2384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status = U_ZERO_ERROR;
2385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int            count = 0;
2386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch *strsrch = NULL;
2387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(rules, 0, 128*sizeof(UChar));
2388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(pattern, 0, 128*sizeof(UChar));
2389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(text, 0, 128*sizeof(UChar));
2390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(CONTRACTIONRULE, rules, 128);
2392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    collator = ucol_openRules(rules, u_strlen(rules), UCOL_ON,
2393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              UCOL_TERTIARY, NULL, &status);
2394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status == U_FILE_ACCESS_ERROR) {
2395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_data_err("Is your data around?\n");
2396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
2397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(U_FAILURE(status)) {
2398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("Error opening collator %s\n", u_errorName(status));
2399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
2400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, 1, text, 1, collator, NULL,
2402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       &status);
2403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
2404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
2405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error opening string search %s\n", u_errorName(status));
2407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (CONTRACTIONCANONICAL[count].text != NULL) {
2410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(CONTRACTIONCANONICAL[count].text, text, 128);
2411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(CONTRACTIONCANONICAL[count].pattern, pattern, 128);
2412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setText(strsrch, text, -1, &status);
2413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        usearch_setPattern(strsrch, pattern, -1, &status);
2414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithUStringSearch(strsrch,
2415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                              CONTRACTIONCANONICAL[count])) {
2416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error at test number %d\n", count);
2417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
2419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    usearch_close(strsrch);
2421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(collator);
2422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNumeric(void) {
2425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCollator     *coll = NULL;
2426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringSearch *strsrch = NULL;
2427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status = U_ZERO_ERROR;
2428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          pattern[128];
2430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          text[128];
2431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(pattern, 0, 128*sizeof(UChar));
2432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(text, 0, 128*sizeof(UChar));
2433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    coll = ucol_open("", &status);
2435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
2436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("Could not open UCA. Is your data around?\n");
2437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_NUMERIC_COLLATION, UCOL_ON, &status);
2441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = usearch_openFromCollator(pattern, 1, text, 1, coll, NULL, &status);
2443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status != U_UNSUPPORTED_ERROR || U_SUCCESS(status)) {
2445b13da9df870a61b11249bf741347908dbea0edd8Jean-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));
2446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(strsrch) {
2447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usearch_close(strsrch);
2448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucol_close(coll);
2452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2455c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/* This test is for ticket 4038 due to incorrect backward searching when certain patterns have a length > 1 */
2456c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic void TestForwardBackward(void) {
2457c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2458c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UCollator *coll = NULL;
2459c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UStringSearch *search = NULL;
2460c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UChar usrcstr[32], value[4];
2461c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t pos= -1;
2462c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t expectedPos = 9;
2463c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2464c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    coll = ucol_open("en_GB", &status);
2465c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (U_FAILURE(status)) {
24666d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "ucol_open failed: %s\n", u_errorName(status));
2467c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        goto exitTestForwardBackward;
2468c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2469c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_PRIMARY, &status);
2470c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_CASE_LEVEL, UCOL_ON, &status);
2471c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, &status);
2472c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2473c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    u_uastrcpy(usrcstr, "QBitArray::bitarr_data"); /* text */
2474c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    u_uastrcpy(value, "::");                       /* pattern */
2475c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2476c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    search = usearch_openFromCollator(value, 2, usrcstr, 22, coll, NULL, &status);
2477c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (U_FAILURE(status)) {
2478c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_err("usearch_openFromCollator failed: %s\n", u_errorName(status));
2479c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        goto exitTestForwardBackward;
2480c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2481c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2482c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    usearch_reset(search);
2483c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    /* forward search */
2484c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    pos = usearch_first(search, &status);
2485c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (pos != expectedPos) {
2486c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_err("Expected search result: %d; Got instead: %d\n", expectedPos, pos);
2487c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        goto exitTestForwardBackward;
2488c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2489c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2490c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    pos = -1;
2491c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    usearch_reset(search);
2492c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    /* backward search */
2493c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    pos = usearch_last(search, &status);
2494c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (pos != expectedPos) {
2495c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_err("Expected search result: %d; Got instead: %d\n", expectedPos, pos);
2496c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2497c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2498c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruexitTestForwardBackward :
2499c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (coll != NULL) {
2500c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        ucol_close(coll);
2501c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2502c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (search != NULL) {
2503c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        usearch_close(search);
2504c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
2505c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
2506c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2507b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define TEST_ASSERT(x) \
25086d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru   {if (U_FAILURE(x)) {log_err_status(x, "%s:%d: FAIL: test assertion failure \n", __FILE__, __LINE__);\
2509b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru   }}
2510b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2511b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestSearchForNull(void) {
2512b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UCollator *coll;
2513b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode ec;
2514b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UStringSearch *search;
2515b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int pos;
2516b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int len;
2517b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int expectedPos;
2518b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int expectedLen;
2519b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int expectedNum;
2520b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int count = 0;
2521b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const UChar zerodigit = 0x0030; /* 0 */
2522b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const UChar nulldigit = 0x0000; /* null */
2523b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2524b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* static const UChar var[(length)+1]=U_DECLARE_UTF16(cs) */
2525b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define PATTERN_LEN 4
2526b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define TEXT_LEN 10
2527b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2528b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    U_STRING_DECL(_pattern, "IS 0", PATTERN_LEN);
2529b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    U_STRING_DECL(_text, "_0IS 0 OK?", TEXT_LEN);
2530b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UChar pattern[PATTERN_LEN + 1], text[TEXT_LEN + 1];
2531b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2532b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    U_STRING_INIT(_pattern, "IS 0", PATTERN_LEN);
2533b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    U_STRING_INIT(_text, "_0IS 0 OK?", TEXT_LEN);
2534b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    expectedPos = 2;
2535b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    expectedLen = 4;
2536b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    expectedNum = 1;
2537b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2538b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (pos = 0; pos < PATTERN_LEN; pos++) {
2539b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (_pattern[pos] == zerodigit) {
2540b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            pattern[pos] = nulldigit;
2541b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        } else {
2542b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            pattern[pos] = _pattern[pos];
2543b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
2544b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
2545b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    pattern[PATTERN_LEN] = 0x0000;
2546b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2547b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (pos = 0; pos < TEXT_LEN; pos++) {
2548b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (_text[pos] == zerodigit) {
2549b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            text[pos] = nulldigit;
2550b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        } else {
2551b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            text[pos] = _text[pos];
2552b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
2553b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
2554b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    text[TEXT_LEN] = 0x0000;
2555b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2556b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ec = U_ZERO_ERROR;
2557b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2558b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* create a US-English collator */
2559b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    coll = ucol_open("en_US", &ec);
2560b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2561b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* make sure we didn't fail. */
25626d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru     TEST_ASSERT (ec);
2563b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2564b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ucol_setStrength(coll, UCOL_IDENTICAL);
2565b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2566b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* open a search looking for 0 */
2567b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    search = usearch_openFromCollator(pattern, PATTERN_LEN, text,
2568b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            TEXT_LEN, coll, NULL, &ec);
25696d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru     TEST_ASSERT (ec);
25706d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
25716d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (coll != NULL && search != NULL) {
25726d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        pos = usearch_first(search, &ec);
25736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        len = usearch_getMatchedLength(search);
25746d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (pos != expectedPos) {
25756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err("Expected search result: %d; Got instead: %d\n", expectedPos,
25766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                    pos);
25776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
2578b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
25796d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (len != expectedLen) {
25806d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err("Expected search result length: %d; Got instead: %d\n",
25816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                    expectedLen, len);
25826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
2583b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
25846d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        for (pos = usearch_first(search, &ec); pos != USEARCH_DONE; pos
25856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                = usearch_next(search, &ec)) {
25866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_verbose("Match at %d\n", pos);
25876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            count += 1;
25886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
2589b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
25906d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (count != expectedNum) {
25916d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err("Expected %d search hits, found %d\n", expectedNum, count);
25926d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
2593b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
2594b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2595b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ucol_close(coll);
2596b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    usearch_close(search);
2597b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
2598b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2599b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestStrengthIdentical(void)
2600b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
2601b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UCollator *coll;
2602b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode ec = U_ZERO_ERROR;
2603b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UStringSearch *search;
2604b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2605b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UChar pattern[] = {0x05E9, 0x0591, 0x05E9};
2606b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UChar text[]    = {0x05E9, 0x0592, 0x05E9};
2607b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t pLen = sizeof (pattern) / sizeof(pattern[0]);
2608b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t tLen = sizeof(text) / sizeof (text[0]);
2609b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t expectedPos = 0;
2610b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t expectedLen = 3;
2611b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2612b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t pos;
2613b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t len;
2614b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2615b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* create a US-English collator */
2616b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    coll = ucol_open ("en_US", &ec);
2617b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2618b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* make sure we didn't fail. */
2619b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT (ec);
2620b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2621b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ucol_setStrength( coll, UCOL_TERTIARY);
2622b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2623b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* open a search looking for 0 */
2624b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    search = usearch_openFromCollator (pattern, pLen, text, tLen, coll, NULL, &ec);
2625b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT (ec);
2626b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
26276d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (coll != NULL && search != NULL) {
2628b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        pos = usearch_first(search, &ec);
2629b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        len = usearch_getMatchedLength(search);
2630b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2631b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(pos != expectedPos) {
2632b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("Expected search result: %d; Got instead: %d\n", expectedPos, pos);
2633b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
2634b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2635b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(len != expectedLen) {
2636b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("Expected search result length: %d; Got instead: %d\n", expectedLen, len);
2637b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
2638b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
26396d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        /* Now try it at strength == UCOL_IDENTICAL */
26406d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        ucol_setStrength(coll, UCOL_IDENTICAL);
2641b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        usearch_reset(search);
2642b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2643b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        pos = usearch_first(search, &ec);
2644b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        len = usearch_getMatchedLength(search);
2645b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2646b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(pos != -1) {
2647b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("Expected failure for strentgh = UCOL_IDENTICAL: got %d instead.\n", pos);
2648b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
26496d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
2650b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2651b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    usearch_close(search);
2652b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ucol_close(coll);
2653b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
2654b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2655b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/**
2656b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* TestUsingSearchCollator
2657b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*/
2658b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2659b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define ARRAY_LENGTH(array) (sizeof(array)/sizeof(array[0]))
2660b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2661b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotypedef struct {
2662b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const UChar *   pattern;
2663b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const int32_t * offsets;
2664b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t         offsetsLen;
2665b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} PatternAndOffsets;
2666b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2667b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar scKoText[] = {
2668b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho       0x0020,
2669b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*01*/ 0xAC00, 0x0020,                         /* simple LV Hangul */
2670b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*03*/ 0xAC01, 0x0020,                         /* simple LVT Hangul */
2671b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*05*/ 0xAC0F, 0x0020,                         /* LVTT, last jamo expands for search */
2672b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*07*/ 0xAFFF, 0x0020,                         /* LLVVVTT, every jamo expands for search */
2673b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*09*/ 0x1100, 0x1161, 0x11A8, 0x0020,         /* 0xAC01 as conjoining jamo */
2674b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*13*/ 0x1100, 0x1161, 0x1100, 0x0020,         /* 0xAC01 as basic conjoining jamo (per search rules) */
2675b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*17*/ 0x3131, 0x314F, 0x3131, 0x0020,         /* 0xAC01 as compatibility jamo */
2676b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*21*/ 0x1100, 0x1161, 0x11B6, 0x0020,         /* 0xAC0F as conjoining jamo; last expands for search */
2677b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*25*/ 0x1100, 0x1161, 0x1105, 0x1112, 0x0020, /* 0xAC0F as basic conjoining jamo; last expands for search */
2678b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*30*/ 0x1101, 0x1170, 0x11B6, 0x0020,         /* 0xAFFF as conjoining jamo; all expand for search */
2679b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*34*/ 0x00E6, 0x0020,                         /* small letter ae, expands */
2680b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*36*/ 0x1E4D, 0x0020,                         /* small letter o with tilde and acute, decomposes */
2681b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho       0
2682b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
2683b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2684b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar scKoPat0[] = { 0xAC01, 0 };
2685b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar scKoPat1[] = { 0x1100, 0x1161, 0x11A8, 0 }; /* 0xAC01 as conjoining jamo */
2686b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar scKoPat2[] = { 0xAC0F, 0 };
2687b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar scKoPat3[] = { 0x1100, 0x1161, 0x1105, 0x1112, 0 }; /* 0xAC0F as basic conjoining jamo */
2688b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar scKoPat4[] = { 0xAFFF, 0 };
2689b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar scKoPat5[] = { 0x1101, 0x1170, 0x11B6, 0 }; /* 0xAFFF as conjoining jamo */
2690b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2691b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const int32_t scKoSrchOff01[] = { 3,  9, 13 };
2692b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const int32_t scKoSrchOff23[] = { 5, 21, 25 };
2693b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const int32_t scKoSrchOff45[] = { 7, 30     };
2694b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2695b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const PatternAndOffsets scKoSrchPatternsOffsets[] = {
2696b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { scKoPat0, scKoSrchOff01, ARRAY_LENGTH(scKoSrchOff01) },
2697b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { scKoPat1, scKoSrchOff01, ARRAY_LENGTH(scKoSrchOff01) },
2698b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { scKoPat2, scKoSrchOff23, ARRAY_LENGTH(scKoSrchOff23) },
2699b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { scKoPat3, scKoSrchOff23, ARRAY_LENGTH(scKoSrchOff23) },
2700b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { scKoPat4, scKoSrchOff45, ARRAY_LENGTH(scKoSrchOff45) },
2701b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { scKoPat5, scKoSrchOff45, ARRAY_LENGTH(scKoSrchOff45) },
2702b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { NULL,     NULL,          0                           }
2703b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
2704b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2705b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const int32_t scKoStndOff01[] = { 3,  9 };
2706b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const int32_t scKoStndOff2[]  = { 5, 21 };
2707b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const int32_t scKoStndOff3[]  = { 25    };
2708b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const int32_t scKoStndOff45[] = { 7, 30 };
2709b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2710b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const PatternAndOffsets scKoStndPatternsOffsets[] = {
2711b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { scKoPat0, scKoStndOff01, ARRAY_LENGTH(scKoStndOff01) },
2712b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { scKoPat1, scKoStndOff01, ARRAY_LENGTH(scKoStndOff01) },
2713b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { scKoPat2, scKoStndOff2,  ARRAY_LENGTH(scKoStndOff2)  },
2714b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { scKoPat3, scKoStndOff3,  ARRAY_LENGTH(scKoStndOff3)  },
2715b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { scKoPat4, scKoStndOff45, ARRAY_LENGTH(scKoStndOff45) },
2716b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { scKoPat5, scKoStndOff45, ARRAY_LENGTH(scKoStndOff45) },
2717b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { NULL,     NULL,          0                           }
2718b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
2719b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2720b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotypedef struct {
2721b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const char *  locale;
2722b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const UChar * text;
2723b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const PatternAndOffsets * patternsAndOffsets;
2724b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} TUSCItem;
2725b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2726b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const TUSCItem tuscItems[] = {
2727b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "root",                  scKoText, scKoStndPatternsOffsets },
2728b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "root@collation=search", scKoText, scKoSrchPatternsOffsets },
2729b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "ko@collation=search",   scKoText, scKoSrchPatternsOffsets },
2730b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { NULL,                    NULL,     NULL                    }
2731b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
2732b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2733b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar dummyPat[] = { 0x0061, 0 };
2734b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2735b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestUsingSearchCollator(void)
2736b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{
2737b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const TUSCItem * tuscItemPtr;
2738b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (tuscItemPtr = tuscItems; tuscItemPtr->locale != NULL; tuscItemPtr++) {
2739b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UErrorCode status = U_ZERO_ERROR;
2740b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UCollator* ucol = ucol_open(tuscItemPtr->locale, &status);
2741b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if ( U_SUCCESS(status) ) {
2742b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            UStringSearch* usrch = usearch_openFromCollator(dummyPat, -1, tuscItemPtr->text, -1, ucol, NULL, &status);
2743b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if ( U_SUCCESS(status) ) {
2744b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                const PatternAndOffsets * patternsOffsetsPtr;
2745b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                for ( patternsOffsetsPtr = tuscItemPtr->patternsAndOffsets; patternsOffsetsPtr->pattern != NULL; patternsOffsetsPtr++) {
2746b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    usearch_setPattern(usrch, patternsOffsetsPtr->pattern, -1, &status);
2747b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    if ( U_SUCCESS(status) ) {
2748b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        int32_t offset;
2749b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        const int32_t * nextOffsetPtr;
2750b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        const int32_t * limitOffsetPtr;
2751b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2752b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        usearch_reset(usrch);
2753b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        nextOffsetPtr = patternsOffsetsPtr->offsets;
2754b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        limitOffsetPtr = patternsOffsetsPtr->offsets + patternsOffsetsPtr->offsetsLen;
2755b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        while (TRUE) {
2756b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            offset = usearch_next(usrch, &status);
2757b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            if ( U_FAILURE(status) || offset == USEARCH_DONE ) {
2758b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                break;
2759b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            }
2760b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            if ( nextOffsetPtr < limitOffsetPtr ) {
2761b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                 if (offset != *nextOffsetPtr) {
2762b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                     log_err("error, locale %s, expected usearch_next %d, got %d\n", tuscItemPtr->locale, *nextOffsetPtr, offset);
2763b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                     nextOffsetPtr = limitOffsetPtr;
2764b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                     break;
2765b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                 }
2766b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                 nextOffsetPtr++;
2767b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            } else {
2768b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                log_err("error, locale %s, usearch_next returned more matches than expected\n", tuscItemPtr->locale );
2769b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            }
2770b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        }
2771b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        if ( U_FAILURE(status) ) {
2772b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            log_err("error, locale %s, usearch_next failed: %s\n", tuscItemPtr->locale, u_errorName(status) );
2773b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        } else if ( nextOffsetPtr < limitOffsetPtr ) {
2774b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            log_err("error, locale %s, usearch_next returned fewer matches than expected\n", tuscItemPtr->locale );
2775b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        }
2776b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2777b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        status = U_ZERO_ERROR;
2778b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        usearch_reset(usrch);
2779b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        nextOffsetPtr = patternsOffsetsPtr->offsets + patternsOffsetsPtr->offsetsLen;
2780b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        limitOffsetPtr = patternsOffsetsPtr->offsets;
2781b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        while (TRUE) {
2782b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            offset = usearch_previous(usrch, &status);
2783b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            if ( U_FAILURE(status) || offset == USEARCH_DONE ) {
2784b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                break;
2785b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            }
2786b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            if ( nextOffsetPtr > limitOffsetPtr ) {
2787b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                nextOffsetPtr--;
2788b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                if (offset != *nextOffsetPtr) {
2789b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                     log_err("error, locale %s, expected usearch_previous %d, got %d\n", tuscItemPtr->locale, *nextOffsetPtr, offset);
2790b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                     nextOffsetPtr = limitOffsetPtr;
2791b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                      break;
2792b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                }
2793b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            } else {
2794b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                log_err("error, locale %s, usearch_previous returned more matches than expected\n", tuscItemPtr->locale );
2795b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            }
2796b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        }
2797b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        if ( U_FAILURE(status) ) {
2798b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            log_err("error, locale %s, usearch_previous failed: %s\n", tuscItemPtr->locale, u_errorName(status) );
2799b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        } else if ( nextOffsetPtr > limitOffsetPtr ) {
2800b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            log_err("error, locale %s, usearch_previous returned fewer matches than expected\n", tuscItemPtr->locale );
2801b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        }
2802b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2803b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    } else {
2804b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        log_err("error, locale %s, usearch_setPattern failed: %s\n", tuscItemPtr->locale, u_errorName(status) );
2805b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    }
2806b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                }
2807b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                usearch_close(usrch);
2808b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            } else {
2809b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_err("error, locale %s, usearch_openFromCollator failed: %s\n", tuscItemPtr->locale, u_errorName(status) );
2810b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
2811b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            ucol_close(ucol);
2812b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else {
2813b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_data_err("error, locale %s, ucol_open failed: %s\n", tuscItemPtr->locale, u_errorName(status) );
2814b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
2815b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
2816b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
2817b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2818b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2819b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestPCEBuffer_with(const UChar *search, uint32_t searchLen, const UChar *source, uint32_t sourceLen) {
2820b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   UErrorCode icuStatus = U_ZERO_ERROR;
2821b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   UCollator *coll;
2822b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   const char *locale;
2823b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   UBreakIterator *ubrk;
2824b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   UStringSearch *usearch;
2825b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   int32_t match = 0;
2826b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2827b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2828b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   coll = ucol_openFromShortString( "LSK_AS_CX_EX_FX_HX_NX_S4",
2829b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    FALSE,
2830b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    NULL,
2831b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    &icuStatus );
2832b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   if ( U_FAILURE(icuStatus) )
2833b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   {
2834b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     log_data_err( "ucol_openFromShortString error %s\n" , u_errorName(icuStatus));
2835b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho      goto exit;
2836b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   }
2837b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2838b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   locale = ucol_getLocaleByType( coll,
2839b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                  ULOC_VALID_LOCALE,
2840b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                  &icuStatus );
2841b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   if ( U_FAILURE(icuStatus) )
2842b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   {
2843b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     log_err( "ucol_getLocaleByType error %s\n", u_errorName(icuStatus) );
2844b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho      goto exit;
2845b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   }
2846b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2847b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   log_verbose("locale=%s\n", locale);
2848b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2849b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   ubrk = ubrk_open( UBRK_CHARACTER,
2850b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                     locale,
2851b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                     source,
2852b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                     sourceLen,
2853b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                     &icuStatus );
2854b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   if ( U_FAILURE(icuStatus) )
2855b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   {
2856b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     log_err( "ubrk_open error %s\n", u_errorName(icuStatus) );
2857b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho      goto exit;
2858b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   }
2859b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2860b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   usearch = usearch_openFromCollator( search,
2861b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                       searchLen,
2862b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                       source,
2863b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                       sourceLen,
2864b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                       coll,
2865b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                       ubrk,
2866b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                       &icuStatus );
2867b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   if ( U_FAILURE(icuStatus) )
2868b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   {
2869b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     log_err( "usearch_openFromCollator error %s\n", u_errorName(icuStatus) );
2870b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho      goto exit;
2871b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   }
2872b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2873b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   match = usearch_first( usearch,
2874b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                          &icuStatus );
2875b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   if ( U_FAILURE(icuStatus) )
2876b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   {
2877b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     log_err( "usearch_first error %s\n", u_errorName(icuStatus) );
2878b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     goto exit;
2879b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   }
2880b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2881b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   if(match==0) {
2882b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     log_verbose("OK: match=%d\n", match);
2883b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   } else {
2884b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     log_err("Err: match expected 0 got %d\n", match);
2885b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   }
2886b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2887b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   usearch_close(usearch);
2888b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   ubrk_close(ubrk);
2889b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   ucol_close(coll);
2890b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2891b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoexit:
2892b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho   return;
2893b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
2894b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2895b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2896b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestPCEBuffer_100df(void) {
2897b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  UChar search[] =
2898b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { 0x0020, 0x0020, 0x00df, 0x0020, 0x0041, 0x00df, 0x0020, 0x0061, 0x00df, 0x0020, 0x00c5, 0x00df, 0x0020, 0x212b, 0x00df, 0x0020, 0x0041, 0x030a, 0x00df, 0x0020, 0x00e5, 0x00df, 0x0020, 0x0061, 0x02da, 0x00df, 0x0020, 0x0061, 0x030a, 0x00df, 0x0020, 0xd8fa, 0xdeae, 0x00df, 0x0020, 0x2027, 0x00df }; /* 38 cp, 9 of them unpaired surrogates */
2899b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  UChar source[] =
2900b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { 0x0020, 0x0020, 0x00df, 0x0020, 0x0041, 0x00df, 0x0020, 0x0061, 0x00df, 0x0020, 0x00c5, 0x00df, 0x0020, 0x212b, 0x00df, 0x0020, 0x0041, 0x030a, 0x00df, 0x0020, 0x00e5, 0x00df, 0x0020, 0x0061, 0x02da, 0x00df, 0x0020, 0x0061, 0x030a, 0x00df, 0x0020, 0xd8fa, 0xdeae, 0x00df, 0x0020, 0x2027, 0x00df };
2901b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  uint32_t searchLen = sizeof(search)/sizeof(UChar);
2902b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  uint32_t sourceLen = sizeof(source)/sizeof(UChar);
2903b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  TestPCEBuffer_with(search,searchLen,source,sourceLen);
2904b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }
2905b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2906b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2907b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestPCEBuffer_2surr(void) {
2908b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  UChar search[] =
2909b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { 0x0020, 0x0020, 0xdfff, 0x0020, 0x0041, 0xdfff, 0x0020, 0x0061, 0xdfff, 0x0020, 0x00c5, 0xdfff, 0x0020, 0x212b, 0xdfff, 0x0020, 0x0041, 0x030a, 0xdfff, 0x0020, 0x00e5, 0xdfff, 0x0020, 0x0061, 0x02da, 0xdfff, 0x0020, 0x0061, 0x030a, 0xdfff, 0x0020, 0xd8fa, 0xdeae, 0xdfff, 0x0020, 0x2027, 0xdfff }; /* 38 cp, 9 of them unpaired surrogates */
2910b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  UChar source[] =
2911b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { 0x0020, 0x0020, 0xdfff, 0x0020, 0x0041, 0xdfff, 0x0020, 0x0061, 0xdfff, 0x0020, 0x00c5, 0xdfff, 0x0020, 0x212b, 0xdfff, 0x0020, 0x0041, 0x030a, 0xdfff, 0x0020, 0x00e5, 0xdfff, 0x0020, 0x0061, 0x02da, 0xdfff, 0x0020, 0x0061, 0x030a, 0xdfff, 0x0020, 0xd8fa, 0xdeae, 0xdfff, 0x0020, 0x2027, 0xdfff };
2912b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  uint32_t searchLen = sizeof(search)/sizeof(UChar);
2913b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  uint32_t sourceLen = sizeof(source)/sizeof(UChar);
2914b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  TestPCEBuffer_with(search,searchLen,source,sourceLen);
2915b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
2916b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2917b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestMatchFollowedByIgnorables(void) {
2918b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* test case for ticket#8482 */
2919b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UChar search[] = { 0x00c9 };
2920b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UChar source[] = { 0x00c9, 0x0000, 0x0041 };
2921b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t searchLen;
2922b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t sourceLen;
2923b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode icuStatus = U_ZERO_ERROR;
2924b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UCollator *coll;
2925b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const char *locale;
2926b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBreakIterator *ubrk;
2927b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UStringSearch *usearch;
2928b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t match = 0;
2929b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t matchLength = 0;
2930b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const int32_t expectedMatchLength = 1;
2931b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2932b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    searchLen = sizeof(search)/sizeof(UChar);
2933b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    sourceLen = sizeof(source)/sizeof(UChar);
2934b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2935b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    coll = ucol_openFromShortString("LHR_AN_CX_EX_FX_HX_NX_S3",
2936b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    FALSE,
2937b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    NULL,
2938b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    &icuStatus);
2939b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(icuStatus)) {
2940b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_data_err("ucol_openFromShortString error - %s\n", u_errorName(icuStatus));
2941b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
2942b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2943b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    locale = ucol_getLocaleByType(coll,
2944b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    ULOC_VALID_LOCALE,
2945b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                    &icuStatus);
2946b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(icuStatus)) {
2947b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_data_err("ucol_getLocaleByType error - %s\n", u_errorName(icuStatus));
2948b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
2949b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2950b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ubrk = ubrk_open(UBRK_CHARACTER,
2951b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        locale,
2952b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        source,
2953b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        sourceLen,
2954b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        &icuStatus);
2955b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(icuStatus)) {
2956b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_data_err("ubrk_open error - %s\n", u_errorName(icuStatus));
2957b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
2958b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2959b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    usearch = usearch_openFromCollator(search,
2960b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                        searchLen,
2961b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                        source,
2962b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                        sourceLen,
2963b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                        coll,
2964b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                        ubrk,
2965b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                        &icuStatus);
2966b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(icuStatus)) {
2967b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_data_err("usearch_openFromCollator error - %s\n", u_errorName(icuStatus));
2968b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
2969b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2970b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    match = usearch_first(usearch,
2971b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            &icuStatus);
2972b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(icuStatus)) {
2973b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_data_err("usearch_first error - %s\n", u_errorName(icuStatus));
2974b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else {
2975b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2976b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_verbose("match=%d\n", match);
2977b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2978b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        matchLength = usearch_getMatchedLength(usearch);
2979b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2980b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (matchLength != expectedMatchLength) {
2981b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("Error: matchLength=%d, expected=%d\n", matchLength, expectedMatchLength);
2982b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
2983b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
2984b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2985b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    usearch_close(usearch);
2986b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ubrk_close(ubrk);
2987b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ucol_close(coll);
2988b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
2989b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2990b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/**
2991b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* addSearchTest
2992b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*/
2993b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addSearchTest(TestNode** root)
2995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestStart, "tscoll/usrchtst/TestStart");
2997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestOpenClose, "tscoll/usrchtst/TestOpenClose");
2998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestInitialization, "tscoll/usrchtst/TestInitialization");
2999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestBasic, "tscoll/usrchtst/TestBasic");
3000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestNormExact, "tscoll/usrchtst/TestNormExact");
3001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestStrength, "tscoll/usrchtst/TestStrength");
3002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestBreakIterator, "tscoll/usrchtst/TestBreakIterator");
3003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestVariable, "tscoll/usrchtst/TestVariable");
3004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestOverlap, "tscoll/usrchtst/TestOverlap");
3005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestCollator, "tscoll/usrchtst/TestCollator");
3006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestPattern, "tscoll/usrchtst/TestPattern");
3007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestText, "tscoll/usrchtst/TestText");
3008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestCompositeBoundaries,
3009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  "tscoll/usrchtst/TestCompositeBoundaries");
3010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestGetSetOffset, "tscoll/usrchtst/TestGetSetOffset");
3011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestGetSetAttribute,
3012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      "tscoll/usrchtst/TestGetSetAttribute");
3013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestGetMatch, "tscoll/usrchtst/TestGetMatch");
3014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestSetMatch, "tscoll/usrchtst/TestSetMatch");
3015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestReset, "tscoll/usrchtst/TestReset");
3016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestSupplementary, "tscoll/usrchtst/TestSupplementary");
3017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestContraction, "tscoll/usrchtst/TestContraction");
3018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestIgnorable, "tscoll/usrchtst/TestIgnorable");
3019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestCanonical, "tscoll/usrchtst/TestCanonical");
3020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestNormCanonical, "tscoll/usrchtst/TestNormCanonical");
3021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestStrengthCanonical,
3022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "tscoll/usrchtst/TestStrengthCanonical");
3023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestBreakIteratorCanonical,
3024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               "tscoll/usrchtst/TestBreakIteratorCanonical");
3025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestVariableCanonical,
3026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "tscoll/usrchtst/TestVariableCanonical");
3027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestOverlapCanonical,
3028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "tscoll/usrchtst/TestOverlapCanonical");
3029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestCollatorCanonical,
3030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    "tscoll/usrchtst/TestCollatorCanonical");
3031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestPatternCanonical,
3032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                     "tscoll/usrchtst/TestPatternCanonical");
3033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestTextCanonical, "tscoll/usrchtst/TestTextCanonical");
3034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestCompositeBoundariesCanonical,
3035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         "tscoll/usrchtst/TestCompositeBoundariesCanonical");
3036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestGetSetOffsetCanonical,
3037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                "tscoll/usrchtst/TestGetSetOffsetCanonical");
3038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestSupplementaryCanonical,
3039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               "tscoll/usrchtst/TestSupplementaryCanonical");
3040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestContractionCanonical,
3041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 "tscoll/usrchtst/TestContractionCanonical");
3042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestEnd, "tscoll/usrchtst/TestEnd");
3043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestNumeric, "tscoll/usrchtst/TestNumeric");
3044c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    addTest(root, &TestDiacriticMatch, "tscoll/usrchtst/TestDiacriticMatch");
3045c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    addTest(root, &TestForwardBackward, "tscoll/usrchtst/TestForwardBackward");
3046b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    addTest(root, &TestSearchForNull, "tscoll/usrchtst/TestSearchForNull");
3047b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    addTest(root, &TestStrengthIdentical, "tscoll/usrchtst/TestStrengthIdentical");
3048b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    addTest(root, &TestUsingSearchCollator, "tscoll/usrchtst/TestUsingSearchCollator");
3049b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    addTest(root, &TestPCEBuffer_100df, "tscoll/usrchtst/TestPCEBuffer/1_00df");
3050b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    addTest(root, &TestPCEBuffer_2surr, "tscoll/usrchtst/TestPCEBuffer/2_dfff");
3051b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    addTest(root, &TestMatchFollowedByIgnorables, "tscoll/usrchtst/TestMatchFollowedByIgnorables");
3052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
3053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_COLLATION */
3055