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