16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/********************************************************************
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 2001-2011 International Business Machines
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Corporation and others. All Rights Reserved.
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * File usrchtst.c
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Modification History:
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Name           Date             Description
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * synwee         July 19 2001     creation
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_COLLATION && !UCONFIG_NO_BREAK_ITERATION && !UCONFIG_NO_FILE_IO
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/usearch.h"
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ccolltst.h"
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h"
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h>
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "usrchdat.c"
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ubrk.h"
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <assert.h>
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool      TOCLOSE_ = TRUE;
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UCollator *EN_US_;
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UCollator *FR_FR_;
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UCollator *DE_;
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UCollator *ES_;
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * CHECK_BREAK(char *brk)
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     Test if a break iterator is passed in AND break iteration is disabled.
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     Skip the test if so.
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * CHECK_BREAK_BOOL(char *brk)
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     Same as above, but returns 'TRUE' as a passing result
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_BREAK_ITERATION
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBreakIterator *EN_WORDBREAKER_;
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBreakIterator *EN_CHARACTERBREAKER_;
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define CHECK_BREAK(x)
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define CHECK_BREAK_BOOL(x)
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define CHECK_BREAK(x)  if(x) { log_info("Skipping test on %s:%d because UCONFIG_NO_BREAK_ITERATION is on\n", __FILE__, __LINE__); return; }
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#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; }
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Opening all static collators and break iterators
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void open(UErrorCode* status)
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (TOCLOSE_) {
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar      rules[1024];
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t    rulelength = 0;
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *status = U_ZERO_ERROR;
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        EN_US_ = ucol_open("en_US", status);
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(*status)) {
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          log_err_status(*status, "Error opening collator\n");
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          return;
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        FR_FR_ = ucol_open("fr_FR", status);
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DE_ = ucol_open("de_DE", status);
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ES_ = ucol_open("es_ES", status);
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strcpy(rules, ucol_getRules(DE_, &rulelength));
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(EXTRACOLLATIONRULE, rules + rulelength, 1024 - rulelength);
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucol_close(DE_);
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DE_ = ucol_openRules(rules, u_strlen(rules), UCOL_ON, UCOL_TERTIARY,
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             (UParseError *)NULL, status);
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strcpy(rules, ucol_getRules(ES_, &rulelength));
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(EXTRACOLLATIONRULE, rules + rulelength, 1024 - rulelength);
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucol_close(ES_);
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ES_ = ucol_openRules(rules, u_strlen(rules), UCOL_ON, UCOL_TERTIARY,
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             NULL, status);
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_BREAK_ITERATION
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        EN_WORDBREAKER_     = ubrk_open(UBRK_WORD, "en_US", NULL, 0, status);
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        EN_CHARACTERBREAKER_ = ubrk_open(UBRK_CHARACTER, "en_US", NULL, 0,
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                        status);
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TOCLOSE_ = TRUE;
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Start opening all static collators and break iterators
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestStart(void)
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TOCLOSE_ = FALSE;
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Closing all static collators and break iterators
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void close(void)
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (TOCLOSE_) {
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucol_close(EN_US_);
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucol_close(FR_FR_);
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucol_close(DE_);
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucol_close(ES_);
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_BREAK_ITERATION
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubrk_close(EN_WORDBREAKER_);
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubrk_close(EN_CHARACTERBREAKER_);
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TOCLOSE_ = FALSE;
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* End closing all static collators and break iterators
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestEnd(void)
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TOCLOSE_ = TRUE;
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TOCLOSE_ = TRUE;
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* output UChar strings for printing.
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic char *toCharString(const UChar* unichars)
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static char result[1024];
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char *temp   = result;
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int   count  = 0;
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int   length = u_strlen(unichars);
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (; count < length; count ++) {
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar ch = unichars[count];
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (ch >= 0x20 && ch <= 0x7e) {
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            *temp ++ = (char)ch;
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else {
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            sprintf(temp, "\\u%04x", ch);
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            temp += 6; /* \uxxxx */
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *temp = 0;
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return result;
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Getting the collator
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UCollator *getCollator(const char *collator)
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (collator == NULL) {
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return EN_US_;
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (strcmp(collator, "fr") == 0) {
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FR_FR_;
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else if (strcmp(collator, "de") == 0) {
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return DE_;
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else if (strcmp(collator, "es") == 0) {
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return ES_;
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else {
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return EN_US_;
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Getting the breakiterator
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBreakIterator *getBreakIterator(const char *breaker)
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (breaker == NULL) {
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_BREAK_ITERATION
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (strcmp(breaker, "wordbreaker") == 0) {
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return EN_WORDBREAKER_;
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else {
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return EN_CHARACTERBREAKER_;
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return NULL;
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestOpenClose(void)
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UErrorCode      status    = U_ZERO_ERROR;
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UStringSearch  *result;
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar           pattern[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66};
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar           text[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67};
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_BREAK_ITERATION
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UBreakIterator *breakiter = ubrk_open(UBRK_WORD, "en_US",
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                text, 6, &status);
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* testing null arguments */
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    result = usearch_open(NULL, 0, NULL, 0, NULL, NULL, &status);
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status) || result != NULL) {
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error: NULL arguments should produce an error and a NULL result\n");
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    result = usearch_openFromCollator(NULL, 0, NULL, 0, NULL, NULL, &status);
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status) || result != NULL) {
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error: NULL arguments should produce an error and a NULL result\n");
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    result = usearch_open(pattern, 3, NULL, 0, NULL, NULL, &status);
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status) || result != NULL) {
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error: NULL arguments should produce an error and a NULL result\n");
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    result = usearch_openFromCollator(pattern, 3, NULL, 0, NULL, NULL,
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      &status);
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status) || result != NULL) {
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error: NULL arguments should produce an error and a NULL result\n");
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    result = usearch_open(pattern, 3, text, 6, NULL, NULL, &status);
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status) || result != NULL) {
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error: NULL arguments should produce an error and a NULL result\n");
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    result = usearch_openFromCollator(pattern, 3, text, 6, NULL, NULL,
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      &status);
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status) || result != NULL) {
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error: NULL arguments should produce an error and a NULL result\n");
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    result = usearch_open(pattern, 3, text, 6, "en_US", NULL, &status);
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status) || result == NULL) {
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Error: NULL break iterator is valid for opening search\n");
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else {
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_close(result);
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    result = usearch_openFromCollator(pattern, 3, text, 6, EN_US_, NULL,
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      &status);
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status) || result == NULL) {
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (EN_US_ == NULL) {
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("Opening collator failed.\n");
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error: NULL break iterator is valid for opening search\n");
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else {
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_close(result);
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_BREAK_ITERATION
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    result = usearch_open(pattern, 3, text, 6, "en_US", breakiter, &status);
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status) || result == NULL) {
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Error: Break iterator is valid for opening search\n");
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else {
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_close(result);
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    result = usearch_openFromCollator(pattern, 3, text, 6, EN_US_, breakiter,
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      &status);
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status) || result == NULL) {
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (EN_US_ == NULL) {
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("Opening collator failed.\n");
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error: Break iterator is valid for opening search\n");
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else {
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_close(result);
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubrk_close(breakiter);
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestInitialization(void)
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UErrorCode      status = U_ZERO_ERROR;
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UChar           pattern[512];
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar           text[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66};
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i = 0;
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UStringSearch  *result;
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* simple test on the pattern ce construction */
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pattern[0] = 0x41;
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pattern[1] = 0x42;
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    result = usearch_openFromCollator(pattern, 2, text, 3, EN_US_, NULL,
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      &status);
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening search %s\n", u_errorName(status));
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(result);
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* testing if an extremely large pattern will fail the initialization */
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i = 0; i < 512; i++) {
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      pattern[i] = 0x41;
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*uprv_memset(pattern, 0x41, 512);*/
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    result = usearch_openFromCollator(pattern, 512, text, 3, EN_US_, NULL,
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      &status);
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening search %s\n", u_errorName(status));
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(result);
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool assertEqualWithUStringSearch(      UStringSearch *strsrch,
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                          const SearchData     search)
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int         count       = 0;
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode  status      = U_ZERO_ERROR;
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t matchindex  = search.offset[count];
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t     textlength;
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar       matchtext[128];
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t     matchlength;
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t     nextStart;
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool       isOverlap;
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_ELEMENT_COMPARISON, search.elemCompare, &status);
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting USEARCH_ELEMENT_COMPARISON attribute %s\n", u_errorName(status));
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (usearch_getMatchedStart(strsrch) != USEARCH_DONE ||
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_getMatchedLength(strsrch) != 0) {
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error with the initialization of match start and length\n");
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* start of next matches */
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (U_SUCCESS(status) && matchindex >= 0) {
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        matchlength = search.size[count];
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_next(strsrch, &status);
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (matchindex != usearch_getMatchedStart(strsrch) ||
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            char *str = toCharString(usearch_getText(strsrch, &textlength));
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Text: %s\n", str);
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            str = toCharString(usearch_getPattern(strsrch, &textlength));
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Pattern: %s\n", str);
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error next match found at idx %d (len:%d); expected %d (len:%d)\n",
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    usearch_getMatchedStart(strsrch), usearch_getMatchedLength(strsrch),
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    matchindex, matchlength);
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return FALSE;
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (int32_t) matchlength || U_FAILURE(status) ||
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            memcmp(matchtext,
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   usearch_getText(strsrch, &textlength) + matchindex,
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   matchlength * sizeof(UChar)) != 0) {
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error getting next matched text\n");
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        matchindex = search.offset[count];
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_next(strsrch, &status);
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (usearch_getMatchedStart(strsrch) != USEARCH_DONE ||
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_getMatchedLength(strsrch) != 0) {
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char *str = toCharString(usearch_getText(strsrch, &textlength));
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Text: %s\n", str);
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        str = toCharString(usearch_getPattern(strsrch, &textlength));
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Pattern: %s\n", str);
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error next match found at %d (len:%d); expected <NO MATCH>\n",
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    usearch_getMatchedStart(strsrch),
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    usearch_getMatchedLength(strsrch));
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* start of previous matches */
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count = count == 0 ? 0 : count - 1;
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    matchindex = search.offset[count];
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (U_SUCCESS(status) && matchindex >= 0) {
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        matchlength = search.size[count];
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_previous(strsrch, &status);
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (matchindex != usearch_getMatchedStart(strsrch) ||
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            char *str = toCharString(usearch_getText(strsrch, &textlength));
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Text: %s\n", str);
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            str = toCharString(usearch_getPattern(strsrch, &textlength));
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Pattern: %s\n", str);
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error previous match found at %d (len:%d); expected %d (len:%d)\n",
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    usearch_getMatchedStart(strsrch), usearch_getMatchedLength(strsrch),
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    matchindex, matchlength);
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return FALSE;
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (int32_t) matchlength || U_FAILURE(status) ||
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            memcmp(matchtext,
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   usearch_getText(strsrch, &textlength) + matchindex,
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   matchlength * sizeof(UChar)) != 0) {
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error getting previous matched text\n");
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        matchindex = count > 0 ? search.offset[count - 1] : -1;
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count --;
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_previous(strsrch, &status);
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (usearch_getMatchedStart(strsrch) != USEARCH_DONE ||
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_getMatchedLength(strsrch) != 0) {
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        char *str = toCharString(usearch_getText(strsrch, &textlength));
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Text: %s\n", str);
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        str = toCharString(usearch_getPattern(strsrch, &textlength));
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Pattern: %s\n", str);
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error previous match found at %d (len:%d); expected <NO MATCH>\n",
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    usearch_getMatchedStart(strsrch),
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    usearch_getMatchedLength(strsrch));
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    isOverlap = (usearch_getAttribute(strsrch, USEARCH_OVERLAP) == USEARCH_ON);
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* start of following matches */
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count = 0;
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    matchindex  = search.offset[count];
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    nextStart = 0;
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (TRUE) {
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_following(strsrch, nextStart, &status);
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (matchindex < 0) {
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (usearch_getMatchedStart(strsrch) != USEARCH_DONE || usearch_getMatchedLength(strsrch) != 0) {
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                char *str = toCharString(usearch_getText(strsrch, &textlength));
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Text: %s\n", str);
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                str = toCharString(usearch_getPattern(strsrch, &textlength));
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Pattern: %s\n", str);
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Error following match starting at %d (overlap:%d) found at %d (len:%d); expected <NO MATCH>\n",
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            nextStart, isOverlap,
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            usearch_getMatchedStart(strsrch),
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            usearch_getMatchedLength(strsrch));
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return FALSE;
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* no more matches */
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        matchlength = search.size[count];
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (usearch_getMatchedStart(strsrch) != matchindex
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                || usearch_getMatchedLength(strsrch) != matchlength
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                || U_FAILURE(status)) {
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            char *str = toCharString(usearch_getText(strsrch, &textlength));
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Text: %s\n", str);
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            str = toCharString(usearch_getPattern(strsrch, &textlength));
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Pattern: %s\n", str);
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error following match starting at %d (overlap: %d) found at %d (len:%d); expected %d (len:%d)\n",
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        nextStart, isOverlap,
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        usearch_getMatchedStart(strsrch), usearch_getMatchedLength(strsrch),
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        matchindex, matchlength);
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return FALSE;
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (isOverlap || usearch_getMatchedLength(strsrch) == 0) {
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            nextStart = usearch_getMatchedStart(strsrch) + 1;
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            nextStart = usearch_getMatchedStart(strsrch) + usearch_getMatchedLength(strsrch);
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count++;
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        matchindex = search.offset[count];
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* start of preceding matches */
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count = -1; /* last non-negative offset index, could be -1 if no match */
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (search.offset[count + 1] >= 0) {
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count++;
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_getText(strsrch, &nextStart);
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (TRUE) {
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_preceding(strsrch, nextStart, &status);
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (count < 0) {
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (usearch_getMatchedStart(strsrch) != USEARCH_DONE || usearch_getMatchedLength(strsrch) != 0) {
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                char *str = toCharString(usearch_getText(strsrch, &textlength));
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Text: %s\n", str);
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                str = toCharString(usearch_getPattern(strsrch, &textlength));
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Pattern: %s\n", str);
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Error preceding match starting at %d (overlap: %d) found at %d (len:%d); expected <NO MATCH>\n",
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            nextStart, isOverlap,
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            usearch_getMatchedStart(strsrch),
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            usearch_getMatchedLength(strsrch));
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return FALSE;
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* no more matches */
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        matchindex = search.offset[count];
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        matchlength = search.size[count];
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (usearch_getMatchedStart(strsrch) != matchindex
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                || usearch_getMatchedLength(strsrch) != matchlength
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                || U_FAILURE(status)) {
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            char *str = toCharString(usearch_getText(strsrch, &textlength));
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Text: %s\n", str);
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            str = toCharString(usearch_getPattern(strsrch, &textlength));
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Pattern: %s\n", str);
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error preceding match starting at %d (overlap: %d) found at %d (len:%d); expected %d (len:%d)\n",
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        nextStart, isOverlap,
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        usearch_getMatchedStart(strsrch), usearch_getMatchedLength(strsrch),
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        matchindex, matchlength);
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return FALSE;
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        nextStart = matchindex;
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count--;
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_ELEMENT_COMPARISON, USEARCH_STANDARD_ELEMENT_COMPARISON, &status);
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return TRUE;
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool assertEqual(const SearchData search)
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode      status      = U_ZERO_ERROR;
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar           pattern[32];
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar           text[128];
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCollator      *collator = getCollator(search.collator);
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBreakIterator *breaker  = getBreakIterator(search.breaker);
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UStringSearch  *strsrch;
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CHECK_BREAK_BOOL(search.breaker);
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(search.text, text, 128);
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(search.pattern, pattern, 32);
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setStrength(collator, search.strength);
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       breaker, &status);
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening string search %s\n", u_errorName(status));
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, search)) {
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucol_setStrength(collator, UCOL_TERTIARY);
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_close(strsrch);
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setStrength(collator, UCOL_TERTIARY);
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(strsrch);
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return TRUE;
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool assertCanonicalEqual(const SearchData search)
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode      status      = U_ZERO_ERROR;
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar           pattern[32];
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar           text[128];
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCollator      *collator = getCollator(search.collator);
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBreakIterator *breaker  = getBreakIterator(search.breaker);
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UStringSearch  *strsrch;
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool           result = TRUE;
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CHECK_BREAK_BOOL(search.breaker);
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(search.text, text, 128);
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(search.pattern, pattern, 32);
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setStrength(collator, search.strength);
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       breaker, &status);
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &status);
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening string search %s\n", u_errorName(status));
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = FALSE;
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto bail;
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, search)) {
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucol_setStrength(collator, UCOL_TERTIARY);
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_close(strsrch);
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = FALSE;
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto bail;
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgbail:
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status);
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setStrength(collator, UCOL_TERTIARY);
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(strsrch);
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return result;
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool assertEqualWithAttribute(const SearchData            search,
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                            USearchAttributeValue canonical,
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                            USearchAttributeValue overlap)
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode      status      = U_ZERO_ERROR;
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar           pattern[32];
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar           text[128];
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCollator      *collator = getCollator(search.collator);
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBreakIterator *breaker  = getBreakIterator(search.breaker);
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UStringSearch  *strsrch;
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CHECK_BREAK_BOOL(search.breaker);
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(search.text, text, 128);
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(search.pattern, pattern, 32);
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setStrength(collator, search.strength);
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       breaker, &status);
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, canonical,
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &status);
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_OVERLAP, overlap, &status);
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening string search %s\n", u_errorName(status));
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return FALSE;
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, search)) {
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucol_setStrength(collator, UCOL_TERTIARY);
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_close(strsrch);
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return FALSE;
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setStrength(collator, UCOL_TERTIARY);
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(strsrch);
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return TRUE;
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBasic(void)
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int count = 0;
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (BASIC[count].text != NULL) {
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqual(BASIC[count])) {
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestNormExact(void)
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int count = 0;
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setAttribute(EN_US_, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting collation normalization %s\n",
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_errorName(status));
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (BASIC[count].text != NULL) {
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqual(BASIC[count])) {
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count = 0;
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (NORMEXACT[count].text != NULL) {
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqual(NORMEXACT[count])) {
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setAttribute(EN_US_, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status);
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count = 0;
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (NONNORMEXACT[count].text != NULL) {
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqual(NONNORMEXACT[count])) {
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestStrength(void)
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int count = 0;
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (STRENGTH[count].text != NULL) {
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqual(STRENGTH[count])) {
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBreakIterator(void) {
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode      status      = U_ZERO_ERROR;
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UStringSearch  *strsrch;
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar           text[128];
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar           pattern[32];
7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int             count = 0;
7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CHECK_BREAK("x");
7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_BREAK_ITERATION
7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (usearch_getBreakIterator(NULL) != NULL) {
7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Expected NULL breakiterator from NULL string search\n");
7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(BREAKITERATOREXACT[0].text, text, 128);
7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(BREAKITERATOREXACT[0].pattern, pattern, 32);
7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_, NULL,
7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       &status);
7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening string search %s\n", u_errorName(status));
7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTBREAKITERATOR;
7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setBreakIterator(strsrch, NULL, &status);
7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status) || usearch_getBreakIterator(strsrch) != NULL) {
7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error usearch_getBreakIterator returned wrong object");
7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTBREAKITERATOR;
7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setBreakIterator(strsrch, EN_CHARACTERBREAKER_, &status);
7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status) ||
7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_getBreakIterator(strsrch) != EN_CHARACTERBREAKER_) {
7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error usearch_getBreakIterator returned wrong object");
7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTBREAKITERATOR;
7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setBreakIterator(strsrch, EN_WORDBREAKER_, &status);
7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status) ||
7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_getBreakIterator(strsrch) != EN_WORDBREAKER_) {
7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error usearch_getBreakIterator returned wrong object");
7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTBREAKITERATOR;
7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(strsrch);
7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count = 0;
7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (count < 4) {
7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* 0-3 test are fixed */
7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const SearchData     *search   = &(BREAKITERATOREXACT[count]);
7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UCollator      *collator = getCollator(search->collator);
7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UBreakIterator *breaker  = getBreakIterator(search->breaker);
7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(search->text, text, 128);
7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(search->pattern, pattern, 32);
7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucol_setStrength(collator, search->strength);
7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                           breaker, &status);
7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status) ||
7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_getBreakIterator(strsrch) != breaker) {
7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error setting break iterator\n");
7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (strsrch != NULL) {
7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                usearch_close(strsrch);
7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqualWithUStringSearch(strsrch, *search)) {
7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucol_setStrength(collator, UCOL_TERTIARY);
7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_close(strsrch);
7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            goto ENDTESTBREAKITERATOR;
7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        search   = &(BREAKITERATOREXACT[count + 1]);
7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        breaker  = getBreakIterator(search->breaker);
7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setBreakIterator(strsrch, breaker, &status);
7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status) || usearch_getBreakIterator(strsrch) != breaker) {
8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error setting break iterator\n");
8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_close(strsrch);
8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            goto ENDTESTBREAKITERATOR;
8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_reset(strsrch);
8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqualWithUStringSearch(strsrch, *search)) {
8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_close(strsrch);
8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            goto ENDTESTBREAKITERATOR;
8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_close(strsrch);
8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count += 2;
8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count = 0;
8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (BREAKITERATOREXACT[count].text != NULL) {
8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         if (!assertEqual(BREAKITERATOREXACT[count])) {
8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             log_err("Error at test number %d\n", count);
8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             goto ENDTESTBREAKITERATOR;
8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         }
8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         count ++;
8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgENDTESTBREAKITERATOR:
8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestVariable(void)
8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int count = 0;
8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setAttribute(EN_US_, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status);
8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting collation alternate attribute %s\n",
8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_errorName(status));
8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (VARIABLE[count].text != NULL) {
8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("variable %d\n", count);
8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqual(VARIABLE[count])) {
8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setAttribute(EN_US_, UCOL_ALTERNATE_HANDLING,
8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      UCOL_NON_IGNORABLE, &status);
8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestOverlap(void)
8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int count = 0;
8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (OVERLAP[count].text != NULL) {
8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqualWithAttribute(OVERLAP[count], USEARCH_OFF,
8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      USEARCH_ON)) {
8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at overlap test number %d\n", count);
8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count = 0;
8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (NONOVERLAP[count].text != NULL) {
8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqual(NONOVERLAP[count])) {
8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at non overlap test number %d\n", count);
8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count = 0;
8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (count < 1) {
8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UChar           pattern[32];
8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UChar           text[128];
8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const SearchData     *search   = &(OVERLAP[count]);
8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UCollator      *collator = getCollator(search->collator);
8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UStringSearch  *strsrch;
8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              status   = U_ZERO_ERROR;
8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(search->text, text, 128);
8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(search->pattern, pattern, 32);
8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                           NULL, &status);
8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(status == U_FILE_ACCESS_ERROR) {
8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          log_data_err("Is your data around?\n");
8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          return;
8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if(U_FAILURE(status)) {
8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          log_err("Error opening searcher\n");
8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          return;
8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_ON, &status);
8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status) ||
8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_ON) {
9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error setting overlap option\n");
9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqualWithUStringSearch(strsrch, *search)) {
9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_close(strsrch);
9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        search   = &(NONOVERLAP[count]);
9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_OFF, &status);
9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status) ||
9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF) {
9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error setting overlap option\n");
9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_reset(strsrch);
9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqualWithUStringSearch(strsrch, *search)) {
9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_close(strsrch);
9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         }
9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_close(strsrch);
9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCollator(void)
9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test collator that thinks "o" and "p" are the same thing */
9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UChar          rules[32];
9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UCollator     *tailored = NULL;
9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UErrorCode     status   = U_ZERO_ERROR;
9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UChar          pattern[32];
9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UChar          text[128];
9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UStringSearch *strsrch;
9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    text[0] = 0x41;
9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    text[1] = 0x42;
9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    text[2] = 0x43;
9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    text[3] = 0x44;
9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    text[4] = 0x45;
9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pattern[0] = 0x62;
9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pattern[1] = 0x63;
9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch  = usearch_open(pattern, 2, text, 5, "en_US",  NULL,  &status);
9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status == U_FILE_ACCESS_ERROR) {
9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_data_err("Is your data around?\n");
9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(U_FAILURE(status)) {
9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_err("Error opening searcher\n");
9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    tailored = usearch_getCollator(strsrch);
9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (usearch_next(strsrch, &status) != -1) {
9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error: Found case insensitive match, when we shouldn't\n");
9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setStrength(tailored, UCOL_PRIMARY);
9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_reset(strsrch);
9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (usearch_next(strsrch, &status) != 1) {
9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error: Found case insensitive match not found\n");
9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(strsrch);
9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (usearch_getCollator(NULL) != NULL) {
9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Expected NULL collator from NULL string search\n");
9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(COLLATOR[0].text, text, 128);
9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(COLLATOR[0].pattern, pattern, 32);
9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       NULL, &status);
9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening string search %s\n", u_errorName(status));
9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, COLLATOR[0])) {
9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTCOLLATOR;
9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(TESTCOLLATORRULE, rules, 32);
9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    tailored = ucol_openRules(rules, -1, UCOL_ON, COLLATOR[1].strength,
9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              NULL, &status);
9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening rule based collator %s\n", u_errorName(status));
9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setCollator(strsrch, tailored, &status);
9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status) || usearch_getCollator(strsrch) != tailored) {
9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting rule based collator\n");
9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_reset(strsrch);
9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, COLLATOR[1])) {
9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTCOLLATOR;
9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setCollator(strsrch, EN_US_, &status);
9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_reset(strsrch);
9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status) || usearch_getCollator(strsrch) != EN_US_) {
9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting rule based collator\n");
9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, COLLATOR[0])) {
9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTCOLLATOR;
10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgENDTESTCOLLATOR:
10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(strsrch);
10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (tailored != NULL) {
10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucol_close(tailored);
10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestPattern(void)
10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UStringSearch *strsrch;
10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UChar          pattern[32];
10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UChar          bigpattern[512];
10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UChar          text[128];
10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar         *temp;
10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          int32_t        templength;
10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UErrorCode     status = U_ZERO_ERROR;
10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (usearch_getPattern(NULL, &templength) != NULL) {
10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error NULL string search expected returning NULL pattern\n");
10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setPattern(NULL, pattern, 3, &status);
10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error expected setting pattern in NULL strings search\n");
10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(PATTERN[0].text, text, 128);
10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(PATTERN[0].pattern, pattern, 32);
10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setStrength(EN_US_, PATTERN[0].strength);
10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       NULL, &status);
10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status == U_FILE_ACCESS_ERROR) {
10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_data_err("Is your data around?\n");
10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(U_FAILURE(status)) {
10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_err("Error opening searcher\n");
10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setPattern(strsrch, NULL, 3, &status);
10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error expected setting NULL pattern in strings search\n");
10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setPattern(strsrch, pattern, 0, &status);
10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error expected setting pattern with length 0 in strings search\n");
10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening string search %s\n", u_errorName(status));
10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    temp = usearch_getPattern(strsrch, &templength);
10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (u_strcmp(pattern, temp) != 0) {
10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting pattern\n");
10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, PATTERN[0])) {
10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(PATTERN[1].pattern, pattern, 32);
10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setPattern(strsrch, pattern, -1, &status);
10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    temp = usearch_getPattern(strsrch, &templength);
10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (u_strcmp(pattern, temp) != 0) {
10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting pattern\n");
10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_reset(strsrch);
10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting pattern %s\n", u_errorName(status));
10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, PATTERN[1])) {
10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(PATTERN[0].pattern, pattern, 32);
10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setPattern(strsrch, pattern, -1, &status);
10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    temp = usearch_getPattern(strsrch, &templength);
10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (u_strcmp(pattern, temp) != 0) {
10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting pattern\n");
10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_reset(strsrch);
10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting pattern %s\n", u_errorName(status));
10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, PATTERN[0])) {
10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* enormous pattern size to see if this crashes */
11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (templength = 0; templength != 512; templength ++) {
11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        bigpattern[templength] = 0x61;
11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bigpattern[511] = 0;
11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setPattern(strsrch, bigpattern, -1, &status);
11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting pattern with size 512, %s \n",
11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_errorName(status));
11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgENDTESTPATTERN:
11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setStrength(EN_US_, UCOL_TERTIARY);
11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (strsrch != NULL) {
11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_close(strsrch);
11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestText(void)
11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UStringSearch *strsrch;
11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UChar          pattern[32];
11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UChar          text[128];
11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar         *temp;
11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          int32_t        templength;
11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UErrorCode     status = U_ZERO_ERROR;
11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(TEXT[0].text, text, 128);
11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(TEXT[0].pattern, pattern, 32);
11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (usearch_getText(NULL, &templength) != NULL) {
11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error NULL string search should return NULL text\n");
11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setText(NULL, text, 10, &status);
11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error NULL string search should have an error when setting text\n");
11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       NULL, &status);
11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening string search %s\n", u_errorName(status));
11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    temp = usearch_getText(strsrch, &templength);
11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (u_strcmp(text, temp) != 0) {
11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting text\n");
11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, TEXT[0])) {
11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(TEXT[1].text, text, 32);
11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setText(strsrch, text, -1, &status);
11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    temp = usearch_getText(strsrch, &templength);
11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (u_strcmp(text, temp) != 0) {
11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting text\n");
11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting text %s\n", u_errorName(status));
11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, TEXT[1])) {
11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(TEXT[0].text, text, 32);
11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setText(strsrch, text, -1, &status);
11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    temp = usearch_getText(strsrch, &templength);
11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (u_strcmp(text, temp) != 0) {
11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting text\n");
11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting pattern %s\n", u_errorName(status));
11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, TEXT[0])) {
11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgENDTESTPATTERN:
11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (strsrch != NULL) {
11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_close(strsrch);
11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCompositeBoundaries(void)
11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int count = 0;
11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (COMPOSITEBOUNDARIES[count].text != NULL) {
12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("composite %d\n", count);
12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqual(COMPOSITEBOUNDARIES[count])) {
12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestGetSetOffset(void)
12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int            searchDataIndex   = 0;
12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          pattern[32];
12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          text[128];
12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode     status  = U_ZERO_ERROR;
12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UStringSearch *strsrch;
12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(pattern, 0, 32*sizeof(UChar));
12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(text, 0, 128*sizeof(UChar));
12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (usearch_getOffset(NULL) != USEARCH_DONE) {
12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("usearch_getOffset(NULL) expected USEARCH_DONE\n");
12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch = usearch_openFromCollator(pattern, 16, text, 32, EN_US_, NULL,
12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       &status);
12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* testing out of bounds error */
12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setOffset(strsrch, -1, &status);
12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error expecting set offset error\n");
12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setOffset(strsrch, 128, &status);
12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error expecting set offset error\n");
12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (BASIC[searchDataIndex].text != NULL) {
12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int         count       = 0;
12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        SearchData  search      = BASIC[searchDataIndex ++];
12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t matchindex  = search.offset[count];
12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t     textlength;
12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(search.text, text, 128);
12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(search.pattern, pattern, 32);
12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setText(strsrch, text, -1, &status);
12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setPattern(strsrch, pattern, -1, &status);
12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucol_setStrength(usearch_getCollator(strsrch), search.strength);
12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_reset(strsrch);
12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        while (U_SUCCESS(status) && matchindex >= 0) {
12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uint32_t matchlength = search.size[count];
12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_next(strsrch, &status);
12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (matchindex != usearch_getMatchedStart(strsrch) ||
12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                char *str = toCharString(usearch_getText(strsrch,
12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                         &textlength));
12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Text: %s\n", str);
12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                str = toCharString(usearch_getPattern(strsrch, &textlength));
12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Pattern: %s\n", str);
12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Error match found at %d %d\n",
12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        usearch_getMatchedStart(strsrch),
12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        usearch_getMatchedLength(strsrch));
12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return;
12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_setOffset(strsrch, matchindex + matchlength, &status);
12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_previous(strsrch, &status);
12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (matchindex != usearch_getMatchedStart(strsrch) ||
12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                char *str = toCharString(usearch_getText(strsrch,
12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                         &textlength));
12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Text: %s\n", str);
12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                str = toCharString(usearch_getPattern(strsrch, &textlength));
12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Pattern: %s\n", str);
12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Error match found at %d %d\n",
12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        usearch_getMatchedStart(strsrch),
12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        usearch_getMatchedLength(strsrch));
12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return;
12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_setOffset(strsrch, matchindex + matchlength, &status);
12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            matchindex = search.offset[count + 1] == -1 ? -1 :
12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         search.offset[count + 2];
12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (search.offset[count + 1] != -1) {
12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                usearch_setOffset(strsrch, search.offset[count + 1] + 1,
12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  &status);
12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (usearch_getOffset(strsrch) != search.offset[count + 1] + 1) {
12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("Error setting offset\n");
12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    return;
12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            count += 2;
12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_next(strsrch, &status);
12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (usearch_getMatchedStart(strsrch) != USEARCH_DONE) {
13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            char *str = toCharString(usearch_getText(strsrch, &textlength));
13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Text: %s\n", str);
13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            str = toCharString(usearch_getPattern(strsrch, &textlength));
13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Pattern: %s\n", str);
13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error match found at %d %d\n",
13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        usearch_getMatchedStart(strsrch),
13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        usearch_getMatchedLength(strsrch));
13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setStrength(usearch_getCollator(strsrch), UCOL_TERTIARY);
13116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(strsrch);
13126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
13136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestGetSetAttribute(void)
13166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
13176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode      status    = U_ZERO_ERROR;
13186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar           pattern[32];
13196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar           text[128];
13206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UStringSearch  *strsrch;
13216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(pattern, 0, 32*sizeof(UChar));
13236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(text, 0, 128*sizeof(UChar));
13246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
13266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
13276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
13286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
13296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (usearch_getAttribute(NULL, USEARCH_OVERLAP) != USEARCH_DEFAULT ||
13316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_getAttribute(NULL, USEARCH_CANONICAL_MATCH) !=
13326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                         USEARCH_DEFAULT) {
13336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err(
13346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "Attributes for NULL string search should be USEARCH_DEFAULT\n");
13356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch = usearch_openFromCollator(pattern, 16, text, 32, EN_US_, NULL,
13376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       &status);
13386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
13396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening search %s\n", u_errorName(status));
13406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
13416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_DEFAULT, &status);
13446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status) ||
13456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF) {
13466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting overlap to the default\n");
13476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_ON, &status);
13496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status) ||
13506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_ON) {
13516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting overlap true\n");
13526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_OFF, &status);
13546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status) ||
13556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF) {
13566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting overlap false\n");
13576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_OVERLAP,
13596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         USEARCH_ATTRIBUTE_VALUE_COUNT, &status);
13606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
13616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting overlap to illegal value\n");
13626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
13646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_DEFAULT,
13656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &status);
13666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status) ||
13676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_getAttribute(strsrch, USEARCH_CANONICAL_MATCH) !=
13686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                        USEARCH_OFF) {
13696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting canonical match to the default\n");
13706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
13726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &status);
13736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status) ||
13746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_getAttribute(strsrch, USEARCH_CANONICAL_MATCH) !=
13756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                         USEARCH_ON) {
13766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting canonical match true\n");
13776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_OFF,
13796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &status);
13806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status) ||
13816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_getAttribute(strsrch, USEARCH_CANONICAL_MATCH) !=
13826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                        USEARCH_OFF) {
13836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting canonical match false\n");
13846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH,
13866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         USEARCH_ATTRIBUTE_VALUE_COUNT, &status);
13876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
13886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting canonical match to illegal value\n");
13896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
13916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_ATTRIBUTE_COUNT, USEARCH_DEFAULT,
13926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &status);
13936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
13946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting illegal attribute success\n");
13956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(strsrch);
13986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
13996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
14006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestGetMatch(void)
14026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
14036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int            count       = 0;
14046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode     status      = U_ZERO_ERROR;
14056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          text[128];
14066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          pattern[32];
14076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SearchData     search      = MATCH[0];
14086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t    matchindex  = search.offset[count];
14096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UStringSearch *strsrch;
14106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t        textlength;
14116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          matchtext[128];
14126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
14146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
14156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
14166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
14176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (usearch_getMatchedStart(NULL) != USEARCH_DONE ||
14206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_getMatchedLength(NULL) != USEARCH_DONE) {
14216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err(
14226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   "Expected start and length of NULL string search should be USEARCH_DONE\n");
14236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(search.text, text, 128);
14266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(search.pattern, pattern, 32);
14276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
14286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       NULL, &status);
14296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
14306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening string search %s\n", u_errorName(status));
14316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (strsrch != NULL) {
14326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_close(strsrch);
14336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
14356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (U_SUCCESS(status) && matchindex >= 0) {
14386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t matchlength = search.size[count];
14396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_next(strsrch, &status);
14406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (matchindex != usearch_getMatchedStart(strsrch) ||
14416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            matchlength != usearch_getMatchedLength(strsrch)) {
14426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            char *str = toCharString(usearch_getText(strsrch, &textlength));
14436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Text: %s\n", str);
14446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            str = toCharString(usearch_getPattern(strsrch, &textlength));
14456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Pattern: %s\n", str);
14466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error match found at %d %d\n",
14476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    usearch_getMatchedStart(strsrch),
14486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    usearch_getMatchedLength(strsrch));
14496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
14506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
14526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
14546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (usearch_getMatchedText(NULL, matchtext, 128, &status) !=
14556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            USEARCH_DONE || U_SUCCESS(status)){
14566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error expecting errors with NULL string search\n");
14576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
14596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (usearch_getMatchedText(strsrch, NULL, 0, &status) !=
14606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (int32_t)matchlength || U_SUCCESS(status)){
14616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error pre-flighting match length\n");
14626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
14646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (usearch_getMatchedText(strsrch, matchtext, 0, &status) !=
14656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (int32_t)matchlength || U_SUCCESS(status)){
14666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error getting match text with buffer size 0\n");
14676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
14696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (usearch_getMatchedText(strsrch, matchtext, matchlength, &status)
14706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            != (int32_t)matchlength || matchtext[matchlength - 1] == 0 ||
14716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            U_FAILURE(status)){
14726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error getting match text with exact size\n");
14736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
14756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
14766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (int32_t) matchlength || U_FAILURE(status) ||
14776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            memcmp(matchtext,
14786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   usearch_getText(strsrch, &textlength) + matchindex,
14796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   matchlength * sizeof(UChar)) != 0 ||
14806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            matchtext[matchlength] != 0) {
14816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error getting matched text\n");
14826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        matchindex = search.offset[count];
14856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
14876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_next(strsrch, &status);
14886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (usearch_getMatchedStart(strsrch)  != USEARCH_DONE ||
14896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_getMatchedLength(strsrch) != 0) {
14906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error end of match not found\n");
14916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
14936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
14946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        USEARCH_DONE) {
14956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error getting null matches\n");
14966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(strsrch);
14986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
14996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
15006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestSetMatch(void)
15026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
15036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int            count       = 0;
15046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
15056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
15066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
15076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
15086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
15096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (MATCH[count].text != NULL) {
15116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        SearchData     search = MATCH[count];
15126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int            size   = 0;
15136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int            offsetIndex = 0;
15146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar          text[128];
15156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar          pattern[32];
15166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UStringSearch *strsrch;
15176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
15186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (usearch_first(NULL, &status) != USEARCH_DONE ||
15206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_last(NULL, &status) != USEARCH_DONE) {
15216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error getting the first and last match of a NULL string search\n");
15226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
15236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(search.text, text, 128);
15246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(search.pattern, pattern, 32);
15256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
15266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                           NULL, &status);
15276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
15286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error opening string search %s\n", u_errorName(status));
15296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (strsrch != NULL) {
15306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                usearch_close(strsrch);
15316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
15326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
15336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
15346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        size = 0;
15366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        while (search.offset[size] != -1) {
15376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            size ++;
15386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
15396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (usearch_first(strsrch, &status) != search.offset[0] ||
15416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            U_FAILURE(status)) {
15426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error getting first match\n");
15436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
15446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (usearch_last(strsrch, &status) != search.offset[size -1] ||
15456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            U_FAILURE(status)) {
15466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error getting last match\n");
15476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
15486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        while (offsetIndex < size) {
15506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (offsetIndex + 2 < size) {
15516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (usearch_following(strsrch, search.offset[offsetIndex + 2] - 1,
15526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      &status) != search.offset[offsetIndex + 2] ||
15536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    U_FAILURE(status)) {
15546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("Error getting following match at index %d\n",
15556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            search.offset[offsetIndex + 2] - 1);
15566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
15576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
15586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (offsetIndex + 1 < size) {
15596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (usearch_preceding(strsrch, search.offset[offsetIndex + 1] +
15606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                               search.size[offsetIndex + 1] + 1,
15616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      &status) != search.offset[offsetIndex + 1] ||
15626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    U_FAILURE(status)) {
15636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("Error getting preceeding match at index %d\n",
15646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            search.offset[offsetIndex + 1] + 1);
15656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
15666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
15676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            offsetIndex += 2;
15686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
15696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
15706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (usearch_following(strsrch, u_strlen(text), &status) !=
15716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            USEARCH_DONE) {
15726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error expecting out of bounds match\n");
15736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
15746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (usearch_preceding(strsrch, 0, &status) != USEARCH_DONE) {
15756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error expecting out of bounds match\n");
15766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
15776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
15786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_close(strsrch);
15796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
15816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
15826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestReset(void)
15846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
15856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode     status    = U_ZERO_ERROR;
15866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          text[]    = {0x66, 0x69, 0x73, 0x68, 0x20,
15876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                0x66, 0x69, 0x73, 0x68};
15886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          pattern[] = {0x73};
15896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UStringSearch *strsrch;
15906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
15926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
15936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
15946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
15956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch = usearch_openFromCollator(pattern, 1, text, 9,
15976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                      EN_US_, NULL, &status);
15986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
15996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening string search %s\n", u_errorName(status));
16006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (strsrch != NULL) {
16016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_close(strsrch);
16026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
16036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
16046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_ON, &status);
16066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
16076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &status);
16086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setOffset(strsrch, 9, &status);
16096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
16106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting attributes and offsets\n");
16116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else {
16136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_reset(strsrch);
16146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF ||
16156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_getAttribute(strsrch, USEARCH_CANONICAL_MATCH) !=
16166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                 USEARCH_OFF ||
16176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_getOffset(strsrch) != 0 ||
16186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_getMatchedLength(strsrch) != 0 ||
16196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_getMatchedStart(strsrch) != USEARCH_DONE) {
16206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error resetting string search\n");
16216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
16226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_previous(strsrch, &status);
16236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (usearch_getMatchedStart(strsrch) != 7 ||
16246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_getMatchedLength(strsrch) != 1) {
16256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error resetting string search\n");
16266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
16276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(strsrch);
16296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
16306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestSupplementary(void)
16336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
16346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int count = 0;
16356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
16366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
16376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
16386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
16396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
16406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (SUPPLEMENTARY[count].text != NULL) {
16426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqual(SUPPLEMENTARY[count])) {
16436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
16446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
16456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
16466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
16486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestContraction(void)
16516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
16526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          rules[128];
16536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          pattern[128];
16546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          text[128];
16556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCollator     *collator;
16566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode     status = U_ZERO_ERROR;
16576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int            count = 0;
16586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UStringSearch *strsrch;
16596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(rules, 0, 128*sizeof(UChar));
16606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(pattern, 0, 128*sizeof(UChar));
16616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(text, 0, 128*sizeof(UChar));
16626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(CONTRACTIONRULE, rules, 128);
16646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    collator = ucol_openRules(rules, u_strlen(rules), UCOL_ON,
16656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              UCOL_TERTIARY, NULL, &status);
16666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status == U_FILE_ACCESS_ERROR) {
16676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_data_err("Is your data around?\n");
16686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
16696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(U_FAILURE(status)) {
16706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_err("Error opening collator %s\n", u_errorName(status));
16716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
16726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch = usearch_openFromCollator(pattern, 1, text, 1, collator, NULL,
16746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       &status);
16756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
16766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening string search %s\n", u_errorName(status));
16776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (CONTRACTION[count].text != NULL) {
16806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(CONTRACTION[count].text, text, 128);
16816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(CONTRACTION[count].pattern, pattern, 128);
16826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setText(strsrch, text, -1, &status);
16836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setPattern(strsrch, pattern, -1, &status);
16846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqualWithUStringSearch(strsrch, CONTRACTION[count])) {
16856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
16866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
16876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
16886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(strsrch);
16906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_close(collator);
16916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestIgnorable(void)
16946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
16956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          rules[128];
16966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          pattern[128];
16976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          text[128];
16986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCollator     *collator;
16996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode     status = U_ZERO_ERROR;
17006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UStringSearch *strsrch;
17016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t       count = 0;
17026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(rules, 0, 128*sizeof(UChar));
17046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(pattern, 0, 128*sizeof(UChar));
17056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(text, 0, 128*sizeof(UChar));
17066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(IGNORABLERULE, rules, 128);
17086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    collator = ucol_openRules(rules, u_strlen(rules), UCOL_ON,
17096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              IGNORABLE[count].strength, NULL, &status);
17106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status == U_FILE_ACCESS_ERROR) {
17116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_data_err("Is your data around?\n");
17126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
17136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(U_FAILURE(status)) {
17146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening collator %s\n", u_errorName(status));
17156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
17166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch = usearch_openFromCollator(pattern, 1, text, 1, collator, NULL,
17186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       &status);
17196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
17206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening string search %s\n", u_errorName(status));
17216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (IGNORABLE[count].text != NULL) {
17246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(IGNORABLE[count].text, text, 128);
17256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(IGNORABLE[count].pattern, pattern, 128);
17266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setText(strsrch, text, -1, &status);
17276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setPattern(strsrch, pattern, -1, &status);
17286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqualWithUStringSearch(strsrch, IGNORABLE[count])) {
17296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
17306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
17326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(strsrch);
17346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_close(collator);
17356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
17366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestDiacriticMatch(void)
17386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
17396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          pattern[128];
17406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          text[128];
17416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode     status = U_ZERO_ERROR;
17426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UStringSearch *strsrch = NULL;
17436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCollator *coll = NULL;
17446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint32_t       count = 0;
17456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SearchData search;
17466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(pattern, 0, 128*sizeof(UChar));
17486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(text, 0, 128*sizeof(UChar));
17496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch = usearch_open(pattern, 1, text, 1, uloc_getDefault(), NULL, &status);
17516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
17526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Error opening string search %s\n", u_errorName(status));
17536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
17546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    search = DIACRITICMATCH[count];
17576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (search.text != NULL) {
17586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (search.collator != NULL) {
17596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            coll = ucol_openFromShortString(search.collator, FALSE, NULL, &status);
17606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
17616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* Always use "en_US" because some of these tests fail in Danish locales. */
17626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            coll = ucol_open("en_US"/*uloc_getDefault()*/, &status);
17636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucol_setStrength(coll, search.strength);
17646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
17666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error opening string search collator(\"%s\") %s\n", search.collator, u_errorName(status));
17676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
17686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setCollator(strsrch, coll, &status);
17716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
17726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error setting string search collator %s\n", u_errorName(status));
17736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
17746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(search.text, text, 128);
17776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(search.pattern, pattern, 128);
17786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setText(strsrch, text, -1, &status);
17796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setPattern(strsrch, pattern, -1, &status);
17806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqualWithUStringSearch(strsrch, search)) {
17816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
17826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucol_close(coll);
17846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        search = DIACRITICMATCH[++count];
17866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(strsrch);
17886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
17896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCanonical(void)
17916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
17926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int count = 0;
17936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
17946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
17956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
17966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
17976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
17986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (BASICCANONICAL[count].text != NULL) {
18006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertCanonicalEqual(BASICCANONICAL[count])) {
18016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
18026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
18036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
18046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
18066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
18076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestNormCanonical(void)
18096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
18106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int count = 0;
18116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
18126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
18136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
18146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
18156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
18166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setAttribute(EN_US_, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
18186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count = 0;
18196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (NORMCANONICAL[count].text != NULL) {
18206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertCanonicalEqual(NORMCANONICAL[count])) {
18216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
18226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
18236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
18246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setAttribute(EN_US_, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status);
18266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
18276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
18286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestStrengthCanonical(void)
18306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
18316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int count = 0;
18326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
18336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
18346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
18356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
18366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
18376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (STRENGTHCANONICAL[count].text != NULL) {
18396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertCanonicalEqual(STRENGTHCANONICAL[count])) {
18406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
18416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
18426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
18436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
18456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
18466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBreakIteratorCanonical(void) {
18486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode      status      = U_ZERO_ERROR;
18496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int             count = 0;
18506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CHECK_BREAK("x");
18526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_BREAK_ITERATION
18546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
18566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
18576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
18586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
18596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (count < 4) {
18616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* 0-3 test are fixed */
18626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UChar           pattern[32];
18636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UChar           text[128];
18646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const SearchData     *search   = &(BREAKITERATORCANONICAL[count]);
18656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UCollator      *collator = getCollator(search->collator);
18666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UBreakIterator *breaker  = getBreakIterator(search->breaker);
18676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UStringSearch  *strsrch;
18686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(search->text, text, 128);
18706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(search->pattern, pattern, 32);
18716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucol_setStrength(collator, search->strength);
18726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
18746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                           breaker, &status);
18756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(status == U_FILE_ACCESS_ERROR) {
18766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("Is your data around?\n");
18776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            goto ENDTESTBREAKITERATOR;
18786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if(U_FAILURE(status)) {
18796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error opening searcher\n");
18806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            goto ENDTESTBREAKITERATOR;
18816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
18826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
18836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             &status);
18846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status) ||
18856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_getBreakIterator(strsrch) != breaker) {
18866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error setting break iterator\n");
18876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_close(strsrch);
18886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            goto ENDTESTBREAKITERATOR;
18896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
18906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqualWithUStringSearch(strsrch, *search)) {
18916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucol_setStrength(collator, UCOL_TERTIARY);
18926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_close(strsrch);
18936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            goto ENDTESTBREAKITERATOR;
18946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
18956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        search   = &(BREAKITERATOREXACT[count + 1]);
18966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        breaker  = getBreakIterator(search->breaker);
18976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setBreakIterator(strsrch, breaker, &status);
18986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status) || usearch_getBreakIterator(strsrch) != breaker) {
18996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error setting break iterator\n");
19006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_close(strsrch);
19016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            goto ENDTESTBREAKITERATOR;
19026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
19036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_reset(strsrch);
19046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
19056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             &status);
19066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqualWithUStringSearch(strsrch, *search)) {
19076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
19086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_close(strsrch);
19096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            goto ENDTESTBREAKITERATOR;
19106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
19116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_close(strsrch);
19126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count += 2;
19136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count = 0;
19156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (BREAKITERATORCANONICAL[count].text != NULL) {
19166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         if (!assertEqual(BREAKITERATORCANONICAL[count])) {
19176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             log_err("Error at test number %d\n", count);
19186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             goto ENDTESTBREAKITERATOR;
19196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         }
19206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         count ++;
19216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgENDTESTBREAKITERATOR:
19246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
19256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
19266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
19276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestVariableCanonical(void)
19296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
19306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int count = 0;
19316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
19326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
19336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
19346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
19356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
19366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setAttribute(EN_US_, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status);
19386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
19396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting collation alternate attribute %s\n",
19406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_errorName(status));
19416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (VARIABLE[count].text != NULL) {
19436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("variable %d\n", count);
19446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertCanonicalEqual(VARIABLE[count])) {
19456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
19466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
19476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
19486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setAttribute(EN_US_, UCOL_ALTERNATE_HANDLING,
19506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      UCOL_NON_IGNORABLE, &status);
19516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
19526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
19536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestOverlapCanonical(void)
19556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
19566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int count = 0;
19576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
19586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
19596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
19606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
19616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
19626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (OVERLAPCANONICAL[count].text != NULL) {
19646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqualWithAttribute(OVERLAPCANONICAL[count], USEARCH_ON,
19656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      USEARCH_ON)) {
19666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at overlap test number %d\n", count);
19676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
19686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
19696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count = 0;
19716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (NONOVERLAP[count].text != NULL) {
19726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertCanonicalEqual(NONOVERLAPCANONICAL[count])) {
19736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at non overlap test number %d\n", count);
19746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
19756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
19766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count = 0;
19796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (count < 1) {
19806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UChar           pattern[32];
19816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UChar           text[128];
19826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const SearchData     *search   = &(OVERLAPCANONICAL[count]);
19836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UCollator      *collator = getCollator(search->collator);
19846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UStringSearch  *strsrch;
19856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              status   = U_ZERO_ERROR;
19866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(search->text, text, 128);
19886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(search->pattern, pattern, 32);
19896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        strsrch = usearch_openFromCollator(pattern, -1, text, -1, collator,
19906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                           NULL, &status);
19916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(status == U_FILE_ACCESS_ERROR) {
19926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          log_data_err("Is your data around?\n");
19936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          return;
19946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if(U_FAILURE(status)) {
19956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          log_err("Error opening searcher\n");
19966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          return;
19976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
19986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
19996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             &status);
20006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_ON, &status);
20016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status) ||
20026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_ON) {
20036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error setting overlap option\n");
20046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
20056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqualWithUStringSearch(strsrch, *search)) {
20066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_close(strsrch);
20076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
20086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
20096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        search   = &(NONOVERLAPCANONICAL[count]);
20106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setAttribute(strsrch, USEARCH_OVERLAP, USEARCH_OFF, &status);
20116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status) ||
20126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_getAttribute(strsrch, USEARCH_OVERLAP) != USEARCH_OFF) {
20136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error setting overlap option\n");
20146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
20156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_reset(strsrch);
20166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqualWithUStringSearch(strsrch, *search)) {
20176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_close(strsrch);
20186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
20196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         }
20206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
20226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_close(strsrch);
20236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
20256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
20266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCollatorCanonical(void)
20286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
20296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test collator that thinks "o" and "p" are the same thing */
20306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UChar          rules[32];
20316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UCollator     *tailored = NULL;
20326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UErrorCode     status = U_ZERO_ERROR;
20336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UChar          pattern[32];
20346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UChar          text[128];
20356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UStringSearch *strsrch;
20366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
20386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
20396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
20406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
20416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(COLLATORCANONICAL[0].text, text, 128);
20436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(COLLATORCANONICAL[0].pattern, pattern, 32);
20446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
20466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       NULL, &status);
20476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status == U_FILE_ACCESS_ERROR) {
20486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_data_err("Is your data around?\n");
20496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
20506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(U_FAILURE(status)) {
20516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_err("Error opening searcher\n");
20526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
20536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
20556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &status);
20566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
20576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening string search %s\n", u_errorName(status));
20586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, COLLATORCANONICAL[0])) {
20606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTCOLLATOR;
20616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(TESTCOLLATORRULE, rules, 32);
20646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    tailored = ucol_openRules(rules, -1, UCOL_ON,
20656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              COLLATORCANONICAL[1].strength, NULL, &status);
20666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
20676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening rule based collator %s\n", u_errorName(status));
20686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setCollator(strsrch, tailored, &status);
20716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status) || usearch_getCollator(strsrch) != tailored) {
20726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting rule based collator\n");
20736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_reset(strsrch);
20756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
20766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &status);
20776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, COLLATORCANONICAL[1])) {
20786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTCOLLATOR;
20796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setCollator(strsrch, EN_US_, &status);
20826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_reset(strsrch);
20836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
20846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &status);
20856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status) || usearch_getCollator(strsrch) != EN_US_) {
20866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting rule based collator\n");
20876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, COLLATORCANONICAL[0])) {
20896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTCOLLATOR;
20906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgENDTESTCOLLATOR:
20936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(strsrch);
20946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (tailored != NULL) {
20956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucol_close(tailored);
20966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
20986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
20996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestPatternCanonical(void)
21016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
21026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UStringSearch *strsrch;
21036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UChar          pattern[32];
21046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UChar          text[128];
21056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar         *temp;
21066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          int32_t        templength;
21076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UErrorCode     status = U_ZERO_ERROR;
21086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
21106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
21116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
21126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
21136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(PATTERNCANONICAL[0].text, text, 128);
21156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(PATTERNCANONICAL[0].pattern, pattern, 32);
21166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setStrength(EN_US_, PATTERNCANONICAL[0].strength);
21186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
21196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       NULL, &status);
21206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
21216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &status);
21226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
21236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening string search %s\n", u_errorName(status));
21246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
21256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    temp = usearch_getPattern(strsrch, &templength);
21276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (u_strcmp(pattern, temp) != 0) {
21286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting pattern\n");
21296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, PATTERNCANONICAL[0])) {
21316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
21326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(PATTERNCANONICAL[1].pattern, pattern, 32);
21356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setPattern(strsrch, pattern, -1, &status);
21366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    temp = usearch_getPattern(strsrch, &templength);
21376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (u_strcmp(pattern, temp) != 0) {
21386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting pattern\n");
21396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
21406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_reset(strsrch);
21426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
21436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &status);
21446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
21456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting pattern %s\n", u_errorName(status));
21466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, PATTERNCANONICAL[1])) {
21486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
21496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(PATTERNCANONICAL[0].pattern, pattern, 32);
21526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setPattern(strsrch, pattern, -1, &status);
21536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    temp = usearch_getPattern(strsrch, &templength);
21546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (u_strcmp(pattern, temp) != 0) {
21556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting pattern\n");
21566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
21576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_reset(strsrch);
21596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
21606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &status);
21616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
21626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting pattern %s\n", u_errorName(status));
21636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, PATTERNCANONICAL[0])) {
21656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
21666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgENDTESTPATTERN:
21686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setStrength(EN_US_, UCOL_TERTIARY);
21696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (strsrch != NULL) {
21706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_close(strsrch);
21716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
21736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
21746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestTextCanonical(void)
21766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
21776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UStringSearch *strsrch;
21786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UChar          pattern[32];
21796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UChar          text[128];
21806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar         *temp;
21816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          int32_t        templength;
21826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UErrorCode     status = U_ZERO_ERROR;
21836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(TEXTCANONICAL[0].text, text, 128);
21856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(TEXTCANONICAL[0].pattern, pattern, 32);
21866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
21886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
21896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
21906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
21916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch = usearch_openFromCollator(pattern, -1, text, -1, EN_US_,
21936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       NULL, &status);
21946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
21956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &status);
21966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
21986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening string search %s\n", u_errorName(status));
21996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
22006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    temp = usearch_getText(strsrch, &templength);
22026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (u_strcmp(text, temp) != 0) {
22036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting text\n");
22046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, TEXTCANONICAL[0])) {
22066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
22076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(TEXTCANONICAL[1].text, text, 32);
22106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setText(strsrch, text, -1, &status);
22116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    temp = usearch_getText(strsrch, &templength);
22126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (u_strcmp(text, temp) != 0) {
22136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting text\n");
22146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
22156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
22176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting text %s\n", u_errorName(status));
22186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, TEXTCANONICAL[1])) {
22206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
22216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(TEXTCANONICAL[0].text, text, 32);
22246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setText(strsrch, text, -1, &status);
22256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    temp = usearch_getText(strsrch, &templength);
22266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (u_strcmp(text, temp) != 0) {
22276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting text\n");
22286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
22296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
22316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error setting pattern %s\n", u_errorName(status));
22326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!assertEqualWithUStringSearch(strsrch, TEXTCANONICAL[0])) {
22346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto ENDTESTPATTERN;
22356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgENDTESTPATTERN:
22376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (strsrch != NULL) {
22386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_close(strsrch);
22396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
22416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
22426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCompositeBoundariesCanonical(void)
22446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
22456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int count = 0;
22466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
22476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
22486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
22496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
22506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
22516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (COMPOSITEBOUNDARIESCANONICAL[count].text != NULL) {
22536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("composite %d\n", count);
22546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertCanonicalEqual(COMPOSITEBOUNDARIESCANONICAL[count])) {
22556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
22566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
22576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
22586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
22606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
22616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestGetSetOffsetCanonical(void)
22636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
22646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int            searchDataIndex   = 0;
22656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          pattern[32];
22666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          text[128];
22676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode     status  = U_ZERO_ERROR;
22686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UStringSearch *strsrch;
22696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCollator     *collator;
22706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(pattern, 0, 32*sizeof(UChar));
22726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(text, 0, 128*sizeof(UChar));
22736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
22756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
22766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
22776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
22786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch = usearch_openFromCollator(pattern, 16, text, 32, EN_US_, NULL,
22806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       &status);
22816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    collator = usearch_getCollator(strsrch);
22836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
22846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
22866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &status);
22876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* testing out of bounds error */
22896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setOffset(strsrch, -1, &status);
22906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
22916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error expecting set offset error\n");
22926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setOffset(strsrch, 128, &status);
22946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
22956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error expecting set offset error\n");
22966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (BASICCANONICAL[searchDataIndex].text != NULL) {
22986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int         count       = 0;
22996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        SearchData  search      = BASICCANONICAL[searchDataIndex ++];
23006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t matchindex  = search.offset[count];
23016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t     textlength;
23026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (BASICCANONICAL[searchDataIndex].text == NULL) {
23046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* skip the last one */
23056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
23066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
23076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(search.text, text, 128);
23096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(search.pattern, pattern, 32);
23106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
23116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setText(strsrch, text, -1, &status);
23126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setPattern(strsrch, pattern, -1, &status);
23136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        while (U_SUCCESS(status) && matchindex >= 0) {
23146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uint32_t matchlength = search.size[count];
23156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_next(strsrch, &status);
23166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (matchindex != usearch_getMatchedStart(strsrch) ||
23176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
23186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                char *str = toCharString(usearch_getText(strsrch,
23196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                         &textlength));
23206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Text: %s\n", str);
23216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                str = toCharString(usearch_getPattern(strsrch, &textlength));
23226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Pattern: %s\n", str);
23236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("Error match found at %d %d\n",
23246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        usearch_getMatchedStart(strsrch),
23256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        usearch_getMatchedLength(strsrch));
23266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                goto bail;
23276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
23286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            matchindex = search.offset[count + 1] == -1 ? -1 :
23296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         search.offset[count + 2];
23306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (search.offset[count + 1] != -1) {
23316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                usearch_setOffset(strsrch, search.offset[count + 1] + 1,
23326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  &status);
23336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (usearch_getOffset(strsrch) != search.offset[count + 1] + 1) {
23346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("Error setting offset\n");
23356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    goto bail;
23366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
23376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
23386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            count += 2;
23406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
23416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_next(strsrch, &status);
23426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (usearch_getMatchedStart(strsrch) != USEARCH_DONE) {
23436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            char *str = toCharString(usearch_getText(strsrch, &textlength));
23446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Text: %s\n", str);
23456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            str = toCharString(usearch_getPattern(strsrch, &textlength));
23466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Pattern: %s\n", str);
23476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error match found at %d %d\n",
23486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        usearch_getMatchedStart(strsrch),
23496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        usearch_getMatchedLength(strsrch));
23506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            goto bail;
23516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
23526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
23536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgbail:
23556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status);
23566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(strsrch);
23576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
23586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
23596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestSupplementaryCanonical(void)
23616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
23626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int count = 0;
23636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
23646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    open(&status);
23656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
23666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Unable to open static collators %s\n", u_errorName(status));
23676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
23686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
23696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (SUPPLEMENTARYCANONICAL[count].text != NULL) {
23706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertCanonicalEqual(SUPPLEMENTARYCANONICAL[count])) {
23716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
23726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
23736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
23746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
23756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    close();
23766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
23776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestContractionCanonical(void)
23796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
23806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          rules[128];
23816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          pattern[128];
23826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          text[128];
23836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCollator     *collator = NULL;
23846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode     status = U_ZERO_ERROR;
23856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int            count = 0;
23866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UStringSearch *strsrch = NULL;
23876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(rules, 0, 128*sizeof(UChar));
23886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(pattern, 0, 128*sizeof(UChar));
23896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(text, 0, 128*sizeof(UChar));
23906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_unescape(CONTRACTIONRULE, rules, 128);
23926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    collator = ucol_openRules(rules, u_strlen(rules), UCOL_ON,
23936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              UCOL_TERTIARY, NULL, &status);
23946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status == U_FILE_ACCESS_ERROR) {
23956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_data_err("Is your data around?\n");
23966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
23976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(U_FAILURE(status)) {
23986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_err("Error opening collator %s\n", u_errorName(status));
23996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
24006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch = usearch_openFromCollator(pattern, 1, text, 1, collator, NULL,
24026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       &status);
24036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_setAttribute(strsrch, USEARCH_CANONICAL_MATCH, USEARCH_ON,
24046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         &status);
24056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
24066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error opening string search %s\n", u_errorName(status));
24076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (CONTRACTIONCANONICAL[count].text != NULL) {
24106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(CONTRACTIONCANONICAL[count].text, text, 128);
24116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_unescape(CONTRACTIONCANONICAL[count].pattern, pattern, 128);
24126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setText(strsrch, text, -1, &status);
24136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_setPattern(strsrch, pattern, -1, &status);
24146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!assertEqualWithUStringSearch(strsrch,
24156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                              CONTRACTIONCANONICAL[count])) {
24166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error at test number %d\n", count);
24176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
24186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        count ++;
24196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(strsrch);
24216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_close(collator);
24226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
24236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestNumeric(void) {
24256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCollator     *coll = NULL;
24266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UStringSearch *strsrch = NULL;
24276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode     status = U_ZERO_ERROR;
24286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          pattern[128];
24306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          text[128];
24316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(pattern, 0, 128*sizeof(UChar));
24326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(text, 0, 128*sizeof(UChar));
24336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    coll = ucol_open("", &status);
24356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
24366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("Could not open UCA. Is your data around?\n");
24376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
24386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setAttribute(coll, UCOL_NUMERIC_COLLATION, UCOL_ON, &status);
24416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strsrch = usearch_openFromCollator(pattern, 1, text, 1, coll, NULL, &status);
24436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status != U_UNSUPPORTED_ERROR || U_SUCCESS(status)) {
24456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Expected U_UNSUPPORTED_ERROR when trying to instantiate a search object from a CODAN collator, got %s instead\n", u_errorName(status));
24466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(strsrch) {
24476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            usearch_close(strsrch);
24486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
24496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_close(coll);
24526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
24546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* This test is for ticket 4038 due to incorrect backward searching when certain patterns have a length > 1 */
24566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestForwardBackward(void) {
24576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
24586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCollator *coll = NULL;
24596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UStringSearch *search = NULL;
24606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar usrcstr[32], value[4];
24616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t pos= -1;
24626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t expectedPos = 9;
24636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    coll = ucol_open("en_GB", &status);
24656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
24666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "ucol_open failed: %s\n", u_errorName(status));
24676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto exitTestForwardBackward;
24686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_PRIMARY, &status);
24706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setAttribute(coll, UCOL_CASE_LEVEL, UCOL_ON, &status);
24716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, &status);
24726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrcpy(usrcstr, "QBitArray::bitarr_data"); /* text */
24746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrcpy(value, "::");                       /* pattern */
24756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    search = usearch_openFromCollator(value, 2, usrcstr, 22, coll, NULL, &status);
24776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
24786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("usearch_openFromCollator failed: %s\n", u_errorName(status));
24796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto exitTestForwardBackward;
24806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_reset(search);
24836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* forward search */
24846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos = usearch_first(search, &status);
24856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (pos != expectedPos) {
24866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Expected search result: %d; Got instead: %d\n", expectedPos, pos);
24876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        goto exitTestForwardBackward;
24886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos = -1;
24916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_reset(search);
24926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* backward search */
24936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos = usearch_last(search, &status);
24946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (pos != expectedPos) {
24956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Expected search result: %d; Got instead: %d\n", expectedPos, pos);
24966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgexitTestForwardBackward :
24996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (coll != NULL) {
25006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucol_close(coll);
25016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (search != NULL) {
25036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_close(search);
25046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
25066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TEST_ASSERT(x) \
25086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   {if (U_FAILURE(x)) {log_err_status(x, "%s:%d: FAIL: test assertion failure \n", __FILE__, __LINE__);\
25096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   }}
25106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestSearchForNull(void) {
25126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCollator *coll;
25136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode ec;
25146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UStringSearch *search;
25156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int pos;
25166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int len;
25176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int expectedPos;
25186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int expectedLen;
25196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int expectedNum;
25206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int count = 0;
25216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar zerodigit = 0x0030; /* 0 */
25226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar nulldigit = 0x0000; /* null */
25236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* static const UChar var[(length)+1]=U_DECLARE_UTF16(cs) */
25256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define PATTERN_LEN 4
25266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TEXT_LEN 10
25276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(_pattern, "IS 0", PATTERN_LEN);
25296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(_text, "_0IS 0 OK?", TEXT_LEN);
25306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar pattern[PATTERN_LEN + 1], text[TEXT_LEN + 1];
25316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(_pattern, "IS 0", PATTERN_LEN);
25336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(_text, "_0IS 0 OK?", TEXT_LEN);
25346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedPos = 2;
25356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedLen = 4;
25366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expectedNum = 1;
25376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (pos = 0; pos < PATTERN_LEN; pos++) {
25396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (_pattern[pos] == zerodigit) {
25406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            pattern[pos] = nulldigit;
25416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
25426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            pattern[pos] = _pattern[pos];
25436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
25446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pattern[PATTERN_LEN] = 0x0000;
25466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (pos = 0; pos < TEXT_LEN; pos++) {
25486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (_text[pos] == zerodigit) {
25496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            text[pos] = nulldigit;
25506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
25516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            text[pos] = _text[pos];
25526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
25536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    text[TEXT_LEN] = 0x0000;
25556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ec = U_ZERO_ERROR;
25576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* create a US-English collator */
25596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    coll = ucol_open("en_US", &ec);
25606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* make sure we didn't fail. */
25626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT (ec);
25636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setStrength(coll, UCOL_IDENTICAL);
25656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* open a search looking for 0 */
25676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    search = usearch_openFromCollator(pattern, PATTERN_LEN, text,
25686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEXT_LEN, coll, NULL, &ec);
25696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT (ec);
25706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (coll != NULL && search != NULL) {
25726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos = usearch_first(search, &ec);
25736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        len = usearch_getMatchedLength(search);
25746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (pos != expectedPos) {
25756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Expected search result: %d; Got instead: %d\n", expectedPos,
25766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    pos);
25776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
25786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (len != expectedLen) {
25806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Expected search result length: %d; Got instead: %d\n",
25816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    expectedLen, len);
25826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
25836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (pos = usearch_first(search, &ec); pos != USEARCH_DONE; pos
25856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                = usearch_next(search, &ec)) {
25866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("Match at %d\n", pos);
25876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            count += 1;
25886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
25896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (count != expectedNum) {
25916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Expected %d search hits, found %d\n", expectedNum, count);
25926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
25936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_close(coll);
25966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(search);
25976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
25986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestStrengthIdentical(void)
26006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
26016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCollator *coll;
26026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode ec = U_ZERO_ERROR;
26036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UStringSearch *search;
26046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar pattern[] = {0x05E9, 0x0591, 0x05E9};
26066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar text[]    = {0x05E9, 0x0592, 0x05E9};
26076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t pLen = sizeof (pattern) / sizeof(pattern[0]);
26086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t tLen = sizeof(text) / sizeof (text[0]);
26096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t expectedPos = 0;
26106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t expectedLen = 3;
26116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t pos;
26136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t len;
26146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* create a US-English collator */
26166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    coll = ucol_open ("en_US", &ec);
26176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* make sure we didn't fail. */
26196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT (ec);
26206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_setStrength( coll, UCOL_TERTIARY);
26226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* open a search looking for 0 */
26246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    search = usearch_openFromCollator (pattern, pLen, text, tLen, coll, NULL, &ec);
26256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT (ec);
26266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (coll != NULL && search != NULL) {
26286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos = usearch_first(search, &ec);
26296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        len = usearch_getMatchedLength(search);
26306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(pos != expectedPos) {
26326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Expected search result: %d; Got instead: %d\n", expectedPos, pos);
26336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
26346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(len != expectedLen) {
26366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Expected search result length: %d; Got instead: %d\n", expectedLen, len);
26376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
26386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Now try it at strength == UCOL_IDENTICAL */
26406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucol_setStrength(coll, UCOL_IDENTICAL);
26416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        usearch_reset(search);
26426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos = usearch_first(search, &ec);
26446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        len = usearch_getMatchedLength(search);
26456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(pos != -1) {
26476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Expected failure for strentgh = UCOL_IDENTICAL: got %d instead.\n", pos);
26486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
26496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
26506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(search);
26526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_close(coll);
26536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
26546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
26566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* TestUsingSearchCollator
26576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
26586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ARRAY_LENGTH(array) (sizeof(array)/sizeof(array[0]))
26606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct {
26626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar *   pattern;
26636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const int32_t * offsets;
26646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t         offsetsLen;
26656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} PatternAndOffsets;
26666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar scKoText[] = {
26686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       0x0020,
26696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*01*/ 0xAC00, 0x0020,                         /* simple LV Hangul */
26706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*03*/ 0xAC01, 0x0020,                         /* simple LVT Hangul */
26716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*05*/ 0xAC0F, 0x0020,                         /* LVTT, last jamo expands for search */
26726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*07*/ 0xAFFF, 0x0020,                         /* LLVVVTT, every jamo expands for search */
26736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*09*/ 0x1100, 0x1161, 0x11A8, 0x0020,         /* 0xAC01 as conjoining jamo */
26746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*13*/ 0x1100, 0x1161, 0x1100, 0x0020,         /* 0xAC01 as basic conjoining jamo (per search rules) */
26756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*17*/ 0x3131, 0x314F, 0x3131, 0x0020,         /* 0xAC01 as compatibility jamo */
26766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*21*/ 0x1100, 0x1161, 0x11B6, 0x0020,         /* 0xAC0F as conjoining jamo; last expands for search */
26776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*25*/ 0x1100, 0x1161, 0x1105, 0x1112, 0x0020, /* 0xAC0F as basic conjoining jamo; last expands for search */
26786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*30*/ 0x1101, 0x1170, 0x11B6, 0x0020,         /* 0xAFFF as conjoining jamo; all expand for search */
26796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*34*/ 0x00E6, 0x0020,                         /* small letter ae, expands */
26806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*36*/ 0x1E4D, 0x0020,                         /* small letter o with tilde and acute, decomposes */
26816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       0
26826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
26836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar scKoPat0[] = { 0xAC01, 0 };
26856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar scKoPat1[] = { 0x1100, 0x1161, 0x11A8, 0 }; /* 0xAC01 as conjoining jamo */
26866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar scKoPat2[] = { 0xAC0F, 0 };
26876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar scKoPat3[] = { 0x1100, 0x1161, 0x1105, 0x1112, 0 }; /* 0xAC0F as basic conjoining jamo */
26886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar scKoPat4[] = { 0xAFFF, 0 };
26896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar scKoPat5[] = { 0x1101, 0x1170, 0x11B6, 0 }; /* 0xAFFF as conjoining jamo */
26906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t scKoSrchOff01[] = { 3,  9, 13 };
26926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t scKoSrchOff23[] = { 5, 21, 25 };
26936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t scKoSrchOff45[] = { 7, 30     };
26946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const PatternAndOffsets scKoSrchPatternsOffsets[] = {
26966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { scKoPat0, scKoSrchOff01, ARRAY_LENGTH(scKoSrchOff01) },
26976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { scKoPat1, scKoSrchOff01, ARRAY_LENGTH(scKoSrchOff01) },
26986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { scKoPat2, scKoSrchOff23, ARRAY_LENGTH(scKoSrchOff23) },
26996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { scKoPat3, scKoSrchOff23, ARRAY_LENGTH(scKoSrchOff23) },
27006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { scKoPat4, scKoSrchOff45, ARRAY_LENGTH(scKoSrchOff45) },
27016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { scKoPat5, scKoSrchOff45, ARRAY_LENGTH(scKoSrchOff45) },
27026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { NULL,     NULL,          0                           }
27036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
27046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t scKoStndOff01[] = { 3,  9 };
27066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t scKoStndOff2[]  = { 5, 21 };
27076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t scKoStndOff3[]  = { 25    };
27086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t scKoStndOff45[] = { 7, 30 };
27096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const PatternAndOffsets scKoStndPatternsOffsets[] = {
27116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { scKoPat0, scKoStndOff01, ARRAY_LENGTH(scKoStndOff01) },
27126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { scKoPat1, scKoStndOff01, ARRAY_LENGTH(scKoStndOff01) },
27136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { scKoPat2, scKoStndOff2,  ARRAY_LENGTH(scKoStndOff2)  },
27146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { scKoPat3, scKoStndOff3,  ARRAY_LENGTH(scKoStndOff3)  },
27156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { scKoPat4, scKoStndOff45, ARRAY_LENGTH(scKoStndOff45) },
27166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { scKoPat5, scKoStndOff45, ARRAY_LENGTH(scKoStndOff45) },
27176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { NULL,     NULL,          0                           }
27186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
27196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct {
27216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *  locale;
27226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar * text;
27236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const PatternAndOffsets * patternsAndOffsets;
27246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} TUSCItem;
27256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const TUSCItem tuscItems[] = {
27276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "root",                  scKoText, scKoStndPatternsOffsets },
27286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "root@collation=search", scKoText, scKoSrchPatternsOffsets },
27296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "ko@collation=search",   scKoText, scKoSrchPatternsOffsets },
27306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { NULL,                    NULL,     NULL                    }
27316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
27326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar dummyPat[] = { 0x0061, 0 };
27346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestUsingSearchCollator(void)
27366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
27376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const TUSCItem * tuscItemPtr;
27386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (tuscItemPtr = tuscItems; tuscItemPtr->locale != NULL; tuscItemPtr++) {
27396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode status = U_ZERO_ERROR;
27406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UCollator* ucol = ucol_open(tuscItemPtr->locale, &status);
27416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if ( U_SUCCESS(status) ) {
27426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UStringSearch* usrch = usearch_openFromCollator(dummyPat, -1, tuscItemPtr->text, -1, ucol, NULL, &status);
27436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if ( U_SUCCESS(status) ) {
27446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const PatternAndOffsets * patternsOffsetsPtr;
27456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                for ( patternsOffsetsPtr = tuscItemPtr->patternsAndOffsets; patternsOffsetsPtr->pattern != NULL; patternsOffsetsPtr++) {
27466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    usearch_setPattern(usrch, patternsOffsetsPtr->pattern, -1, &status);
27476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if ( U_SUCCESS(status) ) {
27486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        int32_t offset;
27496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        const int32_t * nextOffsetPtr;
27506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        const int32_t * limitOffsetPtr;
27516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        usearch_reset(usrch);
27536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        nextOffsetPtr = patternsOffsetsPtr->offsets;
27546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        limitOffsetPtr = patternsOffsetsPtr->offsets + patternsOffsetsPtr->offsetsLen;
27556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        while (TRUE) {
27566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            offset = usearch_next(usrch, &status);
27576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            if ( U_FAILURE(status) || offset == USEARCH_DONE ) {
27586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                break;
27596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            }
27606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            if ( nextOffsetPtr < limitOffsetPtr ) {
27616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                 if (offset != *nextOffsetPtr) {
27626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     log_err("error, locale %s, expected usearch_next %d, got %d\n", tuscItemPtr->locale, *nextOffsetPtr, offset);
27636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     nextOffsetPtr = limitOffsetPtr;
27646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     break;
27656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                 }
27666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                 nextOffsetPtr++;
27676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            } else {
27686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                log_err("error, locale %s, usearch_next returned more matches than expected\n", tuscItemPtr->locale );
27696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            }
27706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
27716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        if ( U_FAILURE(status) ) {
27726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            log_err("error, locale %s, usearch_next failed: %s\n", tuscItemPtr->locale, u_errorName(status) );
27736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        } else if ( nextOffsetPtr < limitOffsetPtr ) {
27746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            log_err("error, locale %s, usearch_next returned fewer matches than expected\n", tuscItemPtr->locale );
27756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
27766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        status = U_ZERO_ERROR;
27786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        usearch_reset(usrch);
27796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        nextOffsetPtr = patternsOffsetsPtr->offsets + patternsOffsetsPtr->offsetsLen;
27806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        limitOffsetPtr = patternsOffsetsPtr->offsets;
27816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        while (TRUE) {
27826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            offset = usearch_previous(usrch, &status);
27836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            if ( U_FAILURE(status) || offset == USEARCH_DONE ) {
27846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                break;
27856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            }
27866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            if ( nextOffsetPtr > limitOffsetPtr ) {
27876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                nextOffsetPtr--;
27886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                if (offset != *nextOffsetPtr) {
27896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     log_err("error, locale %s, expected usearch_previous %d, got %d\n", tuscItemPtr->locale, *nextOffsetPtr, offset);
27906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     nextOffsetPtr = limitOffsetPtr;
27916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      break;
27926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                }
27936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            } else {
27946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                log_err("error, locale %s, usearch_previous returned more matches than expected\n", tuscItemPtr->locale );
27956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            }
27966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
27976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        if ( U_FAILURE(status) ) {
27986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            log_err("error, locale %s, usearch_previous failed: %s\n", tuscItemPtr->locale, u_errorName(status) );
27996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        } else if ( nextOffsetPtr > limitOffsetPtr ) {
28006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            log_err("error, locale %s, usearch_previous returned fewer matches than expected\n", tuscItemPtr->locale );
28016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
28026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    } else {
28046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("error, locale %s, usearch_setPattern failed: %s\n", tuscItemPtr->locale, u_errorName(status) );
28056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
28066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
28076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                usearch_close(usrch);
28086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
28096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("error, locale %s, usearch_openFromCollator failed: %s\n", tuscItemPtr->locale, u_errorName(status) );
28106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
28116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucol_close(ucol);
28126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
28136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("error, locale %s, ucol_open failed: %s\n", tuscItemPtr->locale, u_errorName(status) );
28146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
28156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
28166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
28176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestPCEBuffer_with(const UChar *search, uint32_t searchLen, const UChar *source, uint32_t sourceLen) {
28206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   UErrorCode icuStatus = U_ZERO_ERROR;
28216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   UCollator *coll;
28226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   const char *locale;
28236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   UBreakIterator *ubrk;
28246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   UStringSearch *usearch;
28256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   int32_t match = 0;
28266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   coll = ucol_openFromShortString( "LSK_AS_CX_EX_FX_HX_NX_S4",
28296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    FALSE,
28306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    NULL,
28316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    &icuStatus );
28326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   if ( U_FAILURE(icuStatus) )
28336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   {
28346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     log_data_err( "ucol_openFromShortString error %s\n" , u_errorName(icuStatus));
28356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      goto exit;
28366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   }
28376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   locale = ucol_getLocaleByType( coll,
28396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  ULOC_VALID_LOCALE,
28406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  &icuStatus );
28416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   if ( U_FAILURE(icuStatus) )
28426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   {
28436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     log_err( "ucol_getLocaleByType error %s\n", u_errorName(icuStatus) );
28446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      goto exit;
28456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   }
28466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   log_verbose("locale=%s\n", locale);
28486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   ubrk = ubrk_open( UBRK_CHARACTER,
28506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     locale,
28516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     source,
28526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     sourceLen,
28536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     &icuStatus );
28546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   if ( U_FAILURE(icuStatus) )
28556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   {
28566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     log_err( "ubrk_open error %s\n", u_errorName(icuStatus) );
28576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      goto exit;
28586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   }
28596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   usearch = usearch_openFromCollator( search,
28616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       searchLen,
28626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       source,
28636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       sourceLen,
28646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       coll,
28656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       ubrk,
28666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       &icuStatus );
28676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   if ( U_FAILURE(icuStatus) )
28686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   {
28696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     log_err( "usearch_openFromCollator error %s\n", u_errorName(icuStatus) );
28706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      goto exit;
28716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   }
28726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   match = usearch_first( usearch,
28746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          &icuStatus );
28756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   if ( U_FAILURE(icuStatus) )
28766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   {
28776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     log_err( "usearch_first error %s\n", u_errorName(icuStatus) );
28786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     goto exit;
28796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   }
28806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   if(match==0) {
28826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     log_verbose("OK: match=%d\n", match);
28836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   } else {
28846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     log_err("Err: match expected 0 got %d\n", match);
28856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   }
28866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   usearch_close(usearch);
28886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   ubrk_close(ubrk);
28896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   ucol_close(coll);
28906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgexit:
28926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   return;
28936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
28946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestPCEBuffer_100df(void) {
28976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UChar search[] =
28986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 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 */
28996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UChar source[] =
29006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 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 };
29016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uint32_t searchLen = sizeof(search)/sizeof(UChar);
29026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uint32_t sourceLen = sizeof(source)/sizeof(UChar);
29036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  TestPCEBuffer_with(search,searchLen,source,sourceLen);
29046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }
29056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestPCEBuffer_2surr(void) {
29086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UChar search[] =
29096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 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 */
29106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UChar source[] =
29116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 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 };
29126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uint32_t searchLen = sizeof(search)/sizeof(UChar);
29136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uint32_t sourceLen = sizeof(source)/sizeof(UChar);
29146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  TestPCEBuffer_with(search,searchLen,source,sourceLen);
29156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
29166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestMatchFollowedByIgnorables(void) {
29186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test case for ticket#8482 */
29196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar search[] = { 0x00c9 };
29206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar source[] = { 0x00c9, 0x0000, 0x0041 };
29216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t searchLen;
29226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t sourceLen;
29236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode icuStatus = U_ZERO_ERROR;
29246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCollator *coll;
29256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *locale;
29266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBreakIterator *ubrk;
29276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UStringSearch *usearch;
29286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t match = 0;
29296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t matchLength = 0;
29306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const int32_t expectedMatchLength = 1;
29316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    searchLen = sizeof(search)/sizeof(UChar);
29336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sourceLen = sizeof(source)/sizeof(UChar);
29346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    coll = ucol_openFromShortString("LHR_AN_CX_EX_FX_HX_NX_S3",
29366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    FALSE,
29376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    NULL,
29386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    &icuStatus);
29396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(icuStatus)) {
29406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("ucol_openFromShortString error - %s\n", u_errorName(icuStatus));
29416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
29426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    locale = ucol_getLocaleByType(coll,
29446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    ULOC_VALID_LOCALE,
29456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    &icuStatus);
29466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(icuStatus)) {
29476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("ucol_getLocaleByType error - %s\n", u_errorName(icuStatus));
29486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
29496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubrk = ubrk_open(UBRK_CHARACTER,
29516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        locale,
29526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        source,
29536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        sourceLen,
29546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        &icuStatus);
29556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(icuStatus)) {
29566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("ubrk_open error - %s\n", u_errorName(icuStatus));
29576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
29586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch = usearch_openFromCollator(search,
29606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                        searchLen,
29616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                        source,
29626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                        sourceLen,
29636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                        coll,
29646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                        ubrk,
29656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                        &icuStatus);
29666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(icuStatus)) {
29676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("usearch_openFromCollator error - %s\n", u_errorName(icuStatus));
29686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
29696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    match = usearch_first(usearch,
29716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            &icuStatus);
29726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(icuStatus)) {
29736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("usearch_first error - %s\n", u_errorName(icuStatus));
29746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
29756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("match=%d\n", match);
29776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        matchLength = usearch_getMatchedLength(usearch);
29796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (matchLength != expectedMatchLength) {
29816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Error: matchLength=%d, expected=%d\n", matchLength, expectedMatchLength);
29826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
29836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
29846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    usearch_close(usearch);
29866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubrk_close(ubrk);
29876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucol_close(coll);
29886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
29896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
29916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* addSearchTest
29926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
29936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addSearchTest(TestNode** root)
29956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
29966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestStart, "tscoll/usrchtst/TestStart");
29976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestOpenClose, "tscoll/usrchtst/TestOpenClose");
29986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestInitialization, "tscoll/usrchtst/TestInitialization");
29996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestBasic, "tscoll/usrchtst/TestBasic");
30006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestNormExact, "tscoll/usrchtst/TestNormExact");
30016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestStrength, "tscoll/usrchtst/TestStrength");
30026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestBreakIterator, "tscoll/usrchtst/TestBreakIterator");
30036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestVariable, "tscoll/usrchtst/TestVariable");
30046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestOverlap, "tscoll/usrchtst/TestOverlap");
30056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestCollator, "tscoll/usrchtst/TestCollator");
30066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestPattern, "tscoll/usrchtst/TestPattern");
30076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestText, "tscoll/usrchtst/TestText");
30086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestCompositeBoundaries,
30096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  "tscoll/usrchtst/TestCompositeBoundaries");
30106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestGetSetOffset, "tscoll/usrchtst/TestGetSetOffset");
30116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestGetSetAttribute,
30126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      "tscoll/usrchtst/TestGetSetAttribute");
30136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestGetMatch, "tscoll/usrchtst/TestGetMatch");
30146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestSetMatch, "tscoll/usrchtst/TestSetMatch");
30156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestReset, "tscoll/usrchtst/TestReset");
30166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestSupplementary, "tscoll/usrchtst/TestSupplementary");
30176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestContraction, "tscoll/usrchtst/TestContraction");
30186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestIgnorable, "tscoll/usrchtst/TestIgnorable");
30196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestCanonical, "tscoll/usrchtst/TestCanonical");
30206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestNormCanonical, "tscoll/usrchtst/TestNormCanonical");
30216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestStrengthCanonical,
30226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    "tscoll/usrchtst/TestStrengthCanonical");
30236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestBreakIteratorCanonical,
30246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               "tscoll/usrchtst/TestBreakIteratorCanonical");
30256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestVariableCanonical,
30266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    "tscoll/usrchtst/TestVariableCanonical");
30276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestOverlapCanonical,
30286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     "tscoll/usrchtst/TestOverlapCanonical");
30296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestCollatorCanonical,
30306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    "tscoll/usrchtst/TestCollatorCanonical");
30316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestPatternCanonical,
30326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     "tscoll/usrchtst/TestPatternCanonical");
30336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestTextCanonical, "tscoll/usrchtst/TestTextCanonical");
30346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestCompositeBoundariesCanonical,
30356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         "tscoll/usrchtst/TestCompositeBoundariesCanonical");
30366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestGetSetOffsetCanonical,
30376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                "tscoll/usrchtst/TestGetSetOffsetCanonical");
30386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestSupplementaryCanonical,
30396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               "tscoll/usrchtst/TestSupplementaryCanonical");
30406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestContractionCanonical,
30416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                 "tscoll/usrchtst/TestContractionCanonical");
30426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestEnd, "tscoll/usrchtst/TestEnd");
30436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestNumeric, "tscoll/usrchtst/TestNumeric");
30446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestDiacriticMatch, "tscoll/usrchtst/TestDiacriticMatch");
30456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestForwardBackward, "tscoll/usrchtst/TestForwardBackward");
30466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestSearchForNull, "tscoll/usrchtst/TestSearchForNull");
30476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestStrengthIdentical, "tscoll/usrchtst/TestStrengthIdentical");
30486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestUsingSearchCollator, "tscoll/usrchtst/TestUsingSearchCollator");
30496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestPCEBuffer_100df, "tscoll/usrchtst/TestPCEBuffer/1_00df");
30506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestPCEBuffer_2surr, "tscoll/usrchtst/TestPCEBuffer/2_dfff");
30516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestMatchFollowedByIgnorables, "tscoll/usrchtst/TestMatchFollowedByIgnorables");
30526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
30536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_COLLATION */
3055