1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * Copyright (c) 1999-2014, International Business Machines
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Corporation and others. All Rights Reserved.
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   Date        Name        Description
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   12/14/99    Madhu        Creation.
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   01/12/2000  Madhu        updated for changed API
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h"
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "intltest.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/rbbi.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/schriter.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "rbbiapts.h"
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "rbbidata.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h"
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ubrkimpl.h"
22b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/locid.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utext.h"
25b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "cmemory.h"
26fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#if !UCONFIG_NO_BREAK_ITERATION && U_HAVE_STD_STRING
27fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "unicode/filteredbrk.h"
28fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include <stdio.h> // for sprintf
29fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#endif
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * API Test the RuleBasedBreakIterator class
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TEST_ASSERT_SUCCESS(status) {if (U_FAILURE(status)) {\
36103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusdataerrln("Failure at file %s, line %d, error = %s", __FILE__, __LINE__, u_errorName(status));}}
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
38b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define TEST_ASSERT(expr) {if ((expr) == FALSE) { \
39b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    errln("Test Failure at file %s, line %d: \"%s\" is false.\n", __FILE__, __LINE__, #expr);};}
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RBBIAPITest::TestCloneEquals()
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status=U_ZERO_ERROR;
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedBreakIterator* bi1     = (RuleBasedBreakIterator*)RuleBasedBreakIterator::createCharacterInstance(Locale::getDefault(), status);
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedBreakIterator* biequal = (RuleBasedBreakIterator*)RuleBasedBreakIterator::createCharacterInstance(Locale::getDefault(), status);
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedBreakIterator* bi3     = (RuleBasedBreakIterator*)RuleBasedBreakIterator::createCharacterInstance(Locale::getDefault(), status);
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedBreakIterator* bi2     = (RuleBasedBreakIterator*)RuleBasedBreakIterator::createWordInstance(Locale::getDefault(), status);
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
506d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail : in construction - %s", u_errorName(status));
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString testString="Testing word break iterators's clone() and equals()";
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi1->setText(testString);
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi2->setText(testString);
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    biequal->setText(testString);
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi3->setText("hello");
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"Testing equals()");
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"Testing == and !=");
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool b = (*bi1 != *biequal);
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    b |= *bi1 == *bi2;
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    b |= *bi1 == *bi3;
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (b) {
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"ERROR:1 RBBI's == and != operator failed.");
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(*bi2 == *biequal || *bi2 == *bi1  || *biequal == *bi3)
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"ERROR:2 RBBI's == and != operator  failed.");
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Quick test of RulesBasedBreakIterator assignment -
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Check that
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //    two different iterators are !=
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //    they are == after assignment
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //    source and dest iterator produce the same next() after assignment.
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //    deleting one doesn't disable the other.
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing assignment");
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedBreakIterator *bix = (RuleBasedBreakIterator *)BreakIterator::createLineInstance(Locale::getDefault(), status);
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail : in construction - %s", u_errorName(status));
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedBreakIterator biDefault, biDefault2;
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"FAIL : in construction of default iterator");
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (biDefault == *bix) {
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"ERROR: iterators should not compare ==");
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (biDefault != biDefault2) {
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"ERROR: iterators should compare ==");
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString   HelloString("Hello Kitty");
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bix->setText(HelloString);
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (*bix == *bi2) {
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("ERROR: strings should not be equal before assignment."));
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *bix = *bi2;
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (*bix != *bi2) {
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("ERROR: strings should be equal before assignment."));
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int bixnext = bix->next();
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int bi2next = bi2->next();
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (! (bixnext == bi2next && bixnext == 7)) {
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("ERROR: iterators behaved differently after assignment."));
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete bix;
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (bi2->next() != 8) {
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("ERROR: iterator.next() failed after deleting copy."));
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"Testing clone()");
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedBreakIterator* bi1clone=(RuleBasedBreakIterator*)bi1->clone();
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedBreakIterator* bi2clone=(RuleBasedBreakIterator*)bi2->clone();
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(*bi1clone != *bi1 || *bi1clone  != *biequal  ||
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      *bi1clone == *bi3 || *bi1clone == *bi2)
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"ERROR:1 RBBI's clone() method failed");
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(*bi2clone == *bi1 || *bi2clone == *biequal ||
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       *bi2clone == *bi3 || *bi2clone != *bi2)
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"ERROR:2 RBBI's clone() method failed");
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(bi1->getText() != bi1clone->getText()   ||
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       bi2clone->getText() != bi2->getText()   ||
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       *bi2clone == *bi1clone )
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"ERROR: RBBI's clone() method failed");
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete bi1clone;
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete bi2clone;
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete bi1;
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete bi3;
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete bi2;
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete biequal;
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RBBIAPITest::TestBoilerPlate()
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    BreakIterator* a = BreakIterator::createWordInstance(Locale("hi"), status);
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    BreakIterator* b = BreakIterator::createWordInstance(Locale("hi_IN"),status);
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Creation of break iterator failed %s", u_errorName(status));
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(*a!=*b){
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed: boilerplate method operator!= does not return correct results");
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
16354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    // Japanese word break iterators are identical to root with
16454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    // a dictionary-based break iterator
16554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    BreakIterator* c = BreakIterator::createCharacterInstance(Locale("ja"),status);
16654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    BreakIterator* d = BreakIterator::createCharacterInstance(Locale("root"),status);
16754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(c && d){
16854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        if(*c!=*d){
16954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            errln("Failed: boilerplate method operator== does not return correct results");
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("creation of break iterator failed");
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete a;
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete b;
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
17754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    delete d;
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RBBIAPITest::TestgetRules()
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status=U_ZERO_ERROR;
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedBreakIterator* bi1=(RuleBasedBreakIterator*)RuleBasedBreakIterator::createCharacterInstance(Locale::getDefault(), status);
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedBreakIterator* bi2=(RuleBasedBreakIterator*)RuleBasedBreakIterator::createWordInstance(Locale::getDefault(), status);
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
1876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: in construction - %s", u_errorName(status));
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete bi1;
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete bi2;
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"Testing toString()");
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi1->setText((UnicodeString)"Hello there");
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedBreakIterator* bi3 =(RuleBasedBreakIterator*)bi1->clone();
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString temp=bi1->getRules();
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString temp2=bi2->getRules();
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString temp3=bi3->getRules();
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( temp2.compare(temp3) ==0 || temp.compare(temp2) == 0 || temp.compare(temp3) != 0)
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"ERROR: error in getRules() method");
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete bi1;
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete bi2;
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete bi3;
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RBBIAPITest::TestHashCode()
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status=U_ZERO_ERROR;
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedBreakIterator* bi1     = (RuleBasedBreakIterator*)RuleBasedBreakIterator::createCharacterInstance(Locale::getDefault(), status);
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedBreakIterator* bi3     = (RuleBasedBreakIterator*)RuleBasedBreakIterator::createCharacterInstance(Locale::getDefault(), status);
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedBreakIterator* bi2     = (RuleBasedBreakIterator*)RuleBasedBreakIterator::createWordInstance(Locale::getDefault(), status);
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
2186d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Fail : in construction - %s", u_errorName(status));
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete bi1;
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete bi2;
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete bi3;
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"Testing hashCode()");
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi1->setText((UnicodeString)"Hash code");
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi2->setText((UnicodeString)"Hash code");
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi3->setText((UnicodeString)"Hash code");
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedBreakIterator* bi1clone= (RuleBasedBreakIterator*)bi1->clone();
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedBreakIterator* bi2clone= (RuleBasedBreakIterator*)bi2->clone();
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(bi1->hashCode() != bi1clone->hashCode() ||  bi1->hashCode() != bi3->hashCode() ||
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        bi1clone->hashCode() != bi3->hashCode() || bi2->hashCode() != bi2clone->hashCode())
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"ERROR: identical objects have different hashcodes");
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(bi1->hashCode() == bi2->hashCode() ||  bi2->hashCode() == bi3->hashCode() ||
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        bi1clone->hashCode() == bi2clone->hashCode() || bi1clone->hashCode() == bi2->hashCode())
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"ERROR: different objects have same hashcodes");
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete bi1clone;
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete bi2clone;
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete bi1;
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete bi2;
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete bi3;
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RBBIAPITest::TestGetSetAdoptText()
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"Testing getText setText ");
25350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    IcuTestErrorCode status(*this, "TestGetSetAdoptText");
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str1="first string.";
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str2="Second string.";
25650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalPointer<RuleBasedBreakIterator> charIter1((RuleBasedBreakIterator*)RuleBasedBreakIterator::createCharacterInstance(Locale::getDefault(), status));
25750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalPointer<RuleBasedBreakIterator> wordIter1((RuleBasedBreakIterator*)RuleBasedBreakIterator::createWordInstance(Locale::getDefault(), status));
25850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(status.isFailure()){
25950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errcheckln(status, "Fail : in construction - %s", status.errorName());
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CharacterIterator* text1= new StringCharacterIterator(str1);
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CharacterIterator* text1Clone = text1->clone();
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CharacterIterator* text2= new StringCharacterIterator(str2);
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CharacterIterator* text3= new StringCharacterIterator(str2, 3, 10, 3); //  "ond str"
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    wordIter1->setText(str1);
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CharacterIterator *tci = &wordIter1->getText();
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString      tstr;
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tci->getText(tstr);
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(tstr == str1);
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(wordIter1->current() != 0)
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"ERROR:1 setText did not set the iteration position to the beginning of the text, it is" + wordIter1->current() + (UnicodeString)"\n");
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    wordIter1->next(2);
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    wordIter1->setText(str2);
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(wordIter1->current() != 0)
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"ERROR:2 setText did not reset the iteration position to the beginning of the text, it is" + wordIter1->current() + (UnicodeString)"\n");
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    charIter1->adoptText(text1Clone);
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(wordIter1->getText() != charIter1->getText());
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tci = &wordIter1->getText();
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tci->getText(tstr);
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(tstr == str2);
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tci = &charIter1->getText();
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tci->getText(tstr);
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(tstr == str1);
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
29450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalPointer<RuleBasedBreakIterator> rb((RuleBasedBreakIterator*)wordIter1->clone());
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rb->adoptText(text1);
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(rb->getText() != *text1)
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"ERROR:1 error in adoptText ");
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rb->adoptText(text2);
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(rb->getText() != *text2)
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"ERROR:2 error in adoptText ");
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Adopt where iterator range is less than the entire orignal source string.
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //   (With the change of the break engine to working with UText internally,
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //    CharacterIterators starting at positions other than zero are not supported)
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rb->adoptText(text3);
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(rb->preceding(2) == 0);
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(rb->following(11) == BreakIterator::DONE);
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //if(rb->preceding(2) != 3) {
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //    errln((UnicodeString)"ERROR:3 error in adoptText ");
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //}
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //if(rb->following(11) != BreakIterator::DONE) {
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //    errln((UnicodeString)"ERROR:4 error in adoptText ");
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //}
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // UText API
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //   Quick test to see if UText is working at all.
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *s1 = "\x68\x65\x6C\x6C\x6F\x20\x77\x6F\x72\x6C\x64"; /* "hello world" in UTF-8 */
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *s2 = "\x73\x65\x65\x20\x79\x61"; /* "see ya" in UTF-8 */
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //                012345678901
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
32350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    status.reset();
32450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalUTextPointer ut(utext_openUTF8(NULL, s1, -1, status));
32550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    wordIter1->setText(ut.getAlias(), status);
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT_SUCCESS(status);
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t pos;
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = wordIter1->first();
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(pos==0);
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = wordIter1->next();
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(pos==5);
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = wordIter1->next();
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(pos==6);
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = wordIter1->next();
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(pos==11);
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = wordIter1->next();
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(pos==UBRK_DONE);
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
34050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    status.reset();
34150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalUTextPointer ut2(utext_openUTF8(NULL, s2, -1, status));
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT_SUCCESS(status);
34350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    wordIter1->setText(ut2.getAlias(), status);
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT_SUCCESS(status);
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = wordIter1->first();
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(pos==0);
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = wordIter1->next();
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(pos==3);
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = wordIter1->next();
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(pos==4);
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = wordIter1->last();
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(pos==6);
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = wordIter1->previous();
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(pos==4);
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = wordIter1->previous();
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(pos==3);
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = wordIter1->previous();
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(pos==0);
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = wordIter1->previous();
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(pos==UBRK_DONE);
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
36450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    status.reset();
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString sEmpty;
36650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalUTextPointer gut2(utext_openUnicodeString(NULL, &sEmpty, status));
36750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    wordIter1->getUText(gut2.getAlias(), status);
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT_SUCCESS(status);
36950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    status.reset();
37050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RBBIAPITest::TestIteration()
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // This test just verifies that the API is present.
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Testing for correct operation of the break rules happens elsewhere.
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status=U_ZERO_ERROR;
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedBreakIterator* bi  = (RuleBasedBreakIterator*)RuleBasedBreakIterator::createCharacterInstance(Locale::getDefault(), status);
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || bi == NULL)  {
3816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Failure creating character break iterator.  Status = %s", u_errorName(status));
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete bi;
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi  = (RuleBasedBreakIterator*)RuleBasedBreakIterator::createWordInstance(Locale::getDefault(), status);
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || bi == NULL)  {
3886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Failure creating Word break iterator.  Status = %s", u_errorName(status));
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete bi;
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi  = (RuleBasedBreakIterator*)RuleBasedBreakIterator::createLineInstance(Locale::getDefault(), status);
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || bi == NULL)  {
3956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Failure creating Line break iterator.  Status = %s", u_errorName(status));
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete bi;
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi  = (RuleBasedBreakIterator*)RuleBasedBreakIterator::createSentenceInstance(Locale::getDefault(), status);
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || bi == NULL)  {
4026d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Failure creating Sentence break iterator.  Status = %s", u_errorName(status));
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete bi;
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi  = (RuleBasedBreakIterator*)RuleBasedBreakIterator::createTitleInstance(Locale::getDefault(), status);
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || bi == NULL)  {
4096d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Failure creating Title break iterator.  Status = %s", u_errorName(status));
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete bi;
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi  = (RuleBasedBreakIterator*)RuleBasedBreakIterator::createCharacterInstance(Locale::getDefault(), status);
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || bi == NULL)  {
4166d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Failure creating character break iterator.  Status = %s", u_errorName(status));
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;   // Skip the rest of these tests.
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString testString="0123456789";
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi->setText(testString);
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->first();
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != 0) {
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->first().  Expected 0, got %d.", i);
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->last();
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != 10) {
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->last().  Expected 10, got %d", i);
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Previous
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi->last();
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->previous();
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != 9) {
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->last() at line %d.  Expected 9, got %d", __LINE__, i);
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi->first();
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->previous();
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != BreakIterator::DONE) {
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->previous() at line %d.  Expected DONE, got %d", __LINE__, i);
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // next()
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi->first();
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->next();
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != 1) {
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->next() at line %d.  Expected 1, got %d", __LINE__, i);
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi->last();
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->next();
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != BreakIterator::DONE) {
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->next() at line %d.  Expected DONE, got %d", __LINE__, i);
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //  current()
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi->first();
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->current();
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != 0) {
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->previous() at line %d.  Expected 0, got %d", __LINE__, i);
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi->next();
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->current();
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != 1) {
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->previous() at line %d.  Expected 1, got %d", __LINE__, i);
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi->last();
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi->next();
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->current();
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != 10) {
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->previous() at line %d.  Expected 10, got %d", __LINE__, i);
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi->first();
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi->previous();
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->current();
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != 0) {
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->previous() at line %d.  Expected 0, got %d", __LINE__, i);
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Following()
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->following(4);
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != 5) {
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->following() at line %d.  Expected 5, got %d", __LINE__, i);
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->following(9);
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != 10) {
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->following() at line %d.  Expected 10, got %d", __LINE__, i);
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->following(10);
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != BreakIterator::DONE) {
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->following() at line %d.  Expected DONE, got %d", __LINE__, i);
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Preceding
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->preceding(4);
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != 3) {
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->preceding() at line %d.  Expected 3, got %d", __LINE__, i);
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->preceding(10);
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != 9) {
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->preceding() at line %d.  Expected 9, got %d", __LINE__, i);
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->preceding(1);
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != 0) {
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->preceding() at line %d.  Expected 0, got %d", __LINE__, i);
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->preceding(0);
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != BreakIterator::DONE) {
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->preceding() at line %d.  Expected DONE, got %d", __LINE__, i);
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // isBoundary()
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi->first();
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (bi->isBoundary(3) != TRUE) {
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->isBoudary() at line %d.  Expected TRUE, got FALSE", __LINE__, i);
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->current();
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != 3) {
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->current() at line %d.  Expected 3, got %d", __LINE__, i);
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (bi->isBoundary(11) != FALSE) {
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->isBoudary() at line %d.  Expected FALSE, got TRUE", __LINE__, i);
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->current();
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != 10) {
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->current() at line %d.  Expected 10, got %d", __LINE__, i);
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // next(n)
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi->first();
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->next(4);
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != 4) {
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->next() at line %d.  Expected 4, got %d", __LINE__, i);
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->next(6);
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != 10) {
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->next() at line %d.  Expected 10, got %d", __LINE__, i);
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi->first();
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    i = bi->next(11);
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i != BreakIterator::DONE) {
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Incorrect value from bi->next() at line %d.  Expected BreakIterator::DONE, got %d", __LINE__, i);
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete bi;
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RBBIAPITest::TestBuilder() {
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UnicodeString rulesString1 = "$Letters = [:L:];\n"
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  "$Numbers = [:N:];\n"
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  "$Letters+;\n"
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  "$Numbers+;\n"
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  "[^$Letters $Numbers];\n"
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  "!.*;\n";
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UnicodeString testString1  = "abc123..abc";
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                // 01234567890
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     int32_t bounds1[] = {0, 3, 6, 7, 8, 11};
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UErrorCode status=U_ZERO_ERROR;
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UParseError    parseError;
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     RuleBasedBreakIterator *bi = new RuleBasedBreakIterator(rulesString1, parseError, status);
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     if(U_FAILURE(status)) {
6056d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru         dataerrln("Fail : in construction - %s", u_errorName(status));
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     } else {
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         bi->setText(testString1);
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         doBoundaryTest(*bi, testString1, bounds1);
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     }
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     delete bi;
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//  TestQuoteGrouping
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//       Single quotes within rules imply a grouping, so that a modifier
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//       following the quoted text (* or +) applies to all of the quoted chars.
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RBBIAPITest::TestQuoteGrouping() {
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UnicodeString rulesString1 = "#Here comes the rule...\n"
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  "'$@!'*;\n"   //  (\$\@\!)*
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  ".;\n";
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UnicodeString testString1  = "$@!$@!X$@!!X";
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                // 0123456789012
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     int32_t bounds1[] = {0, 6, 7, 10, 11, 12};
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UErrorCode status=U_ZERO_ERROR;
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UParseError    parseError;
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     RuleBasedBreakIterator *bi = new RuleBasedBreakIterator(rulesString1, parseError, status);
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     if(U_FAILURE(status)) {
6326d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru         dataerrln("Fail : in construction - %s", u_errorName(status));
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     } else {
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         bi->setText(testString1);
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         doBoundaryTest(*bi, testString1, bounds1);
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     }
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     delete bi;
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//  TestRuleStatus
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//      Test word break rule status constants.
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RBBIAPITest::TestRuleStatus() {
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UChar str[30];
64654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     //no longer test Han or hiragana breaking here: ruleStatusVec would return nothing
64754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     // changed UBRK_WORD_KANA to UBRK_WORD_IDEO
64854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     u_unescape("plain word 123.45 \\u30a1\\u30a2 ",
649fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius              // 012345678901234567  8      9    0
650fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius              //                     Katakana
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                str, 30);
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UnicodeString testString1(str);
65354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     int32_t bounds1[] = {0, 5, 6, 10, 11, 17, 18, 20, 21};
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     int32_t tag_lo[]  = {UBRK_WORD_NONE,     UBRK_WORD_LETTER, UBRK_WORD_NONE,    UBRK_WORD_LETTER,
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          UBRK_WORD_NONE,     UBRK_WORD_NUMBER, UBRK_WORD_NONE,
65654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                          UBRK_WORD_IDEO,     UBRK_WORD_NONE};
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     int32_t tag_hi[]  = {UBRK_WORD_NONE_LIMIT, UBRK_WORD_LETTER_LIMIT, UBRK_WORD_NONE_LIMIT, UBRK_WORD_LETTER_LIMIT,
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          UBRK_WORD_NONE_LIMIT, UBRK_WORD_NUMBER_LIMIT, UBRK_WORD_NONE_LIMIT,
66054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                          UBRK_WORD_IDEO_LIMIT, UBRK_WORD_NONE_LIMIT};
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UErrorCode status=U_ZERO_ERROR;
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
66459d709d503bab6e2b61931737e662dd293b40578ccornelius     BreakIterator *bi = BreakIterator::createWordInstance(Locale::getEnglish(), status);
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     if(U_FAILURE(status)) {
6666d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru         errcheckln(status, "Fail : in construction - %s", u_errorName(status));
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     } else {
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         bi->setText(testString1);
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         // First test that the breaks are in the right spots.
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         doBoundaryTest(*bi, testString1, bounds1);
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         // Then go back and check tag values
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         int32_t i = 0;
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         int32_t pos, tag;
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         for (pos = bi->first(); pos != BreakIterator::DONE; pos = bi->next(), i++) {
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             if (pos != bounds1[i]) {
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 errln("FAIL: unexpected word break at postion %d", pos);
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 break;
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             }
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             tag = bi->getRuleStatus();
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             if (tag < tag_lo[i] || tag >= tag_hi[i]) {
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 errln("FAIL: incorrect tag value %d at position %d", tag, pos);
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 break;
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             }
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             // Check that we get the same tag values from getRuleStatusVec()
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             int32_t vec[10];
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             int t = bi->getRuleStatusVec(vec, 10, status);
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             TEST_ASSERT_SUCCESS(status);
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             TEST_ASSERT(t==1);
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             TEST_ASSERT(vec[0] == tag);
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         }
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     }
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     delete bi;
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     // Now test line break status.  This test mostly is to confirm that the status constants
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     //                              are correctly declared in the header.
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     testString1 =   "test line. \n";
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     // break type    s    s     h
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
70159d709d503bab6e2b61931737e662dd293b40578ccornelius     bi = BreakIterator::createLineInstance(Locale::getEnglish(), status);
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     if(U_FAILURE(status)) {
7036d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru         errcheckln(status, "failed to create word break iterator. - %s", u_errorName(status));
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     } else {
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         int32_t i = 0;
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         int32_t pos, tag;
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         UBool   success;
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         bi->setText(testString1);
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         pos = bi->current();
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         tag = bi->getRuleStatus();
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         for (i=0; i<3; i++) {
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             switch (i) {
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             case 0:
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 success = pos==0  && tag==UBRK_LINE_SOFT; break;
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             case 1:
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 success = pos==5  && tag==UBRK_LINE_SOFT; break;
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             case 2:
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 success = pos==12 && tag==UBRK_LINE_HARD; break;
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             default:
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 success = FALSE; break;
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             }
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             if (success == FALSE) {
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 errln("Fail: incorrect word break status or position.  i=%d, pos=%d, tag=%d",
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     i, pos, tag);
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 break;
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             }
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             pos = bi->next();
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             tag = bi->getRuleStatus();
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         }
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         if (UBRK_LINE_SOFT >= UBRK_LINE_SOFT_LIMIT ||
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             UBRK_LINE_HARD >= UBRK_LINE_HARD_LIMIT ||
73327f654740f2a26ad62a5c155af9199af9e69b889claireho             (UBRK_LINE_HARD > UBRK_LINE_SOFT && UBRK_LINE_HARD < UBRK_LINE_SOFT_LIMIT)) {
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             errln("UBRK_LINE_* constants from header are inconsistent.");
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         }
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     }
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     delete bi;
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//  TestRuleStatusVec
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//      Test the vector form of  break rule status.
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RBBIAPITest::TestRuleStatusVec() {
747c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UnicodeString rulesString(   "[A-N]{100}; \n"
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 "[a-w]{200}; \n"
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 "[\\p{L}]{300}; \n"
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 "[\\p{N}]{400}; \n"
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 "[0-5]{500}; \n"
752c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                                  "!.*;\n", -1, US_INV);
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UnicodeString testString1  = "Aapz5?";
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     int32_t  statusVals[10];
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     int32_t  numStatuses;
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     int32_t  pos;
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UErrorCode status=U_ZERO_ERROR;
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UParseError    parseError;
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     RuleBasedBreakIterator *bi = new RuleBasedBreakIterator(rulesString, parseError, status);
7626d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru     if (U_FAILURE(status)) {
7636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru         dataerrln("Failure at file %s, line %d, error = %s", __FILE__, __LINE__, u_errorName(status));
7646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru     } else {
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         bi->setText(testString1);
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         // A
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         pos = bi->next();
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(pos==1);
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         numStatuses = bi->getRuleStatusVec(statusVals, 10, status);
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT_SUCCESS(status);
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(numStatuses == 2);
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(statusVals[0] == 100);
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(statusVals[1] == 300);
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         // a
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         pos = bi->next();
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(pos==2);
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         numStatuses = bi->getRuleStatusVec(statusVals, 10, status);
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT_SUCCESS(status);
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(numStatuses == 2);
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(statusVals[0] == 200);
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(statusVals[1] == 300);
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         // p
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         pos = bi->next();
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(pos==3);
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         numStatuses = bi->getRuleStatusVec(statusVals, 10, status);
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT_SUCCESS(status);
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(numStatuses == 2);
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(statusVals[0] == 200);
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(statusVals[1] == 300);
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         // z
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         pos = bi->next();
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(pos==4);
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         numStatuses = bi->getRuleStatusVec(statusVals, 10, status);
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT_SUCCESS(status);
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(numStatuses == 1);
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(statusVals[0] == 300);
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         // 5
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         pos = bi->next();
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(pos==5);
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         numStatuses = bi->getRuleStatusVec(statusVals, 10, status);
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT_SUCCESS(status);
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(numStatuses == 2);
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(statusVals[0] == 400);
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(statusVals[1] == 500);
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         // ?
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         pos = bi->next();
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(pos==6);
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         numStatuses = bi->getRuleStatusVec(statusVals, 10, status);
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT_SUCCESS(status);
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(numStatuses == 1);
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(statusVals[0] == 0);
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         //
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         //  Check buffer overflow error handling.   Char == A
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         //
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         bi->first();
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         pos = bi->next();
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(pos==1);
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         memset(statusVals, -1, sizeof(statusVals));
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         numStatuses = bi->getRuleStatusVec(statusVals, 0, status);
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(numStatuses == 2);
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(statusVals[0] == -1);
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         status = U_ZERO_ERROR;
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         memset(statusVals, -1, sizeof(statusVals));
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         numStatuses = bi->getRuleStatusVec(statusVals, 1, status);
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(numStatuses == 2);
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(statusVals[0] == 100);
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(statusVals[1] == -1);
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         status = U_ZERO_ERROR;
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         memset(statusVals, -1, sizeof(statusVals));
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         numStatuses = bi->getRuleStatusVec(statusVals, 2, status);
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT_SUCCESS(status);
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(numStatuses == 2);
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(statusVals[0] == 100);
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(statusVals[1] == 300);
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         TEST_ASSERT(statusVals[2] == -1);
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     }
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     delete bi;
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//   Bug 2190 Regression test.   Builder crash on rule consisting of only a
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//                               $variable reference
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RBBIAPITest::TestBug2190() {
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UnicodeString rulesString1 = "$aaa = abcd;\n"
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  "$bbb = $aaa;\n"
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  "$bbb;\n";
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UnicodeString testString1  = "abcdabcd";
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                // 01234567890
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     int32_t bounds1[] = {0, 4, 8};
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UErrorCode status=U_ZERO_ERROR;
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UParseError    parseError;
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     RuleBasedBreakIterator *bi = new RuleBasedBreakIterator(rulesString1, parseError, status);
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     if(U_FAILURE(status)) {
8676d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru         dataerrln("Fail : in construction - %s", u_errorName(status));
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     } else {
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         bi->setText(testString1);
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         doBoundaryTest(*bi, testString1, bounds1);
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     }
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     delete bi;
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RBBIAPITest::TestRegistration() {
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    BreakIterator* ja_word = BreakIterator::createWordInstance("ja_JP", status);
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ok to not delete these if we exit because of error?
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    BreakIterator* ja_char = BreakIterator::createCharacterInstance("ja_JP", status);
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    BreakIterator* root_word = BreakIterator::createWordInstance("", status);
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    BreakIterator* root_char = BreakIterator::createCharacterInstance("", status);
884fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
8856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (status == U_MISSING_RESOURCE_ERROR || status == U_FILE_ACCESS_ERROR) {
8866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("Error creating instances of break interactors - %s", u_errorName(status));
88754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
8886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        delete ja_word;
8896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        delete ja_char;
8906d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        delete root_word;
8916d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        delete root_char;
892fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
8936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
8946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    URegistryKey key = BreakIterator::registerInstance(ja_word, "xx", UBRK_WORD, status);
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
89854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if 0 // With a dictionary based word breaking, ja_word is identical to root.
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (ja_word && *ja_word == *root_word) {
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("japan not different from root");
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
90254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BreakIterator* result = BreakIterator::createWordInstance("xx_XX", status);
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool fail = TRUE;
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(result){
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fail = *result != *ja_word;
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete result;
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (fail) {
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("bad result for xx_XX/word");
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BreakIterator* result = BreakIterator::createCharacterInstance("ja_JP", status);
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool fail = TRUE;
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(result){
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fail = *result != *ja_char;
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete result;
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (fail) {
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("bad result for ja_JP/char");
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BreakIterator* result = BreakIterator::createCharacterInstance("xx_XX", status);
931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool fail = TRUE;
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(result){
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fail = *result != *root_char;
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete result;
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (fail) {
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("bad result for xx_XX/char");
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        StringEnumeration* avail = BreakIterator::getAvailableLocales();
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool found = FALSE;
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UnicodeString* p;
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while ((p = avail->snext(status))) {
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (p->compare("xx") == 0) {
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                found = TRUE;
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete avail;
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!found) {
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("did not find test locale");
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool unreg = BreakIterator::unregister(key, status);
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!unreg) {
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("unable to unregister");
961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BreakIterator* result = BreakIterator::createWordInstance("en_US", status);
966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BreakIterator* root = BreakIterator::createWordInstance("", status);
967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool fail = TRUE;
968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(root){
969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          fail = *root != *result;
970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete root;
972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete result;
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (fail) {
974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("did not get root break");
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        StringEnumeration* avail = BreakIterator::getAvailableLocales();
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool found = FALSE;
981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UnicodeString* p;
982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while ((p = avail->snext(status))) {
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (p->compare("xx") == 0) {
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                found = TRUE;
985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete avail;
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (found) {
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("found test locale");
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t count;
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool   foundLocale = FALSE;
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const Locale *avail = BreakIterator::getAvailableLocales(count);
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int i=0; i<count; i++) {
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (avail[i] == Locale::getEnglish()) {
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                foundLocale = TRUE;
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (foundLocale == FALSE) {
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("BreakIterator::getAvailableLocales(&count), failed to find EN.");
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ja_word was adopted by factory
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete ja_char;
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete root_word;
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete root_char;
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RBBIAPITest::RoundtripRule(const char *dataFile) {
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UParseError parseError;
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    parseError.line = 0;
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    parseError.offset = 0;
102250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalUDataMemoryPointer data(udata_open(U_ICUDATA_BRKITR, "brk", dataFile, &status));
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t length;
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar *builtSource;
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const uint8_t *rbbiRules;
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const uint8_t *builtRules;
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
10296d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "Can't open \"%s\" - %s", dataFile, u_errorName(status));
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
103350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    builtRules = (const uint8_t *)udata_getMemory(data.getAlias());
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    builtSource = (const UChar *)(builtRules + ((RBBIDataHeader*)builtRules)->fRuleSource);
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RuleBasedBreakIterator *brkItr = new RuleBasedBreakIterator(builtSource, parseError, status);
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("createRuleBasedBreakIterator: ICU Error \"%s\"  at line %d, column %d\n",
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_errorName(status), parseError.line, parseError.offset);
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rbbiRules = brkItr->getBinaryRules(length);
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Comparing \"%s\" len=%d", dataFile, length);
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (memcmp(builtRules, rbbiRules, (int32_t)length) != 0) {
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Built rules and rebuilt rules are different %s", dataFile);
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete brkItr;
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RBBIAPITest::TestRoundtripRules() {
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RoundtripRule("word");
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RoundtripRule("title");
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RoundtripRule("sent");
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RoundtripRule("line");
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    RoundtripRule("char");
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!quick) {
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        RoundtripRule("word_POSIX");
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1061b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// Try out the RuleBasedBreakIterator constructors that take RBBIDataHeader*
1062b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// (these are protected so we access them via a local class RBBIWithProtectedFunctions).
1063fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius// This is just a sanity check, not a thorough test (e.g. we don't check that the
1064b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// first delete actually frees rulesCopy).
1065b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid RBBIAPITest::TestCreateFromRBBIData() {
1066b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // Get some handy RBBIData
1067b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char *brkName = "word"; // or "sent", "line", "char", etc.
1068b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
106950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalUDataMemoryPointer data(udata_open(U_ICUDATA_BRKITR, "brk", brkName, &status));
1070b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if ( U_SUCCESS(status) ) {
107150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const RBBIDataHeader * builtRules = (const RBBIDataHeader *)udata_getMemory(data.getAlias());
1072b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        uint32_t length = builtRules->fLength;
1073b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        RBBIWithProtectedFunctions * brkItr;
1074b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1075b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // Try the memory-adopting constructor, need to copy the data first
1076b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        RBBIDataHeader * rulesCopy = (RBBIDataHeader *) uprv_malloc(length);
1077b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if ( rulesCopy ) {
1078b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            uprv_memcpy( rulesCopy, builtRules, length );
1079b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1080b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            brkItr = new RBBIWithProtectedFunctions(rulesCopy, status);
1081b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if ( U_SUCCESS(status) ) {
1082b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                delete brkItr; // this should free rulesCopy
1083b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            } else {
1084b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                errln("create RuleBasedBreakIterator from RBBIData (adopted): ICU Error \"%s\"\n", u_errorName(status) );
1085b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                status = U_ZERO_ERROR;// reset for the next test
1086b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                uprv_free( rulesCopy );
1087b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
1088b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
1089fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1090b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // Now try the non-adopting constructor
1091b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        brkItr = new RBBIWithProtectedFunctions(builtRules, RBBIWithProtectedFunctions::kDontAdopt, status);
1092b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if ( U_SUCCESS(status) ) {
1093b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            delete brkItr; // this should NOT attempt to free builtRules
1094b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if (builtRules->fLength != length) { // sanity check
1095b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                errln("create RuleBasedBreakIterator from RBBIData (non-adopted): delete affects data\n" );
1096b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
1097b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        } else {
1098b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            errln("create RuleBasedBreakIterator from RBBIData (non-adopted): ICU Error \"%s\"\n", u_errorName(status) );
1099b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
1100b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
1101b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1102b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // getBinaryRules() and RuleBasedBreakIterator(uint8_t binaryRules, ...)
1103b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    //
1104b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    status = U_ZERO_ERROR;
1105b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    RuleBasedBreakIterator *rb = (RuleBasedBreakIterator *)BreakIterator::createWordInstance(Locale::getEnglish(), status);
1106b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (rb == NULL || U_FAILURE(status)) {
1107b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        dataerrln("Unable to create BreakIterator::createWordInstance (Locale::getEnglish) - %s", u_errorName(status));
1108b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else {
1109b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        uint32_t length;
1110b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        const uint8_t *rules = rb->getBinaryRules(length);
1111b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        RuleBasedBreakIterator *rb2 = new RuleBasedBreakIterator(rules, length, status);
1112b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_ASSERT_SUCCESS(status);
1113b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_ASSERT(*rb == *rb2);
1114b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UnicodeString words = "one two three ";
1115b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        rb2->setText(words);
1116b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int wordCounter = 0;
1117b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        while (rb2->next() != UBRK_DONE) {
1118b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            wordCounter++;
1119b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1120b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_ASSERT(wordCounter == 6);
1121b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1122b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        status = U_ZERO_ERROR;
1123b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        RuleBasedBreakIterator *rb3 = new RuleBasedBreakIterator(rules, length-1, status);
1124b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_ASSERT(status == U_ILLEGAL_ARGUMENT_ERROR);
1125b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1126b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        delete rb;
1127b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        delete rb2;
1128b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        delete rb3;
1129b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
1130b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
1131b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
11324fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes
11334fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughesvoid RBBIAPITest::TestRefreshInputText() {
11344fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    /*
11354fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes     *  RefreshInput changes out the input of a Break Iterator without
11364fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes     *    changing anything else in the iterator's state.  Used with Java JNI,
11374fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes     *    when Java moves the underlying string storage.   This test
11384fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes     *    runs BreakIterator::next() repeatedly, moving the text in the middle of the sequence.
11394fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes     *    The right set of boundaries should still be found.
11404fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes     */
11414fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    UChar testStr[]  = {0x20, 0x41, 0x20, 0x42, 0x20, 0x43, 0x20, 0x44, 0x0};  /* = " A B C D"  */
11424fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    UChar movedStr[] = {0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,  0};
11434fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    UErrorCode status = U_ZERO_ERROR;
11444fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    UText ut1 = UTEXT_INITIALIZER;
11454fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    UText ut2 = UTEXT_INITIALIZER;
11464fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    RuleBasedBreakIterator *bi = (RuleBasedBreakIterator *)BreakIterator::createLineInstance(Locale::getEnglish(), status);
11474fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    TEST_ASSERT_SUCCESS(status);
11484fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes
11494fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    utext_openUChars(&ut1, testStr, -1, &status);
11504fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    TEST_ASSERT_SUCCESS(status);
11514fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes
1152103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (U_SUCCESS(status)) {
1153103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        bi->setText(&ut1, status);
1154103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TEST_ASSERT_SUCCESS(status);
1155103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1156103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        /* Line boundaries will occur before each letter in the original string */
1157103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TEST_ASSERT(1 == bi->next());
1158103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TEST_ASSERT(3 == bi->next());
1159103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1160103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        /* Move the string, kill the original string.  */
1161103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        u_strcpy(movedStr, testStr);
1162103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        u_memset(testStr, 0x20, u_strlen(testStr));
1163103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        utext_openUChars(&ut2, movedStr, -1, &status);
1164103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TEST_ASSERT_SUCCESS(status);
1165103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        RuleBasedBreakIterator *returnedBI = &bi->refreshInputText(&ut2, status);
1166103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TEST_ASSERT_SUCCESS(status);
1167103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TEST_ASSERT(bi == returnedBI);
1168103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1169103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        /* Find the following matches, now working in the moved string. */
1170103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TEST_ASSERT(5 == bi->next());
1171103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TEST_ASSERT(7 == bi->next());
1172103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TEST_ASSERT(8 == bi->next());
1173103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TEST_ASSERT(UBRK_DONE == bi->next());
1174fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1175103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        utext_close(&ut1);
1176103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        utext_close(&ut2);
1177103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1178103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    delete bi;
1179103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
11804fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes}
11814fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes
1182fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#if !UCONFIG_NO_BREAK_ITERATION && U_HAVE_STD_STRING
1183fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic void prtbrks(BreakIterator* brk, const UnicodeString &ustr, IntlTest &it) {
1184fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  static const UChar PILCROW=0x00B6, CHSTR=0x3010, CHEND=0x3011; // lenticular brackets
1185fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  it.logln(UnicodeString("String:'")+ustr+UnicodeString("'"));
1186fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1187fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  int32_t *pos = new int32_t[ustr.length()];
1188fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  int32_t posCount = 0;
1189fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1190fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  // calculate breaks up front, so we can print out
1191fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  // sans any debugging
1192fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  for(int32_t n = 0; (n=brk->next())!=UBRK_DONE; ) {
1193fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    pos[posCount++] = n;
1194fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if(posCount>=ustr.length()) {
1195fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      it.errln("brk count exceeds string length!");
1196fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      return;
1197fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
1198fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  }
1199fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  UnicodeString out;
1200fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  out.append((UChar)CHSTR);
1201fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  int32_t prev = 0;
1202fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  for(int32_t i=0;i<posCount;i++) {
1203fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t n=pos[i];
1204fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    out.append(ustr.tempSubString(prev,n-prev));
1205fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    out.append((UChar)PILCROW);
1206fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    prev=n;
1207fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  }
1208fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  out.append(ustr.tempSubString(prev,ustr.length()-prev));
1209fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  out.append((UChar)CHEND);
1210fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  it.logln(out);
1211fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1212fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  out.remove();
1213fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  for(int32_t i=0;i<posCount;i++) {
1214fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    char tmp[100];
1215fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    sprintf(tmp,"%d ",pos[i]);
1216fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    out.append(UnicodeString(tmp));
1217fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  }
1218fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  it.logln(out);
1219fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  delete [] pos;
1220fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
1221fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#endif
1222fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1223fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid RBBIAPITest::TestFilteredBreakIteratorBuilder() {
1224fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#if !UCONFIG_NO_BREAK_ITERATION && U_HAVE_STD_STRING && !UCONFIG_NO_FILTERED_BREAK_ITERATION
1225fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  UErrorCode status = U_ZERO_ERROR;
1226fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  LocalPointer<FilteredBreakIteratorBuilder> builder;
1227fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  LocalPointer<BreakIterator> baseBI;
1228fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  LocalPointer<BreakIterator> filteredBI;
1229fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1230fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  const UnicodeString text("In the meantime Mr. Weston arrived with his small ship, which he had now recovered. Capt. Gorges, who informed the Sgt. here that one purpose of his going east was to meet with Mr. Weston, took this opportunity to call him to account for some abuses he had to lay to his charge."); // (William Bradford, public domain. http://catalog.hathitrust.org/Record/008651224 ) - edited.
1231fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  const UnicodeString ABBR_MR("Mr.");
1232fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  const UnicodeString ABBR_CAPT("Capt.");
1233fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1234fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  {
1235fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Constructing empty builder\n");
1236fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    builder.adoptInstead(FilteredBreakIteratorBuilder::createInstance(status));
1237fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT_SUCCESS(status);
1238fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1239fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Constructing base BI\n");
1240fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    baseBI.adoptInstead(BreakIterator::createSentenceInstance(Locale::getEnglish(), status));
1241fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT_SUCCESS(status);
1242fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1243fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Building new BI\n");
1244fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    filteredBI.adoptInstead(builder->build(baseBI.orphan(), status));
1245fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT_SUCCESS(status);
1246fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1247fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Testing:");
1248fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    filteredBI->setText(text);
1249fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT(20 == filteredBI->next()); // Mr.
1250fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT(84 == filteredBI->next()); // recovered.
1251fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT(90 == filteredBI->next()); // Capt.
1252fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT(181 == filteredBI->next()); // Mr.
1253fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT(278 == filteredBI->next()); // charge.
1254fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    filteredBI->first();
1255fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    prtbrks(filteredBI.getAlias(), text, *this);
1256fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  }
1257fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1258fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  {
1259fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Constructing empty builder\n");
1260fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    builder.adoptInstead(FilteredBreakIteratorBuilder::createInstance(status));
1261fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT_SUCCESS(status);
1262fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1263fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Adding Mr. as an exception\n");
1264fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT(TRUE == builder->suppressBreakAfter(ABBR_MR, status));
1265fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT(FALSE == builder->suppressBreakAfter(ABBR_MR, status)); // already have it
1266fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT(TRUE == builder->unsuppressBreakAfter(ABBR_MR, status));
1267fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT(FALSE == builder->unsuppressBreakAfter(ABBR_MR, status)); // already removed it
1268fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT(TRUE == builder->suppressBreakAfter(ABBR_MR, status));
1269fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT_SUCCESS(status);
1270fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1271fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Constructing base BI\n");
1272fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    baseBI.adoptInstead(BreakIterator::createSentenceInstance(Locale::getEnglish(), status));
1273fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT_SUCCESS(status);
1274fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1275fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Building new BI\n");
1276fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    filteredBI.adoptInstead(builder->build(baseBI.orphan(), status));
1277fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT_SUCCESS(status);
1278fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1279fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Testing:");
1280fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    filteredBI->setText(text);
1281fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT(84 == filteredBI->next());
1282fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT(90 == filteredBI->next());// Capt.
1283fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT(278 == filteredBI->next());
1284fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    filteredBI->first();
1285fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    prtbrks(filteredBI.getAlias(), text, *this);
1286fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  }
1287fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1288fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1289fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  {
1290fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Constructing empty builder\n");
1291fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    builder.adoptInstead(FilteredBreakIteratorBuilder::createInstance(status));
1292fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT_SUCCESS(status);
1293fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1294fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Adding Mr. and Capt as an exception\n");
1295fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT(TRUE == builder->suppressBreakAfter(ABBR_MR, status));
1296fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT(TRUE == builder->suppressBreakAfter(ABBR_CAPT, status));
1297fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT_SUCCESS(status);
1298fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1299fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Constructing base BI\n");
1300fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    baseBI.adoptInstead(BreakIterator::createSentenceInstance(Locale::getEnglish(), status));
1301fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT_SUCCESS(status);
1302fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1303fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Building new BI\n");
1304fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    filteredBI.adoptInstead(builder->build(baseBI.orphan(), status));
1305fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT_SUCCESS(status);
1306fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1307fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Testing:");
1308fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    filteredBI->setText(text);
1309fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT(84 == filteredBI->next());
1310fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT(278 == filteredBI->next());
1311fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    filteredBI->first();
1312fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    prtbrks(filteredBI.getAlias(), text, *this);
1313fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  }
1314fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1315fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1316fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  {
1317fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Constructing English builder\n");
1318fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    builder.adoptInstead(FilteredBreakIteratorBuilder::createInstance(Locale::getEnglish(), status));
1319fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT_SUCCESS(status);
1320fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1321fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Constructing base BI\n");
1322fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    baseBI.adoptInstead(BreakIterator::createSentenceInstance(Locale::getEnglish(), status));
1323fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT_SUCCESS(status);
1324fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1325fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("unsuppressing 'Capt'");
1326fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT(TRUE == builder->unsuppressBreakAfter(ABBR_CAPT, status));
1327fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1328fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Building new BI\n");
1329fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    filteredBI.adoptInstead(builder->build(baseBI.orphan(), status));
1330fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT_SUCCESS(status);
1331fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1332fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if(filteredBI.isValid()) {
1333fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      logln("Testing:");
1334fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      filteredBI->setText(text);
1335fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      TEST_ASSERT(84 == filteredBI->next());
1336fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      TEST_ASSERT(90 == filteredBI->next());
1337fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      TEST_ASSERT(278 == filteredBI->next());
1338fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      filteredBI->first();
1339fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      prtbrks(filteredBI.getAlias(), text, *this);
1340fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
1341fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  }
1342fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1343fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1344fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  {
1345fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Constructing English builder\n");
1346fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    builder.adoptInstead(FilteredBreakIteratorBuilder::createInstance(Locale::getEnglish(), status));
1347fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT_SUCCESS(status);
1348fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1349fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Constructing base BI\n");
1350fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    baseBI.adoptInstead(BreakIterator::createSentenceInstance(Locale::getEnglish(), status));
1351fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT_SUCCESS(status);
1352fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1353fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Building new BI\n");
1354fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    filteredBI.adoptInstead(builder->build(baseBI.orphan(), status));
1355fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT_SUCCESS(status);
1356fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1357fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if(filteredBI.isValid()) {
1358fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      logln("Testing:");
1359fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      filteredBI->setText(text);
1360fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      TEST_ASSERT(84 == filteredBI->next());
1361fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      TEST_ASSERT(278 == filteredBI->next());
1362fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      filteredBI->first();
1363fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      prtbrks(filteredBI.getAlias(), text, *this);
1364fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
1365fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  }
1366fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1367fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#if 0
1368fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  // reenable once french is in
1369fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  {
1370fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Constructing French builder");
1371fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    builder.adoptInstead(FilteredBreakIteratorBuilder::createInstance(Locale::getFrench(), status));
1372fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT_SUCCESS(status);
1373fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1374fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Constructing base BI\n");
1375fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    baseBI.adoptInstead(BreakIterator::createSentenceInstance(Locale::getFrench(), status));
1376fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT_SUCCESS(status);
1377fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1378fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln("Building new BI\n");
1379fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    filteredBI.adoptInstead(builder->build(baseBI.orphan(), status));
1380fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_ASSERT_SUCCESS(status);
1381fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1382fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if(filteredBI.isValid()) {
1383fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      logln("Testing:");
1384fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      filteredBI->setText(text);
1385fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      TEST_ASSERT(20 == filteredBI->next());
1386fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      TEST_ASSERT(84 == filteredBI->next());
1387fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      filteredBI->first();
1388fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      prtbrks(filteredBI.getAlias(), text, *this);
1389fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
1390fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  }
1391fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#endif
1392fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1393fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#else
1394fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  logln("Skipped- not: !UCONFIG_NO_BREAK_ITERATION && U_HAVE_STD_STRING && !UCONFIG_NO_FILTERED_BREAK_ITERATION");
1395fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#endif
1396fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
13974fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// runIndexedTest
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RBBIAPITest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (exec) logln((UnicodeString)"TestSuite RuleBasedBreakIterator API ");
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (index) {
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     //   case 0: name = "TestConstruction"; if (exec) TestConstruction(); break;
140750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FILE_IO
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case  0: name = "TestCloneEquals"; if (exec) TestCloneEquals(); break;
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case  1: name = "TestgetRules"; if (exec) TestgetRules(); break;
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case  2: name = "TestHashCode"; if (exec) TestHashCode(); break;
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case  3: name = "TestGetSetAdoptText"; if (exec) TestGetSetAdoptText(); break;
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case  4: name = "TestIteration"; if (exec) TestIteration(); break;
141350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#else
141450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        case  0: case  1: case  2: case  3: case  4: name = "skip"; break;
141550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case  5: name = "TestBuilder"; if (exec) TestBuilder(); break;
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case  6: name = "TestQuoteGrouping"; if (exec) TestQuoteGrouping(); break;
141850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        case  7: name = "TestRuleStatusVec"; if (exec) TestRuleStatusVec(); break;
141950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        case  8: name = "TestBug2190"; if (exec) TestBug2190(); break;
142050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FILE_IO
142150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        case  9: name = "TestRegistration"; if (exec) TestRegistration(); break;
142250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        case 10: name = "TestBoilerPlate"; if (exec) TestBoilerPlate(); break;
142350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        case 11: name = "TestRuleStatus"; if (exec) TestRuleStatus(); break;
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 12: name = "TestRoundtripRules"; if (exec) TestRoundtripRules(); break;
1425b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        case 13: name = "TestCreateFromRBBIData"; if (exec) TestCreateFromRBBIData(); break;
142650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#else
142750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        case  9: case 10: case 11: case 12: case 13: name = "skip"; break;
142850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
14294fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes        case 14: name = "TestRefreshInputText"; if (exec) TestRefreshInputText(); break;
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1431fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#if !UCONFIG_NO_BREAK_ITERATION && U_HAVE_STD_STRING
1432fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    case 15: name = "TestFilteredBreakIteratorBuilder"; if(exec) TestFilteredBreakIteratorBuilder(); break;
1433fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#else
1434fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    case 15: name="skip"; break;
1435fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#endif
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        default: name = ""; break; // needed to end loop
1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//Internal subroutines
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
144459d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid RBBIAPITest::doBoundaryTest(BreakIterator& bi, UnicodeString& text, int32_t *boundaries){
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     logln((UnicodeString)"testIsBoundary():");
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t p = 0;
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool isB;
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int32_t i = 0; i < text.length(); i++) {
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            isB = bi.isBoundary(i);
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln((UnicodeString)"bi.isBoundary(" + i + ") -> " + isB);
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (i == boundaries[p]) {
1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (!isB)
1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln((UnicodeString)"Wrong result from isBoundary() for " + i + (UnicodeString)": expected true, got false");
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                p++;
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else {
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (isB)
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln((UnicodeString)"Wrong result from isBoundary() for " + i + (UnicodeString)": expected false, got true");
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RBBIAPITest::doTest(UnicodeString& testString, int32_t start, int32_t gotoffset, int32_t expectedOffset, const char* expectedString){
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString selected;
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString expected=CharsToUnicodeString(expectedString);
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(gotoffset != expectedOffset)
1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         errln((UnicodeString)"ERROR:****returned #" + gotoffset + (UnicodeString)" instead of #" + expectedOffset);
1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(start <= gotoffset){
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testString.extractBetween(start, gotoffset, selected);
1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else{
1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testString.extractBetween(gotoffset, start, selected);
1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(selected.compare(expected) != 0)
1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         errln(prettify((UnicodeString)"ERROR:****selected \"" + selected + "\" instead of \"" + expected + "\""));
1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(prettify("****selected \"" + selected + "\""));
1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1481b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//---------------------------------------------
1482b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//RBBIWithProtectedFunctions class functions
1483b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//---------------------------------------------
1484b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1485b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruRBBIWithProtectedFunctions::RBBIWithProtectedFunctions(RBBIDataHeader* data, UErrorCode &status)
1486b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    : RuleBasedBreakIterator(data, status)
1487b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
1488b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
1489b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1490b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruRBBIWithProtectedFunctions::RBBIWithProtectedFunctions(const RBBIDataHeader* data, enum EDontAdopt, UErrorCode &status)
1491b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    : RuleBasedBreakIterator(data, RuleBasedBreakIterator::kDontAdopt, status)
1492b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
1493b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
1494b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
1496