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