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