1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*****************************************************************************
3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* Copyright (C) 2001-2011, International Business Machines orporation
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* and others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru****************************************************************************/
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "srchtest.h"
1227f654740f2a26ad62a5c155af9199af9e69b889claireho#if !UCONFIG_NO_BREAK_ITERATION
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "../cintltst/usrchdat.c"
1427f654740f2a26ad62a5c155af9199af9e69b889claireho#endif
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/stsearch.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/schriter.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h>
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h>
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// private definitions -----------------------------------------------------
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CASE(id,test)                 \
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case id:                          \
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name = #test;                 \
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (exec) {                   \
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(#test "---");       \
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln((UnicodeString)""); \
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(areBroken) {           \
306d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  dataerrln(__FILE__ " cannot test - failed to create collator.");  \
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {                  \
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                test();               \
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }                         \
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }                             \
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// public contructors and destructors --------------------------------------
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
39c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruStringSearchTest::StringSearchTest()
40c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
41c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru:
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_en_wordbreaker_(NULL), m_en_characterbreaker_(NULL)
43c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#endif
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
45c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode    status = U_ZERO_ERROR;
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_en_us_ = (RuleBasedCollator *)Collator::createInstance("en_US", status);
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_fr_fr_ = (RuleBasedCollator *)Collator::createInstance("fr_FR", status);
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_de_    = (RuleBasedCollator *)Collator::createInstance("de_DE", status);
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_es_    = (RuleBasedCollator *)Collator::createInstance("es_ES", status);
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete m_en_us_;
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete m_fr_fr_;
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete m_de_;
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete m_es_;
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      m_en_us_ = 0;
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      m_fr_fr_ = 0;
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      m_de_ = 0;
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      m_es_ = 0;
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("Collator creation failed with %s", u_errorName(status));
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString rules;
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules.setTo(((RuleBasedCollator *)m_de_)->getRules());
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar extrarules[128];
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(EXTRACOLLATIONRULE, extrarules, 128);
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules.append(extrarules, u_strlen(extrarules));
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete m_de_;
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_de_ = new RuleBasedCollator(rules, status);
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules.setTo(((RuleBasedCollator *)m_es_)->getRules());
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules.append(extrarules, u_strlen(extrarules));
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete m_es_;
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_es_ = new RuleBasedCollator(rules, status);
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_en_wordbreaker_      = BreakIterator::createWordInstance(
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                    Locale::getEnglish(), status);
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_en_characterbreaker_ = BreakIterator::createCharacterInstance(
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                    Locale::getEnglish(), status);
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
88c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#endif
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruStringSearchTest::~StringSearchTest()
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
93c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete m_en_us_;
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete m_fr_fr_;
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete m_de_;
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete m_es_;
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete m_en_wordbreaker_;
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete m_en_characterbreaker_;
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
102c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#endif
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// public methods ----------------------------------------------------------
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::runIndexedTest(int32_t index, UBool exec,
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      const char* &name, char* )
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
110c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool areBroken = FALSE;
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (m_en_us_ == NULL && m_fr_fr_ == NULL && m_de_ == NULL &&
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_es_ == NULL && m_en_wordbreaker_ == NULL &&
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_en_characterbreaker_ == NULL && exec) {
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        areBroken = TRUE;
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (index) {
11950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FILE_IO
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(0, TestOpenClose)
12150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(1, TestInitialization)
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(2, TestBasic)
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(3, TestNormExact)
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(4, TestStrength)
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if UCONFIG_NO_BREAK_ITERATION
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 5:
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name = "TestBreakIterator";
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(5, TestBreakIterator)
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(6, TestVariable)
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(7, TestOverlap)
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(8, TestCollator)
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(9, TestPattern)
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(10, TestText)
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(11, TestCompositeBoundaries)
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(12, TestGetSetOffset)
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(13, TestGetSetAttribute)
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(14, TestGetMatch)
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(15, TestSetMatch)
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(16, TestReset)
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(17, TestSupplementary)
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(18, TestContraction)
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(19, TestIgnorable)
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(20, TestCanonical)
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(21, TestNormCanonical)
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(22, TestStrengthCanonical)
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if UCONFIG_NO_BREAK_ITERATION
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 23:
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name = "TestBreakIteratorCanonical";
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(23, TestBreakIteratorCanonical)
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(24, TestVariableCanonical)
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(25, TestOverlapCanonical)
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(26, TestCollatorCanonical)
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(27, TestPatternCanonical)
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(28, TestTextCanonical)
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(29, TestCompositeBoundariesCanonical)
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(30, TestGetSetOffsetCanonical)
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(31, TestSupplementaryCanonical)
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(32, TestContractionCanonical)
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(33, TestUClassID)
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(34, TestSubclass)
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(35, TestCoverage)
169c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        CASE(36, TestDiacriticMatch)
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        default: name = ""; break;
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
172c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#else
173c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    name="";
174c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#endif
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
177c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// private methods ------------------------------------------------------
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruRuleBasedCollator * StringSearchTest::getCollator(const char *collator)
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (collator == NULL) {
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return m_en_us_;
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(collator, "fr") == 0) {
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return m_fr_fr_;
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else if (strcmp(collator, "de") == 0) {
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return m_de_;
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else if (strcmp(collator, "es") == 0) {
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return m_es_;
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return m_en_us_;
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruBreakIterator * StringSearchTest::getBreakIterator(const char *breaker)
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if UCONFIG_NO_BREAK_ITERATION
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return NULL;
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (breaker == NULL) {
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NULL;
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strcmp(breaker, "wordbreaker") == 0) {
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return m_en_wordbreaker_;
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return m_en_characterbreaker_;
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruchar * StringSearchTest::toCharString(const UnicodeString &text)
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static char   result[1024];
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int    index  = 0;
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int    count  = 0;
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           int    length = text.length();
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (; count < length; count ++) {
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar ch = text[count];
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (ch >= 0x20 && ch <= 0x7e) {
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result[index ++] = (char)ch;
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            sprintf(result+index, "\\u%04x", ch);
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            index += 6; /* \uxxxx */
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result[index] = 0;
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return result;
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCollator::ECollationStrength StringSearchTest::getECollationStrength(
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    const UCollationStrength &strength) const
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  switch (strength)
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case UCOL_PRIMARY :
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return Collator::PRIMARY;
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case UCOL_SECONDARY :
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return Collator::SECONDARY;
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case UCOL_TERTIARY :
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return Collator::TERTIARY;
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  default :
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return Collator::IDENTICAL;
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool StringSearchTest::assertEqualWithStringSearch(StringSearch *strsrch,
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                    const SearchData *search)
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
257b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t         count       = 0;
258b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode      status      = U_ZERO_ERROR;
259b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t         matchindex  = search->offset[count];
260b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeString   matchtext;
261b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t         matchlength;
262b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
26350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    strsrch->setAttribute(USEARCH_ELEMENT_COMPARISON, search->elemCompare, status);
26450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (U_FAILURE(status)) {
26550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errln("Error setting USEARCH_ELEMENT_COMPARISON attribute %s", u_errorName(status));
26650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return FALSE;
26750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
26850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strsrch->getMatchedStart() != USEARCH_DONE ||
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->getMatchedLength() != 0) {
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error with the initialization of match start and length");
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
273b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
274b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // start of next matches
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (U_SUCCESS(status) && matchindex >= 0) {
276b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        matchlength = search->size[count];
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->next(status);
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (matchindex != strsrch->getMatchedStart() ||
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            matchlength != strsrch->getMatchedLength()) {
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char *str = toCharString(strsrch->getText());
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Text: %s", str);
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = toCharString(strsrch->getPattern());
283b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln("Pattern: %s", str);
284b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln("Error next match found at %d (len:%d); expected %d (len:%d)",
28550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    strsrch->getMatchedStart(), strsrch->getMatchedLength(),
28650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    matchindex, matchlength);
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return FALSE;
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->getMatchedText(matchtext);
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strsrch->getText().compareBetween(matchindex,
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                              matchindex + matchlength,
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                              matchtext, 0,
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                              matchtext.length())) {
298b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln("Error getting next matched text");
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        matchindex = search->offset[count];
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->next(status);
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strsrch->getMatchedStart() != USEARCH_DONE ||
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->getMatchedLength() != 0) {
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char *str = toCharString(strsrch->getText());
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Text: %s", str);
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = toCharString(strsrch->getPattern());
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Pattern: %s", str);
310b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln("Error next match found at %d (len:%d); expected <NO MATCH>",
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    strsrch->getMatchedStart(), strsrch->getMatchedLength());
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return FALSE;
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
314b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
315b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // start of previous matches
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = count == 0 ? 0 : count - 1;
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    matchindex = search->offset[count];
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (U_SUCCESS(status) && matchindex >= 0) {
319b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        matchlength = search->size[count];
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->previous(status);
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (matchindex != strsrch->getMatchedStart() ||
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            matchlength != strsrch->getMatchedLength()) {
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char *str = toCharString(strsrch->getText());
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Text: %s", str);
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = toCharString(strsrch->getPattern());
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Pattern: %s", str);
327b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln("Error previous match found at %d (len:%d); expected %d (len:%d)",
328b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    strsrch->getMatchedStart(), strsrch->getMatchedLength(),
329b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    matchindex, matchlength);
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return FALSE;
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->getMatchedText(matchtext);
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strsrch->getText().compareBetween(matchindex,
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                              matchindex + matchlength,
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                              matchtext, 0,
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                              matchtext.length())) {
340b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln("Error getting previous matched text");
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        matchindex = count > 0 ? search->offset[count - 1] : -1;
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count --;
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->previous(status);
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strsrch->getMatchedStart() != USEARCH_DONE ||
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->getMatchedLength() != 0) {
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char *str = toCharString(strsrch->getText());
350b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        errln("Text: %s", str);
351b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        str = toCharString(strsrch->getPattern());
352b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        errln("Pattern: %s", str);
353b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        errln("Error previous match found at %d (len:%d); expected <NO MATCH>",
354b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                strsrch->getMatchedStart(), strsrch->getMatchedLength());
355b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return FALSE;
356b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
357b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
358b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t nextStart;
359b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool isOverlap = (strsrch->getAttribute(USEARCH_OVERLAP) == USEARCH_ON);
360b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
361b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // start of following matches
362b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    count = 0;
363b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    matchindex = search->offset[count];
364b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    nextStart = 0;
365b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
366b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    while (TRUE) {
367b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        strsrch->following(nextStart, status);
368b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
369b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (matchindex < 0) {
370b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (strsrch->getMatchedStart() != USEARCH_DONE ||
371b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    strsrch->getMatchedLength() != 0) {
372b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                char *str = toCharString(strsrch->getText());
373b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                errln("Text: %s", str);
374b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                str = toCharString(strsrch->getPattern());
375b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                errln("Pattern: %s", str);
376b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                errln("Error following match starting at %d (overlap:%d) found at %d (len:%d); expected <NO MATCH>",
377b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        nextStart, isOverlap,
378b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        strsrch->getMatchedStart(), strsrch->getMatchedLength());
379b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                return FALSE;
380b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
381b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            // no more matches
382b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            break;
383b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
384b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
385b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        matchlength = search->size[count];
386b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (strsrch->getMatchedStart() != matchindex
387b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                || strsrch->getMatchedLength() != matchlength
388b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                || U_FAILURE(status)) {
389b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            char *str = toCharString(strsrch->getText());
390b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln("Text: %s\n", str);
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = toCharString(strsrch->getPattern());
392b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln("Pattern: %s\n", str);
393b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln("Error following match starting at %d (overlap: %d) found at %d (len:%d); expected %d (len:%d)\n",
394b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        nextStart, isOverlap,
395b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        strsrch->getMatchedStart(), strsrch->getMatchedLength(),
396b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        matchindex, matchlength);
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return FALSE;
398b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
399b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
400b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (isOverlap || strsrch->getMatchedLength() == 0) {
401b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            nextStart = strsrch->getMatchedStart() + 1;
402b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else {
403b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            nextStart = strsrch->getMatchedStart() + strsrch->getMatchedLength();
404b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
405b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
406b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        count++;
407b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        matchindex = search->offset[count];
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
409b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
410b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // start preceding matches
411b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    count = -1; // last non-negative offset index, could be -1 if no match
412b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    while (search->offset[count + 1] >= 0) {
413b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        count++;
414b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
415b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    nextStart = strsrch->getText().length();
416b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
417b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    while (TRUE) {
418b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        strsrch->preceding(nextStart, status);
419b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
420b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (count < 0) {
421b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (strsrch->getMatchedStart() != USEARCH_DONE || strsrch->getMatchedLength() != 0) {
422b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                char *str = toCharString(strsrch->getText());
423b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                errln("Text: %s\n", str);
424b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                str = toCharString(strsrch->getPattern());
425b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                errln("Pattern: %s\n", str);
426b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                errln("Error preceding match starting at %d (overlap: %d) found at %d (len:%d); expected <NO MATCH>\n",
427b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            nextStart, isOverlap,
428b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            strsrch->getMatchedStart(),
429b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            strsrch->getMatchedLength());
430b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                return FALSE;
431b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
432b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            // no more matches
433b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            break;
434b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
435b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
436b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        matchindex = search->offset[count];
437b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        matchlength = search->size[count];
438b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (strsrch->getMatchedStart() != matchindex
439b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                || strsrch->getMatchedLength() != matchlength
440b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                || U_FAILURE(status)) {
441b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            char *str = toCharString(strsrch->getText());
442b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln("Text: %s\n", str);
443b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            str = toCharString(strsrch->getPattern());
444b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln("Pattern: %s\n", str);
445b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln("Error preceding match starting at %d (overlap: %d) found at %d (len:%d); expected %d (len:%d)\n",
446b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        nextStart, isOverlap,
447b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        strsrch->getMatchedStart(), strsrch->getMatchedLength(),
448b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        matchindex, matchlength);
449b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return FALSE;
450b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
451b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
452b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        nextStart = matchindex;
453b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        count--;
454b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
455b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
45650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    strsrch->setAttribute(USEARCH_ELEMENT_COMPARISON, USEARCH_STANDARD_ELEMENT_COMPARISON, status);
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool StringSearchTest::assertEqual(const SearchData *search)
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status   = U_ZERO_ERROR;
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Collator      *collator = getCollator(search->collator);
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    BreakIterator *breaker  = getBreakIterator(search->breaker);
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch  *strsrch, *strsrch2;
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          temp[128];
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if UCONFIG_NO_BREAK_ITERATION
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(search->breaker) {
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return TRUE; /* skip test */
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search->text, temp, 128);
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString text;
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.setTo(temp);
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search->pattern, temp, 128);
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString  pattern;
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern.setTo(temp);
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (breaker != NULL) {
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        breaker->setText(text);
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    collator->setStrength(getECollationStrength(search->strength));
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = new StringSearch(pattern, text, (RuleBasedCollator *)collator,
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               breaker, status);
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening string search %s", u_errorName(status));
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, search)) {
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        collator->setStrength(getECollationStrength(UCOL_TERTIARY));
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch2 = strsrch->clone();
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( strsrch2 == strsrch || *strsrch2 != *strsrch ||
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        !assertEqualWithStringSearch(strsrch2, search)
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
505c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        infoln("failure with StringSearch.clone()");
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        collator->setStrength(getECollationStrength(UCOL_TERTIARY));
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch2;
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete strsrch2;
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    collator->setStrength(getECollationStrength(UCOL_TERTIARY));
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete strsrch;
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool StringSearchTest::assertCanonicalEqual(const SearchData *search)
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status   = U_ZERO_ERROR;
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Collator      *collator = getCollator(search->collator);
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    BreakIterator *breaker  = getBreakIterator(search->breaker);
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch  *strsrch;
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          temp[128];
525c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UBool          result = TRUE;
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if UCONFIG_NO_BREAK_ITERATION
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(search->breaker) {
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return TRUE; /* skip test */
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search->text, temp, 128);
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString text;
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.setTo(temp);
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search->pattern, temp, 128);
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString  pattern;
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern.setTo(temp);
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (breaker != NULL) {
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        breaker->setText(text);
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    collator->setStrength(getECollationStrength(search->strength));
546c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    collator->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = new StringSearch(pattern, text, (RuleBasedCollator *)collator,
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               breaker, status);
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status);
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening string search %s", u_errorName(status));
552c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        result = FALSE;
553c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        goto bail;
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, search)) {
557c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        result = FALSE;
558c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        goto bail;
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
560c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
561c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querubail:
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    collator->setStrength(getECollationStrength(UCOL_TERTIARY));
563c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    collator->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_OFF, status);
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete strsrch;
565c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
566c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    return result;
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool StringSearchTest::assertEqualWithAttribute(const SearchData *search,
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                            USearchAttributeValue canonical,
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                            USearchAttributeValue overlap)
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status   = U_ZERO_ERROR;
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Collator      *collator = getCollator(search->collator);
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    BreakIterator *breaker  = getBreakIterator(search->breaker);
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch  *strsrch;
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          temp[128];
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if UCONFIG_NO_BREAK_ITERATION
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(search->breaker) {
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return TRUE; /* skip test */
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search->text, temp, 128);
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString text;
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.setTo(temp);
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search->pattern, temp, 128);
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString  pattern;
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern.setTo(temp);
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (breaker != NULL) {
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        breaker->setText(text);
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    collator->setStrength(getECollationStrength(search->strength));
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch = new StringSearch(pattern, text, (RuleBasedCollator *)collator,
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               breaker, status);
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_CANONICAL_MATCH, canonical, status);
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_OVERLAP, overlap, status);
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening string search %s", u_errorName(status));
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, search)) {
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        collator->setStrength(getECollationStrength(UCOL_TERTIARY));
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    collator->setStrength(getECollationStrength(UCOL_TERTIARY));
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete strsrch;
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestOpenClose()
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode               status    = U_ZERO_ERROR;
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch            *result;
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    BreakIterator           *breakiter = m_en_wordbreaker_;
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString            pattern;
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString            text;
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString            temp("a");
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringCharacterIterator  chariter(text);
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* testing null arguments */
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = new StringSearch(pattern, text, NULL, NULL, status);
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error: NULL arguments should produce an error");
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete result;
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    chariter.setText(text);
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = new StringSearch(pattern, chariter, NULL, NULL, status);
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error: NULL arguments should produce an error");
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete result;
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.append(0, 0x1);
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = new StringSearch(pattern, text, NULL, NULL, status);
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error: Empty pattern should produce an error");
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete result;
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    chariter.setText(text);
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = new StringSearch(pattern, chariter, NULL, NULL, status);
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error: Empty pattern should produce an error");
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete result;
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.remove();
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern.append(temp);
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = new StringSearch(pattern, text, NULL, NULL, status);
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error: Empty text should produce an error");
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete result;
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    chariter.setText(text);
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = new StringSearch(pattern, chariter, NULL, NULL, status);
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error: Empty text should produce an error");
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete result;
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.append(temp);
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = new StringSearch(pattern, text, NULL, NULL, status);
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error: NULL arguments should produce an error");
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete result;
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    chariter.setText(text);
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = new StringSearch(pattern, chariter, NULL, NULL, status);
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error: NULL arguments should produce an error");
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete result;
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = new StringSearch(pattern, text, m_en_us_, NULL, status);
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error: NULL break iterator is valid for opening search");
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete result;
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = new StringSearch(pattern, chariter, m_en_us_, NULL, status);
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error: NULL break iterator is valid for opening search");
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete result;
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = new StringSearch(pattern, text, Locale::getEnglish(), NULL, status);
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || result == NULL) {
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error: NULL break iterator is valid for opening search");
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete result;
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = new StringSearch(pattern, chariter, Locale::getEnglish(), NULL, status);
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error: NULL break iterator is valid for opening search");
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete result;
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = new StringSearch(pattern, text, m_en_us_, breakiter, status);
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error: Break iterator is valid for opening search");
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete result;
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = new StringSearch(pattern, chariter, m_en_us_, NULL, status);
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error: Break iterator is valid for opening search");
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete result;
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestInitialization()
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status = U_ZERO_ERROR;
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString  pattern;
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString  text;
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString  temp("a");
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch  *result;
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count;
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* simple test on the pattern ce construction */
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern.append(temp);
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern.append(temp);
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.append(temp);
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.append(temp);
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.append(temp);
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = new StringSearch(pattern, text, m_en_us_, NULL, status);
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening search %s", u_errorName(status));
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch *copy = new StringSearch(*result);
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (*(copy->getCollator()) != *(result->getCollator()) ||
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        copy->getBreakIterator() != result->getBreakIterator() ||
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        copy->getMatchedLength() != result->getMatchedLength() ||
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        copy->getMatchedStart() != result->getMatchedStart() ||
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        copy->getOffset() != result->getOffset() ||
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        copy->getPattern() != result->getPattern() ||
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        copy->getText() != result->getText() ||
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *(copy) != *(result))
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error copying StringSearch");
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete copy;
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    copy = (StringSearch *)result->safeClone();
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (*(copy->getCollator()) != *(result->getCollator()) ||
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        copy->getBreakIterator() != result->getBreakIterator() ||
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        copy->getMatchedLength() != result->getMatchedLength() ||
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        copy->getMatchedStart() != result->getMatchedStart() ||
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        copy->getOffset() != result->getOffset() ||
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        copy->getPattern() != result->getPattern() ||
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        copy->getText() != result->getText() ||
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *(copy) != *(result)) {
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error copying StringSearch");
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete result;
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* testing if an extremely large pattern will fail the initialization */
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (count = 0; count < 512; count ++) {
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pattern.append(temp);
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = new StringSearch(pattern, text, m_en_us_, NULL, status);
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (*result != *result) {
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error: string search object expected to match itself");
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (*result == *copy) {
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error: string search objects are not expected to match");
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *copy  = *result;
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (*(copy->getCollator()) != *(result->getCollator()) ||
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        copy->getBreakIterator() != result->getBreakIterator() ||
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        copy->getMatchedLength() != result->getMatchedLength() ||
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        copy->getMatchedStart() != result->getMatchedStart() ||
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        copy->getOffset() != result->getOffset() ||
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        copy->getPattern() != result->getPattern() ||
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        copy->getText() != result->getText() ||
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *(copy) != *(result)) {
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error copying StringSearch");
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening search %s", u_errorName(status));
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete result;
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete copy;
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestBasic()
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (BASIC[count].text != NULL) {
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //printf("count %d", count);
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(&BASIC[count])) {
817c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            infoln("Error at test number %d", count);
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestNormExact()
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_en_us_->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting collation normalization %s",
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              u_errorName(status));
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (BASIC[count].text != NULL) {
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(&BASIC[count])) {
834c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            infoln("Error at test number %d", count);
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (NORMEXACT[count].text != NULL) {
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(&NORMEXACT[count])) {
841c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            infoln("Error at test number %d", count);
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_en_us_->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_OFF, status);
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (NONNORMEXACT[count].text != NULL) {
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(&NONNORMEXACT[count])) {
849c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            infoln("Error at test number %d", count);
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestStrength()
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (STRENGTH[count].text != NULL) {
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(&STRENGTH[count])) {
860c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            infoln("Error at test number %d", count);
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestBreakIterator()
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp[128];
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(BREAKITERATOREXACT[0].text, temp, 128);
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString text;
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.setTo(temp, u_strlen(temp));
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(BREAKITERATOREXACT[0].pattern, temp, 128);
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pattern;
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern.setTo(temp, u_strlen(temp));
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, NULL,
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             status);
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening string search %s", u_errorName(status));
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setBreakIterator(NULL, status);
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || strsrch->getBreakIterator() != NULL) {
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error usearch_getBreakIterator returned wrong object");
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setBreakIterator(m_en_characterbreaker_, status);
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->getBreakIterator() != m_en_characterbreaker_) {
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error usearch_getBreakIterator returned wrong object");
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setBreakIterator(m_en_wordbreaker_, status);
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->getBreakIterator() != m_en_wordbreaker_) {
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error usearch_getBreakIterator returned wrong object");
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete strsrch;
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (count < 4) {
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // special purposes for tests numbers 0-3
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const SearchData        *search   = &(BREAKITERATOREXACT[count]);
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              RuleBasedCollator *collator = getCollator(search->collator);
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              BreakIterator     *breaker  = getBreakIterator(search->breaker);
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              StringSearch      *strsrch;
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->text, temp, 128);
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        text.setTo(temp, u_strlen(temp));
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->pattern, temp, 128);
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pattern.setTo(temp, u_strlen(temp));
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (breaker != NULL) {
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            breaker->setText(text);
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        collator->setStrength(getECollationStrength(search->strength));
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch = new StringSearch(pattern, text, collator, breaker, status);
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strsrch->getBreakIterator() != breaker) {
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error setting break iterator");
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (strsrch != NULL) {
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                delete strsrch;
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithStringSearch(strsrch, search)) {
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            collator->setStrength(getECollationStrength(UCOL_TERTIARY));
931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete strsrch;
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        search   = &(BREAKITERATOREXACT[count + 1]);
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        breaker  = getBreakIterator(search->breaker);
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (breaker != NULL) {
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            breaker->setText(text);
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setBreakIterator(breaker, status);
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strsrch->getBreakIterator() != breaker) {
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error setting break iterator");
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete strsrch;
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->reset();
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithStringSearch(strsrch, search)) {
946c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru             infoln("Error at test number %d", count);
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count += 2;
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (BREAKITERATOREXACT[count].text != NULL) {
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         if (!assertEqual(&BREAKITERATOREXACT[count])) {
954c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru             infoln("Error at test number %d", count);
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         }
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         count ++;
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestVariable()
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_en_us_->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, status);
967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting collation alternate attribute %s",
969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              u_errorName(status));
970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (VARIABLE[count].text != NULL) {
972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("variable %d", count);
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(&VARIABLE[count])) {
974c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            infoln("Error at test number %d", count);
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_en_us_->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE,
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           status);
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestOverlap()
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (OVERLAP[count].text != NULL) {
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithAttribute(&OVERLAP[count], USEARCH_OFF,
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      USEARCH_ON)) {
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error at overlap test number %d", count);
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (NONOVERLAP[count].text != NULL) {
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(&NONOVERLAP[count])) {
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error at non overlap test number %d", count);
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (count < 1) {
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const SearchData *search = &(OVERLAP[count]);
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UChar       temp[128];
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->text, temp, 128);
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString text;
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        text.setTo(temp, u_strlen(temp));
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->pattern, temp, 128);
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString pattern;
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pattern.setTo(temp, u_strlen(temp));
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        RuleBasedCollator *collator = getCollator(search->collator);
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode         status   = U_ZERO_ERROR;
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        StringSearch      *strsrch  = new StringSearch(pattern, text,
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                       collator, NULL,
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                       status);
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setAttribute(USEARCH_OVERLAP, USEARCH_ON, status);
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strsrch->getAttribute(USEARCH_OVERLAP) != USEARCH_ON) {
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error setting overlap option");
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithStringSearch(strsrch, search)) {
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete strsrch;
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        search = &(NONOVERLAP[count]);
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setAttribute(USEARCH_OVERLAP, USEARCH_OFF, status);
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strsrch->getAttribute(USEARCH_OVERLAP) != USEARCH_OFF) {
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error setting overlap option");
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->reset();
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithStringSearch(strsrch, search)) {
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete strsrch;
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error at test number %d", count);
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         }
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestCollator()
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // test collator that thinks "o" and "p" are the same thing
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar         temp[128];
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(COLLATOR[0].text, temp, 128);
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString text;
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.setTo(temp, u_strlen(temp));
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(COLLATOR[0].pattern, temp, 128);
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pattern;
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern.setTo(temp, u_strlen(temp));
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode    status = U_ZERO_ERROR;
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, NULL,
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             status);
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening string search %s", u_errorName(status));
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, &COLLATOR[0])) {
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TESTCOLLATORRULE, temp, 128);
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString rules;
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules.setTo(temp, u_strlen(temp));
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *tailored = new RuleBasedCollator(rules, status);
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tailored->setStrength(getECollationStrength(COLLATOR[1].strength));
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening rule based collator %s", u_errorName(status));
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
1077b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        delete tailored;
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setCollator(tailored, status);
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || (*strsrch->getCollator()) != (*tailored)) {
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting rule based collator");
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
1085b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        delete tailored;
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->reset();
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, &COLLATOR[1])) {
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
1090b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        delete tailored;
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setCollator(m_en_us_, status);
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->reset();
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || (*strsrch->getCollator()) != (*m_en_us_)) {
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting rule based collator");
1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
1099b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        delete tailored;
1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, &COLLATOR[0])) {
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       errln("Error searching collator test");
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete strsrch;
1105b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    delete tailored;
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestPattern()
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp[512];
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int templength;
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERN[0].text, temp, 512);
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString text;
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.setTo(temp, u_strlen(temp));
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERN[0].pattern, temp, 512);
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pattern;
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern.setTo(temp, u_strlen(temp));
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_en_us_->setStrength(getECollationStrength(PATTERN[0].strength));
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode    status = U_ZERO_ERROR;
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, NULL,
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             status);
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening string search %s", u_errorName(status));
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_en_us_->setStrength(getECollationStrength(UCOL_TERTIARY));
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strsrch != NULL) {
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete strsrch;
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strsrch->getPattern() != pattern) {
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting pattern");
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, &PATTERN[0])) {
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_en_us_->setStrength(getECollationStrength(UCOL_TERTIARY));
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strsrch != NULL) {
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete strsrch;
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERN[1].pattern, temp, 512);
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern.setTo(temp, u_strlen(temp));
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setPattern(pattern, status);
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pattern != strsrch->getPattern()) {
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting pattern");
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_en_us_->setStrength(getECollationStrength(UCOL_TERTIARY));
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strsrch != NULL) {
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete strsrch;
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->reset();
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting pattern %s", u_errorName(status));
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, &PATTERN[1])) {
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_en_us_->setStrength(getECollationStrength(UCOL_TERTIARY));
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strsrch != NULL) {
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete strsrch;
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERN[0].pattern, temp, 512);
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern.setTo(temp, u_strlen(temp));
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setPattern(pattern, status);
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pattern != strsrch->getPattern()) {
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting pattern");
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_en_us_->setStrength(getECollationStrength(UCOL_TERTIARY));
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strsrch != NULL) {
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete strsrch;
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->reset();
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting pattern %s", u_errorName(status));
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, &PATTERN[0])) {
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_en_us_->setStrength(getECollationStrength(UCOL_TERTIARY));
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strsrch != NULL) {
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete strsrch;
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* enormous pattern size to see if this crashes */
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (templength = 0; templength != 512; templength ++) {
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        temp[templength] = 0x61;
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp[511] = 0;
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern.setTo(temp, 511);
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setPattern(pattern, status);
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting pattern with size 512, %s", u_errorName(status));
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_en_us_->setStrength(getECollationStrength(UCOL_TERTIARY));
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strsrch != NULL) {
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestText()
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp[128];
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXT[0].text, temp, 128);
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString text;
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.setTo(temp, u_strlen(temp));
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXT[0].pattern, temp, 128);
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pattern;
1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern.setTo(temp, u_strlen(temp));
1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, NULL,
1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             status);
1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening string search %s", u_errorName(status));
1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (text != strsrch->getText()) {
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting text");
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, &TEXT[0])) {
1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXT[1].text, temp, 128);
1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.setTo(temp, u_strlen(temp));
1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setText(text, status);
1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (text != strsrch->getText()) {
1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting text");
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting text %s", u_errorName(status));
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, &TEXT[1])) {
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXT[0].text, temp, 128);
1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.setTo(temp, u_strlen(temp));
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringCharacterIterator chariter(text);
1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setText(chariter, status);
1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (text != strsrch->getText()) {
1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting text");
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting pattern %s", u_errorName(status));
1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, &TEXT[0])) {
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error searching within set text");
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete strsrch;
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestCompositeBoundaries()
1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (COMPOSITEBOUNDARIES[count].text != NULL) {
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("composite %d", count);
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(&COMPOSITEBOUNDARIES[count])) {
1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error at test number %d", count);
1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestGetSetOffset()
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status  = U_ZERO_ERROR;
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString  pattern("1234567890123456");
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString  text("12345678901234567890123456789012");
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch  *strsrch = new StringSearch(pattern, text, m_en_us_,
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                              NULL, status);
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* testing out of bounds error */
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setOffset(-1, status);
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error expecting set offset error");
1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setOffset(128, status);
1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error expecting set offset error");
1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int index   = 0;
1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (BASIC[index].text != NULL) {
1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode  status      = U_ZERO_ERROR;
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        SearchData  search      = BASIC[index ++];
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar       temp[128];
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.text, temp, 128);
1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        text.setTo(temp, u_strlen(temp));
1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.pattern, temp, 128);
1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pattern.setTo(temp, u_strlen(temp));
1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setText(text, status);
1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setPattern(pattern, status);
1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->getCollator()->setStrength(getECollationStrength(
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                          search.strength));
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->reset();
1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int count = 0;
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t matchindex  = search.offset[count];
1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while (U_SUCCESS(status) && matchindex >= 0) {
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t matchlength = search.size[count];
1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strsrch->next(status);
1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (matchindex != strsrch->getMatchedStart() ||
1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                matchlength != strsrch->getMatchedLength()) {
1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                char *str = toCharString(strsrch->getText());
1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("Text: %s", str);
1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                str = toCharString(strsrch->getPattern());
1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("Pattern: %s", str);
1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("Error match found at %d %d",
1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        strsrch->getMatchedStart(),
1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        strsrch->getMatchedLength());
1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return;
1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            matchindex = search.offset[count + 1] == -1 ? -1 :
1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         search.offset[count + 2];
1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (search.offset[count + 1] != -1) {
1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                strsrch->setOffset(search.offset[count + 1] + 1, status);
1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (strsrch->getOffset() != search.offset[count + 1] + 1) {
1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln("Error setting offset\n");
1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    return;
1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            count += 2;
1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->next(status);
1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strsrch->getMatchedStart() != USEARCH_DONE) {
1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char *str = toCharString(strsrch->getText());
1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Text: %s", str);
1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = toCharString(strsrch->getPattern());
1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Pattern: %s", str);
1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error match found at %d %d",
1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        strsrch->getMatchedStart(),
1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        strsrch->getMatchedLength());
1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->getCollator()->setStrength(getECollationStrength(
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                             UCOL_TERTIARY));
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete strsrch;
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestGetSetAttribute()
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status    = U_ZERO_ERROR;
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString  pattern("pattern");
1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString  text("text");
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch  *strsrch = new StringSearch(pattern, text, m_en_us_, NULL,
1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                              status);
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening search %s", u_errorName(status));
1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_OVERLAP, USEARCH_DEFAULT, status);
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->getAttribute(USEARCH_OVERLAP) != USEARCH_OFF) {
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting overlap to the default");
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_OVERLAP, USEARCH_ON, status);
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->getAttribute(USEARCH_OVERLAP) != USEARCH_ON) {
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting overlap true");
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_OVERLAP, USEARCH_OFF, status);
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->getAttribute(USEARCH_OVERLAP) != USEARCH_OFF) {
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting overlap false");
1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_OVERLAP, USEARCH_ATTRIBUTE_VALUE_COUNT,
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          status);
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting overlap to illegal value");
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_DEFAULT, status);
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->getAttribute(USEARCH_CANONICAL_MATCH) != USEARCH_OFF) {
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting canonical match to the default");
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status);
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->getAttribute(USEARCH_CANONICAL_MATCH) != USEARCH_ON) {
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting canonical match true");
1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_OFF, status);
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) ||
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->getAttribute(USEARCH_CANONICAL_MATCH) != USEARCH_OFF) {
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting canonical match false");
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_CANONICAL_MATCH,
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          USEARCH_ATTRIBUTE_VALUE_COUNT, status);
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting canonical match to illegal value");
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_ATTRIBUTE_COUNT, USEARCH_DEFAULT, status);
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting illegal attribute success");
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete strsrch;
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestGetMatch()
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar      temp[128];
1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SearchData search = MATCH[0];
1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search.text, temp, 128);
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString text;
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.setTo(temp, u_strlen(temp));
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(search.pattern, temp, 128);
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pattern;
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern.setTo(temp, u_strlen(temp));
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode    status  = U_ZERO_ERROR;
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, NULL,
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             status);
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening string search %s", u_errorName(status));
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strsrch != NULL) {
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete strsrch;
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int           count      = 0;
1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t   matchindex = search.offset[count];
1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString matchtext;
1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (U_SUCCESS(status) && matchindex >= 0) {
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t matchlength = search.size[count];
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->next(status);
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (matchindex != strsrch->getMatchedStart() ||
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            matchlength != strsrch->getMatchedLength()) {
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char *str = toCharString(strsrch->getText());
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Text: %s", str);
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = toCharString(strsrch->getPattern());
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Pattern: %s", str);
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error match found at %d %d", strsrch->getMatchedStart(),
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  strsrch->getMatchedLength());
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->getMatchedText(matchtext);
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (matchtext.length() != matchlength || U_FAILURE(status)){
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error getting match text");
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        matchindex = search.offset[count];
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->next(status);
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strsrch->getMatchedStart()  != USEARCH_DONE ||
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->getMatchedLength() != 0) {
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error end of match not found");
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->getMatchedText(matchtext);
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (matchtext.length() != 0) {
1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error getting null matches");
1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete strsrch;
1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestSetMatch()
1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (MATCH[count].text != NULL) {
1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        SearchData     search = MATCH[count];
1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar          temp[128];
1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.text, temp, 128);
1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString text;
1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        text.setTo(temp, u_strlen(temp));
1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.pattern, temp, 128);
1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString pattern;
1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pattern.setTo(temp, u_strlen(temp));
1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_,
1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                 NULL, status);
1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error opening string search %s", u_errorName(status));
1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (strsrch != NULL) {
1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                delete strsrch;
1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int size = 0;
1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while (search.offset[size] != -1) {
1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            size ++;
1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strsrch->first(status) != search.offset[0] || U_FAILURE(status)) {
1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error getting first match");
1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strsrch->last(status) != search.offset[size -1] ||
1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            U_FAILURE(status)) {
1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error getting last match");
1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int index = 0;
1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while (index < size) {
1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (index + 2 < size) {
1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (strsrch->following(search.offset[index + 2] - 1, status)
1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         != search.offset[index + 2] || U_FAILURE(status)) {
1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln("Error getting following match at index %d",
1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          search.offset[index + 2] - 1);
1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (index + 1 < size) {
1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (strsrch->preceding(search.offset[index + 1] +
1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                search.size[index + 1] + 1,
1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       status) != search.offset[index + 1] ||
1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    U_FAILURE(status)) {
1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln("Error getting preceeding match at index %d",
1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          search.offset[index + 1] + 1);
1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            index += 2;
1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strsrch->following(text.length(), status) != USEARCH_DONE) {
1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error expecting out of bounds match");
1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strsrch->preceding(0, status) != USEARCH_DONE) {
1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error expecting out of bounds match");
1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestReset()
1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status  = U_ZERO_ERROR;
1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString  text("fish fish");
1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString  pattern("s");
1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch  *strsrch = new StringSearch(pattern, text, m_en_us_, NULL,
1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                              status);
1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening string search %s", u_errorName(status));
1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strsrch != NULL) {
1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete strsrch;
1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_OVERLAP, USEARCH_ON, status);
1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status);
1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setOffset(9, status);
1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting attributes and offsets");
1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->reset();
1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strsrch->getAttribute(USEARCH_OVERLAP) != USEARCH_OFF ||
1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strsrch->getAttribute(USEARCH_CANONICAL_MATCH) != USEARCH_OFF ||
1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strsrch->getOffset() != 0 || strsrch->getMatchedLength() != 0 ||
1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strsrch->getMatchedStart() != USEARCH_DONE) {
1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error resetting string search");
1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->previous(status);
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strsrch->getMatchedStart() != 7 ||
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strsrch->getMatchedLength() != 1) {
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error resetting string search\n");
1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete strsrch;
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestSupplementary()
1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (SUPPLEMENTARY[count].text != NULL) {
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqual(&SUPPLEMENTARY[count])) {
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error at test number %d", count);
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestContraction()
1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar      temp[128];
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(CONTRACTIONRULE, temp, 128);
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString rules;
1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules.setTo(temp, u_strlen(temp));
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *collator = new RuleBasedCollator(rules,
1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        getECollationStrength(UCOL_TERTIARY), UCOL_ON, status);
1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening collator %s", u_errorName(status));
1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString text("text");
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pattern("pattern");
1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch *strsrch = new StringSearch(pattern, text, collator, NULL,
1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             status);
1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening string search %s", u_errorName(status));
1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (CONTRACTION[count].text != NULL) {
1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(CONTRACTION[count].text, temp, 128);
1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        text.setTo(temp, u_strlen(temp));
1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(CONTRACTION[count].pattern, temp, 128);
1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pattern.setTo(temp, u_strlen(temp));
1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setText(text, status);
1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setPattern(pattern, status);
1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithStringSearch(strsrch, &CONTRACTION[count])) {
1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error at test number %d", count);
1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete strsrch;
1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete collator;
1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestIgnorable()
1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp[128];
1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(IGNORABLERULE, temp, 128);
1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString rules;
1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules.setTo(temp, u_strlen(temp));
1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int        count  = 0;
1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *collator = new RuleBasedCollator(rules,
1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            getECollationStrength(IGNORABLE[count].strength),
1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            UCOL_ON, status);
1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening collator %s", u_errorName(status));
1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pattern("pattern");
1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString text("text");
1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch *strsrch = new StringSearch(pattern, text, collator, NULL,
1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             status);
1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening string search %s", u_errorName(status));
1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete collator;
1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (IGNORABLE[count].text != NULL) {
1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(IGNORABLE[count].text, temp, 128);
1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        text.setTo(temp, u_strlen(temp));
1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(IGNORABLE[count].pattern, temp, 128);
1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pattern.setTo(temp, u_strlen(temp));
1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setText(text, status);
1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setPattern(pattern, status);
1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithStringSearch(strsrch, &IGNORABLE[count])) {
1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error at test number %d", count);
1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete strsrch;
1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete collator;
1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1672c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid StringSearchTest::TestDiacriticMatch()
1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru	UChar temp[128];
1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int        count  = 0;
1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator* coll = NULL;
1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch *strsrch = NULL;
1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pattern("pattern");
1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString text("text");
1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const SearchData *search;
1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1685c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    search = &(DIACRITICMATCH[count]);
1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (search->text != NULL) {
1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   		coll = getCollator(search->collator);
1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    	coll->setStrength(getECollationStrength(search->strength));
1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    	strsrch = new StringSearch(pattern, text, coll, getBreakIterator(search->breaker), status);
1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    	if (U_FAILURE(status)) {
1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru	        errln("Error opening string search %s", u_errorName(status));
1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru	        return;
1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru	    }
1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->text, temp, 128);
1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        text.setTo(temp, u_strlen(temp));
1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->pattern, temp, 128);
1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pattern.setTo(temp, u_strlen(temp));
1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setText(text, status);
1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setPattern(pattern, status);
1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithStringSearch(strsrch, search)) {
1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error at test number %d", count);
1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1703c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        search = &(DIACRITICMATCH[++count]);
1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestCanonical()
1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (BASICCANONICAL[count].text != NULL) {
1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(&BASICCANONICAL[count])) {
1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error at test number %d", count);
1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestNormCanonical()
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_en_us_->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (NORMCANONICAL[count].text != NULL) {
1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(&NORMCANONICAL[count])) {
1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error at test number %d", count);
1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_en_us_->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_OFF, status);
1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestStrengthCanonical()
1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (STRENGTHCANONICAL[count].text != NULL) {
1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(&STRENGTHCANONICAL[count])) {
1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error at test number %d", count);
1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestBreakIteratorCanonical()
1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int        count  = 0;
1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (count < 4) {
1753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // special purposes for tests numbers 0-3
1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UChar           temp[128];
1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const SearchData     *search   = &(BREAKITERATORCANONICAL[count]);
1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->text, temp, 128);
1758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString text;
1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        text.setTo(temp, u_strlen(temp));
1760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->pattern, temp, 128);
1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString pattern;
1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pattern.setTo(temp, u_strlen(temp));
1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        RuleBasedCollator *collator = getCollator(search->collator);
1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        collator->setStrength(getECollationStrength(search->strength));
1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BreakIterator *breaker = getBreakIterator(search->breaker);
1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        StringSearch  *strsrch = new StringSearch(pattern, text, collator,
1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                  breaker, status);
1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error creating string search data");
1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status);
1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strsrch->getBreakIterator() != breaker) {
1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error setting break iterator");
1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete strsrch;
1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithStringSearch(strsrch, search)) {
1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            collator->setStrength(getECollationStrength(UCOL_TERTIARY));
1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete strsrch;
1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        search  = &(BREAKITERATOREXACT[count + 1]);
1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        breaker = getBreakIterator(search->breaker);
1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (breaker == NULL) {
1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error creating BreakIterator");
1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        breaker->setText(strsrch->getText());
1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setBreakIterator(breaker, status);
1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) || strsrch->getBreakIterator() != breaker) {
1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error setting break iterator");
1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete strsrch;
1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->reset();
1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status);
1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithStringSearch(strsrch, search)) {
1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             errln("Error at test number %d", count);
1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             return;
1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count += 2;
1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (BREAKITERATORCANONICAL[count].text != NULL) {
1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         if (!assertEqual(&BREAKITERATORCANONICAL[count])) {
1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             errln("Error at test number %d", count);
1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             return;
1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         }
1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         count ++;
1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestVariableCanonical()
1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_en_us_->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, status);
1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting collation alternate attribute %s",
1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              u_errorName(status));
1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (VARIABLE[count].text != NULL) {
1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("variable %d", count);
1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(&VARIABLE[count])) {
1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error at test number %d", count);
1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_en_us_->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE,
1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           status);
1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestOverlapCanonical()
1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (OVERLAPCANONICAL[count].text != NULL) {
1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithAttribute(&OVERLAPCANONICAL[count], USEARCH_ON,
1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      USEARCH_ON)) {
1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error at overlap test number %d", count);
1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (NONOVERLAP[count].text != NULL) {
1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(&NONOVERLAPCANONICAL[count])) {
1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error at non overlap test number %d", count);
1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = 0;
1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (count < 1) {
1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UChar       temp[128];
1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const SearchData *search = &(OVERLAPCANONICAL[count]);
1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UErrorCode  status = U_ZERO_ERROR;
1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->text, temp, 128);
1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString text;
1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        text.setTo(temp, u_strlen(temp));
1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search->pattern, temp, 128);
1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString pattern;
1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pattern.setTo(temp, u_strlen(temp));
1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        RuleBasedCollator *collator = getCollator(search->collator);
1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        StringSearch *strsrch = new StringSearch(pattern, text, collator,
1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                 NULL, status);
1872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status);
1873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setAttribute(USEARCH_OVERLAP, USEARCH_ON, status);
1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strsrch->getAttribute(USEARCH_OVERLAP) != USEARCH_ON) {
1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error setting overlap option");
1877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithStringSearch(strsrch, search)) {
1879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete strsrch;
1880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        search = &(NONOVERLAPCANONICAL[count]);
1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setAttribute(USEARCH_OVERLAP, USEARCH_OFF, status);
1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status) ||
1885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strsrch->getAttribute(USEARCH_OVERLAP) != USEARCH_OFF) {
1886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error setting overlap option");
1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->reset();
1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithStringSearch(strsrch, search)) {
1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete strsrch;
1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error at test number %d", count);
1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         }
1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestCollatorCanonical()
1900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test collator that thinks "o" and "p" are the same thing */
1902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp[128];
1903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(COLLATORCANONICAL[0].text, temp, 128);
1904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString text;
1905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.setTo(temp, u_strlen(temp));
1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(COLLATORCANONICAL[0].pattern, temp, 128);
1907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pattern;
1908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern.setTo(temp, u_strlen(temp));
1909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode    status  = U_ZERO_ERROR;
1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_,
1912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             NULL, status);
1913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status);
1914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening string search %s", u_errorName(status));
1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, &COLLATORCANONICAL[0])) {
1918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
1919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TESTCOLLATORRULE, temp, 128);
1923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString rules;
1924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules.setTo(temp, u_strlen(temp));
1925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *tailored = new RuleBasedCollator(rules,
1926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        getECollationStrength(COLLATORCANONICAL[1].strength),
1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCOL_ON, status);
1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening rule based collator %s", u_errorName(status));
1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setCollator(tailored, status);
1934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || *(strsrch->getCollator()) != *tailored) {
1935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting rule based collator");
1936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->reset();
1938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status);
1939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, &COLLATORCANONICAL[1])) {
1940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
1941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (tailored != NULL) {
1942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete tailored;
1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1944c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1945c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return;
1946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setCollator(m_en_us_, status);
1949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->reset();
1950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || *(strsrch->getCollator()) != *m_en_us_) {
1951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting rule based collator");
1952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, &COLLATORCANONICAL[0])) {
1954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete strsrch;
1956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tailored != NULL) {
1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete tailored;
1958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestPatternCanonical()
1962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp[128];
1965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERNCANONICAL[0].text, temp, 128);
1967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString text;
1968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.setTo(temp, u_strlen(temp));
1969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERNCANONICAL[0].pattern, temp, 128);
1970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pattern;
1971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern.setTo(temp, u_strlen(temp));
1972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_en_us_->setStrength(
1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      getECollationStrength(PATTERNCANONICAL[0].strength));
1975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode    status  = U_ZERO_ERROR;
1977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, NULL,
1978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             status);
1979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status);
1980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening string search %s", u_errorName(status));
1982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pattern != strsrch->getPattern()) {
1985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting pattern");
1986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, &PATTERNCANONICAL[0])) {
1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERNCANONICAL[1].pattern, temp, 128);
1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern.setTo(temp, u_strlen(temp));
1993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setPattern(pattern, status);
1994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pattern != strsrch->getPattern()) {
1995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting pattern");
1996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
1997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->reset();
1999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status);
2000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting pattern %s", u_errorName(status));
2002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, &PATTERNCANONICAL[1])) {
2004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(PATTERNCANONICAL[0].pattern, temp, 128);
2008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern.setTo(temp, u_strlen(temp));
2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setPattern(pattern, status);
2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pattern != strsrch->getPattern()) {
2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting pattern");
2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->reset();
2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status);
2016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting pattern %s", u_errorName(status));
2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, &PATTERNCANONICAL[0])) {
2020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruENDTESTPATTERN:
2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_en_us_->setStrength(getECollationStrength(UCOL_TERTIARY));
2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strsrch != NULL) {
2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
2026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestTextCanonical()
2030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp[128];
2032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXTCANONICAL[0].text, temp, 128);
2033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString text;
2034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.setTo(temp, u_strlen(temp));
2035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXTCANONICAL[0].pattern, temp, 128);
2036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pattern;
2037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern.setTo(temp, u_strlen(temp));
2038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode    status  = U_ZERO_ERROR;
2040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch *strsrch = new StringSearch(pattern, text, m_en_us_, NULL,
2041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             status);
2042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status);
2043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening string search %s", u_errorName(status));
2046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (text != strsrch->getText()) {
2049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting text");
2050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, &TEXTCANONICAL[0])) {
2052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXTCANONICAL[1].text, temp, 128);
2056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.setTo(temp, u_strlen(temp));
2057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setText(text, status);
2058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (text != strsrch->getText()) {
2059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting text");
2060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting text %s", u_errorName(status));
2064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, &TEXTCANONICAL[1])) {
2066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(TEXTCANONICAL[0].text, temp, 128);
2070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text.setTo(temp, u_strlen(temp));
2071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setText(text, status);
2072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (text != strsrch->getText()) {
2073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting text");
2074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting pattern %s", u_errorName(status));
2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertEqualWithStringSearch(strsrch, &TEXTCANONICAL[0])) {
2080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto ENDTESTPATTERN;
2081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruENDTESTPATTERN:
2083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (strsrch != NULL) {
2084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete strsrch;
2085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestCompositeBoundariesCanonical()
2089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
2091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (COMPOSITEBOUNDARIESCANONICAL[count].text != NULL) {
2092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("composite %d", count);
2093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(&COMPOSITEBOUNDARIESCANONICAL[count])) {
2094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error at test number %d", count);
2095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
2097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestGetSetOffsetCanonical()
2101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status  = U_ZERO_ERROR;
2104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString  text("text");
2105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString  pattern("pattern");
2106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch  *strsrch = new StringSearch(pattern, text, m_en_us_, NULL,
2107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                              status);
2108c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    Collator *collator = strsrch->getCollator();
2109c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2110c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    collator->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
2111c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status);
2113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* testing out of bounds error */
2114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setOffset(-1, status);
2115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
2116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error expecting set offset error");
2117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setOffset(128, status);
2119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
2120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error expecting set offset error");
2121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int   index   = 0;
2123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp[128];
2124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (BASICCANONICAL[index].text != NULL) {
2125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        SearchData  search      = BASICCANONICAL[index ++];
2126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (BASICCANONICAL[index].text == NULL) {
2127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* skip the last one */
2128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
2129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.text, temp, 128);
2132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        text.setTo(temp, u_strlen(temp));
2133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(search.pattern, temp, 128);
2134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pattern.setTo(temp, u_strlen(temp));
2135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode  status      = U_ZERO_ERROR;
2137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setText(text, status);
2138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setPattern(pattern, status);
2140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int         count       = 0;
2142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t matchindex  = search.offset[count];
2143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while (U_SUCCESS(status) && matchindex >= 0) {
2144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t matchlength = search.size[count];
2145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strsrch->next(status);
2146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (matchindex != strsrch->getMatchedStart() ||
2147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                matchlength != strsrch->getMatchedLength()) {
2148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                char *str = toCharString(strsrch->getText());
2149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("Text: %s", str);
2150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                str = toCharString(strsrch->getPattern());
2151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("Pattern: %s", str);
2152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("Error match found at %d %d",
2153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      strsrch->getMatchedStart(),
2154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      strsrch->getMatchedLength());
2155c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                goto bail;
2156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            matchindex = search.offset[count + 1] == -1 ? -1 :
2158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         search.offset[count + 2];
2159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (search.offset[count + 1] != -1) {
2160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                strsrch->setOffset(search.offset[count + 1] + 1, status);
2161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (strsrch->getOffset() != search.offset[count + 1] + 1) {
2162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln("Error setting offset");
2163c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    goto bail;
2164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
2165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            count += 2;
2168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->next(status);
2170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (strsrch->getMatchedStart() != USEARCH_DONE) {
2171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char *str = toCharString(strsrch->getText());
2172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Text: %s", str);
2173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = toCharString(strsrch->getPattern());
2174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Pattern: %s", str);
2175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error match found at %d %d", strsrch->getMatchedStart(),
2176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   strsrch->getMatchedLength());
2177c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            goto bail;
2178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2180c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2181c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querubail:
2182c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    collator->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_OFF, status);
2183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete strsrch;
2184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestSupplementaryCanonical()
2187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
2189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (SUPPLEMENTARYCANONICAL[count].text != NULL) {
2190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertCanonicalEqual(&SUPPLEMENTARYCANONICAL[count])) {
2191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error at test number %d", count);
2192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
2194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestContractionCanonical()
2198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          temp[128];
2200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_unescape(CONTRACTIONRULE, temp, 128);
2202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString rules;
2203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rules.setTo(temp, u_strlen(temp));
2204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode         status   = U_ZERO_ERROR;
2206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedCollator *collator = new RuleBasedCollator(rules,
2207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        getECollationStrength(UCOL_TERTIARY), UCOL_ON, status);
2208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening collator %s", u_errorName(status));
2210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString text("text");
2212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pattern("pattern");
2213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch *strsrch = new StringSearch(pattern, text, collator, NULL,
2214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             status);
2215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strsrch->setAttribute(USEARCH_CANONICAL_MATCH, USEARCH_ON, status);
2216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error opening string search %s", u_errorName(status));
2218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int count = 0;
2221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (CONTRACTIONCANONICAL[count].text != NULL) {
2222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(CONTRACTIONCANONICAL[count].text, temp, 128);
2223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        text.setTo(temp, u_strlen(temp));
2224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_unescape(CONTRACTIONCANONICAL[count].pattern, temp, 128);
2225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pattern.setTo(temp, u_strlen(temp));
2226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setText(text, status);
2227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strsrch->setPattern(pattern, status);
2228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!assertEqualWithStringSearch(strsrch,
2229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             &CONTRACTIONCANONICAL[count])) {
2230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error at test number %d", count);
2231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count ++;
2233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete strsrch;
2235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete collator;
2236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestUClassID()
2239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char id = *((char *)StringSearch::getStaticClassID());
2241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (id != 0) {
2242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Static class id for StringSearch should be 0");
2243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode     status    = U_ZERO_ERROR;
2245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString  text("text");
2246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString  pattern("pattern");
2247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringSearch  *strsrch = new StringSearch(pattern, text, m_en_us_, NULL,
2248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                              status);
2249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    id = *((char *)strsrch->getDynamicClassID());
2250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (id != 0) {
2251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Dynamic class id for StringSearch should be 0");
2252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete strsrch;
2254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TestSearch : public SearchIterator
2257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
2259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TestSearch(const TestSearch &obj);
2260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TestSearch(const UnicodeString &text,
2261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               BreakIterator *breakiter,
2262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               const UnicodeString &pattern);
2263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ~TestSearch();
2264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void        setOffset(int32_t position, UErrorCode &status);
2266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t     getOffset() const;
2267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SearchIterator* safeClone() const;
2268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
2271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * ICU "poor man's RTTI", returns a UClassID for the actual class.
2272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
2273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @draft ICU 2.2
2274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
2275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); }
2276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
2278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * ICU "poor man's RTTI", returns a UClassID for this class.
2279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
2280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @draft ICU 2.2
2281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
2282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; }
2283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool operator!=(const TestSearch &that) const;
2285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString m_pattern_;
2287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprotected:
2289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t      handleNext(int32_t position, UErrorCode &status);
2290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t      handlePrev(int32_t position, UErrorCode &status);
2291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TestSearch & operator=(const TestSearch &that);
2292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate:
2294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
2296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * The address of this static class variable serves as this class's ID
2297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * for ICU "poor man's RTTI".
2298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
2299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char fgClassID;
2300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t m_offset_;
2301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
2302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char TestSearch::fgClassID=0;
2304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestSearch::TestSearch(const TestSearch &obj) : SearchIterator(obj)
2306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_offset_ = obj.m_offset_;
2308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_pattern_ = obj.m_pattern_;
2309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestSearch::TestSearch(const UnicodeString &text,
2312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       BreakIterator *breakiter,
2313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       const UnicodeString &pattern) : SearchIterator()
2314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_breakiterator_ = breakiter;
2316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_pattern_ = pattern;
2317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_text_ = text;
2318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_offset_ = 0;
2319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_pattern_ = pattern;
2320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestSearch::~TestSearch()
2323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestSearch::setOffset(int32_t position, UErrorCode &status)
2328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (position >= 0 && position <= m_text_.length()) {
2330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_offset_ = position;
2331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
2333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_INDEX_OUTOFBOUNDS_ERROR;
2334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t TestSearch::getOffset() const
2338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return m_offset_;
2340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruSearchIterator * TestSearch::safeClone() const
2343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return new TestSearch(m_text_, m_breakiterator_, m_pattern_);
2345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool TestSearch::operator!=(const TestSearch &that) const
2348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (SearchIterator::operator !=(that)) {
2350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
2351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return m_offset_ != that.m_offset_ || m_pattern_ != that.m_pattern_;
2353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t TestSearch::handleNext(int32_t start, UErrorCode &status)
2356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_SUCCESS(status)) {
2358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int match = m_text_.indexOf(m_pattern_, start);
2359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (match < 0) {
2360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_offset_ = m_text_.length();
2361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        setMatchStart(m_offset_);
2362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        setMatchLength(0);
2363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return USEARCH_DONE;
2364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setMatchStart(match);
2366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_offset_ = match;
2367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setMatchLength(m_pattern_.length());
2368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return match;
2369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else {
2370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return USEARCH_DONE;
2371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
2372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t TestSearch::handlePrev(int32_t start, UErrorCode &status)
2375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_SUCCESS(status)) {
2377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int match = m_text_.lastIndexOf(m_pattern_, 0, start);
2378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (match < 0) {
2379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        m_offset_ = 0;
2380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        setMatchStart(m_offset_);
2381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        setMatchLength(0);
2382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return USEARCH_DONE;
2383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setMatchStart(match);
2385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_offset_ = match;
2386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setMatchLength(m_pattern_.length());
2387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return match;
2388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else {
2389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return USEARCH_DONE;
2390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
2391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestSearch & TestSearch::operator=(const TestSearch &that)
2394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SearchIterator::operator=(that);
2396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_offset_ = that.m_offset_;
2397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m_pattern_ = that.m_pattern_;
2398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return *this;
2399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestSubclass()
2402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString text("abc abcd abc");
2404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pattern("abc");
2405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TestSearch search(text, NULL, pattern);
2406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TestSearch search2(search);
2407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int expected[] = {0, 4, 9};
2408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i;
2410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringCharacterIterator chariter(text);
2411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    search.setText(text, status);
2413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (search.getText() != search2.getText()) {
2414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting text");
2415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    search.setText(chariter, status);
2418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (search.getText() != search2.getText()) {
2419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error setting text");
2420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    search.reset();
2423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // comparing constructors
2424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < (int)(sizeof(expected) / sizeof(expected[0])); i ++) {
2426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (search.next(status) != expected[i]) {
2427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error getting next match");
2428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (search.getMatchedLength() != search.m_pattern_.length()) {
2430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error getting next match length");
2431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (search.next(status) != USEARCH_DONE) {
2434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error should have reached the end of the iteration");
2435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = sizeof(expected) / sizeof(expected[0]) - 1; i >= 0; i --) {
2437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (search.previous(status) != expected[i]) {
2438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error getting previous match");
2439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (search.getMatchedLength() != search.m_pattern_.length()) {
2441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Error getting previous match length");
2442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (search.previous(status) != USEARCH_DONE) {
2445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error should have reached the start of the iteration");
2446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass StubSearchIterator:public SearchIterator{
2450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
2451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StubSearchIterator(){}
2452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual void setOffset(int32_t , UErrorCode &) {};
2453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual int32_t getOffset(void) const {return 0;};
2454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual SearchIterator* safeClone(void) const {return NULL;};
2455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual int32_t handleNext(int32_t , UErrorCode &){return 0;};
2456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual int32_t handlePrev(int32_t , UErrorCode &) {return 0;};
2457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual UClassID getDynamicClassID() const {
2458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static char classID = 0;
2459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (UClassID)&classID;
2460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
2462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid StringSearchTest::TestCoverage(){
2464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StubSearchIterator stub1, stub2;
2465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (stub1 != stub2){
2468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("new StubSearchIterator should be equal");
2469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    stub2.setText(UnicodeString("ABC"), status);
2472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Error: SearchIterator::SetText");
2474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    stub1 = stub2;
2477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (stub1 != stub2){
2478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("SearchIterator::operator =  assigned object should be equal");
2479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2482c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#endif /* !UCONFIG_NO_BREAK_ITERATION */
2483c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_COLLATION */
2485