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