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