itercoll.cpp revision 8de051c3d18a56cc126f0f44e368495a52f9148c
1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/********************************************************************
2fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * COPYRIGHT:
38de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * Copyright (c) 1997-2016, International Business Machines Corporation and
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * others. All Rights Reserved.
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/coll.h"
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/tblcoll.h"
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/unistr.h"
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/sortkey.h"
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "itercoll.h"
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/schriter.h"
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/chariter.h"
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uchar.h"
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cmemory.h"
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UErrorCode status = U_ZERO_ERROR;
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruCollationIteratorTest::CollationIteratorTest()
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru : test1("What subset of all possible test cases?", ""),
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   test2("has the highest probability of detecting", "")
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    en_us = (RuleBasedCollator *)Collator::createInstance(Locale::getUS(), status);
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)) {
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      delete en_us;
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      en_us = 0;
3185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      errcheckln(status, "Collator creation failed with %s", u_errorName(status));
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      return;
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruCollationIteratorTest::~CollationIteratorTest()
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete en_us;
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Test for CollationElementIterator previous and next for the whole set of
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * unicode characters.
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid CollationIteratorTest::TestUnicodeChar()
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    CollationElementIterator *iter;
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar codepoint;
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString source;
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for (codepoint = 1; codepoint < 0xFFFE;)
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      source.remove();
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      while (codepoint % 0xFF != 0)
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      {
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (u_isdefined(codepoint))
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          source += codepoint;
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        codepoint ++;
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (u_isdefined(codepoint))
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        source += codepoint;
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      if (codepoint != 0xFFFF)
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        codepoint ++;
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      iter = en_us->createCollationElementIterator(source);
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      /* A basic test to see if it's working at all */
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      backAndForth(*iter);
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      delete iter;
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Test for CollationElementIterator.previous()
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @bug 4108758 - Make sure it works with contracting characters
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid CollationIteratorTest::TestPrevious(/* char* par */)
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    CollationElementIterator *iter = en_us->createCollationElementIterator(test1);
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // A basic test to see if it's working at all
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    backAndForth(*iter);
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete iter;
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // Test with a contracting character sequence
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString source;
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    RuleBasedCollator *c1 = NULL;
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    c1 = new RuleBasedCollator(
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        (UnicodeString)"&a,A < b,B < c,C, d,D < z,Z < ch,cH,Ch,CH", status);
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (c1 == NULL || U_FAILURE(status))
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Couldn't create a RuleBasedCollator with a contracting sequence.");
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete c1;
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source = "abchdcba";
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter = c1->createCollationElementIterator(source);
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    backAndForth(*iter);
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete iter;
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete c1;
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // Test with an expanding character sequence
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    RuleBasedCollator *c2 = NULL;
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    c2 = new RuleBasedCollator((UnicodeString)"&a < b < c/abd < d", status);
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (c2 == NULL || U_FAILURE(status))
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Couldn't create a RuleBasedCollator with an expanding sequence.");
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete c2;
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source = "abcd";
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter = c2->createCollationElementIterator(source);
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    backAndForth(*iter);
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete iter;
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete c2;
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // Now try both
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    RuleBasedCollator *c3 = NULL;
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    c3 = new RuleBasedCollator((UnicodeString)"&a < b < c/aba < d < z < ch", status);
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (c3 == NULL || U_FAILURE(status))
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Couldn't create a RuleBasedCollator with both an expanding and a contracting sequence.");
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete c3;
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source = "abcdbchdc";
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter = c3->createCollationElementIterator(source);
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    backAndForth(*iter);
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete iter;
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete c3;
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    status=U_ZERO_ERROR;
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source= CharsToUnicodeString("\\u0e41\\u0e02\\u0e41\\u0e02\\u0e27abc");
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Collator *c4 = Collator::createInstance(Locale("th", "TH", ""), status);
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Couldn't create a collator");
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter = ((RuleBasedCollator*)c4)->createCollationElementIterator(source);
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    backAndForth(*iter);
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete iter;
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete c4;
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source= CharsToUnicodeString("\\u0061\\u30CF\\u3099\\u30FC");
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Collator *c5 = Collator::createInstance(Locale("ja", "JP", ""), status);
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter = ((RuleBasedCollator*)c5)->createCollationElementIterator(source);
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(status)){
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Couldn't create Japanese collator\n");
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    backAndForth(*iter);
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete iter;
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete c5;
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Test for getOffset() and setOffset()
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid CollationIteratorTest::TestOffset(/* char* par */)
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    CollationElementIterator *iter = en_us->createCollationElementIterator(test1);
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // testing boundaries
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter->setOffset(0, status);
177fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (U_FAILURE(status) || iter->previous(status) != CollationElementIterator::NULLORDER) {
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Error: After setting offset to 0, we should be at the end "
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "of the backwards iteration");
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter->setOffset(test1.length(), status);
182fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (U_FAILURE(status) || iter->next(status) != CollationElementIterator::NULLORDER) {
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Error: After setting offset to end of the string, we should "
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                "be at the end of the backwards iteration");
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // Run all the way through the iterator, then get the offset
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t orderLength = 0;
18985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    Order *orders = getOrders(*iter, orderLength);
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t offset = iter->getOffset();
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (offset != test1.length())
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString msg1("offset at end != length: ");
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString msg2(" vs ");
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln(msg1 + offset + msg2 + test1.length());
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // Now set the offset back to the beginning and see if it works
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    CollationElementIterator *pristine = en_us->createCollationElementIterator(test1);
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter->setOffset(0, status);
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status))
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("setOffset failed.");
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        assertEqual(*iter, *pristine);
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete pristine;
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete[] orders;
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete iter;
218fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
219fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // setting offset in the middle of a contraction
220fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UnicodeString contraction = "change";
221fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    status = U_ZERO_ERROR;
222fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    RuleBasedCollator tailored("& a < ch", status);
223fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (U_FAILURE(status)) {
224fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errln("Error: in creation of Spanish collator - %s", u_errorName(status));
225fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return;
226fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
227fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter = tailored.createCollationElementIterator(contraction);
228fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    Order *order = getOrders(*iter, orderLength);
229fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter->setOffset(1, status); // sets offset in the middle of ch
230fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t order2Length = 0;
231fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    Order *order2 = getOrders(*iter, order2Length);
232fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (orderLength != order2Length || uprv_memcmp(order, order2, orderLength * sizeof(Order)) != 0) {
233fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errln("Error: setting offset in the middle of a contraction should be the same as setting it to the start of the contraction");
234fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
235fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    delete[] order;
236fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    delete[] order2;
237fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    delete iter;
238fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    contraction = "peache";
239fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter = tailored.createCollationElementIterator(contraction);
240fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter->setOffset(3, status);
241fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    order = getOrders(*iter, orderLength);
242fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter->setOffset(4, status); // sets offset in the middle of ch
243fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    order2 = getOrders(*iter, order2Length);
244fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (orderLength != order2Length || uprv_memcmp(order, order2, orderLength * sizeof(Order)) != 0) {
245fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errln("Error: setting offset in the middle of a contraction should be the same as setting it to the start of the contraction");
246fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
247fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    delete[] order;
248fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    delete[] order2;
249fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    delete iter;
250fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // setting offset in the middle of a surrogate pair
251fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UnicodeString surrogate = UNICODE_STRING_SIMPLE("\\ud800\\udc00str").unescape();
252fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter = tailored.createCollationElementIterator(surrogate);
253fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    order = getOrders(*iter, orderLength);
254fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter->setOffset(1, status); // sets offset in the middle of surrogate
255fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    order2 = getOrders(*iter, order2Length);
256fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (orderLength != order2Length || uprv_memcmp(order, order2, orderLength * sizeof(Order)) != 0) {
257fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errln("Error: setting offset in the middle of a surrogate pair should be the same as setting it to the start of the surrogate pair");
258fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
259fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    delete[] order;
260fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    delete[] order2;
261fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    delete iter;
262fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    surrogate = UNICODE_STRING_SIMPLE("simple\\ud800\\udc00str").unescape();
263fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter = tailored.createCollationElementIterator(surrogate);
264fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter->setOffset(6, status);
265fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    order = getOrders(*iter, orderLength);
266fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    iter->setOffset(7, status); // sets offset in the middle of surrogate
267fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    order2 = getOrders(*iter, order2Length);
268fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (orderLength != order2Length || uprv_memcmp(order, order2, orderLength * sizeof(Order)) != 0) {
269fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errln("Error: setting offset in the middle of a surrogate pair should be the same as setting it to the start of the surrogate pair");
270fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
271fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    delete[] order;
272fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    delete[] order2;
273fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    delete iter;
274fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // TODO: try iterating halfway through a messy string.
275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Test for setText()
279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid CollationIteratorTest::TestSetText(/* char* par */)
281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    CollationElementIterator *iter1 = en_us->createCollationElementIterator(test1);
283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    CollationElementIterator *iter2 = en_us->createCollationElementIterator(test2);
284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // Run through the second iterator just to exercise it
287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t c = iter2->next(status);
288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t i = 0;
289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while ( ++i < 10 && c != CollationElementIterator::NULLORDER)
291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_FAILURE(status))
293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {
294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            errln("iter2->next() returned an error.");
295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            delete iter2;
296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            delete iter1;
297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = iter2->next(status);
300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // Now set it to point to the same string as the first iterator
303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter2->setText(test1, status);
304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status))
306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("call to iter2->setText(test1) failed.");
308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else
310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        assertEqual(*iter1, *iter2);
312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter1->reset();
314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    //now use the overloaded setText(ChracterIterator&, UErrorCode) function to set the text
315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    CharacterIterator* chariter = new StringCharacterIterator(test1);
316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter2->setText(*chariter, status);
317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status))
318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("call to iter2->setText(chariter(test1)) failed.");
320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else
322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        assertEqual(*iter1, *iter2);
324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // test for an empty string
327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString empty("");
328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter1->setText(empty, status);
329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)
330fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        || iter1->next(status) != (int32_t)CollationElementIterator::NULLORDER) {
331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Empty string should have no CEs.");
332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ((StringCharacterIterator *)chariter)->setText(empty);
334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter1->setText(*chariter, status);
335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)
336fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        || iter1->next(status) != (int32_t)CollationElementIterator::NULLORDER) {
337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Empty string should have no CEs.");
338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete chariter;
340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete iter2;
341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete iter1;
342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** @bug 4108762
345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Test for getMaxExpansion()
346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid CollationIteratorTest::TestMaxExpansion(/* char* par */)
348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode          status = U_ZERO_ERROR;
350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString rule("&a < ab < c/aba < d < z < ch");
351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    RuleBasedCollator  *coll   = new RuleBasedCollator(rule, status);
352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar               ch     = 0;
353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString       str(ch);
354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    CollationElementIterator *iter   = coll->createCollationElementIterator(str);
356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while (ch < 0xFFFF && U_SUCCESS(status)) {
358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int      count = 1;
359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uint32_t order;
360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ch ++;
361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString str(ch);
362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        iter->setText(str, status);
363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        order = iter->previous(status);
364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* thai management */
366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (CollationElementIterator::isIgnorable(order))
367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            order = iter->previous(status);
368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        while (U_SUCCESS(status)
370fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            && iter->previous(status) != (int32_t)CollationElementIterator::NULLORDER)
371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {
372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            count ++;
373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_FAILURE(status) && iter->getMaxExpansion(order) < count) {
376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            errln("Failure at codepoint %d, maximum expansion count < %d\n",
377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                ch, count);
378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete iter;
382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete coll;
383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @bug 4157299
387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid CollationIteratorTest::TestClearBuffers(/* char* par */)
389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    RuleBasedCollator *c = new RuleBasedCollator((UnicodeString)"&a < b < c & ab = d", status);
392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (c == NULL || U_FAILURE(status))
394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Couldn't create a RuleBasedCollator.");
396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete c;
397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString source("abcd");
401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    CollationElementIterator *i = c->createCollationElementIterator(source);
402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t e0 = i->next(status);    // save the first collation element
403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status))
405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("call to i->next() failed. err=%s", u_errorName(status));
407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else
409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        i->setOffset(3, status);        // go to the expanding character
411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (U_FAILURE(status))
413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {
414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            errln("call to i->setOffset(3) failed. err=%s", u_errorName(status));
415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        else
417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {
418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            i->next(status);                // but only use up half of it
419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if (U_FAILURE(status))
421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            {
422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                errln("call to i->next() failed. err=%s", u_errorName(status));
423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            else
425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            {
426ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                i->setOffset(0, status);        // go back to the beginning
427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                if (U_FAILURE(status))
429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                {
430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    errln("call to i->setOffset(0) failed. err=%s", u_errorName(status));
431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                else
433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                {
434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    int32_t e = i->next(status);    // and get this one again
435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    if (U_FAILURE(status))
437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    {
438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        errln("call to i->next() failed. err=%s", u_errorName(status));
439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    }
440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    else if (e != e0)
441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    {
442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        errln("got 0x%X, expected 0x%X", e, e0);
443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                    }
444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                }
445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete i;
450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete c;
451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Testing the assignment operator
455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid CollationIteratorTest::TestAssignment()
457ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
459ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    RuleBasedCollator *coll =
460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        (RuleBasedCollator *)Collator::createInstance(status);
461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (coll == NULL || U_FAILURE(status))
463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Couldn't create a default collator.");
465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString source("abcd");
469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    CollationElementIterator *iter1 =
470ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        coll->createCollationElementIterator(source);
471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    CollationElementIterator iter2 = *iter1;
473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
474ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (*iter1 != iter2) {
475ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Fail collation iterator assignment does not produce the same elements");
476ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
477ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
478ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    CollationElementIterator iter3(*iter1);
479ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
480ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (*iter1 != iter3) {
481ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Fail collation iterator copy constructor does not produce the same elements");
482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
484ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    source = CharsToUnicodeString("a\\u0300\\u0325");
485ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    coll->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    CollationElementIterator *iter4
487ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        = coll->createCollationElementIterator(source);
488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    CollationElementIterator iter5(*iter4);
489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (*iter4 != iter5) {
490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("collation iterator assignment does not produce the same elements");
491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter4->next(status);
493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status) || *iter4 == iter5) {
494ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("collation iterator not equal");
495ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
496ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter5.next(status);
497ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status) || *iter4 != iter5) {
498ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("collation iterator equal");
499ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
500ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter4->next(status);
501ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status) || *iter4 == iter5) {
502ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("collation iterator not equal");
503ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
504ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter5.next(status);
505ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status) || *iter4 != iter5) {
506ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("collation iterator equal");
507ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
508ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    CollationElementIterator iter6(*iter4);
509ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (*iter4 != iter6) {
510ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("collation iterator equal");
511ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
512ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter4->next(status);
513ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status) || *iter4 == iter5) {
514ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("collation iterator not equal");
515ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
516ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter5.next(status);
517ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status) || *iter4 != iter5) {
518ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("collation iterator equal");
519ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
520ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter4->next(status);
521ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status) || *iter4 == iter5) {
522ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("collation iterator not equal");
523ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
524ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter5.next(status);
525ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status) || *iter4 != iter5) {
526ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("collation iterator equal");
527ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
528ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete iter1;
529ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete iter4;
530ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete coll;
531ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
532ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
533ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
534ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Testing the constructors
535ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
536ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid CollationIteratorTest::TestConstructors()
537ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
538ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
539ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    RuleBasedCollator *coll =
540ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        (RuleBasedCollator *)Collator::createInstance(status);
541ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (coll == NULL || U_FAILURE(status))
542ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
543ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Couldn't create a default collator.");
544ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
545ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
546ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
547ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // testing protected constructor with character iterator as argument
548ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    StringCharacterIterator chariter(test1);
549ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    CollationElementIterator *iter1 =
550ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        coll->createCollationElementIterator(chariter);
551ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(status)) {
552ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Couldn't create collation element iterator with character iterator.");
553ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
554ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
555ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    CollationElementIterator *iter2 =
556ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        coll->createCollationElementIterator(test1);
557ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
558ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // initially the 2 collation element iterators should be the same
559ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (*iter1 != *iter1 || *iter2 != *iter2 || *iter1 != *iter2
560ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        || *iter2 != *iter1) {
561ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("CollationElementIterators constructed with the same string data should be the same at the start");
562ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
563ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    assertEqual(*iter1, *iter2);
564ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
565ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete iter1;
566ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete iter2;
567ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
568ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // tests empty strings
569ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString empty("");
570ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter1 = coll->createCollationElementIterator(empty);
571ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    chariter.setText(empty);
572ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    iter2 = coll->createCollationElementIterator(chariter);
573ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (*iter1 != *iter1 || *iter2 != *iter2 || *iter1 != *iter2
574ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        || *iter2 != *iter1) {
575ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("CollationElementIterators constructed with the same string data should be the same at the start");
576ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
577fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (iter1->next(status) != (int32_t)CollationElementIterator::NULLORDER) {
578ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Empty string should have no CEs.");
579ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
580fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (iter2->next(status) != (int32_t)CollationElementIterator::NULLORDER) {
581ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Empty string should have no CEs.");
582ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
583ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete iter1;
584ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete iter2;
585ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete coll;
586ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
587ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
588ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
589ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Testing the strength order
590ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
591ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid CollationIteratorTest::TestStrengthOrder()
592ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
593ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int order = 0x0123ABCD;
594ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
595ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
596ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    RuleBasedCollator *coll =
597ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        (RuleBasedCollator *)Collator::createInstance(status);
598ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (coll == NULL || U_FAILURE(status))
599ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
600ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Couldn't create a default collator.");
601ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
602ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
603ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
604ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    coll->setStrength(Collator::PRIMARY);
605ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    CollationElementIterator *iter =
606ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        coll->createCollationElementIterator(test1);
607ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
608ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (iter == NULL) {
609ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Couldn't create a collation element iterator from default collator");
610ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
611ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
612ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
613ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (iter->strengthOrder(order) != 0x01230000) {
614ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Strength order for a primary strength collator should be the first 2 bytes");
615ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
616ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
617ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
618ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    coll->setStrength(Collator::SECONDARY);
619ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (iter->strengthOrder(order) != 0x0123AB00) {
620ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Strength order for a secondary strength collator should be the third byte");
621ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
622ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
623ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
624ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    coll->setStrength(Collator::TERTIARY);
625ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (iter->strengthOrder(order) != order) {
626ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        errln("Strength order for a tertiary strength collator should be the third byte");
627ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
628ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
629ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete iter;
630ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete coll;
631ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
632ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
633ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
634ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Return a string containing all of the collation orders
635ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * returned by calls to next on the specified iterator
636ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
637ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUnicodeString &CollationIteratorTest::orderString(CollationElementIterator &iter, UnicodeString &target)
638ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
639ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t order;
640ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
641ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
642ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while ((order = iter.next(status)) != CollationElementIterator::NULLORDER)
643ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
644ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        target += "0x";
645ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        appendHex(order, 8, target);
646ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        target += " ";
647ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
648ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
649ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return target;
650ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
651ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
652ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid CollationIteratorTest::assertEqual(CollationElementIterator &i1, CollationElementIterator &i2)
653ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
654ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t c1, c2, count = 0;
655ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
656ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
657ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    do
658ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
659ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c1 = i1.next(status);
660ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c2 = i2.next(status);
661ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
662ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (c1 != c2)
663ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {
664ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            errln("    %d: strength(0x%X) != strength(0x%X)", count, c1, c2);
665ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            break;
666ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
667ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
668ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        count += 1;
669ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
670ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while (c1 != CollationElementIterator::NULLORDER);
671ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
672ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
673ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid CollationIteratorTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par*/)
674ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
675ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (exec)
676ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
677ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        logln("Collation Iteration Tests: ");
678ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
679ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
680ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(en_us) {
681ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      switch (index)
682ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      {
683ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          case  0: name = "TestPrevious";      if (exec) TestPrevious(/* par */);     break;
684ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          case  1: name = "TestOffset";        if (exec) TestOffset(/* par */);       break;
685ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          case  2: name = "TestSetText";       if (exec) TestSetText(/* par */);      break;
686ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          case  3: name = "TestMaxExpansion";  if (exec) TestMaxExpansion(/* par */); break;
687ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          case  4: name = "TestClearBuffers";  if (exec) TestClearBuffers(/* par */); break;
688ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          case  5: name = "TestUnicodeChar";   if (exec) TestUnicodeChar(/* par */);  break;
689ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          case  6: name = "TestAssignment";    if (exec) TestAssignment(/* par */);    break;
690ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          case  7: name = "TestConstructors";  if (exec) TestConstructors(/* par */); break;
691ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          case  8: name = "TestStrengthOrder"; if (exec) TestStrengthOrder(/* par */); break;
692ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          default: name = ""; break;
693ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      }
694ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
69585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho      dataerrln("Class iterator not instantiated");
696ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      name = "";
697ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
698ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
699ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
700ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_COLLATION */
701