1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/******************************************************************** 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * COPYRIGHT: 3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * Copyright (c) 1997-2014, International Business Machines Corporation and 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * others. All Rights Reserved. 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/ 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/******************************************************************************** 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* File CITERTST.C 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Modification History: 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Date Name Description 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Madhu Katragadda Ported for C API 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 02/19/01 synwee Modified test case for new collation iterator 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*********************************************************************************/ 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Collation Iterator tests. 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * (Let me reiterate my position...) 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h" 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ucol.h" 25b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/ucoleitr.h" 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uloc.h" 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uchar.h" 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustring.h" 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/putil.h" 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "callcoll.h" 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cmemory.h" 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cintltst.h" 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "citertst.h" 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ccolltst.h" 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "filestrm.h" 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cstring.h" 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ucol_imp.h" 3827f654740f2a26ad62a5c155af9199af9e69b889claireho#include "uparse.h" 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdio.h> 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruextern uint8_t ucol_uprv_getCaseBits(const UChar *, uint32_t, UErrorCode *); 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid addCollIterTest(TestNode** root) 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru addTest(root, &TestPrevious, "tscoll/citertst/TestPrevious"); 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru addTest(root, &TestOffset, "tscoll/citertst/TestOffset"); 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru addTest(root, &TestSetText, "tscoll/citertst/TestSetText"); 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru addTest(root, &TestMaxExpansion, "tscoll/citertst/TestMaxExpansion"); 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru addTest(root, &TestUnicodeChar, "tscoll/citertst/TestUnicodeChar"); 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru addTest(root, &TestNormalizedUnicodeChar, 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "tscoll/citertst/TestNormalizedUnicodeChar"); 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru addTest(root, &TestNormalization, "tscoll/citertst/TestNormalization"); 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru addTest(root, &TestBug672, "tscoll/citertst/TestBug672"); 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru addTest(root, &TestBug672Normalize, "tscoll/citertst/TestBug672Normalize"); 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru addTest(root, &TestSmallBuffer, "tscoll/citertst/TestSmallBuffer"); 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru addTest(root, &TestDiscontiguos, "tscoll/citertst/TestDiscontiguos"); 57b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho addTest(root, &TestSearchCollatorElements, "tscoll/citertst/TestSearchCollatorElements"); 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* The locales we support */ 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char * LOCALES[] = {"en_AU", "en_BE", "en_CA"}; 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestBug672() { 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar pattern[20]; 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar text[50]; 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int i; 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int result[3][3]; 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_uastrcpy(pattern, "resume"); 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_uastrcpy(text, "Time to resume updating my resume."); 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (i = 0; i < 3; ++ i) { 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollator *coll = ucol_open(LOCALES[i], &status); 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollationElements *pitr = ucol_openElements(coll, pattern, -1, 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru &status); 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollationElements *titer = ucol_openElements(coll, text, -1, 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru &status); 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)) { 8185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "ERROR: in creation of either the collator or the collation iterator :%s\n", 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_verbose("locale tested %s\n", LOCALES[i]); 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while (ucol_next(pitr, &status) != UCOL_NULLORDER && 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru U_SUCCESS(status)) { 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)) { 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: reversing collation iterator :%s\n", 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_reset(pitr); 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_setOffset(titer, u_strlen(pattern), &status); 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)) { 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: setting offset in collator :%s\n", 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru result[i][0] = ucol_getOffset(titer); 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_verbose("Text iterator set to offset %d\n", result[i][0]); 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Use previous() */ 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_previous(titer, &status); 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru result[i][1] = ucol_getOffset(titer); 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_verbose("Current offset %d after previous\n", result[i][1]); 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Add one to index */ 113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_verbose("Adding one to current offset...\n"); 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_setOffset(titer, ucol_getOffset(titer) + 1, &status); 115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)) { 116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: setting offset in collator :%s\n", 117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru result[i][2] = ucol_getOffset(titer); 121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_verbose("Current offset in text = %d\n", result[i][2]); 122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(pitr); 123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(titer); 124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(coll); 125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (uprv_memcmp(result[0], result[1], 3) != 0 || 128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uprv_memcmp(result[1], result[2], 3) != 0) { 129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: Different locales have different offsets at the same character\n"); 130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Running this test with normalization enabled showed up a bug in the incremental 136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru normalization code. */ 137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestBug672Normalize() { 138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar pattern[20]; 140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar text[50]; 141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int i; 142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int result[3][3]; 143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_uastrcpy(pattern, "resume"); 145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_uastrcpy(text, "Time to resume updating my resume."); 146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (i = 0; i < 3; ++ i) { 148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollator *coll = ucol_open(LOCALES[i], &status); 149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollationElements *pitr = NULL; 150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollationElements *titer = NULL; 151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru pitr = ucol_openElements(coll, pattern, -1, &status); 155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru titer = ucol_openElements(coll, text, -1, &status); 156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)) { 15785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "ERROR: in creation of either the collator or the collation iterator :%s\n", 158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_verbose("locale tested %s\n", LOCALES[i]); 163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while (ucol_next(pitr, &status) != UCOL_NULLORDER && 165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru U_SUCCESS(status)) { 166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)) { 168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: reversing collation iterator :%s\n", 169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_reset(pitr); 173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_setOffset(titer, u_strlen(pattern), &status); 175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)) { 176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: setting offset in collator :%s\n", 177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru result[i][0] = ucol_getOffset(titer); 181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_verbose("Text iterator set to offset %d\n", result[i][0]); 182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Use previous() */ 184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_previous(titer, &status); 185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru result[i][1] = ucol_getOffset(titer); 186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_verbose("Current offset %d after previous\n", result[i][1]); 187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Add one to index */ 189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_verbose("Adding one to current offset...\n"); 190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_setOffset(titer, ucol_getOffset(titer) + 1, &status); 191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)) { 192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: setting offset in collator :%s\n", 193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru result[i][2] = ucol_getOffset(titer); 197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_verbose("Current offset in text = %d\n", result[i][2]); 198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(pitr); 199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(titer); 200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(coll); 201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (uprv_memcmp(result[0], result[1], 3) != 0 || 204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uprv_memcmp(result[1], result[2], 3) != 0) { 205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: Different locales have different offsets at the same character\n"); 206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Test for CollationElementIterator previous and next for the whole set of 214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * unicode characters. 215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestUnicodeChar() 217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar source[0x100]; 219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollator *en_us; 220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollationElements *iter; 221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar codepoint; 223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar *test; 225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru en_us = ucol_open("en_US", &status); 226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)){ 22785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "ERROR: in creation of collation data using ucol_open()\n %s\n", 228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (codepoint = 1; codepoint < 0xFFFE;) 233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru test = source; 235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while (codepoint % 0xFF != 0) 237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (u_isdefined(codepoint)) 239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *(test ++) = codepoint; 240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru codepoint ++; 241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (u_isdefined(codepoint)) 244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *(test ++) = codepoint; 245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (codepoint != 0xFFFF) 247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru codepoint ++; 248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *test = 0; 250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter=ucol_openElements(en_us, source, u_strlen(source), &status); 251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_FAILURE(status)){ 252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(en_us); 255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* A basic test to see if it's working at all */ 258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_verbose("codepoint testing %x\n", codepoint); 259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru backAndForth(iter); 260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter); 261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* null termination test */ 263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter=ucol_openElements(en_us, source, -1, &status); 264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_FAILURE(status)){ 265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(en_us); 268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* A basic test to see if it's working at all */ 271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru backAndForth(iter); 272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter); 273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(en_us); 276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Test for CollationElementIterator previous and next for the whole set of 280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * unicode characters with normalization on. 281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestNormalizedUnicodeChar() 283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar source[0x100]; 285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollator *th_th; 286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollationElements *iter; 287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar codepoint; 289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar *test; 291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* thai should have normalization on */ 292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru th_th = ucol_open("th_TH", &status); 293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)){ 29485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "ERROR: in creation of thai collation using ucol_open()\n %s\n", 295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (codepoint = 1; codepoint < 0xFFFE;) 300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru test = source; 302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while (codepoint % 0xFF != 0) 304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (u_isdefined(codepoint)) 306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *(test ++) = codepoint; 307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru codepoint ++; 308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (u_isdefined(codepoint)) 311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *(test ++) = codepoint; 312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (codepoint != 0xFFFF) 314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru codepoint ++; 315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *test = 0; 317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter=ucol_openElements(th_th, source, u_strlen(source), &status); 318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_FAILURE(status)){ 319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(th_th); 322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru backAndForth(iter); 326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter); 327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter=ucol_openElements(th_th, source, -1, &status); 329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_FAILURE(status)){ 330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(th_th); 333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru backAndForth(iter); 337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter); 338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(th_th); 341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Test the incremental normalization 345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/ 346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestNormalization() 347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char *str = 350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "&a < \\u0300\\u0315 < A\\u0300\\u0315 < \\u0316\\u0315B < \\u0316\\u0300\\u0315"; 351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollator *coll; 352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar rule[50]; 353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int rulelen = u_unescape(str, rule, 50); 354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int count = 0; 355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char *testdata[] = 356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru {"\\u1ED9", "o\\u0323\\u0302", 357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "\\u0300\\u0315", "\\u0315\\u0300", 358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "A\\u0300\\u0315B", "A\\u0315\\u0300B", 359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "A\\u0316\\u0315B", "A\\u0315\\u0316B", 360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "\\u0316\\u0300\\u0315", "\\u0315\\u0300\\u0316", 361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "A\\u0316\\u0300\\u0315B", "A\\u0315\\u0300\\u0316B", 362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "\\u0316\\u0315\\u0300", "A\\u0316\\u0315\\u0300B"}; 363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t srclen; 364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar source[10]; 365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollationElements *iter; 366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru coll = ucol_openRules(rule, rulelen, UCOL_ON, UCOL_TERTIARY, NULL, &status); 368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)){ 37085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "ERROR: in creation of collator using ucol_openRules()\n %s\n", 371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru srclen = u_unescape(testdata[0], source, 10); 376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter = ucol_openElements(coll, source, srclen, &status); 377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru backAndForth(iter); 378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter); 379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru srclen = u_unescape(testdata[1], source, 10); 381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter = ucol_openElements(coll, source, srclen, &status); 382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru backAndForth(iter); 383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter); 384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while (count < 12) { 386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru srclen = u_unescape(testdata[count], source, 10); 387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter = ucol_openElements(coll, source, srclen, &status); 388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)){ 390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: in creation of collator element iterator\n %s\n", 391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru backAndForth(iter); 395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter); 396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter = ucol_openElements(coll, source, -1, &status); 398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)){ 400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: in creation of collator element iterator\n %s\n", 401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru backAndForth(iter); 405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter); 406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru count ++; 407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(coll); 409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Test for CollationElementIterator.previous() 413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @bug 4108758 - Make sure it works with contracting characters 415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestPrevious() 418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollator *coll=NULL; 420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar rule[50]; 421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar *source; 422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollator *c1, *c2, *c3; 423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollationElements *iter; 424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 42585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar test1[50]; 42685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar test2[50]; 427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_uastrcpy(test1, "What subset of all possible test cases?"); 429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_uastrcpy(test2, "has the highest probability of detecting"); 430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru coll = ucol_open("en_US", &status); 431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter=ucol_openElements(coll, test1, u_strlen(test1), &status); 433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_verbose("English locale testing back and forth\n"); 434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_FAILURE(status)){ 43585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(coll); 438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* A basic test to see if it's working at all */ 441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru backAndForth(iter); 442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter); 443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(coll); 444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Test with a contracting character sequence */ 446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_uastrcpy(rule, "&a,A < b,B < c,C, d,D < z,Z < ch,cH,Ch,CH"); 447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru c1 = ucol_openRules(rule, u_strlen(rule), UCOL_OFF, UCOL_DEFAULT_STRENGTH, NULL, &status); 448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_verbose("Contraction rule testing back and forth with no normalization\n"); 450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (c1 == NULL || U_FAILURE(status)) 452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("Couldn't create a RuleBasedCollator with a contracting sequence\n %s\n", 454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 457ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru source=(UChar*)malloc(sizeof(UChar) * 20); 458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_uastrcpy(source, "abchdcba"); 459ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter=ucol_openElements(c1, source, u_strlen(source), &status); 460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_FAILURE(status)){ 461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru backAndForth(iter); 466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter); 467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(c1); 468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Test with an expanding character sequence */ 470ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_uastrcpy(rule, "&a < b < c/abd < d"); 471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru c2 = ucol_openRules(rule, u_strlen(rule), UCOL_OFF, UCOL_DEFAULT_STRENGTH, NULL, &status); 472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_verbose("Expansion rule testing back and forth with no normalization\n"); 473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (c2 == NULL || U_FAILURE(status)) 474ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 475ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("Couldn't create a RuleBasedCollator with a contracting sequence.\n %s\n", 476ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 477ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 478ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 479ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_uastrcpy(source, "abcd"); 480ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter=ucol_openElements(c2, source, u_strlen(source), &status); 481ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_FAILURE(status)){ 482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 484ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 485ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru backAndForth(iter); 487ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter); 488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(c2); 489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Now try both */ 490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_uastrcpy(rule, "&a < b < c/aba < d < z < ch"); 491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru c3 = ucol_openRules(rule, u_strlen(rule), UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH,NULL, &status); 492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_verbose("Expansion/contraction rule testing back and forth with no normalization\n"); 493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 494ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (c3 == NULL || U_FAILURE(status)) 495ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 496ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("Couldn't create a RuleBasedCollator with a contracting sequence.\n %s\n", 497ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 498ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 499ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 500ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_uastrcpy(source, "abcdbchdc"); 501ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter=ucol_openElements(c3, source, u_strlen(source), &status); 502ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_FAILURE(status)){ 503ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 504ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 505ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 506ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 507ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru backAndForth(iter); 508ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter); 509ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(c3); 510ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru source[0] = 0x0e41; 511ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru source[1] = 0x0e02; 512ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru source[2] = 0x0e41; 513ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru source[3] = 0x0e02; 514ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru source[4] = 0x0e27; 515ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru source[5] = 0x61; 516ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru source[6] = 0x62; 517ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru source[7] = 0x63; 518ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru source[8] = 0; 519ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 520ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru coll = ucol_open("th_TH", &status); 521ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_verbose("Thai locale testing back and forth with normalization\n"); 522ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter=ucol_openElements(coll, source, u_strlen(source), &status); 523ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_FAILURE(status)){ 524ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 525ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 526ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 527ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 528ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru backAndForth(iter); 529ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter); 530ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(coll); 531ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 532ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* prev test */ 533ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru source[0] = 0x0061; 534ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru source[1] = 0x30CF; 535ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru source[2] = 0x3099; 536ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru source[3] = 0x30FC; 537ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru source[4] = 0; 538ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 539ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru coll = ucol_open("ja_JP", &status); 540ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_verbose("Japanese locale testing back and forth with normalization\n"); 541ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter=ucol_openElements(coll, source, u_strlen(source), &status); 542ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_FAILURE(status)){ 543ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 544ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 545ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 546ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 547ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru backAndForth(iter); 548ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter); 549ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(coll); 550ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 551ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru free(source); 552ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 553ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 554ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 555ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Test for getOffset() and setOffset() 556ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 557ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestOffset() 558ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 559ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode status= U_ZERO_ERROR; 560ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollator *en_us=NULL; 561ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollationElements *iter, *pristine; 562ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t offset; 56385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho OrderAndOffset *orders; 564ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t orderLength=0; 565ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int count = 0; 56685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar test1[50]; 56785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar test2[50]; 56885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 569ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_uastrcpy(test1, "What subset of all possible test cases?"); 570ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_uastrcpy(test2, "has the highest probability of detecting"); 571ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru en_us = ucol_open("en_US", &status); 572ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_verbose("Testing getOffset and setOffset for collations\n"); 573ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter = ucol_openElements(en_us, test1, u_strlen(test1), &status); 574ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_FAILURE(status)){ 57585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 576ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 577ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(en_us); 578ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 579ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 580ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 581ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* testing boundaries */ 582ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_setOffset(iter, 0, &status); 583ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status) || ucol_previous(iter, &status) != UCOL_NULLORDER) { 584ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("Error: After setting offset to 0, we should be at the end " 585ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "of the backwards iteration"); 586ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 587ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_setOffset(iter, u_strlen(test1), &status); 588ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status) || ucol_next(iter, &status) != UCOL_NULLORDER) { 589ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("Error: After setting offset to end of the string, we should " 590ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "be at the end of the backwards iteration"); 591ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 592ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 593ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Run all the way through the iterator, then get the offset */ 594ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 595ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru orders = getOrders(iter, &orderLength); 596ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 597ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru offset = ucol_getOffset(iter); 598ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 599ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (offset != u_strlen(test1)) 600ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 601ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("offset at end != length %d vs %d\n", offset, 602ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_strlen(test1) ); 603ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 604ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 605ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Now set the offset back to the beginning and see if it works */ 606ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru pristine=ucol_openElements(en_us, test1, u_strlen(test1), &status); 607ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_FAILURE(status)){ 608ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 609ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 610ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(en_us); 611ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 612ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 613ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru status = U_ZERO_ERROR; 614ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 615ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_setOffset(iter, 0, &status); 616ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)) 617ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 618ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("setOffset failed. %s\n", myErrorName(status)); 619ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 620ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else 621ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 622ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru assertEqual(iter, pristine); 623ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 624ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 625ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(pristine); 626ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter); 627ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru free(orders); 628ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 629ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* testing offsets in normalization buffer */ 630ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru test1[0] = 0x61; 631ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru test1[1] = 0x300; 632ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru test1[2] = 0x316; 633ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru test1[3] = 0x62; 634ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru test1[4] = 0; 635ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_setAttribute(en_us, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 636ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter = ucol_openElements(en_us, test1, 4, &status); 637ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_FAILURE(status)){ 638ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n", 639ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 640ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(en_us); 641ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 642ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 643ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 644ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru count = 0; 645ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while (ucol_next(iter, &status) != UCOL_NULLORDER && 646ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru U_SUCCESS(status)) { 647ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru switch (count) { 648ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case 0: 649ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (ucol_getOffset(iter) != 1) { 65085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("ERROR: Offset of iteration should be 1\n"); 651ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 652ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 653ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case 3: 654ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (ucol_getOffset(iter) != 4) { 655ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: Offset of iteration should be 4\n"); 656ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 657ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 658ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru default: 659ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (ucol_getOffset(iter) != 3) { 660ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: Offset of iteration should be 3\n"); 661ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 662ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 663ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru count ++; 664ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 665ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 666ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_reset(iter); 667ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru count = 0; 668ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while (ucol_previous(iter, &status) != UCOL_NULLORDER && 669ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru U_SUCCESS(status)) { 670ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru switch (count) { 671ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case 0: 67285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho case 1: 673ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (ucol_getOffset(iter) != 3) { 674ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: Offset of iteration should be 3\n"); 675ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 676ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 67785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho case 2: 67885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (ucol_getOffset(iter) != 1) { 67985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("ERROR: Offset of iteration should be 1\n"); 68085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 68185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho break; 682ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru default: 683ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (ucol_getOffset(iter) != 0) { 684ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: Offset of iteration should be 0\n"); 685ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 686ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 687ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru count ++; 688ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 689ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 690ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_FAILURE(status)){ 691ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: in iterating collation elements %s\n", 692ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 693ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 694ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 695ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter); 696ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(en_us); 697ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 698ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 699ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 700ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Test for setText() 701ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 702ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestSetText() 703ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 704ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t c,i; 705ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 706ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollator *en_us=NULL; 707ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollationElements *iter1, *iter2; 70885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar test1[50]; 70985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar test2[50]; 71085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 711ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_uastrcpy(test1, "What subset of all possible test cases?"); 712ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_uastrcpy(test2, "has the highest probability of detecting"); 713ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru en_us = ucol_open("en_US", &status); 714ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_verbose("testing setText for Collation elements\n"); 715ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter1=ucol_openElements(en_us, test1, u_strlen(test1), &status); 716ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_FAILURE(status)){ 71785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "ERROR: in creation of collation element iterator1 using ucol_openElements()\n %s\n", 718ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 719ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(en_us); 720ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 721ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 722ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter2=ucol_openElements(en_us, test2, u_strlen(test2), &status); 723ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_FAILURE(status)){ 724ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("ERROR: in creation of collation element iterator2 using ucol_openElements()\n %s\n", 725ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru myErrorName(status)); 726ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(en_us); 727ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 728ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 729ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 730ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Run through the second iterator just to exercise it */ 731ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru c = ucol_next(iter2, &status); 732ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru i = 0; 733ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 734ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while ( ++i < 10 && (c != UCOL_NULLORDER)) 735ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 736ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)) 737ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 738ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("iter2->next() returned an error. %s\n", myErrorName(status)); 739ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter2); 740ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter1); 741ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(en_us); 742ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 743ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 744ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 745ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru c = ucol_next(iter2, &status); 746ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 747ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 748ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Now set it to point to the same string as the first iterator */ 749ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_setText(iter2, test1, u_strlen(test1), &status); 750ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)) 751ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 752ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("call to iter2->setText(test1) failed. %s\n", myErrorName(status)); 753ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 754ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else 755ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 756ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru assertEqual(iter1, iter2); 757ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 758ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 759ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Now set it to point to a null string with fake length*/ 760ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_setText(iter2, NULL, 2, &status); 761fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (status != U_ILLEGAL_ARGUMENT_ERROR) 762ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 763fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius log_err("call to iter2->setText(null, 2) should yield an illegal-argument-error - %s\n", 764fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius myErrorName(status)); 765ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 766ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 767ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter2); 768ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter1); 769ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(en_us); 770ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 771ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 772ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** @bug 4108762 773ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Test for getMaxExpansion() 774ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 775ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestMaxExpansion() 776ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 777ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 778ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollator *coll ;/*= ucol_open("en_US", &status);*/ 779ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar ch = 0; 780ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar32 unassigned = 0xEFFFD; 781ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar supplementary[2]; 78227f654740f2a26ad62a5c155af9199af9e69b889claireho uint32_t stringOffset = 0; 783ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool isError = FALSE; 784ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uint32_t sorder = 0; 785ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollationElements *iter ;/*= ucol_openElements(coll, &ch, 1, &status);*/ 786ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uint32_t temporder = 0; 787ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 788ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar rule[256]; 789ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_uastrcpy(rule, "&a < ab < c/aba < d < z < ch"); 790ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru coll = ucol_openRules(rule, u_strlen(rule), UCOL_DEFAULT, 791ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCOL_DEFAULT_STRENGTH,NULL, &status); 792ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_SUCCESS(status) && coll) { 793ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter = ucol_openElements(coll, &ch, 1, &status); 794ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 795ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while (ch < 0xFFFF && U_SUCCESS(status)) { 796ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int count = 1; 797ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uint32_t order; 798ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t size = 0; 799ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 800ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ch ++; 801ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 802ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_setText(iter, &ch, 1, &status); 803ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru order = ucol_previous(iter, &status); 804ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 805ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* thai management */ 806ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (order == 0) 807ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru order = ucol_previous(iter, &status); 808ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 809ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while (U_SUCCESS(status) && 810ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_previous(iter, &status) != UCOL_NULLORDER) { 811ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru count ++; 812ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 813ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 814ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru size = ucol_getMaxExpansion(iter, order); 815ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status) || size < count) { 816ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("Failure at codepoint %d, maximum expansion count < %d\n", 817ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ch, count); 818ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 819ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 820ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 821ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* testing for exact max expansion */ 822ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ch = 0; 823ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while (ch < 0x61) { 824ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uint32_t order; 825ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t size; 826ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_setText(iter, &ch, 1, &status); 827ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru order = ucol_previous(iter, &status); 828ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru size = ucol_getMaxExpansion(iter, order); 829ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status) || size != 1) { 830ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("Failure at codepoint %d, maximum expansion count < %d\n", 831ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ch, 1); 832ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 833ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ch ++; 834ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 835ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 836ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ch = 0x63; 837ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_setText(iter, &ch, 1, &status); 838ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru temporder = ucol_previous(iter, &status); 839ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 840ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status) || ucol_getMaxExpansion(iter, temporder) != 3) { 841ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("Failure at codepoint %d, maximum expansion count != %d\n", 842ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ch, 3); 843ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 844ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 845ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ch = 0x64; 846ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_setText(iter, &ch, 1, &status); 847ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru temporder = ucol_previous(iter, &status); 848ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 849ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status) || ucol_getMaxExpansion(iter, temporder) != 1) { 850ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("Failure at codepoint %d, maximum expansion count != %d\n", 851ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ch, 3); 852ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 853ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 85427f654740f2a26ad62a5c155af9199af9e69b889claireho U16_APPEND(supplementary, stringOffset, 2, unassigned, isError); 85559d709d503bab6e2b61931737e662dd293b40578ccornelius (void)isError; /* Suppress set but not used warning. */ 856ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_setText(iter, supplementary, 2, &status); 857ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru sorder = ucol_previous(iter, &status); 858ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 859ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status) || ucol_getMaxExpansion(iter, sorder) != 2) { 860ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("Failure at codepoint %d, maximum expansion count < %d\n", 861ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ch, 2); 862ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 863ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 864ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* testing jamo */ 865ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ch = 0x1165; 866ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 867ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_setText(iter, &ch, 1, &status); 868ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru temporder = ucol_previous(iter, &status); 869ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status) || ucol_getMaxExpansion(iter, temporder) > 3) { 870ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("Failure at codepoint %d, maximum expansion count > %d\n", 871ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ch, 3); 872ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 873ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 874ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter); 875ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(coll); 876ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 877ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* testing special jamo &a<\u1160 */ 878ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru rule[0] = 0x26; 879ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru rule[1] = 0x71; 880ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru rule[2] = 0x3c; 881ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru rule[3] = 0x1165; 882ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru rule[4] = 0x2f; 883ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru rule[5] = 0x71; 884ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru rule[6] = 0x71; 885ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru rule[7] = 0x71; 886ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru rule[8] = 0x71; 887ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru rule[9] = 0; 888ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 889ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru coll = ucol_openRules(rule, u_strlen(rule), UCOL_DEFAULT, 890ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCOL_DEFAULT_STRENGTH,NULL, &status); 891ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter = ucol_openElements(coll, &ch, 1, &status); 892ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 893ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru temporder = ucol_previous(iter, &status); 894ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status) || ucol_getMaxExpansion(iter, temporder) != 6) { 895ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("Failure at codepoint %d, maximum expansion count > %d\n", 896ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ch, 5); 897ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 898ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 899ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter); 900ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(coll); 901ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 90285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "Couldn't open collator -> %s\n", u_errorName(status)); 903ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 904ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 905ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 906ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 907ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 908ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void assertEqual(UCollationElements *i1, UCollationElements *i2) 909ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 910ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t c1, c2; 911ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t count = 0; 912ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 913ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 914ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru do 915ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 916ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru c1 = ucol_next(i1, &status); 917ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru c2 = ucol_next(i2, &status); 918ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 919ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (c1 != c2) 920ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 921ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("Error in iteration %d assetEqual between\n %d and %d, they are not equal\n", count, c1, c2); 922ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 923ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 924ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 925ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru count += 1; 926ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 927ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while (c1 != UCOL_NULLORDER); 928ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 929ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 930ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 931ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Testing iterators with extremely small buffers 932ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 933ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestSmallBuffer() 934ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 935ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 936ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollator *coll; 937ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollationElements *testiter, 938ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *iter; 939ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t count = 0; 94085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho OrderAndOffset *testorders, 941ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *orders; 942ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 943ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar teststr[500]; 944ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar str[] = {0x300, 0x31A, 0}; 945ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* 946ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru creating a long string of decomposable characters, 947ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru since by default the writable buffer is of size 256 948ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 949ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while (count < 500) { 950ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if ((count & 1) == 0) { 951ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru teststr[count ++] = 0x300; 952ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 953ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else { 954ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru teststr[count ++] = 0x31A; 955ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 956ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 957ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 958ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru coll = ucol_open("th_TH", &status); 959ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_SUCCESS(status) && coll) { 960ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru testiter = ucol_openElements(coll, teststr, 500, &status); 961ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter = ucol_openElements(coll, str, 2, &status); 962ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 963ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru orders = getOrders(iter, &count); 964ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (count != 2) { 965ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("Error collation elements size is not 2 for \\u0300\\u031A\n"); 966ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 967ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 968ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* 969ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru this will rearrange the string data to 250 characters of 0x300 first then 970ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 250 characters of 0x031A 971ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 972ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru testorders = getOrders(testiter, &count); 973ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 974ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (count != 500) { 975ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("Error decomposition does not give the right sized collation elements\n"); 976ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 977ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 978ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while (count != 0) { 979ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* UCA collation element for 0x0F76 */ 98085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if ((count > 250 && testorders[-- count].order != orders[1].order) || 98185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho (count <= 250 && testorders[-- count].order != orders[0].order)) { 982ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("Error decomposition does not give the right collation element at %d count\n", count); 983ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 984ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 985ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 986ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 987ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru free(testorders); 988ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru free(orders); 989ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 990ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_reset(testiter); 991ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 992ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* ensures closing of elements done properly to clear writable buffer */ 993ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_next(testiter, &status); 994ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_next(testiter, &status); 995ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(testiter); 996ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter); 997ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(coll); 998ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 99985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "Couldn't open collator -> %s\n", u_errorName(status)); 1000ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 1001ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 1002ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 1003ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 1004ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Testing the discontigous contractions 1005ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/ 1006ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestDiscontiguos() { 1007ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char *rulestr = 1008ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "&z < AB < X\\u0300 < ABC < X\\u0300\\u0315"; 1009ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar rule[50]; 1010ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int rulelen = u_unescape(rulestr, rule, 50); 1011ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char *src[] = { 1012ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "ADB", "ADBC", "A\\u0315B", "A\\u0315BC", 1013ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* base character blocked */ 1014ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "XD\\u0300", "XD\\u0300\\u0315", 1015ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* non blocking combining character */ 1016ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "X\\u0319\\u0300", "X\\u0319\\u0300\\u0315", 1017ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* blocking combining character */ 1018ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "X\\u0314\\u0300", "X\\u0314\\u0300\\u0315", 1019ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* contraction prefix */ 1020ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "ABDC", "AB\\u0315C","X\\u0300D\\u0315", "X\\u0300\\u0319\\u0315", 1021ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "X\\u0300\\u031A\\u0315", 1022ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* ends not with a contraction character */ 1023ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "X\\u0319\\u0300D", "X\\u0319\\u0300\\u0315D", "X\\u0300D\\u0315D", 1024ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "X\\u0300\\u0319\\u0315D", "X\\u0300\\u031A\\u0315D" 1025ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }; 1026ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char *tgt[] = { 1027ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* non blocking combining character */ 1028ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "A D B", "A D BC", "A \\u0315 B", "A \\u0315 BC", 1029ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* base character blocked */ 1030ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "X D \\u0300", "X D \\u0300\\u0315", 1031ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* non blocking combining character */ 1032ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "X\\u0300 \\u0319", "X\\u0300\\u0315 \\u0319", 1033ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* blocking combining character */ 1034ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "X \\u0314 \\u0300", "X \\u0314 \\u0300\\u0315", 1035ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* contraction prefix */ 1036ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "AB DC", "AB \\u0315 C","X\\u0300 D \\u0315", "X\\u0300\\u0315 \\u0319", 1037ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "X\\u0300 \\u031A \\u0315", 1038ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* ends not with a contraction character */ 1039ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "X\\u0300 \\u0319D", "X\\u0300\\u0315 \\u0319D", "X\\u0300 D\\u0315D", 1040ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "X\\u0300\\u0315 \\u0319D", "X\\u0300 \\u031A\\u0315D" 1041ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }; 1042ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int size = 20; 1043ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollator *coll; 1044ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1045ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int count = 0; 1046ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollationElements *iter; 1047ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UCollationElements *resultiter; 1048ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 1049ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru coll = ucol_openRules(rule, rulelen, UCOL_OFF, UCOL_DEFAULT_STRENGTH,NULL, &status); 1050ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iter = ucol_openElements(coll, rule, 1, &status); 1051ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru resultiter = ucol_openElements(coll, rule, 1, &status); 1052ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 1053ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)) { 105485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "Error opening collation rules -> %s\n", u_errorName(status)); 1055ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 1056ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 1057ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 1058ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while (count < size) { 1059ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar str[20]; 1060ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar tstr[20]; 1061ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int strLen = u_unescape(src[count], str, 20); 1062ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar *s; 1063ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 1064ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_setText(iter, str, strLen, &status); 1065ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)) { 1066ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("Error opening collation iterator\n"); 1067ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 1068ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 1069ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 1070ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_unescape(tgt[count], tstr, 20); 1071ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru s = tstr; 1072ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 1073ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_verbose("count %d\n", count); 1074ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 1075ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (;;) { 1076ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uint32_t ce; 1077ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar *e = u_strchr(s, 0x20); 1078ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (e == 0) { 1079ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru e = u_strchr(s, 0); 1080ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 1081ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_setText(resultiter, s, (int32_t)(e - s), &status); 1082ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ce = ucol_next(resultiter, &status); 1083ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)) { 1084ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("Error manipulating collation iterator\n"); 1085ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 1086ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 1087ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while (ce != UCOL_NULLORDER) { 1088ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (ce != (uint32_t)ucol_next(iter, &status) || 1089ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru U_FAILURE(status)) { 1090ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("Discontiguos contraction test mismatch\n"); 1091ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 1092ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 1093ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ce = ucol_next(resultiter, &status); 1094ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)) { 1095ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru log_err("Error getting next collation element\n"); 1096ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 1097ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 1098ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 1099ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru s = e + 1; 1100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (*e == 0) { 1101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 1102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 1103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 1104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_reset(iter); 1105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru backAndForth(iter); 1106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru count ++; 1107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 1108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(resultiter); 1109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_closeElements(iter); 1110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucol_close(coll); 1111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 1112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 1113b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/** 1114b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* TestSearchCollatorElements tests iterator behavior (forwards and backwards) with 1115b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* normalization on AND jamo tailoring, among other things. 1116fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* 1117fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* Note: This test is sensitive to changes of the root collator, 1118fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* for example whether the ae-ligature maps to three CEs (as in the DUCET) 1119fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* or to two CEs (as in the CLDR 24 FractionalUCA.txt). 1120fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* It is also sensitive to how those CEs map to the iterator's 32-bit CE encoding. 1121fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* For example, the DUCET's artificial secondary CE in the ae-ligature 1122fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* may map to two 32-bit iterator CEs (as it did until ICU 52). 1123b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho*/ 1124b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar tsceText[] = { /* Nothing in here should be ignorable */ 1125b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x0020, 0xAC00, /* simple LV Hangul */ 1126b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x0020, 0xAC01, /* simple LVT Hangul */ 1127b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x0020, 0xAC0F, /* LVTT, last jamo expands for search */ 1128b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x0020, 0xAFFF, /* LLVVVTT, every jamo expands for search */ 1129b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x0020, 0x1100, 0x1161, 0x11A8, /* 0xAC01 as conjoining jamo */ 1130b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x0020, 0x3131, 0x314F, 0x3131, /* 0xAC01 as compatibility jamo */ 1131b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x0020, 0x1100, 0x1161, 0x11B6, /* 0xAC0F as conjoining jamo; last expands for search */ 1132b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x0020, 0x1101, 0x1170, 0x11B6, /* 0xAFFF as conjoining jamo; all expand for search */ 1133b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x0020, 0x00E6, /* small letter ae, expands */ 1134b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x0020, 0x1E4D, /* small letter o with tilde and acute, decomposes */ 1135b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x0020 1136b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}; 1137b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoenum { kLen_tsceText = sizeof(tsceText)/sizeof(tsceText[0]) }; 1138b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1139b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const int32_t rootStandardOffsets[] = { 1140b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0, 1,2, 1141b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2, 3,4,4, 1142b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 4, 5,6,6, 1143b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6, 7,8,8, 1144b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 8, 9,10,11, 1145b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 12, 13,14,15, 1146b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 16, 17,18,19, 1147b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 20, 21,22,23, 1148fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 24, 25,26, /* plus another 1-2 offset=26 if ae-ligature maps to three CEs */ 1149b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 26, 27,28,28, 1150b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 28, 1151b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 29 1152b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}; 1153b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoenum { kLen_rootStandardOffsets = sizeof(rootStandardOffsets)/sizeof(rootStandardOffsets[0]) }; 1154b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1155b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const int32_t rootSearchOffsets[] = { 1156b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0, 1,2, 1157b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2, 3,4,4, 1158b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 4, 5,6,6,6, 1159b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6, 7,8,8,8,8,8,8, 1160b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 8, 9,10,11, 1161b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 12, 13,14,15, 1162b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 16, 17,18,19,20, 1163b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 20, 21,22,22,23,23,23,24, 1164fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 24, 25,26, /* plus another 1-2 offset=26 if ae-ligature maps to three CEs */ 1165b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 26, 27,28,28, 1166b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 28, 1167b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 29 1168b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}; 1169b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoenum { kLen_rootSearchOffsets = sizeof(rootSearchOffsets)/sizeof(rootSearchOffsets[0]) }; 1170b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1171b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotypedef struct { 1172b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const char * locale; 1173b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const int32_t * offsets; 1174b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t offsetsLen; 1175b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} TSCEItem; 1176b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1177b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const TSCEItem tsceItems[] = { 1178b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "root", rootStandardOffsets, kLen_rootStandardOffsets }, 1179b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "root@collation=search", rootSearchOffsets, kLen_rootSearchOffsets }, 1180b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { NULL, NULL, 0 } 1181b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}; 1182b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1183b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestSearchCollatorElements(void) 1184b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{ 1185b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const TSCEItem * tsceItemPtr; 1186b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (tsceItemPtr = tsceItems; tsceItemPtr->locale != NULL; tsceItemPtr++) { 1187b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode status = U_ZERO_ERROR; 1188b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCollator* ucol = ucol_open(tsceItemPtr->locale, &status); 1189b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ( U_SUCCESS(status) ) { 1190b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCollationElements * uce = ucol_openElements(ucol, tsceText, kLen_tsceText, &status); 1191b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ( U_SUCCESS(status) ) { 1192b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t offset, element; 1193b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const int32_t * nextOffsetPtr; 1194b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const int32_t * limitOffsetPtr; 1195b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1196b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nextOffsetPtr = tsceItemPtr->offsets; 1197b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho limitOffsetPtr = tsceItemPtr->offsets + tsceItemPtr->offsetsLen; 1198b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho do { 1199b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho offset = ucol_getOffset(uce); 1200b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho element = ucol_next(uce, &status); 1201fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius log_verbose("(%s) offset=%2d ce=%08x\n", tsceItemPtr->locale, offset, element); 1202b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ( element == 0 ) { 1203b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("error, locale %s, ucol_next returned element 0\n", tsceItemPtr->locale ); 1204b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1205b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ( nextOffsetPtr < limitOffsetPtr ) { 1206b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (offset != *nextOffsetPtr) { 1207b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("error, locale %s, expected ucol_next -> ucol_getOffset %d, got %d\n", 1208b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho tsceItemPtr->locale, *nextOffsetPtr, offset ); 1209b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nextOffsetPtr = limitOffsetPtr; 1210b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 1211b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1212b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nextOffsetPtr++; 1213b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 1214b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("error, locale %s, ucol_next returned more elements than expected\n", tsceItemPtr->locale ); 1215b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1216b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } while ( U_SUCCESS(status) && element != UCOL_NULLORDER ); 1217b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ( nextOffsetPtr < limitOffsetPtr ) { 1218b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("error, locale %s, ucol_next returned fewer elements than expected\n", tsceItemPtr->locale ); 1219b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1220b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1221b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ucol_setOffset(uce, kLen_tsceText, &status); 1222b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho status = U_ZERO_ERROR; 1223b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nextOffsetPtr = tsceItemPtr->offsets + tsceItemPtr->offsetsLen; 1224b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho limitOffsetPtr = tsceItemPtr->offsets; 1225b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho do { 1226b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho offset = ucol_getOffset(uce); 1227b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho element = ucol_previous(uce, &status); 1228b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ( element == 0 ) { 1229b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("error, locale %s, ucol_previous returned element 0\n", tsceItemPtr->locale ); 1230b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1231b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ( nextOffsetPtr > limitOffsetPtr ) { 1232b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nextOffsetPtr--; 1233b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (offset != *nextOffsetPtr) { 1234b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("error, locale %s, expected ucol_previous -> ucol_getOffset %d, got %d\n", 1235b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho tsceItemPtr->locale, *nextOffsetPtr, offset ); 1236b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nextOffsetPtr = limitOffsetPtr; 1237b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 1238b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1239b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 1240b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("error, locale %s, ucol_previous returned more elements than expected\n", tsceItemPtr->locale ); 1241b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1242b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } while ( U_SUCCESS(status) && element != UCOL_NULLORDER ); 1243b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ( nextOffsetPtr > limitOffsetPtr ) { 1244b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("error, locale %s, ucol_previous returned fewer elements than expected\n", tsceItemPtr->locale ); 1245b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1246b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1247b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ucol_closeElements(uce); 1248b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 1249b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("error, locale %s, ucol_openElements failed: %s\n", tsceItemPtr->locale, u_errorName(status) ); 1250b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1251b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ucol_close(ucol); 1252b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 1253b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_data_err("error, locale %s, ucol_open failed: %s\n", tsceItemPtr->locale, u_errorName(status) ); 1254b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1255b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1256b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 1257b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_COLLATION */ 1259