127f654740f2a26ad62a5c155af9199af9e69b889claireho 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************** 3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT: 48393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * Copyright (c) 2001-2013, International Business Machines Corporation and 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved. 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/ 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************************* 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File cmsccoll.C 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************/ 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * These are the tests specific to ICU 1.8 and above, that I didn't know where 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * to fit. 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h> 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucol.h" 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucoleitr.h" 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uloc.h" 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h" 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ccolltst.h" 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "callcoll.h" 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "string.h" 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucol_imp.h" 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucol_tok.h" 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h" 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h" 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uassert.h" 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/parseerr.h" 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucnv.h" 3885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/ures.h" 3927f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/uscript.h" 40103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "unicode/utf16.h" 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uparse.h" 4285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "putilimp.h" 4385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LEN(a) (sizeof(a)/sizeof(a[0])) 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define MAX_TOKEN_LEN 16 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef UCollationResult tst_strcoll(void *collator, const int object, 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *source, const int sLen, 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *target, const int tLen); 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst static char cnt1[][10] = { 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "AA", 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "AC", 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "AZ", 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "AQ", 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "AB", 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ABZ", 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ABQ", 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Z", 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ABC", 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Q", 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "B" 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst static char cnt2[][10] = { 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "DA", 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "DAD", 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "DAZ", 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "MAR", 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Z", 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "DAVIS", 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "MARK", 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "DAV", 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "DAVI" 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void IncompleteCntTest(void) 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar temp[90]; 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar t1[90]; 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar t2[90]; 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = NULL; 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t i = 0, j = 0; 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t size = 0; 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(temp, " & Z < ABC < Q < B"); 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_openRules(temp, u_strlen(temp), UCOL_OFF, UCOL_DEFAULT_STRENGTH, NULL,&status); 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru size = sizeof(cnt1)/sizeof(cnt1[0]); 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < size-1; i++) { 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = i+1; j < size; j++) { 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationElements *iter; 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(t1, cnt1[i]); 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(t2, cnt1[j]); 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(coll, t1, t2, UCOL_LESS); 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* synwee : added collation element iterator test */ 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter = ucol_openElements(coll, t2, u_strlen(t2), &status); 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Creation of iterator failed\n"); 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru backAndForth(iter); 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_closeElements(iter); 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(temp, " & Z < DAVIS < MARK <DAV"); 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_openRules(temp, u_strlen(temp), UCOL_OFF, UCOL_DEFAULT_STRENGTH,NULL, &status); 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru size = sizeof(cnt2)/sizeof(cnt2[0]); 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < size-1; i++) { 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = i+1; j < size; j++) { 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationElements *iter; 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(t1, cnt2[i]); 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(t2, cnt2[j]); 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(coll, t1, t2, UCOL_LESS); 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* synwee : added collation element iterator test */ 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter = ucol_openElements(coll, t2, u_strlen(t2), &status); 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Creation of iterator failed\n"); 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru backAndForth(iter); 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_closeElements(iter); 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst static char shifted[][20] = { 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "black bird", 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "black-bird", 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "blackbird", 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "black Bird", 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "black-Bird", 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "blackBird", 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "black birds", 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "black-birds", 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "blackbirds" 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst static UCollationResult shiftedTert[] = { 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_EQUAL, 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_EQUAL, 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_EQUAL, 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_LESS, 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_EQUAL, 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_EQUAL, 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_LESS, 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_EQUAL, 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_EQUAL 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst static char nonignorable[][20] = { 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "black bird", 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "black Bird", 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "black birds", 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "black-bird", 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "black-Bird", 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "black-birds", 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "blackbird", 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "blackBird", 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "blackbirds" 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void BlackBirdTest(void) { 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar t1[90]; 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar t2[90]; 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t i = 0, j = 0; 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t size = 0; 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_open("en_US", &status); 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status); 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, &status); 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru size = sizeof(nonignorable)/sizeof(nonignorable[0]); 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < size-1; i++) { 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = i+1; j < size; j++) { 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(t1, nonignorable[i]); 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(t2, nonignorable[j]); 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(coll, t1, t2, UCOL_LESS); 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status); 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_QUATERNARY, &status); 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru size = sizeof(shifted)/sizeof(shifted[0]); 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < size-1; i++) { 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = i+1; j < size; j++) { 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(t1, shifted[i]); 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(t2, shifted[j]); 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(coll, t1, t2, UCOL_LESS); 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_TERTIARY, &status); 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru size = sizeof(shifted)/sizeof(shifted[0]); 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 1; i < size; i++) { 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(t1, shifted[i-1]); 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(t2, shifted[i]); 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(coll, t1, t2, shiftedTert[i]); 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst static UChar testSourceCases[][MAX_TOKEN_LEN] = { 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0041/*'A'*/, 0x0300, 0x0301, 0x0000}, 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0041/*'A'*/, 0x0300, 0x0316, 0x0000}, 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0041/*'A'*/, 0x0300, 0x0000}, 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x00C0, 0x0301, 0x0000}, 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* this would work with forced normalization */ 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x00C0, 0x0316, 0x0000} 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst static UChar testTargetCases[][MAX_TOKEN_LEN] = { 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0041/*'A'*/, 0x0301, 0x0300, 0x0000}, 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0041/*'A'*/, 0x0316, 0x0300, 0x0000}, 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x00C0, 0}, 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0041/*'A'*/, 0x0301, 0x0300, 0x0000}, 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* this would work with forced normalization */ 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0041/*'A'*/, 0x0316, 0x0300, 0x0000} 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst static UCollationResult results[] = { 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_GREATER, 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_EQUAL, 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_EQUAL, 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_GREATER, 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_EQUAL 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void FunkyATest(void) 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *myCollation; 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru myCollation = ucol_open("en_US", &status); 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 26985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "ERROR: in creation of rule based collator: %s\n", myErrorName(status)); 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing some A letters, for some reason\n"); 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(myCollation, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(myCollation, UCOL_TERTIARY); 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < 4 ; i++) 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(myCollation, testSourceCases[i], testTargetCases[i], results[i]); 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(myCollation); 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUColAttributeValue caseFirst[] = { 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_OFF, 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_LOWER_FIRST, 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_UPPER_FIRST 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUColAttributeValue alternateHandling[] = { 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_NON_IGNORABLE, 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_SHIFTED 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUColAttributeValue caseLevel[] = { 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_OFF, 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_ON 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUColAttributeValue strengths[] = { 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_PRIMARY, 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_SECONDARY, 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_TERTIARY, 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_QUATERNARY, 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_IDENTICAL 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char * strengthsC[] = { 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UCOL_PRIMARY", 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UCOL_SECONDARY", 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UCOL_TERTIARY", 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UCOL_QUATERNARY", 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UCOL_IDENTICAL" 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char * caseFirstC[] = { 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UCOL_OFF", 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UCOL_LOWER_FIRST", 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UCOL_UPPER_FIRST" 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char * alternateHandlingC[] = { 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UCOL_NON_IGNORABLE", 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UCOL_SHIFTED" 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char * caseLevelC[] = { 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UCOL_OFF", 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UCOL_ON" 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* not used currently - does not test only prints */ 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void PrintMarkDavis(void) 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar m[256]; 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t sortkey[256]; 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_open("en_US", &status); 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t h,i,j,k, sortkeysize; 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t sizem = 0; 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char buffer[512]; 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t len = 512; 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("PrintMarkDavis"); 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(m, "Mark Davis"); 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sizem = u_strlen(m); 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru m[1] = 0xe4; 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<sizem; i++) { 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, "\\u%04X ", m[i]); 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, "\n"); 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(h = 0; h<sizeof(caseFirst)/sizeof(caseFirst[0]); h++) { 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_CASE_FIRST, caseFirst[i], &status); 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, "caseFirst: %s\n", caseFirstC[h]); 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<sizeof(alternateHandling)/sizeof(alternateHandling[0]); i++) { 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, alternateHandling[i], &status); 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, " AltHandling: %s\n", alternateHandlingC[i]); 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = 0; j<sizeof(caseLevel)/sizeof(caseLevel[0]); j++) { 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_CASE_LEVEL, caseLevel[j], &status); 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, " caseLevel: %s\n", caseLevelC[j]); 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(k = 0; k<sizeof(strengths)/sizeof(strengths[0]); k++) { 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_STRENGTH, strengths[k], &status); 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortkeysize = ucol_getSortKey(coll, m, sizem, sortkey, 256); 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, " strength: %s\n Sortkey: ", strengthsC[k]); 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, "%s\n", ucol_sortKeyToString(coll, sortkey, buffer, &len)); 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void BillFairmanTest(void) { 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru** check for actual locale via ICU resource bundles 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru** 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru** lp points to the original locale ("fr_FR_....") 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UResourceBundle *lr,*cr; 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode lec = U_ZERO_ERROR; 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *lp = "fr_FR_you_ll_never_find_this_locale"; 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("BillFairmanTest\n"); 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lr = ures_open(NULL,lp,&lec); 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (lr) { 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cr = ures_getByKey(lr,"collations",0,&lec); 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (cr) { 40285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho lp = ures_getLocaleByType(cr, ULOC_ACTUAL_LOCALE, &lec); 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (lp) { 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(lec)) { 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strcmp(lp, "fr") != 0) { 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Wrong locale for French Collation Data, expected \"fr\" got %s", lp); 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_close(cr); 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_close(lr); 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testPrimary(UCollator* col, const UChar* p,const UChar* q){ 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar source[256] = { '\0'}; 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar target[256] = { '\0'}; 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar preP = 0x31a3; 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar preQ = 0x310d; 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar preP = (*p>0x0400 && *p<0x0500)?0x00e1:0x491; 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar preQ = (*p>0x0400 && *p<0x0500)?0x0041:0x413; 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*log_verbose("Testing primary\n");*/ 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(col, p, q, UCOL_LESS); 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationResult result = ucol_strcoll(col,p,u_strlen(p),q,u_strlen(q)); 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result!=UCOL_LESS){ 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru aescstrdup(p,utfSource,256); 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru aescstrdup(q,utfTarget,256); 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(file,"Primary failed source: %s target: %s \n", utfSource,utfTarget); 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source[0] = preP; 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(source+1,p); 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target[0] = preQ; 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(target+1,q); 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(col, source, target, UCOL_LESS); 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(file,"Primary swamps 2nd failed source: %s target: %s \n", utfSource,utfTarget); 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testSecondary(UCollator* col, const UChar* p,const UChar* q){ 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar source[256] = { '\0'}; 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar target[256] = { '\0'}; 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*log_verbose("Testing secondary\n");*/ 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(col, p, q, UCOL_LESS); 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(file,"secondary failed source: %s target: %s \n", utfSource,utfTarget); 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source[0] = 0x0053; 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(source+1,p); 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target[0]= 0x0073; 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(target+1,q); 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(col, source, target, UCOL_LESS); 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(file,"secondary swamps 3rd failed source: %s target: %s \n",utfSource,utfTarget); 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(source,p); 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source[u_strlen(p)] = 0x62; 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source[u_strlen(p)+1] = 0; 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(target,q); 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target[u_strlen(q)] = 0x61; 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target[u_strlen(q)+1] = 0; 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(col, source, target, UCOL_GREATER); 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(file,"secondary is swamped by 1 failed source: %s target: %s \n",utfSource,utfTarget); 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testTertiary(UCollator* col, const UChar* p,const UChar* q){ 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar source[256] = { '\0'}; 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar target[256] = { '\0'}; 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*log_verbose("Testing tertiary\n");*/ 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(col, p, q, UCOL_LESS); 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(file,"Tertiary failed source: %s target: %s \n",utfSource,utfTarget); 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source[0] = 0x0020; 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(source+1,p); 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target[0]= 0x002D; 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(target+1,q); 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(col, source, target, UCOL_LESS); 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(file,"Tertiary swamps 4th failed source: %s target: %s \n", utfSource,utfTarget); 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(source,p); 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source[u_strlen(p)] = 0xE0; 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source[u_strlen(p)+1] = 0; 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(target,q); 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target[u_strlen(q)] = 0x61; 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target[u_strlen(q)+1] = 0; 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(col, source, target, UCOL_GREATER); 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(file,"Tertiary is swamped by 3rd failed source: %s target: %s \n",utfSource,utfTarget); 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testEquality(UCollator* col, const UChar* p,const UChar* q){ 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar source[256] = { '\0'}; 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar target[256] = { '\0'}; 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(col, p, q, UCOL_EQUAL); 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(file,"Primary failed source: %s target: %s \n", utfSource,utfTarget); 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testCollator(UCollator *coll, UErrorCode *status) { 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *rules = NULL, *current = NULL; 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t ruleLen = 0; 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t strength = 0; 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t chOffset = 0; uint32_t chLen = 0; 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t exOffset = 0; uint32_t exLen = 0; 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t prefixOffset = 0; uint32_t prefixLen = 0; 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t firstEx = 0; 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* uint32_t rExpsLen = 0; */ 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t firstLen = 0; 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool varT = FALSE; UBool top_ = TRUE; 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint16_t specs = 0; 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool startOfRules = TRUE; 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool lastReset = FALSE; 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool before = FALSE; 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t beforeStrength = 0; 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColTokenParser src; 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColOptionSet opts; 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar first[256]; 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar second[256]; 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar tempB[256]; 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t tempLen; 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *rulesCopy = NULL; 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 55685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 55727f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_memset(&src, 0, sizeof(UColTokenParser)); 55827f654740f2a26ad62a5c155af9199af9e69b889claireho 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src.opts = &opts; 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules = ucol_getRules(coll, &ruleLen); 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(*status) && ruleLen > 0) { 56327f654740f2a26ad62a5c155af9199af9e69b889claireho rulesCopy = (UChar *)uprv_malloc((ruleLen+UCOL_TOK_EXTRA_RULE_SPACE_SIZE)*sizeof(UChar)); 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memcpy(rulesCopy, rules, ruleLen*sizeof(UChar)); 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src.current = src.source = rulesCopy; 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src.end = rulesCopy+ruleLen; 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src.extraCurrent = src.end; 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src.extraEnd = src.end+UCOL_TOK_EXTRA_RULE_SPACE_SIZE; 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *first = *second = 0; 570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 57127f654740f2a26ad62a5c155af9199af9e69b889claireho /* Note that as a result of tickets 7015 or 6912, ucol_tok_parseNextToken can cause the pointer to 57227f654740f2a26ad62a5c155af9199af9e69b889claireho the rules copy in src.source to get reallocated, freeing the original pointer in rulesCopy */ 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while ((current = ucol_tok_parseNextToken(&src, startOfRules,&parseError, status)) != NULL) { 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strength = src.parsedToken.strength; 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru chOffset = src.parsedToken.charsOffset; 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru chLen = src.parsedToken.charsLen; 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exOffset = src.parsedToken.extensionOffset; 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exLen = src.parsedToken.extensionLen; 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prefixOffset = src.parsedToken.prefixOffset; 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prefixLen = src.parsedToken.prefixLen; 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru specs = src.parsedToken.flags; 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru startOfRules = FALSE; 584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru varT = (UBool)((specs & UCOL_TOK_VARIABLE_TOP) != 0); 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru top_ = (UBool)((specs & UCOL_TOK_TOP) != 0); 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(top_) { /* if reset is on top, the sequence is broken. We should have an empty string */ 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru second[0] = 0; 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 58927f654740f2a26ad62a5c155af9199af9e69b889claireho u_strncpy(second,src.source+chOffset, chLen); 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru second[chLen] = 0; 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(exLen > 0 && firstEx == 0) { 59327f654740f2a26ad62a5c155af9199af9e69b889claireho u_strncat(first, src.source+exOffset, exLen); 594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first[firstLen+exLen] = 0; 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(lastReset == TRUE && prefixLen != 0) { 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strncpy(first+prefixLen, first, firstLen); 59927f654740f2a26ad62a5c155af9199af9e69b889claireho u_strncpy(first, src.source+prefixOffset, prefixLen); 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first[firstLen+prefixLen] = 0; 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru firstLen = firstLen+prefixLen; 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(before == TRUE) { /* swap first and second */ 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(tempB, first); 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(first, second); 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(second, tempB); 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempLen = firstLen; 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru firstLen = chLen; 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru chLen = tempLen; 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempLen = firstEx; 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru firstEx = exLen; 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exLen = tempLen; 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(beforeStrength < strength) { 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strength = beforeStrength; 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lastReset = FALSE; 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch(strength){ 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCOL_IDENTICAL: 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testEquality(coll,first,second); 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCOL_PRIMARY: 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testPrimary(coll,first,second); 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCOL_SECONDARY: 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testSecondary(coll,first,second); 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCOL_TERTIARY: 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testTertiary(coll,first,second); 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case UCOL_TOK_RESET: 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lastReset = TRUE; 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru before = (UBool)((specs & UCOL_TOK_BEFORE) != 0); 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(before) { 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru beforeStrength = (specs & UCOL_TOK_BEFORE)-1; 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(before == TRUE && strength != UCOL_TOK_RESET) { /* first and second were swapped */ 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru before = FALSE; 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru firstLen = chLen; 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru firstEx = exLen; 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(first, second); 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 65527f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_free(src.source); 6568393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius uprv_free(src.reorderCodes); 657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UCollationResult ucaTest(void *collator, const int object, const UChar *source, const int sLen, const UChar *target, const int tLen) { 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *UCA = (UCollator *)collator; 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ucol_strcoll(UCA, source, sLen, target, tLen); 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UCollationResult winTest(void *collator, const int object, const UChar *source, const int sLen, const UChar *target, const int tLen) { 667103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_HAS_WIN32_API 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LCID lcid = (LCID)collator; 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UCollationResult)CompareString(lcid, 0, source, sLen, target, tLen); 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UCollationResult swampEarlier(tst_strcoll* func, void *collator, int opts, 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar s1, UChar s2, 678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *s, const uint32_t sLen, 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *t, const uint32_t tLen) { 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar source[256] = {0}; 681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar target[256] = {0}; 682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source[0] = s1; 684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(source+1, s); 685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target[0] = s2; 686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(target+1, t); 687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return func(collator, opts, source, sLen+1, target, tLen+1); 689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UCollationResult swampLater(tst_strcoll* func, void *collator, int opts, 692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar s1, UChar s2, 693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *s, const uint32_t sLen, 694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *t, const uint32_t tLen) { 695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar source[256] = {0}; 696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar target[256] = {0}; 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(source, s); 699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source[sLen] = s1; 700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(target, t); 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target[tLen] = s2; 702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return func(collator, opts, source, sLen+1, target, tLen+1); 704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic uint32_t probeStrength(tst_strcoll* func, void *collator, int opts, 707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *s, const uint32_t sLen, 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *t, const uint32_t tLen, 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationResult result) { 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*UChar fPrimary = 0x6d;*/ 711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*UChar sPrimary = 0x6e;*/ 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar fSecondary = 0x310d; 713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar sSecondary = 0x31a3; 714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar fTertiary = 0x310f; 715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar sTertiary = 0x31b7; 716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationResult oposite; 718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result == UCOL_EQUAL) { 719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return UCOL_IDENTICAL; 720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(result == UCOL_GREATER) { 721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru oposite = UCOL_LESS; 722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru oposite = UCOL_GREATER; 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(swampEarlier(func, collator, opts, sSecondary, fSecondary, s, sLen, t, tLen) == result) { 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return UCOL_PRIMARY; 728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if((swampEarlier(func, collator, opts, sTertiary, 0x310f, s, sLen, t, tLen) == result) && 729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (swampEarlier(func, collator, opts, 0x310f, sTertiary, s, sLen, t, tLen) == result)) { 730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return UCOL_SECONDARY; 731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if((swampLater(func, collator, opts, sTertiary, fTertiary, s, sLen, t, tLen) == result) && 732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (swampLater(func, collator, opts, fTertiary, sTertiary, s, sLen, t, tLen) == result)) { 733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return UCOL_TERTIARY; 734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if((swampLater(func, collator, opts, sTertiary, 0x310f, s, sLen, t, tLen) == oposite) && 735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (swampLater(func, collator, opts, fTertiary, sTertiary, s, sLen, t, tLen) == oposite)) { 736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return UCOL_QUATERNARY; 737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return UCOL_IDENTICAL; 739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char *getRelationSymbol(UCollationResult res, uint32_t strength, char *buffer) { 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t i = 0; 744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(res == UCOL_EQUAL || strength == 0xdeadbeef) { 746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[0] = '='; 747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[1] = '='; 748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[2] = '\0'; 749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(res == UCOL_GREATER) { 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<strength+1; i++) { 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[i] = '>'; 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[strength+1] = '\0'; 754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<strength+1; i++) { 756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[i] = '<'; 757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[strength+1] = '\0'; 759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return buffer; 762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void logFailure (const char *platform, const char *test, 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *source, const uint32_t sLen, 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *target, const uint32_t tLen, 769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationResult realRes, uint32_t realStrength, 770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationResult expRes, uint32_t expStrength, UBool error) { 771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t i = 0; 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char sEsc[256], s[256], tEsc[256], t[256], b[256], output[512], relation[256]; 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static int32_t maxOutputLength = 0; 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t outputLength; 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *sEsc = *tEsc = *s = *t = 0; 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(error == TRUE) { 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Difference between expected and generated order. Run test with -v for more info\n"); 78127f654740f2a26ad62a5c155af9199af9e69b889claireho } else if(getTestOption(VERBOSITY_OPTION) == 0) { 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<sLen; i++) { 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(b, "%04X", source[i]); 786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(sEsc, "\\u"); 787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(sEsc, b); 788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(s, b); 789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(s, " "); 790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(source[i] < 0x80) { 791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(b, "(%c)", source[i]); 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(sEsc, b); 793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<tLen; i++) { 796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(b, "%04X", target[i]); 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(tEsc, "\\u"); 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(tEsc, b); 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(t, b); 800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(t, " "); 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(target[i] < 0x80) { 802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(b, "(%c)", target[i]); 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(tEsc, b); 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcpy(output, "[[ "); 808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, sEsc); 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, getRelationSymbol(expRes, expStrength, relation)); 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, tEsc); 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, " : "); 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, sEsc); 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, getRelationSymbol(realRes, realStrength, relation)); 816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, tEsc); 817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, " ]] "); 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%s", output); 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcpy(output, "DIFF: "); 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, s); 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, " : "); 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, t); 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, test); 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, ": "); 831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, sEsc); 833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, getRelationSymbol(expRes, expStrength, relation)); 834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, tEsc); 835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, " "); 837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, platform); 839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, ": "); 840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, sEsc); 842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, getRelationSymbol(realRes, realStrength, relation)); 843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(output, tEsc); 844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru outputLength = (int32_t)strlen(output); 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(outputLength > maxOutputLength) { 847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru maxOutputLength = outputLength; 848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_ASSERT(outputLength < sizeof(output)); 849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%s\n", output); 852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void printOutRules(const UChar *rules) { 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t len = u_strlen(rules); 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t i = 0; 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char toPrint; 860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t line = 0; 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "Rules:"); 863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<len; i++) { 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(rules[i]<0x7f && rules[i]>=0x20) { 866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru toPrint = (char)rules[i]; 867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(toPrint == '&') { 868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru line = 1; 869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "\n&"); 870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(toPrint == ';') { 871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "<<"); 872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru line+=2; 873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(toPrint == ',') { 874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "<<<"); 875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru line+=3; 876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "%c", toPrint); 878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru line++; 879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(rules[i]<0x3400 || rules[i]>=0xa000) { 881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "\\u%04X", rules[i]); 882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru line+=6; 883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(line>72) { 885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "\n"); 886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru line = 0; 887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n"); 891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic uint32_t testSwitch(tst_strcoll* func, void *collator, int opts, uint32_t strength, const UChar *first, const UChar *second, const char* msg, UBool error) { 896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t diffs = 0; 897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationResult realResult; 898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t realStrength; 899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t sLen = u_strlen(first); 901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t tLen = u_strlen(second); 902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru realResult = func(collator, opts, first, sLen, second, tLen); 904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru realStrength = probeStrength(func, collator, opts, first, sLen, second, tLen, realResult); 905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 906103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(strength == UCOL_IDENTICAL && realResult != UCOL_EQUAL) { 907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logFailure(msg, "tailoring", first, sLen, second, tLen, realResult, realStrength, UCOL_EQUAL, strength, error); 908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru diffs++; 909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(realResult != UCOL_LESS || realStrength != strength) { 910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logFailure(msg, "tailoring", first, sLen, second, tLen, realResult, realStrength, UCOL_LESS, strength, error); 911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru diffs++; 912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return diffs; 914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testAgainstUCA(UCollator *coll, UCollator *UCA, const char *refName, UBool error, UErrorCode *status) { 918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *rules = NULL, *current = NULL; 919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t ruleLen = 0; 920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t strength = 0; 921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t chOffset = 0; uint32_t chLen = 0; 922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t exOffset = 0; uint32_t exLen = 0; 923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t prefixOffset = 0; uint32_t prefixLen = 0; 924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* uint32_t rExpsLen = 0; */ 925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t firstLen = 0, secondLen = 0; 926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool varT = FALSE; UBool top_ = TRUE; 927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint16_t specs = 0; 928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool startOfRules = TRUE; 929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColTokenParser src; 930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColOptionSet opts; 931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar first[256]; 933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar second[256]; 934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *rulesCopy = NULL; 935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t UCAdiff = 0; 937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t Windiff = 1; 938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 94027f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_memset(&src, 0, sizeof(UColTokenParser)); 941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src.opts = &opts; 942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules = ucol_getRules(coll, &ruleLen); 944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*printOutRules(rules);*/ 946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(*status) && ruleLen > 0) { 94827f654740f2a26ad62a5c155af9199af9e69b889claireho rulesCopy = (UChar *)uprv_malloc((ruleLen+UCOL_TOK_EXTRA_RULE_SPACE_SIZE)*sizeof(UChar)); 949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memcpy(rulesCopy, rules, ruleLen*sizeof(UChar)); 950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src.current = src.source = rulesCopy; 951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src.end = rulesCopy+ruleLen; 952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src.extraCurrent = src.end; 953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src.extraEnd = src.end+UCOL_TOK_EXTRA_RULE_SPACE_SIZE; 954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *first = *second = 0; 955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 95627f654740f2a26ad62a5c155af9199af9e69b889claireho /* Note that as a result of tickets 7015 or 6912, ucol_tok_parseNextToken can cause the pointer to 95727f654740f2a26ad62a5c155af9199af9e69b889claireho the rules copy in src.source to get reallocated, freeing the original pointer in rulesCopy */ 958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while ((current = ucol_tok_parseNextToken(&src, startOfRules, &parseError,status)) != NULL) { 959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strength = src.parsedToken.strength; 960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru chOffset = src.parsedToken.charsOffset; 961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru chLen = src.parsedToken.charsLen; 962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exOffset = src.parsedToken.extensionOffset; 963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exLen = src.parsedToken.extensionLen; 964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prefixOffset = src.parsedToken.prefixOffset; 965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prefixLen = src.parsedToken.prefixLen; 966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru specs = src.parsedToken.flags; 967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru startOfRules = FALSE; 969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru varT = (UBool)((specs & UCOL_TOK_VARIABLE_TOP) != 0); 970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru top_ = (UBool)((specs & UCOL_TOK_TOP) != 0); 971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 97227f654740f2a26ad62a5c155af9199af9e69b889claireho u_strncpy(second,src.source+chOffset, chLen); 973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru second[chLen] = 0; 974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru secondLen = chLen; 975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(exLen > 0) { 97727f654740f2a26ad62a5c155af9199af9e69b889claireho u_strncat(first, src.source+exOffset, exLen); 978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first[firstLen+exLen] = 0; 979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru firstLen += exLen; 980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strength != UCOL_TOK_RESET) { 983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if((*first<0x3400 || *first>=0xa000) && (*second<0x3400 || *second>=0xa000)) { 984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCAdiff += testSwitch(&ucaTest, (void *)UCA, 0, strength, first, second, refName, error); 985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*Windiff += testSwitch(&winTest, (void *)lcid, 0, strength, first, second, "Win32");*/ 986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru firstLen = chLen; 991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(first, second); 992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(UCAdiff != 0 && Windiff != 0) { 995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n"); 996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(UCAdiff == 0) { 998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("No immediate difference with %s!\n", refName); 999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(Windiff == 0) { 1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("No immediate difference with Win32!\n"); 1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 100327f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_free(src.source); 10048393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius uprv_free(src.reorderCodes); 1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Takes two CEs (lead and continuation) and 1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * compares them as CEs should be compared: 1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * primary vs. primary, secondary vs. secondary 1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * tertiary vs. tertiary 1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t compareCEs(uint32_t s1, uint32_t s2, 1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t t1, uint32_t t2) { 1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t s = 0, t = 0; 1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(s1 == t1 && s2 == t2) { 1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s = (s1 & 0xFFFF0000)|((s2 & 0xFFFF0000)>>16); 1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = (t1 & 0xFFFF0000)|((t2 & 0xFFFF0000)>>16); 1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(s < t) { 1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return -1; 1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(s > t) { 1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 1; 1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s = (s1 & 0x0000FF00) | (s2 & 0x0000FF00)>>8; 1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = (t1 & 0x0000FF00) | (t2 & 0x0000FF00)>>8; 1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(s < t) { 1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return -1; 1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(s > t) { 1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 1; 1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s = (s1 & 0x000000FF)<<8 | (s2 & 0x000000FF); 1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = (t1 & 0x000000FF)<<8 | (t2 & 0x000000FF); 1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(s < t) { 1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return -1; 1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 1; 1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef struct { 1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t startCE; 1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t startContCE; 1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t limitCE; 1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t limitContCE; 1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} indirectBoundaries; 1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* these values are used for finding CE values for indirect positioning. */ 1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Indirect positioning is a mechanism for allowing resets on symbolic */ 1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* values. It only works for resets and you cannot tailor indirect names */ 1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* An indirect name can define either an anchor point or a range. An */ 1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* anchor point behaves in exactly the same way as a code point in reset */ 1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* would, except that it cannot be tailored. A range (we currently only */ 1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* know for the [top] range will explicitly set the upper bound for */ 1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* generated CEs, thus allowing for better control over how many CEs can */ 1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* be squeezed between in the range without performance penalty. */ 1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* In that respect, we use [top] for tailoring of locales that use CJK */ 1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* characters. Other indirect values are currently a pure convenience, */ 1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* they can be used to assure that the CEs will be always positioned in */ 1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* the same place relative to a point with known properties (e.g. first */ 1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* primary ignorable). */ 1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic indirectBoundaries ucolIndirectBoundaries[15]; 1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool indirectBoundariesSet = FALSE; 1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void setIndirectBoundaries(uint32_t indexR, uint32_t *start, uint32_t *end) { 106985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Set values for the top - TODO: once we have values for all the indirects, we are going */ 107085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* to initalize here. */ 107185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucolIndirectBoundaries[indexR].startCE = start[0]; 107285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucolIndirectBoundaries[indexR].startContCE = start[1]; 107385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(end) { 107485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucolIndirectBoundaries[indexR].limitCE = end[0]; 107585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucolIndirectBoundaries[indexR].limitContCE = end[1]; 107685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 107785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucolIndirectBoundaries[indexR].limitCE = 0; 107885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucolIndirectBoundaries[indexR].limitContCE = 0; 107985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void testCEs(UCollator *coll, UErrorCode *status) { 108385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const UChar *rules = NULL, *current = NULL; 108485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t ruleLen = 0; 108585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 108685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint32_t strength = 0; 108785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint32_t maxStrength = UCOL_IDENTICAL; 108885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint32_t baseCE, baseContCE, nextCE, nextContCE, currCE, currContCE; 108985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint32_t lastCE; 109085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint32_t lastContCE; 109185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 109285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t result = 0; 109385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint32_t chOffset = 0; uint32_t chLen = 0; 109485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint32_t exOffset = 0; uint32_t exLen = 0; 109585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint32_t prefixOffset = 0; uint32_t prefixLen = 0; 109685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint32_t oldOffset = 0; 109785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 109885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* uint32_t rExpsLen = 0; */ 109985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* uint32_t firstLen = 0; */ 110085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint16_t specs = 0; 110185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UBool varT = FALSE; UBool top_ = TRUE; 110285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UBool startOfRules = TRUE; 110385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UBool before = FALSE; 110485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UColTokenParser src; 110585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UColOptionSet opts; 110685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UParseError parseError; 110785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar *rulesCopy = NULL; 110850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho collIterate *c = uprv_new_collIterate(status); 110985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCAConstants *consts = NULL; 111085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint32_t UCOL_RESET_TOP_VALUE, /*UCOL_RESET_TOP_CONT, */ 111185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCOL_NEXT_TOP_VALUE, UCOL_NEXT_TOP_CONT; 111285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char *colLoc; 111385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCollator *UCA = ucol_open("root", status); 111485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 111585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(*status)) { 111685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Could not open root collator %s\n", u_errorName(*status)); 111750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_delete_collIterate(c); 111885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 111985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 112185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho colLoc = ucol_getLocaleByType(coll, ULOC_ACTUAL_LOCALE, status); 112285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(*status)) { 112385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Could not get collator name: %s\n", u_errorName(*status)); 112450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ucol_close(UCA); 112550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_delete_collIterate(c); 112685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 112785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 112927f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_memset(&src, 0, sizeof(UColTokenParser)); 113027f654740f2a26ad62a5c155af9199af9e69b889claireho 113185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho consts = (UCAConstants *)((uint8_t *)UCA->image + UCA->image->UCAConsts); 113285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCOL_RESET_TOP_VALUE = consts->UCA_LAST_NON_VARIABLE[0]; 113385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*UCOL_RESET_TOP_CONT = consts->UCA_LAST_NON_VARIABLE[1]; */ 113485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCOL_NEXT_TOP_VALUE = consts->UCA_FIRST_IMPLICIT[0]; 113585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCOL_NEXT_TOP_CONT = consts->UCA_FIRST_IMPLICIT[1]; 113685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 113785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho baseCE=baseContCE=nextCE=nextContCE=currCE=currContCE=lastCE=lastContCE = UCOL_NOT_FOUND; 113885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 113985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho src.opts = &opts; 114085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 114185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho rules = ucol_getRules(coll, &ruleLen); 114285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 114385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho src.invUCA = ucol_initInverseUCA(status); 114485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 114585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(indirectBoundariesSet == FALSE) { 114685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* UCOL_RESET_TOP_VALUE */ 114785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho setIndirectBoundaries(0, consts->UCA_LAST_NON_VARIABLE, consts->UCA_FIRST_IMPLICIT); 114885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* UCOL_FIRST_PRIMARY_IGNORABLE */ 114985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho setIndirectBoundaries(1, consts->UCA_FIRST_PRIMARY_IGNORABLE, 0); 115085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* UCOL_LAST_PRIMARY_IGNORABLE */ 115185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho setIndirectBoundaries(2, consts->UCA_LAST_PRIMARY_IGNORABLE, 0); 115285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* UCOL_FIRST_SECONDARY_IGNORABLE */ 115385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho setIndirectBoundaries(3, consts->UCA_FIRST_SECONDARY_IGNORABLE, 0); 115485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* UCOL_LAST_SECONDARY_IGNORABLE */ 115585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho setIndirectBoundaries(4, consts->UCA_LAST_SECONDARY_IGNORABLE, 0); 115685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* UCOL_FIRST_TERTIARY_IGNORABLE */ 115785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho setIndirectBoundaries(5, consts->UCA_FIRST_TERTIARY_IGNORABLE, 0); 115885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* UCOL_LAST_TERTIARY_IGNORABLE */ 115985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho setIndirectBoundaries(6, consts->UCA_LAST_TERTIARY_IGNORABLE, 0); 116085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* UCOL_FIRST_VARIABLE */ 116185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho setIndirectBoundaries(7, consts->UCA_FIRST_VARIABLE, 0); 116285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* UCOL_LAST_VARIABLE */ 116385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho setIndirectBoundaries(8, consts->UCA_LAST_VARIABLE, 0); 116485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* UCOL_FIRST_NON_VARIABLE */ 116585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho setIndirectBoundaries(9, consts->UCA_FIRST_NON_VARIABLE, 0); 116685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* UCOL_LAST_NON_VARIABLE */ 116785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho setIndirectBoundaries(10, consts->UCA_LAST_NON_VARIABLE, consts->UCA_FIRST_IMPLICIT); 116885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* UCOL_FIRST_IMPLICIT */ 116985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho setIndirectBoundaries(11, consts->UCA_FIRST_IMPLICIT, 0); 117085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* UCOL_LAST_IMPLICIT */ 117185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho setIndirectBoundaries(12, consts->UCA_LAST_IMPLICIT, consts->UCA_FIRST_TRAILING); 117285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* UCOL_FIRST_TRAILING */ 117385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho setIndirectBoundaries(13, consts->UCA_FIRST_TRAILING, 0); 117485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* UCOL_LAST_TRAILING */ 117585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho setIndirectBoundaries(14, consts->UCA_LAST_TRAILING, 0); 117685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucolIndirectBoundaries[14].limitCE = (consts->UCA_PRIMARY_SPECIAL_MIN<<24); 117785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho indirectBoundariesSet = TRUE; 117885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 118185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(U_SUCCESS(*status) && ruleLen > 0) { 118227f654740f2a26ad62a5c155af9199af9e69b889claireho rulesCopy = (UChar *)uprv_malloc((ruleLen+UCOL_TOK_EXTRA_RULE_SPACE_SIZE)*sizeof(UChar)); 118385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_memcpy(rulesCopy, rules, ruleLen*sizeof(UChar)); 118485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho src.current = src.source = rulesCopy; 118585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho src.end = rulesCopy+ruleLen; 118685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho src.extraCurrent = src.end; 118785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho src.extraEnd = src.end+UCOL_TOK_EXTRA_RULE_SPACE_SIZE; 118885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 118927f654740f2a26ad62a5c155af9199af9e69b889claireho /* Note that as a result of tickets 7015 or 6912, ucol_tok_parseNextToken can cause the pointer to 119027f654740f2a26ad62a5c155af9199af9e69b889claireho the rules copy in src.source to get reallocated, freeing the original pointer in rulesCopy */ 119185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho while ((current = ucol_tok_parseNextToken(&src, startOfRules, &parseError,status)) != NULL) { 119285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho strength = src.parsedToken.strength; 119385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho chOffset = src.parsedToken.charsOffset; 119485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho chLen = src.parsedToken.charsLen; 119585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho exOffset = src.parsedToken.extensionOffset; 119685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho exLen = src.parsedToken.extensionLen; 119785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho prefixOffset = src.parsedToken.prefixOffset; 119885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho prefixLen = src.parsedToken.prefixLen; 119985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho specs = src.parsedToken.flags; 120085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 120185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho startOfRules = FALSE; 120285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho varT = (UBool)((specs & UCOL_TOK_VARIABLE_TOP) != 0); 120385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho top_ = (UBool)((specs & UCOL_TOK_TOP) != 0); 120485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 120527f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_init_collIterate(coll, src.source+chOffset, chLen, c, status); 120685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 120750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho currCE = ucol_getNextCE(coll, c, status); 120827f654740f2a26ad62a5c155af9199af9e69b889claireho if(currCE == 0 && UCOL_ISTHAIPREVOWEL(*(src.source+chOffset))) { 120985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("Thai prevowel detected. Will pick next CE\n"); 121050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho currCE = ucol_getNextCE(coll, c, status); 121185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 121350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho currContCE = ucol_getNextCE(coll, c, status); 121485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(!isContinuation(currContCE)) { 121585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho currContCE = 0; 121685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 121885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* we need to repack CEs here */ 1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 122085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(strength == UCOL_TOK_RESET) { 122185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho before = (UBool)((specs & UCOL_TOK_BEFORE) != 0); 122285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(top_ == TRUE) { 122327f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t tokenIndex = src.parsedToken.indirectIndex; 1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 122527f654740f2a26ad62a5c155af9199af9e69b889claireho nextCE = baseCE = currCE = ucolIndirectBoundaries[tokenIndex].startCE; 122627f654740f2a26ad62a5c155af9199af9e69b889claireho nextContCE = baseContCE = currContCE = ucolIndirectBoundaries[tokenIndex].startContCE; 122785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 122885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho nextCE = baseCE = currCE; 122985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho nextContCE = baseContCE = currContCE; 123085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 123185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho maxStrength = UCOL_IDENTICAL; 123285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 123385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(strength < maxStrength) { 123485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho maxStrength = strength; 123585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(baseCE == UCOL_RESET_TOP_VALUE) { 123685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("Resetting to [top]\n"); 123785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho nextCE = UCOL_NEXT_TOP_VALUE; 123885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho nextContCE = UCOL_NEXT_TOP_CONT; 123985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 124085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho result = ucol_inv_getNextCE(&src, baseCE & 0xFFFFFF3F, baseContCE, &nextCE, &nextContCE, maxStrength); 124185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 124285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(result < 0) { 124327f654740f2a26ad62a5c155af9199af9e69b889claireho if(ucol_isTailored(coll, *(src.source+oldOffset), status)) { 124427f654740f2a26ad62a5c155af9199af9e69b889claireho log_verbose("Reset is tailored codepoint %04X, don't know how to continue, taking next test\n", *(src.source+oldOffset)); 124585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 124685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 124785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("%s: couldn't find the CE\n", colLoc); 124885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 124985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 125085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 125185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 125385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho currCE &= 0xFFFFFF3F; 125485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho currContCE &= 0xFFFFFFBF; 1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 125685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(maxStrength == UCOL_IDENTICAL) { 125785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(baseCE != currCE || baseContCE != currContCE) { 125885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("%s: current CE (initial strength UCOL_EQUAL)\n", colLoc); 125985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 126085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 126185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(strength == UCOL_IDENTICAL) { 126285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(lastCE != currCE || lastContCE != currContCE) { 126385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("%s: current CE (initial strength UCOL_EQUAL)\n", colLoc); 126485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 126585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 126685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(compareCEs(currCE, currContCE, nextCE, nextContCE) > 0) { 126785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*if(currCE > nextCE || (currCE == nextCE && currContCE >= nextContCE)) {*/ 126885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("%s: current CE is not less than base CE\n", colLoc); 126985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 127085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(!before) { 127185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(compareCEs(currCE, currContCE, lastCE, lastContCE) < 0) { 127285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*if(currCE < lastCE || (currCE == lastCE && currContCE <= lastContCE)) {*/ 127385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("%s: sequence of generated CEs is broken\n", colLoc); 127485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 127585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 127685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho before = FALSE; 127785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(compareCEs(currCE, currContCE, lastCE, lastContCE) > 0) { 127885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*if(currCE < lastCE || (currCE == lastCE && currContCE <= lastContCE)) {*/ 127985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("%s: sequence of generated CEs is broken\n", colLoc); 128085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 128185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 128285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 128385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 128785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho oldOffset = chOffset; 128885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho lastCE = currCE & 0xFFFFFF3F; 128985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho lastContCE = currContCE & 0xFFFFFFBF; 1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 129127f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_free(src.source); 12928393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius uprv_free(src.reorderCodes); 1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 129485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(UCA); 129550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_delete_collIterate(c); 1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0 1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* these locales are now picked from index RB */ 1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* localesToTest[] = { 1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"ar", "bg", "ca", "cs", "da", 1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"el", "en_BE", "en_US_POSIX", 1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"es", "et", "fi", "fr", "hi", 1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"hr", "hu", "is", "iw", "ja", 1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"ko", "lt", "lv", "mk", "mt", 1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"nb", "nn", "nn_NO", "pl", "ro", 1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"ru", "sh", "sk", "sl", "sq", 1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"sr", "sv", "th", "tr", "uk", 1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"vi", "zh", "zh_TW" 1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* rulesToTest[] = { 1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Funky fa rule */ 1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&\\u0622 < \\u0627 << \\u0671 < \\u0621", 1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*"& Z < p, P",*/ 1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Cui Mins rules */ 1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[top]<o,O<p,P<q,Q<'?'/u<r,R<u,U", /*"<o,O<p,P<q,Q<r,R<u,U & Qu<'?'",*/ 1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[top]<o,O<p,P<q,Q;'?'/u<r,R<u,U", /*"<o,O<p,P<q,Q<r,R<u,U & Qu;'?'",*/ 1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[top]<o,O<p,P<q,Q,'?'/u<r,R<u,U", /*"<o,O<p,P<q,Q<r,R<u,U&'Qu','?'",*/ 1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[top]<3<4<5<c,C<f,F<m,M<o,O<p,P<q,Q;'?'/u<r,R<u,U", /*"<'?'<3<4<5<a,A<f,F<m,M<o,O<p,P<q,Q<r,R<u,U & Qu;'?'",*/ 1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[top]<'?';Qu<3<4<5<c,C<f,F<m,M<o,O<p,P<q,Q<r,R<u,U", /*"<'?'<3<4<5<a,A<f,F<m,M<o,O<p,P<q,Q<r,R<u,U & '?';Qu",*/ 1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[top]<3<4<5<c,C<f,F<m,M<o,O<p,P<q,Q;'?'/um<r,R<u,U", /*"<'?'<3<4<5<a,A<f,F<m,M<o,O<p,P<q,Q<r,R<u,U & Qum;'?'",*/ 1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[top]<'?';Qum<3<4<5<c,C<f,F<m,M<o,O<p,P<q,Q<r,R<u,U" /*"<'?'<3<4<5<a,A<f,F<m,M<o,O<p,P<q,Q<r,R<u,U & '?';Qum"*/ 1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCollations(void) { 132985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t noOfLoc = uloc_countAvailable(); 133085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t i = 0, j = 0; 1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 133285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 133385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho char cName[256]; 133485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar name[256]; 133585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t nameSize; 1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 133885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char *locName = NULL; 133985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCollator *coll = NULL; 134085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCollator *UCA = ucol_open("", &status); 134185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UColAttributeValue oldStrength = ucol_getAttribute(UCA, UCOL_STRENGTH, &status); 134285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(status)) { 134385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "Could not open UCA collator %s\n", u_errorName(status)); 134485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 134585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 134685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_setAttribute(UCA, UCOL_STRENGTH, UCOL_QUATERNARY, &status); 1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 134885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 0; i<noOfLoc; i++) { 134985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho status = U_ZERO_ERROR; 135085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho locName = uloc_getAvailable(i); 135185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(uprv_strcmp("ja", locName) == 0) { 135285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("Don't know how to test prefixes\n"); 135385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho continue; 1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 135585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(hasCollationElements(locName)) { 135685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho nameSize = uloc_getDisplayName(locName, NULL, name, 256, &status); 135785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(j = 0; j<nameSize; j++) { 135885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho cName[j] = (char)name[j]; 135985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 136085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho cName[nameSize] = 0; 136185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("\nTesting locale %s (%s)\n", locName, cName); 136285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho coll = ucol_open(locName, &status); 136385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(U_SUCCESS(status)) { 136485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho testAgainstUCA(coll, UCA, "UCA", FALSE, &status); 136585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(coll); 136685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 136785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Couldn't instantiate collator for locale %s, error: %s\n", locName, u_errorName(status)); 136885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho status = U_ZERO_ERROR; 136985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 137285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_setAttribute(UCA, UCOL_STRENGTH, oldStrength, &status); 137385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(UCA); 1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void RamsRulesTest(void) { 137785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 137885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t i = 0; 137985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCollator *coll = NULL; 138085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar rule[2048]; 138185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint32_t ruleLen; 138285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t noOfLoc = uloc_countAvailable(); 138385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char *locName = NULL; 1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 138585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("RamsRulesTest\n"); 1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 138727f654740f2a26ad62a5c155af9199af9e69b889claireho if (uprv_strcmp("km", uloc_getDefault())==0 || uprv_strcmp("km_KH", uloc_getDefault())==0) { 138827f654740f2a26ad62a5c155af9199af9e69b889claireho /* This test will fail if the default locale is "km" or "km_KH". Enable after trac#6040. */ 138927f654740f2a26ad62a5c155af9199af9e69b889claireho return; 139027f654740f2a26ad62a5c155af9199af9e69b889claireho } 139127f654740f2a26ad62a5c155af9199af9e69b889claireho 139285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 0; i<noOfLoc; i++) { 139385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho locName = uloc_getAvailable(i); 139485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(hasCollationElements(locName)) { 139585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (uprv_strcmp("ja", locName)==0) { 139685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("Don't know how to test Japanese because of prefixes\n"); 139785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho continue; 139885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 139985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (uprv_strcmp("de__PHONEBOOK", locName)==0) { 140085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("Don't know how to test Phonebook because the reset is on an expanding character\n"); 140185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho continue; 140285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 140327f654740f2a26ad62a5c155af9199af9e69b889claireho if (uprv_strcmp("bn", locName)==0 || 14048393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius uprv_strcmp("bs", locName)==0 || /* Add due to import per cldrbug 5647 */ 14058393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius uprv_strcmp("bs_Cyrl", locName)==0 || /* Add due to import per cldrbug 5647 */ 140627f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcmp("en_US_POSIX", locName)==0 || 14078393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius uprv_strcmp("fa_AF", locName)==0 || /* Add due to import per cldrbug 5647 */ 14088393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius uprv_strcmp("he", locName)==0 || /* Add due to new tailoring of \u05F3 vs \u0027 per cldrbug 5576 */ 14098393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius uprv_strcmp("he_IL", locName)==0 || /* Add due to new tailoring of \u05F3 vs \u0027 per cldrbug 5576 */ 141027f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcmp("km", locName)==0 || 141185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcmp("km_KH", locName)==0 || 141227f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcmp("my", locName)==0 || 141385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcmp("si", locName)==0 || 141485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcmp("si_LK", locName)==0 || 14158393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius uprv_strcmp("sr_Latn", locName)==0 || /* Add due to import per cldrbug 5647 */ 141654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius uprv_strcmp("th", locName)==0 || 141754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius uprv_strcmp("th_TH", locName)==0 || 141885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_strcmp("zh", locName)==0 || 141927f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_strcmp("zh_Hant", locName)==0 142027f654740f2a26ad62a5c155af9199af9e69b889claireho ) { 142127f654740f2a26ad62a5c155af9199af9e69b889claireho log_verbose("Don't know how to test %s. " 142227f654740f2a26ad62a5c155af9199af9e69b889claireho "TODO: Fix ticket #6040 and reenable RamsRulesTest for this locale.\n", locName); 142327f654740f2a26ad62a5c155af9199af9e69b889claireho continue; 142485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 142585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("Testing locale %s\n", locName); 142627f654740f2a26ad62a5c155af9199af9e69b889claireho status = U_ZERO_ERROR; 142785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho coll = ucol_open(locName, &status); 142885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(U_SUCCESS(status)) { 142927f654740f2a26ad62a5c155af9199af9e69b889claireho if((status != U_USING_DEFAULT_WARNING) && (status != U_USING_FALLBACK_WARNING)) { 143085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(coll->image->jamoSpecial == TRUE) { 143127f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("%s has special JAMOs\n", locName); 143285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 143385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_setAttribute(coll, UCOL_CASE_FIRST, UCOL_OFF, &status); 143485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho testCollator(coll, &status); 143585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho testCEs(coll, &status); 143627f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 143727f654740f2a26ad62a5c155af9199af9e69b889claireho log_verbose("Skipping %s: %s\n", locName, u_errorName(status)); 143827f654740f2a26ad62a5c155af9199af9e69b889claireho } 143927f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_close(coll); 144027f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 144127f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("Could not open %s: %s\n", locName, u_errorName(status)); 144285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 144685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 0; i<sizeof(rulesToTest)/sizeof(rulesToTest[0]); i++) { 144785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("Testing rule: %s\n", rulesToTest[i]); 144885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ruleLen = u_unescape(rulesToTest[i], rule, 2048); 144927f654740f2a26ad62a5c155af9199af9e69b889claireho status = U_ZERO_ERROR; 145085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho coll = ucol_openRules(rule, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status); 145185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(U_SUCCESS(status)) { 145285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho testCollator(coll, &status); 145385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho testCEs(coll, &status); 145485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(coll); 145527f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 145627f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(status, "Could not test rule: %s: '%s'\n", u_errorName(status), rulesToTest[i]); 145785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void IsTailoredTest(void) { 146385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 146485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint32_t i = 0; 146585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCollator *coll = NULL; 146685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar rule[2048]; 146785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar tailored[2048]; 146885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar notTailored[2048]; 146985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint32_t ruleLen, tailoredLen, notTailoredLen; 1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 147185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("IsTailoredTest\n"); 1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 147385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho u_uastrcpy(rule, "&Z < A, B, C;c < d"); 147485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ruleLen = u_strlen(rule); 1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 147685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho u_uastrcpy(tailored, "ABCcd"); 147785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tailoredLen = u_strlen(tailored); 1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 147985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho u_uastrcpy(notTailored, "ZabD"); 148085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho notTailoredLen = u_strlen(notTailored); 1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 148285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho coll = ucol_openRules(rule, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status); 148385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(U_SUCCESS(status)) { 148485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 0; i<tailoredLen; i++) { 148585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(!ucol_isTailored(coll, tailored[i], &status)) { 148685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("%i: %04X should be tailored - it is reported as not\n", i, tailored[i]); 148785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 148885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 148985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 0; i<notTailoredLen; i++) { 149085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(ucol_isTailored(coll, notTailored[i], &status)) { 149185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("%i: %04X should not be tailored - it is reported as it is\n", i, notTailored[i]); 149285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 149385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 149485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(coll); 1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 149685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho else { 149785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "Can't tailor rules\n"); 149885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 149985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Code coverage */ 150085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho status = U_ZERO_ERROR; 150185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho coll = ucol_open("ja", &status); 150285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(!ucol_isTailored(coll, 0x4E9C, &status)) { 150385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "0x4E9C should be tailored - it is reported as not\n"); 1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst static char chTest[][20] = { 1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "c", 1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "C", 1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ca", "cb", "cx", "cy", "CZ", 1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "c\\u030C", "C\\u030C", 1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "h", 1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "H", 1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ha", "Ha", "harly", "hb", "HB", "hx", "HX", "hy", "HY", 1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ch", "cH", "Ch", "CH", 1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "cha", "charly", "che", "chh", "chch", "chr", 1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "i", "I", "iarly", 1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "r", "R", 1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "r\\u030C", "R\\u030C", 1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "s", 1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "S", 1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "s\\u030C", "S\\u030C", 1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "z", "Z", 1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "z\\u030C", "Z\\u030C" 1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestChMove(void) { 153085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar t1[256] = {0}; 153185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar t2[256] = {0}; 1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 153385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint32_t i = 0, j = 0; 153485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint32_t size = 0; 153585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 153785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCollator *coll = ucol_open("cs", &status); 1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 153985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(U_SUCCESS(status)) { 154085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho size = sizeof(chTest)/sizeof(chTest[0]); 154185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 0; i < size-1; i++) { 154285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(j = i+1; j < size; j++) { 154385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho u_unescape(chTest[i], t1, 256); 154485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho u_unescape(chTest[j], t2, 256); 154585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho doTest(coll, t1, t2, UCOL_LESS); 154685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 154785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 154985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho else { 155027f654740f2a26ad62a5c155af9199af9e69b889claireho log_data_err("Can't open collator"); 155185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 155285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(coll); 1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst static char impTest[][20] = { 1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u4e00", 1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a", 1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "A", 1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "b", 1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "B", 1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u4e01" 1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestImplicitTailoring(void) { 1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const struct { 1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *rules; 1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *data[10]; 1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const uint32_t len; 1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } tests[] = { 1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 1]\\u4e00 < b < c &[before 1]\\u4e00 < d < e", { "d", "e", "b", "c", "\\u4e00"}, 5 }, 1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&\\u4e00 < a <<< A < b <<< B", { "\\u4e00", "a", "A", "b", "B", "\\u4e01"}, 6 }, 1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 1]\\u4e00 < \\u4e01 < \\u4e02", { "\\u4e01", "\\u4e02", "\\u4e00"}, 3}, 1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 1]\\u4e01 < \\u4e02 < \\u4e03", { "\\u4e02", "\\u4e03", "\\u4e01"}, 3} 1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0; 1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) { 1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter(tests[i].rules, tests[i].data, tests[i].len); 1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar t1[256] = {0}; 1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar t2[256] = {0}; 1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *rule = "&\\u4e00 < a <<< A < b <<< B"; 1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t i = 0, j = 0; 1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t size = 0; 1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t ruleLen = 0; 1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = NULL; 1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ruleLen = u_unescape(rule, t1, 256); 1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_openRules(t1, ruleLen, UCOL_OFF, UCOL_TERTIARY,NULL, &status); 1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru size = sizeof(impTest)/sizeof(impTest[0]); 1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < size-1; i++) { 1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = i+1; j < size; j++) { 1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_unescape(impTest[i], t1, 256); 1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_unescape(impTest[j], t2, 256); 1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(coll, t1, t2, UCOL_LESS); 1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Can't open collator"); 1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestFCDProblem(void) { 1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar t1[256] = {0}; 1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar t2[256] = {0}; 1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *s1 = "\\u0430\\u0306\\u0325"; 1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *s2 = "\\u04D1\\u0325"; 1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_open("", &status); 1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_unescape(s1, t1, 256); 1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_unescape(s2, t2, 256); 1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status); 1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(coll, t1, t2, UCOL_EQUAL); 1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(coll, t1, t2, UCOL_EQUAL); 1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 163985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* 164085bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoThe largest normalization form is 18 for NFKC/NFKD, 4 for NFD and 3 for NFC 164185bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoWe're only using NFC/NFD in this test. 164285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho*/ 164385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define NORM_BUFFER_TEST_LEN 18 1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef struct { 1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 u; 1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar NFC[NORM_BUFFER_TEST_LEN]; 1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar NFD[NORM_BUFFER_TEST_LEN]; 1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} tester; 1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestComposeDecompose(void) { 165185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* [[:NFD_Inert=false:][:NFC_Inert=false:]] */ 165285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho static const UChar UNICODESET_STR[] = { 165385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 0x5B,0x5B,0x3A,0x4E,0x46,0x44,0x5F,0x49,0x6E,0x65,0x72,0x74,0x3D,0x66,0x61, 165485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 0x6C,0x73,0x65,0x3A,0x5D,0x5B,0x3A,0x4E,0x46,0x43,0x5F,0x49,0x6E,0x65,0x72, 165585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 0x74,0x3D,0x66,0x61,0x6C,0x73,0x65,0x3A,0x5D,0x5D,0 165685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho }; 1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t noOfLoc; 1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0, j = 0; 1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *locName = NULL; 1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t nfcSize; 1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t nfdSize; 1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tester **t; 1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t noCases = 0; 1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = NULL; 1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 u = 0; 1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar comp[NORM_BUFFER_TEST_LEN]; 1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t len = 0; 1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationElements *iter; 167185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho USet *charsToTest = uset_openPattern(UNICODESET_STR, -1, &status); 167285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t charsToTestSize; 1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru noOfLoc = uloc_countAvailable(); 1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_open("", &status); 167785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(status)) { 167885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_data_err("Error opening collator -> %s (Are you missing data?)\n", u_errorName(status)); 167985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 168185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho charsToTestSize = uset_size(charsToTest); 168285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (charsToTestSize <= 0) { 168385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Set was zero. Missing data?\n"); 168485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 168585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1686b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho t = (tester **)malloc(charsToTestSize * sizeof(tester *)); 168785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho t[0] = (tester *)malloc(sizeof(tester)); 168885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("Testing UCA extensively for %d characters\n", charsToTestSize); 1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 169085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(u = 0; u < charsToTestSize; u++) { 169185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar32 ch = uset_charAt(charsToTest, u); 169285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho len = 0; 1693103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius U16_APPEND_UNSAFE(comp, len, ch); 1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfcSize = unorm_normalize(comp, len, UNORM_NFC, 0, t[noCases]->NFC, NORM_BUFFER_TEST_LEN, &status); 1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfdSize = unorm_normalize(comp, len, UNORM_NFD, 0, t[noCases]->NFD, NORM_BUFFER_TEST_LEN, &status); 1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(nfcSize != nfdSize || (uprv_memcmp(t[noCases]->NFC, t[noCases]->NFD, nfcSize * sizeof(UChar)) != 0) 1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || (len != nfdSize || (uprv_memcmp(comp, t[noCases]->NFD, nfdSize * sizeof(UChar)) != 0))) { 169985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho t[noCases]->u = ch; 1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(len != nfdSize || (uprv_memcmp(comp, t[noCases]->NFD, nfdSize * sizeof(UChar)) != 0)) { 170185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho u_strncpy(t[noCases]->NFC, comp, len); 170285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho t[noCases]->NFC[len] = 0; 1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru noCases++; 1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t[noCases] = (tester *)malloc(sizeof(tester)); 1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memset(t[noCases], 0, sizeof(tester)); 1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 170985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("Testing %d/%d of possible test cases\n", noCases, charsToTestSize); 171085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uset_close(charsToTest); 171185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho charsToTest = NULL; 1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(u=0; u<(UChar32)noCases; u++) { 171485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(!ucol_equal(coll, t[u]->NFC, -1, t[u]->NFD, -1)) { 171585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Failure: codePoint %05X fails TestComposeDecompose in the UCA\n", t[u]->u); 171685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho doTest(coll, t[u]->NFC, t[u]->NFD, UCOL_EQUAL); 171785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 172085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(u = 0; u < charsToTestSize; u++) { 1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!(u&0xFFFF)) { 1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%08X ", u); 1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memset(t[noCases], 0, sizeof(tester)); 1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t[noCases]->u = u; 1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru len = 0; 1727103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius U16_APPEND_UNSAFE(comp, len, u); 1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru comp[len] = 0; 1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfcSize = unorm_normalize(comp, len, UNORM_NFC, 0, t[noCases]->NFC, NORM_BUFFER_TEST_LEN, &status); 1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfdSize = unorm_normalize(comp, len, UNORM_NFD, 0, t[noCases]->NFD, NORM_BUFFER_TEST_LEN, &status); 1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(coll, comp, t[noCases]->NFD, UCOL_EQUAL); 1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(coll, comp, t[noCases]->NFC, UCOL_EQUAL); 1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing locales, number of cases = %i\n", noCases); 1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<noOfLoc; i++) { 1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru locName = uloc_getAvailable(i); 1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(hasCollationElements(locName)) { 1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char cName[256]; 1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar name[256]; 1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t nameSize = uloc_getDisplayName(locName, NULL, name, sizeof(cName), &status); 1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = 0; j<nameSize; j++) { 1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cName[j] = (char)name[j]; 1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cName[nameSize] = 0; 1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\nTesting locale %s (%s)\n", locName, cName); 1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_open(locName, &status); 1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(coll, UCOL_IDENTICAL); 1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter = ucol_openElements(coll, t[u]->NFD, u_strlen(t[u]->NFD), &status); 1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(u=0; u<(UChar32)noCases; u++) { 175885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(!ucol_equal(coll, t[u]->NFC, -1, t[u]->NFD, -1)) { 175985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Failure: codePoint %05X fails TestComposeDecompose for locale %s\n", t[u]->u, cName); 176085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho doTest(coll, t[u]->NFC, t[u]->NFD, UCOL_EQUAL); 176185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("Testing NFC\n"); 176285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_setText(iter, t[u]->NFC, u_strlen(t[u]->NFC), &status); 176385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho backAndForth(iter); 176485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("Testing NFD\n"); 176585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_setText(iter, t[u]->NFD, u_strlen(t[u]->NFD), &status); 176685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho backAndForth(iter); 176785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_closeElements(iter); 1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(u = 0; u <= (UChar32)noCases; u++) { 1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(t[u]); 1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(t); 1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestEmptyRule(void) { 1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar rulez[] = { 0 }; 1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_openRules(rulez, 0, UCOL_OFF, UCOL_TERTIARY,NULL, &status); 1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestUCARules(void) { 1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar b[256]; 1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *rules = b; 1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t ruleLen = 0; 1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *UCAfromRules = NULL; 1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_open("", &status); 1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(status == U_FILE_ACCESS_ERROR) { 1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_data_err("Is your data around?\n"); 1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(U_FAILURE(status)) { 1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error opening collator\n"); 1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ruleLen = ucol_getRulesEx(coll, UCOL_FULL_RULES, rules, 256); 1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("TestUCARules\n"); 1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(ruleLen > 256) { 1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules = (UChar *)malloc((ruleLen+1)*sizeof(UChar)); 1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ruleLen = ucol_getRulesEx(coll, UCOL_FULL_RULES, rules, ruleLen); 1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Rules length is %d\n", ruleLen); 1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCAfromRules = ucol_openRules(rules, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status); 1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(UCAfromRules); 1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Unable to create a collator from UCARules!\n"); 1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_unescape(blah, b, 256); 1817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(coll, b, 1, res, 256); 1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(rules != b) { 1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(rules); 1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Pinyin tonal order */ 1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru A < .. (\u0101) < .. (\u00e1) < .. (\u01ce) < .. (\u00e0) 1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (w/macron)< (w/acute)< (w/caron)< (w/grave) 1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru E < .. (\u0113) < .. (\u00e9) < .. (\u011b) < .. (\u00e8) 1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru I < .. (\u012b) < .. (\u00ed) < .. (\u01d0) < .. (\u00ec) 1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru O < .. (\u014d) < .. (\u00f3) < .. (\u01d2) < .. (\u00f2) 1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U < .. (\u016b) < .. (\u00fa) < .. (\u01d4) < .. (\u00f9) 1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru < .. (\u01d6) < .. (\u01d8) < .. (\u01da) < .. (\u01dc) < 1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru.. (\u00fc) 1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruHowever, in testing we got the following order: 1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru A < .. (\u00e1) < .. (\u00e0) < .. (\u01ce) < .. (\u0101) 1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (w/acute)< (w/grave)< (w/caron)< (w/macron) 1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru E < .. (\u00e9) < .. (\u00e8) < .. (\u00ea) < .. (\u011b) < 1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru.. (\u0113) 1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru I < .. (\u00ed) < .. (\u00ec) < .. (\u01d0) < .. (\u012b) 1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru O < .. (\u00f3) < .. (\u00f2) < .. (\u01d2) < .. (\u014d) 1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U < .. (\u00fa) < .. (\u00f9) < .. (\u01d4) < .. (\u00fc) < 1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru.. (\u01d8) 1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru < .. (\u01dc) < .. (\u01da) < .. (\u01d6) < .. (\u016b) 1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBefore(void) { 1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *data[] = { 1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0101", "\\u00e1", "\\u01ce", "\\u00e0", "A", 1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0113", "\\u00e9", "\\u011b", "\\u00e8", "E", 1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u012b", "\\u00ed", "\\u01d0", "\\u00ec", "I", 1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u014d", "\\u00f3", "\\u01d2", "\\u00f2", "O", 1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u016b", "\\u00fa", "\\u01d4", "\\u00f9", "U", 1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u01d6", "\\u01d8", "\\u01da", "\\u01dc", "\\u00fc" 1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter( 1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[before 1]a<\\u0101<\\u00e1<\\u01ce<\\u00e0" 1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[before 1]e<\\u0113<\\u00e9<\\u011b<\\u00e8" 1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[before 1]i<\\u012b<\\u00ed<\\u01d0<\\u00ec" 1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[before 1]o<\\u014d<\\u00f3<\\u01d2<\\u00f2" 1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[before 1]u<\\u016b<\\u00fa<\\u01d4<\\u00f9" 1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&u<\\u01d6<\\u01d8<\\u01da<\\u01dc<\\u00fc", 1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru data, sizeof(data)/sizeof(data[0])); 1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0 1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* superceded by TestBeforePinyin */ 1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestJ784(void) { 1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *data[] = { 1872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "A", "\\u0101", "\\u00e1", "\\u01ce", "\\u00e0", 1873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "E", "\\u0113", "\\u00e9", "\\u011b", "\\u00e8", 1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "I", "\\u012b", "\\u00ed", "\\u01d0", "\\u00ec", 1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "O", "\\u014d", "\\u00f3", "\\u01d2", "\\u00f2", 1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "U", "\\u016b", "\\u00fa", "\\u01d4", "\\u00f9", 1877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u00fc", 1878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u01d6", "\\u01d8", "\\u01da", "\\u01dc" 1879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarter("zh", data, sizeof(data)/sizeof(data[0])); 1881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0 1885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* superceded by the changes to the lv locale */ 1886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestJ831(void) { 1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *data[] = { 1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "I", 1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "i", 1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Y", 1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "y" 1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarter("lv", data, sizeof(data)/sizeof(data[0])); 1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestJ815(void) { 1898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *data[] = { 1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "aa", 1900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Aa", 1901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ab", 1902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Ab", 1903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ad", 1904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Ad", 1905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ae", 1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Ae", 1907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u00e6", 1908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u00c6", 1909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "af", 1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Af", 1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "b", 1912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "B" 1913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarter("fr", data, sizeof(data)/sizeof(data[0])); 1915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter("[backwards 2]&A<<\\u00e6/e<<<\\u00c6/E", data, sizeof(data)/sizeof(data[0])); 1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 1920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"& a < b < c < d& r < c", "& a < b < d& r < c", 1921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"& a < b < c < d& c < m", "& a < b < c < m < d", 1922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"& a < b < c < d& a < m", "& a < m < b < c < d", 1923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"& a <<< b << c < d& a < m", "& a <<< b << c < m < d", 1924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"& a < b < c < d& [before 1] c < m", "& a < b < m < c < d", 1925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"& a < b <<< c << d <<< e& [before 3] e <<< x", "& a < b <<< c << d <<< x <<< e", 1926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"& a < b <<< c << d <<< e& [before 2] e <<< x", "& a < b <<< c <<< x << d <<< e", 1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"& a < b <<< c << d <<< e& [before 1] e <<< x", "& a <<< x < b <<< c << d <<< e", 1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru"& a < b <<< c << d <<< e <<< f < g& [before 1] g < x", "& a < b <<< c << d <<< e <<< f < x < g", 1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 1930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestRedundantRules(void) { 1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const struct { 1934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *rules; 1935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *expectedRules; 1936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *testdata[8]; 1937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t testdatalen; 1938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } tests[] = { 1939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* this test conflicts with positioning of CODAN placeholder */ 1940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*{ 1941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a <<< b <<< c << d <<< e& [before 1] e <<< x", 1942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&\\u2089<<<x", 1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u2089", "x"}, 2 1944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, */ 1945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* this test conflicts with the [before x] syntax tightening */ 1946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*{ 1947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& b <<< c <<< d << e <<< f& [before 1] f <<< x", 1948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&\\u0252<<<x", 1949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u0252", "x"}, 2 1950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, */ 1951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* this test conflicts with the [before x] syntax tightening */ 1952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*{ 1953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a < b <<< c << d <<< e& [before 1] e <<< x", 1954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a <<< x < b <<< c << d <<< e", 1955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"a", "x", "b", "c", "d", "e"}, 6 1956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, */ 1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a < b < c < d& [before 1] c < m", 1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a < b < m < c < d", 1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"a", "b", "m", "c", "d"}, 5 1961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a < b <<< c << d <<< e& [before 3] e <<< x", 1964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a < b <<< c << d <<< x <<< e", 1965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"a", "b", "c", "d", "x", "e"}, 6 1966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* this test conflicts with the [before x] syntax tightening */ 1968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* { 1969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a < b <<< c << d <<< e& [before 2] e <<< x", 1970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a < b <<< c <<< x << d <<< e", 1971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"a", "b", "c", "x", "d", "e"},, 6 1972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, */ 1973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a < b <<< c << d <<< e <<< f < g& [before 1] g < x", 1975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a < b <<< c << d <<< e <<< f < x < g", 1976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"a", "b", "c", "d", "e", "f", "x", "g"}, 8 1977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a <<< b << c < d& a < m", 1980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a <<< b << c < m < d", 1981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"a", "b", "c", "m", "d"}, 5 1982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&a<b<<b\\u0301 &z<b", 1985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&a<b\\u0301 &z<b", 1986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"a", "b\\u0301", "z", "b"}, 4 1987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&z<m<<<q<<<m", 1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&z<q<<<m", 1991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"z", "q", "m"},3 1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&z<<<m<q<<<m", 1995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&z<q<<<m", 1996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"z", "q", "m"}, 3 1997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 1998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a < b < c < d& r < c", 2000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a < b < d& r < c", 2001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"a", "b", "d"}, 3 2002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 2003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a < b < c < d& r < c", 2005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a < b < d& r < c", 2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"r", "c"}, 2 2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 2008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a < b < c < d& c < m", 2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a < b < c < m < d", 2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"a", "b", "c", "m", "d"}, 5 2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a < b < c < d& a < m", 2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "& a < m < b < c < d", 2016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"a", "m", "b", "c", "d"}, 5 2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *credundant = NULL; 2022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *cresulting = NULL; 2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar rlz[2048] = { 0 }; 2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t rlen = 0; 2026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<sizeof(tests)/sizeof(tests[0]); i++) { 2028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing rule %s, expected to be %s\n", tests[i].rules, tests[i].expectedRules); 2029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rlen = u_unescape(tests[i].rules, rlz, 2048); 2030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru credundant = ucol_openRules(rlz, rlen, UCOL_DEFAULT, UCOL_DEFAULT, NULL,&status); 2032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(status == U_FILE_ACCESS_ERROR) { 2033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_data_err("Is your data around?\n"); 2034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(U_FAILURE(status)) { 2036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error opening collator\n"); 2037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rlen = u_unescape(tests[i].expectedRules, rlz, 2048); 2041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cresulting = ucol_openRules(rlz, rlen, UCOL_DEFAULT, UCOL_DEFAULT, NULL,&status); 2042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testAgainstUCA(cresulting, credundant, "expected", TRUE, &status); 2044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(credundant); 2046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(cresulting); 2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing using data\n"); 2049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter(tests[i].rules, tests[i].testdata, tests[i].testdatalen); 2051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestExpansionSyntax(void) { 2056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 2057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *rules[] = { 2059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&AE <<< a << b <<< c &d <<< f", 2060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&AE <<< a <<< b << c << d < e < f <<< g", 2061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&AE <<< B <<< C / D <<< F" 2062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *expectedRules[] = { 2065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&A <<< a / E << b / E <<< c /E &d <<< f", 2066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&A <<< a / E <<< b / E << c / E << d / E < e < f <<< g", 2067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&A <<< B / E <<< C / ED <<< F / E" 2068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *testdata[][8] = { 2071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"AE", "a", "b", "c"}, 2072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"AE", "a", "b", "c", "d", "e", "f", "g"}, 2073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"AE", "B", "C"} /* / ED <<< F / E"},*/ 2074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static uint32_t testdatalen[] = { 2077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4, 2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 8, 2079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3 2080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *credundant = NULL; 2085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *cresulting = NULL; 2086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar rlz[2048] = { 0 }; 2088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t rlen = 0; 2089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<sizeof(rules)/sizeof(rules[0]); i++) { 2091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing rule %s, expected to be %s\n", rules[i], expectedRules[i]); 2092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rlen = u_unescape(rules[i], rlz, 2048); 2093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru credundant = ucol_openRules(rlz, rlen, UCOL_DEFAULT, UCOL_DEFAULT, NULL, &status); 2095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(status == U_FILE_ACCESS_ERROR) { 2096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_data_err("Is your data around?\n"); 2097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(U_FAILURE(status)) { 2099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error opening collator\n"); 2100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rlen = u_unescape(expectedRules[i], rlz, 2048); 2103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cresulting = ucol_openRules(rlz, rlen, UCOL_DEFAULT, UCOL_DEFAULT, NULL,&status); 2104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* testAgainstUCA still doesn't handle expansions correctly, so this is not run */ 2106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* as a hard error test, but only in information mode */ 2107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testAgainstUCA(cresulting, credundant, "expected", FALSE, &status); 2108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(credundant); 2110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(cresulting); 2111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing using data\n"); 2113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter(rules[i], testdata[i], testdatalen[i]); 2115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCase(void) 2119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 2120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static UChar gRules[MAX_TOKEN_LEN] = 2121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*" & 0 < 1,\u2461<a,A"*/ 2122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x0026, 0x0030, 0x003C, 0x0031, 0x002C, 0x2460, 0x003C, 0x0061, 0x002C, 0x0041, 0x0000 }; 2123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static UChar testCase[][MAX_TOKEN_LEN] = 2125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*0*/ {0x0031 /*'1'*/, 0x0061/*'a'*/, 0x0000}, 2127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*1*/ {0x0031 /*'1'*/, 0x0041/*'A'*/, 0x0000}, 2128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*2*/ {0x2460 /*circ'1'*/, 0x0061/*'a'*/, 0x0000}, 2129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*3*/ {0x2460 /*circ'1'*/, 0x0041/*'A'*/, 0x0000} 2130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static UCollationResult caseTestResults[][9] = 2133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { UCOL_LESS, UCOL_LESS, UCOL_LESS, UCOL_EQUAL, UCOL_LESS, UCOL_LESS, UCOL_EQUAL, UCOL_EQUAL, UCOL_LESS }, 2135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { UCOL_GREATER, UCOL_LESS, UCOL_LESS, UCOL_EQUAL, UCOL_LESS, UCOL_LESS, UCOL_EQUAL, UCOL_EQUAL, UCOL_GREATER }, 2136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { UCOL_LESS, UCOL_LESS, UCOL_LESS, UCOL_EQUAL, UCOL_GREATER, UCOL_LESS, UCOL_EQUAL, UCOL_EQUAL, UCOL_LESS }, 2137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { UCOL_GREATER, UCOL_LESS, UCOL_GREATER, UCOL_EQUAL, UCOL_LESS, UCOL_LESS, UCOL_EQUAL, UCOL_EQUAL, UCOL_GREATER } 2138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static UColAttributeValue caseTestAttributes[][2] = 2141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { UCOL_LOWER_FIRST, UCOL_OFF}, 2143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { UCOL_UPPER_FIRST, UCOL_OFF}, 2144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { UCOL_LOWER_FIRST, UCOL_ON}, 2145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { UCOL_UPPER_FIRST, UCOL_ON} 2146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i,j,k; 2148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationElements *iter; 2150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *myCollation; 2151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru myCollation = ucol_open("en_US", &status); 2152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 215485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "ERROR: in creation of rule based collator: %s\n", myErrorName(status)); 2155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing different case settings\n"); 2158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(myCollation, UCOL_TERTIARY); 2159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(k = 0; k<4; k++) { 2161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(myCollation, UCOL_CASE_FIRST, caseTestAttributes[k][0], &status); 2162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(myCollation, UCOL_CASE_LEVEL, caseTestAttributes[k][1], &status); 2163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Case first = %d, Case level = %d\n", caseTestAttributes[k][0], caseTestAttributes[k][1]); 2164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < 3 ; i++) { 2165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = i+1; j<4; j++) { 2166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(myCollation, testCase[i], testCase[j], caseTestResults[k][3*i+j-1]); 2167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(myCollation); 2171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru myCollation = ucol_openRules(gRules, u_strlen(gRules), UCOL_OFF, UCOL_TERTIARY,NULL, &status); 2173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 2174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR: in creation of rule based collator: %s\n", myErrorName(status)); 2175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing different case settings with custom rules\n"); 2178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(myCollation, UCOL_TERTIARY); 2179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(k = 0; k<4; k++) { 2181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(myCollation, UCOL_CASE_FIRST, caseTestAttributes[k][0], &status); 2182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(myCollation, UCOL_CASE_LEVEL, caseTestAttributes[k][1], &status); 2183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < 3 ; i++) { 2184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = i+1; j<4; j++) { 2185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("k:%d, i:%d, j:%d\n", k, i, j); 2186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(myCollation, testCase[i], testCase[j], caseTestResults[k][3*i+j-1]); 2187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter=ucol_openElements(myCollation, testCase[i], u_strlen(testCase[i]), &status); 2188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru backAndForth(iter); 2189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_closeElements(iter); 2190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter=ucol_openElements(myCollation, testCase[j], u_strlen(testCase[j]), &status); 2191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru backAndForth(iter); 2192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_closeElements(iter); 2193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(myCollation); 2197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *lowerFirst[] = { 2199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "h", 2200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "H", 2201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ch", 2202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Ch", 2203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "CH", 2204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "cha", 2205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "chA", 2206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Cha", 2207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ChA", 2208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "CHa", 2209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "CHA", 2210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "i", 2211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "I" 2212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *upperFirst[] = { 2215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "H", 2216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "h", 2217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "CH", 2218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Ch", 2219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ch", 2220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "CHA", 2221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "CHa", 2222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ChA", 2223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Cha", 2224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "chA", 2225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "cha", 2226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "I", 2227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "i" 2228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("mixed case test\n"); 2230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("lower first, case level off\n"); 2231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter("[casefirst lower]&H<ch<<<Ch<<<CH", lowerFirst, sizeof(lowerFirst)/sizeof(lowerFirst[0])); 2232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("upper first, case level off\n"); 2233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter("[casefirst upper]&H<ch<<<Ch<<<CH", upperFirst, sizeof(upperFirst)/sizeof(upperFirst[0])); 2234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("lower first, case level on\n"); 2235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter("[casefirst lower][caselevel on]&H<ch<<<Ch<<<CH", lowerFirst, sizeof(lowerFirst)/sizeof(lowerFirst[0])); 2236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("upper first, case level on\n"); 2237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter("[casefirst upper][caselevel on]&H<ch<<<Ch<<<CH", upperFirst, sizeof(upperFirst)/sizeof(upperFirst[0])); 2238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestIncrementalNormalize(void) { 2243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*UChar baseA =0x61;*/ 2245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar baseA =0x41; 2246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* UChar baseB = 0x42;*/ 2247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar ccMix[] = {0x316, 0x321, 0x300}; 2248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*UChar ccMix[] = {0x61, 0x61, 0x61};*/ 2249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 2250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x316 is combining grave accent below, cc=220 2251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x321 is combining palatalized hook below, cc=202 2252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x300 is combining grave accent, cc=230 2253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 225585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define MAXSLEN 2000 2256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*int maxSLen = 64000;*/ 2257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int sLen; 2258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 2259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll; 2261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationResult result; 2263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 226427f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t myQ = getTestOption(QUICK_OPTION); 2265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 226627f654740f2a26ad62a5c155af9199af9e69b889claireho if(getTestOption(QUICK_OPTION) < 0) { 226727f654740f2a26ad62a5c155af9199af9e69b889claireho setTestOption(QUICK_OPTION, 1); 2268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Test 1. Run very long unnormalized strings, to force overflow of*/ 2272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* most buffers along the way.*/ 227385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar strA[MAXSLEN+1]; 227485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar strB[MAXSLEN+1]; 2275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_open("en_US", &status); 2277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(status == U_FILE_ACCESS_ERROR) { 2278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_data_err("Is your data around?\n"); 2279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(U_FAILURE(status)) { 2281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error opening collator\n"); 2282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 2285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 228685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*for (sLen = 257; sLen<MAXSLEN; sLen++) {*/ 228785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*for (sLen = 4; sLen<MAXSLEN; sLen++) {*/ 2288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*for (sLen = 1000; sLen<1001; sLen++) {*/ 2289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (sLen = 500; sLen<501; sLen++) { 2290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*for (sLen = 40000; sLen<65000; sLen+=1000) {*/ 2291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strA[0] = baseA; 2292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strB[0] = baseA; 2293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=1; i<=sLen-1; i++) { 2294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strA[i] = ccMix[i % 3]; 2295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strB[sLen-i] = ccMix[i % 3]; 2296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strA[sLen] = 0; 2298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strB[sLen] = 0; 2299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(coll, UCOL_TERTIARY); /* Do test with default strength, which runs*/ 2301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(coll, strA, strB, UCOL_EQUAL); /* optimized functions in the impl*/ 2302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(coll, UCOL_IDENTICAL); /* Do again with the slow, general impl.*/ 2303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(coll, strA, strB, UCOL_EQUAL); 2304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 230727f654740f2a26ad62a5c155af9199af9e69b889claireho setTestOption(QUICK_OPTION, myQ); 2308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Test 2: Non-normal sequence in a string that extends to the last character*/ 2311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* of the string. Checks a couple of edge cases.*/ 2312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar strA[] = {0x41, 0x41, 0x300, 0x316, 0}; 2315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar strB[] = {0x41, 0xc0, 0x316, 0}; 2316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(coll, UCOL_TERTIARY); 2317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(coll, strA, strB, UCOL_EQUAL); 2318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Test 3: Non-normal sequence is terminated by a surrogate pair.*/ 2321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* New UCA 3.1.1. 2324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * test below used a code point from Desseret, which sorts differently 2325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * than d800 dc00 2326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*UChar strA[] = {0x41, 0x41, 0x300, 0x316, 0xD801, 0xDC00, 0};*/ 2328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar strA[] = {0x41, 0x41, 0x300, 0x316, 0xD800, 0xDC01, 0}; 2329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar strB[] = {0x41, 0xc0, 0x316, 0xD800, 0xDC00, 0}; 2330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(coll, UCOL_TERTIARY); 2331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(coll, strA, strB, UCOL_GREATER); 2332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Test 4: Imbedded nulls do not terminate a string when length is specified.*/ 2335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar strA[] = {0x41, 0x00, 0x42, 0x00}; 2338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar strB[] = {0x41, 0x00, 0x00, 0x00}; 2339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char sortKeyA[50]; 2340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char sortKeyAz[50]; 2341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char sortKeyB[50]; 2342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char sortKeyBz[50]; 2343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int r; 2344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* there used to be -3 here. Hmmmm.... */ 2346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*result = ucol_strcoll(coll, strA, -3, strB, -3);*/ 2347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = ucol_strcoll(coll, strA, 3, strB, 3); 2348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (result != UCOL_GREATER) { 2349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR 1 in test 4\n"); 2350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = ucol_strcoll(coll, strA, -1, strB, -1); 2352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (result != UCOL_EQUAL) { 2353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR 2 in test 4\n"); 2354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(coll, strA, 3, (uint8_t *)sortKeyA, sizeof(sortKeyA)); 2357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(coll, strA, -1, (uint8_t *)sortKeyAz, sizeof(sortKeyAz)); 2358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(coll, strB, 3, (uint8_t *)sortKeyB, sizeof(sortKeyB)); 2359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(coll, strB, -1, (uint8_t *)sortKeyBz, sizeof(sortKeyBz)); 2360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru r = strcmp(sortKeyA, sortKeyAz); 2362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (r <= 0) { 2363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error 3 in test 4\n"); 2364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru r = strcmp(sortKeyA, sortKeyB); 2366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (r <= 0) { 2367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error 4 in test 4\n"); 2368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru r = strcmp(sortKeyAz, sortKeyBz); 2370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (r != 0) { 2371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error 5 in test 4\n"); 2372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(coll, UCOL_IDENTICAL); 2375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(coll, strA, 3, (uint8_t *)sortKeyA, sizeof(sortKeyA)); 2376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(coll, strA, -1, (uint8_t *)sortKeyAz, sizeof(sortKeyAz)); 2377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(coll, strB, 3, (uint8_t *)sortKeyB, sizeof(sortKeyB)); 2378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(coll, strB, -1, (uint8_t *)sortKeyBz, sizeof(sortKeyBz)); 2379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru r = strcmp(sortKeyA, sortKeyAz); 2381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (r <= 0) { 2382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error 6 in test 4\n"); 2383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru r = strcmp(sortKeyA, sortKeyB); 2385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (r <= 0) { 2386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error 7 in test 4\n"); 2387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru r = strcmp(sortKeyAz, sortKeyBz); 2389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (r != 0) { 2390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error 8 in test 4\n"); 2391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(coll, UCOL_TERTIARY); 2393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Test 5: Null characters in non-normal source strings.*/ 2397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar strA[] = {0x41, 0x41, 0x300, 0x316, 0x00, 0x42, 0x00}; 2400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar strB[] = {0x41, 0x41, 0x300, 0x316, 0x00, 0x00, 0x00}; 2401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char sortKeyA[50]; 2402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char sortKeyAz[50]; 2403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char sortKeyB[50]; 2404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char sortKeyBz[50]; 2405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int r; 2406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = ucol_strcoll(coll, strA, 6, strB, 6); 2408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (result != UCOL_GREATER) { 2409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR 1 in test 5\n"); 2410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = ucol_strcoll(coll, strA, -1, strB, -1); 2412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (result != UCOL_EQUAL) { 2413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR 2 in test 5\n"); 2414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(coll, strA, 6, (uint8_t *)sortKeyA, sizeof(sortKeyA)); 2417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(coll, strA, -1, (uint8_t *)sortKeyAz, sizeof(sortKeyAz)); 2418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(coll, strB, 6, (uint8_t *)sortKeyB, sizeof(sortKeyB)); 2419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(coll, strB, -1, (uint8_t *)sortKeyBz, sizeof(sortKeyBz)); 2420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru r = strcmp(sortKeyA, sortKeyAz); 2422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (r <= 0) { 2423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error 3 in test 5\n"); 2424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru r = strcmp(sortKeyA, sortKeyB); 2426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (r <= 0) { 2427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error 4 in test 5\n"); 2428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru r = strcmp(sortKeyAz, sortKeyBz); 2430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (r != 0) { 2431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error 5 in test 5\n"); 2432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(coll, UCOL_IDENTICAL); 2435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(coll, strA, 6, (uint8_t *)sortKeyA, sizeof(sortKeyA)); 2436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(coll, strA, -1, (uint8_t *)sortKeyAz, sizeof(sortKeyAz)); 2437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(coll, strB, 6, (uint8_t *)sortKeyB, sizeof(sortKeyB)); 2438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(coll, strB, -1, (uint8_t *)sortKeyBz, sizeof(sortKeyBz)); 2439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru r = strcmp(sortKeyA, sortKeyAz); 2441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (r <= 0) { 2442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error 6 in test 5\n"); 2443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru r = strcmp(sortKeyA, sortKeyB); 2445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (r <= 0) { 2446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error 7 in test 5\n"); 2447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru r = strcmp(sortKeyAz, sortKeyBz); 2449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (r != 0) { 2450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error 8 in test 5\n"); 2451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(coll, UCOL_TERTIARY); 2453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Test 6: Null character as base of a non-normal combining sequence.*/ 2457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar strA[] = {0x41, 0x0, 0x300, 0x316, 0x41, 0x302, 0x00}; 2460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar strB[] = {0x41, 0x0, 0x302, 0x316, 0x41, 0x300, 0x00}; 2461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = ucol_strcoll(coll, strA, 5, strB, 5); 2463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (result != UCOL_LESS) { 2464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error 1 in test 6\n"); 2465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = ucol_strcoll(coll, strA, -1, strB, -1); 2467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (result != UCOL_EQUAL) { 2468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error 2 in test 6\n"); 2469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 2473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0 2478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestGetCaseBit(void) { 2479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *caseBitData[] = { 2480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a", "A", "ch", "Ch", "CH", 2481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\uFF9E", "\\u0009" 2482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const uint8_t results[] = { 2485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_LOWER_CASE, UCOL_UPPER_CASE, UCOL_LOWER_CASE, UCOL_MIXED_CASE, UCOL_UPPER_CASE, 2486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCOL_UPPER_CASE, UCOL_LOWER_CASE 2487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t i, blen = 0; 2490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar b[256] = {0}; 2491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *UCA = ucol_open("", &status); 2493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t res = 0; 2494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<sizeof(results)/sizeof(results[0]); i++) { 2496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru blen = u_unescape(caseBitData[i], b, 256); 2497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru res = ucol_uprv_getCaseBits(UCA, b, blen, &status); 2498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(results[i] != res) { 2499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Expected case = %02X, got %02X for %04X\n", results[i], res, b[0]); 2500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 2504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestHangulTailoring(void) { 2506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *koreanData[] = { 2507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\uac00", "\\u4f3d", "\\u4f73", "\\u5047", "\\u50f9", "\\u52a0", "\\u53ef", "\\u5475", 2508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u54e5", "\\u5609", "\\u5ac1", "\\u5bb6", "\\u6687", "\\u67b6", "\\u67b7", "\\u67ef", 2509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u6b4c", "\\u73c2", "\\u75c2", "\\u7a3c", "\\u82db", "\\u8304", "\\u8857", "\\u8888", 2510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u8a36", "\\u8cc8", "\\u8dcf", "\\u8efb", "\\u8fe6", "\\u99d5", 2511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u4EEE", "\\u50A2", "\\u5496", "\\u54FF", "\\u5777", "\\u5B8A", "\\u659D", "\\u698E", 2512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u6A9F", "\\u73C8", "\\u7B33", "\\u801E", "\\u8238", "\\u846D", "\\u8B0C" 2513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *rules = 2516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&\\uac00 <<< \\u4f3d <<< \\u4f73 <<< \\u5047 <<< \\u50f9 <<< \\u52a0 <<< \\u53ef <<< \\u5475 " 2517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<< \\u54e5 <<< \\u5609 <<< \\u5ac1 <<< \\u5bb6 <<< \\u6687 <<< \\u67b6 <<< \\u67b7 <<< \\u67ef " 2518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<< \\u6b4c <<< \\u73c2 <<< \\u75c2 <<< \\u7a3c <<< \\u82db <<< \\u8304 <<< \\u8857 <<< \\u8888 " 2519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<< \\u8a36 <<< \\u8cc8 <<< \\u8dcf <<< \\u8efb <<< \\u8fe6 <<< \\u99d5 " 2520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<< \\u4EEE <<< \\u50A2 <<< \\u5496 <<< \\u54FF <<< \\u5777 <<< \\u5B8A <<< \\u659D <<< \\u698E " 2521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<< \\u6A9F <<< \\u73C8 <<< \\u7B33 <<< \\u801E <<< \\u8238 <<< \\u846D <<< \\u8B0C"; 2522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar rlz[2048] = { 0 }; 2526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t rlen = u_unescape(rules, rlz, 2048); 2527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_openRules(rlz, rlen, UCOL_DEFAULT, UCOL_DEFAULT,NULL, &status); 2529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(status == U_FILE_ACCESS_ERROR) { 2530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_data_err("Is your data around?\n"); 2531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(U_FAILURE(status)) { 2533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error opening collator\n"); 2534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Using start of korean rules\n"); 2538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 2540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericOrderingTest(coll, koreanData, sizeof(koreanData)/sizeof(koreanData[0])); 2541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Unable to open collator with rules %s\n", rules); 2543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Setting jamoSpecial to TRUE and testing once more\n"); 2546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ((UCATableHeader *)coll->image)->jamoSpecial = TRUE; /* don't try this at home */ 2547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericOrderingTest(coll, koreanData, sizeof(koreanData)/sizeof(koreanData[0])); 2548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 2550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Using ko__LOTUS locale\n"); 2552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarter("ko__LOTUS", koreanData, sizeof(koreanData)/sizeof(koreanData[0])); 2553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCompressOverlap(void) { 2556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar secstr[150]; 2557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar tertstr[150]; 2558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll; 2560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char result[200]; 2561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t resultlen; 2562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int count = 0; 2563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *tempptr; 2564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_open("", &status); 2566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 256885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "Collator can't be created -> %s\n", u_errorName(status)); 2569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (count < 149) { 2572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru secstr[count] = 0x0020; /* [06, 05, 05] */ 2573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tertstr[count] = 0x0020; 2574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count ++; 2575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* top down compression ----------------------------------- */ 2578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru secstr[count] = 0x0332; /* [, 87, 05] */ 2579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tertstr[count] = 0x3000; /* [06, 05, 07] */ 2580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* no compression secstr should have 150 secondary bytes, tertstr should 2582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru have 150 tertiary bytes. 2583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru with correct overlapping compression, secstr should have 4 secondary 2584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bytes, tertstr should have > 2 tertiary bytes */ 2585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resultlen = ucol_getSortKey(coll, secstr, 150, (uint8_t *)result, 250); 2586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempptr = uprv_strchr(result, 1) + 1; 2587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (*(tempptr + 1) != 1) { 2588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* the last secondary collation element is not checked since it is not 2589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru part of the compression */ 2590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*tempptr < UCOL_COMMON_TOP2 - UCOL_TOP_COUNT2) { 2591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Secondary compression overlapped\n"); 2592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempptr ++; 2594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* tertiary top/bottom/common for en_US is similar to the secondary 2597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru top/bottom/common */ 2598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resultlen = ucol_getSortKey(coll, tertstr, 150, (uint8_t *)result, 250); 2599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempptr = uprv_strrchr(result, 1) + 1; 2600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (*(tempptr + 1) != 0) { 2601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* the last secondary collation element is not checked since it is not 2602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru part of the compression */ 2603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*tempptr < coll->tertiaryTop - coll->tertiaryTopCount) { 2604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Tertiary compression overlapped\n"); 2605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempptr ++; 2607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* bottom up compression ------------------------------------- */ 2610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru secstr[count] = 0; 2611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tertstr[count] = 0; 2612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resultlen = ucol_getSortKey(coll, secstr, 150, (uint8_t *)result, 250); 2613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempptr = uprv_strchr(result, 1) + 1; 2614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (*(tempptr + 1) != 1) { 2615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* the last secondary collation element is not checked since it is not 2616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru part of the compression */ 2617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*tempptr > UCOL_COMMON_BOT2 + UCOL_BOT_COUNT2) { 2618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Secondary compression overlapped\n"); 2619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempptr ++; 2621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* tertiary top/bottom/common for en_US is similar to the secondary 2624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru top/bottom/common */ 2625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resultlen = ucol_getSortKey(coll, tertstr, 150, (uint8_t *)result, 250); 2626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempptr = uprv_strrchr(result, 1) + 1; 2627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (*(tempptr + 1) != 0) { 2628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* the last secondary collation element is not checked since it is not 2629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru part of the compression */ 2630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*tempptr > coll->tertiaryBottom + coll->tertiaryBottomCount) { 2631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Tertiary compression overlapped\n"); 2632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempptr ++; 2634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 2637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCyrillicTailoring(void) { 2640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *test[] = { 2641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0410b", 2642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0410\\u0306a", 2643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u04d0A" 2644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Russian overrides contractions, so this test is not valid anymore */ 2647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*genericLocaleStarter("ru", test, 3);*/ 2648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarter("root", test, 3); 2650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter("&\\u0410 = \\u0410", test, 3); 2651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter("&Z < \\u0410", test, 3); 2652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter("&\\u0410 = \\u0410 < \\u04d0", test, 3); 2653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter("&Z < \\u0410 < \\u04d0", test, 3); 2654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter("&\\u0410 = \\u0410 < \\u0410\\u0301", test, 3); 2655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter("&Z < \\u0410 < \\u0410\\u0301", test, 3); 2656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSuppressContractions(void) { 2659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *testNoCont2[] = { 2661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0410\\u0302a", 2662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0410\\u0306b", 2663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0410c" 2664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *testNoCont[] = { 2666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a\\u0410", 2667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "A\\u0410\\u0306", 2668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\uFF21\\u0410\\u0302" 2669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter("[suppressContractions [\\u0400-\\u047f]]", testNoCont, 3); 2672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter("[suppressContractions [\\u0400-\\u047f]]", testNoCont2, 3); 2673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestContraction(void) { 2676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *testrules[] = { 2677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&A = AB / B", 2678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&A = A\\u0306/\\u0306", 2679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&c = ch / h" 2680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static UChar testdata[][2] = { 2682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0041 /* 'A' */, 0x0042 /* 'B' */}, 2683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0041 /* 'A' */, 0x0306 /* combining breve */}, 2684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0063 /* 'c' */, 0x0068 /* 'h' */} 2685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static UChar testdata2[][2] = { 2687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0063 /* 'c' */, 0x0067 /* 'g' */}, 2688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0063 /* 'c' */, 0x0068 /* 'h' */}, 2689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0063 /* 'c' */, 0x006C /* 'l' */} 2690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *testrules3[] = { 2692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&z < xyz &xyzw << B", 2693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&z < xyz &xyz << B / w", 2694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&z < ch &achm << B", 2695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&z < ch &a << B / chm", 2696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&\\ud800\\udc00w << B", 2697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&\\ud800\\udc00 << B / w", 2698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&a\\ud800\\udc00m << B", 2699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&a << B / \\ud800\\udc00m", 2700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll; 2704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar rule[256] = {0}; 2705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t rlen = 0; 2706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 2707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < sizeof(testrules) / sizeof(testrules[0]); i ++) { 2709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationElements *iter1; 2710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int j = 0; 2711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Rule %s for testing\n", testrules[i]); 2712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rlen = u_unescape(testrules[i], rule, 32); 2713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_openRules(rule, rlen, UCOL_ON, UCOL_TERTIARY,NULL, &status); 2714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 271585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "Collator creation failed %s -> %s\n", testrules[i], u_errorName(status)); 2716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter1 = ucol_openElements(coll, testdata[i], 2, &status); 2719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 2720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Collation iterator creation failed\n"); 2721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (j < 2) { 2724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationElements *iter2 = ucol_openElements(coll, 2725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &(testdata[i][j]), 2726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1, &status); 2727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t ce; 2728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 2729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Collation iterator creation failed\n"); 2730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ce = ucol_next(iter2, &status); 2733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (ce != UCOL_NULLORDER) { 2734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((uint32_t)ucol_next(iter1, &status) != ce) { 2735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Collation elements in contraction split does not match\n"); 2736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ce = ucol_next(iter2, &status); 2739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru j ++; 2741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_closeElements(iter2); 2742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_next(iter1, &status) != UCOL_NULLORDER) { 2744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Collation elements not exhausted\n"); 2745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_closeElements(iter1); 2748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 2749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rlen = u_unescape("& a < b < c < ch < d & c = ch / h", rule, 256); 2752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_openRules(rule, rlen, UCOL_ON, UCOL_TERTIARY,NULL, &status); 2753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_strcoll(coll, testdata2[0], 2, testdata2[1], 2) != UCOL_LESS) { 2754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Expected \\u%04x\\u%04x < \\u%04x\\u%04x\n", 2755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testdata2[0][0], testdata2[0][1], testdata2[1][0], 2756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testdata2[1][1]); 2757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_strcoll(coll, testdata2[1], 2, testdata2[2], 2) != UCOL_LESS) { 2760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Expected \\u%04x\\u%04x < \\u%04x\\u%04x\n", 2761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testdata2[1][0], testdata2[1][1], testdata2[2][0], 2762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testdata2[2][1]); 2763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 2766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < sizeof(testrules3) / sizeof(testrules3[0]); i += 2) { 2768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll1, 2769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *coll2; 2770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationElements *iter1, 2771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *iter2; 2772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar ch = 0x0042 /* 'B' */; 2773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t ce; 2774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rlen = u_unescape(testrules3[i], rule, 32); 2775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll1 = ucol_openRules(rule, rlen, UCOL_ON, UCOL_TERTIARY,NULL, &status); 2776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rlen = u_unescape(testrules3[i + 1], rule, 32); 2777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll2 = ucol_openRules(rule, rlen, UCOL_ON, UCOL_TERTIARY,NULL, &status); 2778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 2779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Collator creation failed %s\n", testrules[i]); 2780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter1 = ucol_openElements(coll1, &ch, 1, &status); 2783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter2 = ucol_openElements(coll2, &ch, 1, &status); 2784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 2785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Collation iterator creation failed\n"); 2786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ce = ucol_next(iter1, &status); 2789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 2790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Retrieving ces failed\n"); 2791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (ce != UCOL_NULLORDER) { 2794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ce != (uint32_t)ucol_next(iter2, &status)) { 2795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("CEs does not match\n"); 2796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ce = ucol_next(iter1, &status); 2799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 2800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Retrieving ces failed\n"); 2801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_next(iter2, &status) != UCOL_NULLORDER) { 2805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("CEs not exhausted\n"); 2806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_closeElements(iter1); 2809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_closeElements(iter2); 2810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll1); 2811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll2); 2812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestExpansion(void) { 2816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *testrules[] = { 2817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&J << K / B & K << M", 2818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&J << K / B << M" 2819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static UChar testdata[][3] = { 2821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x004A /*'J'*/, 0x0041 /*'A'*/, 0}, 2822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x004D /*'M'*/, 0x0041 /*'A'*/, 0}, 2823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x004B /*'K'*/, 0x0041 /*'A'*/, 0}, 2824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x004B /*'K'*/, 0x0043 /*'C'*/, 0}, 2825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x004A /*'J'*/, 0x0043 /*'C'*/, 0}, 2826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x004D /*'M'*/, 0x0043 /*'C'*/, 0} 2827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll; 2831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar rule[256] = {0}; 2832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t rlen = 0; 2833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 2834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < sizeof(testrules) / sizeof(testrules[0]); i ++) { 2836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int j = 0; 2837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Rule %s for testing\n", testrules[i]); 2838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rlen = u_unescape(testrules[i], rule, 32); 2839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_openRules(rule, rlen, UCOL_ON, UCOL_TERTIARY,NULL, &status); 2840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 284185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "Collator creation failed %s -> %s\n", testrules[i], u_errorName(status)); 2842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (j = 0; j < 5; j ++) { 2846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(coll, testdata[j], testdata[j + 1], UCOL_LESS); 2847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 2849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0 2853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* this test tests the current limitations of the engine */ 2854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* it always fail, so it is disabled by default */ 2855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestLimitations(void) { 2856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* recursive expansions */ 2857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *rule = "&a=b/c&d=c/e"; 2859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *tlimit01[] = {"add","b","adf"}; 2860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *tlimit02[] = {"aa","b","af"}; 2861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("recursive expansions\n"); 2862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter(rule, tlimit01, sizeof(tlimit01)/sizeof(tlimit01[0])); 2863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter(rule, tlimit02, sizeof(tlimit02)/sizeof(tlimit02[0])); 2864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* contractions spanning expansions */ 2866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *rule = "&a<<<c/e&g<<<eh"; 2868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *tlimit01[] = {"ad","c","af","f","ch","h"}; 2869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *tlimit02[] = {"ad","c","ch","af","f","h"}; 2870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("contractions spanning expansions\n"); 2871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter(rule, tlimit01, sizeof(tlimit01)/sizeof(tlimit01[0])); 2872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter(rule, tlimit02, sizeof(tlimit02)/sizeof(tlimit02[0])); 2873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* normalization: nulls in contractions */ 2875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *rule = "&a<<<\\u0000\\u0302"; 2877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *tlimit01[] = {"a","\\u0000\\u0302\\u0327"}; 2878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *tlimit02[] = {"\\u0000\\u0302\\u0327","a"}; 2879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UColAttribute att[] = { UCOL_DECOMPOSITION_MODE }; 2880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UColAttributeValue valOn[] = { UCOL_ON }; 2881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UColAttributeValue valOff[] = { UCOL_OFF }; 2882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("NULL in contractions\n"); 2884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarterWithOptions(rule, tlimit01, 2, att, valOn, 1); 2885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarterWithOptions(rule, tlimit02, 2, att, valOn, 1); 2886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarterWithOptions(rule, tlimit01, 2, att, valOff, 1); 2887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarterWithOptions(rule, tlimit02, 2, att, valOff, 1); 2888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* normalization: contractions spanning normalization */ 2891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *rule = "&a<<<\\u0000\\u0302"; 2893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *tlimit01[] = {"a","\\u0000\\u0302\\u0327"}; 2894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *tlimit02[] = {"\\u0000\\u0302\\u0327","a"}; 2895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UColAttribute att[] = { UCOL_DECOMPOSITION_MODE }; 2896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UColAttributeValue valOn[] = { UCOL_ON }; 2897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UColAttributeValue valOff[] = { UCOL_OFF }; 2898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("contractions spanning normalization\n"); 2900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarterWithOptions(rule, tlimit01, 2, att, valOn, 1); 2901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarterWithOptions(rule, tlimit02, 2, att, valOn, 1); 2902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarterWithOptions(rule, tlimit01, 2, att, valOff, 1); 2903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarterWithOptions(rule, tlimit02, 2, att, valOff, 1); 2904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* variable top: */ 2907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*static const char *rule2 = "&\\u2010<x=[variable top]<z";*/ 2909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *rule = "&\\u2010<x<[variable top]=z"; 2910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*static const char *rule3 = "&' '<x<[variable top]=z";*/ 2911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *tlimit01[] = {" ", "z", "zb", "a", " b", "xb", "b", "c" }; 2912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *tlimit02[] = {"-", "-x", "x","xb", "-z", "z", "zb", "-a", "a", "-b", "b", "c"}; 2913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *tlimit03[] = {" ", "xb", "z", "zb", "a", " b", "b", "c" }; 2914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UColAttribute att[] = { UCOL_ALTERNATE_HANDLING, UCOL_STRENGTH }; 2915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UColAttributeValue valOn[] = { UCOL_SHIFTED, UCOL_QUATERNARY }; 2916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UColAttributeValue valOff[] = { UCOL_NON_IGNORABLE, UCOL_TERTIARY }; 2917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("variable top\n"); 2919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarterWithOptions(rule, tlimit03, sizeof(tlimit03)/sizeof(tlimit03[0]), att, valOn, sizeof(att)/sizeof(att[0])); 2920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarterWithOptions(rule, tlimit01, sizeof(tlimit01)/sizeof(tlimit01[0]), att, valOn, sizeof(att)/sizeof(att[0])); 2921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarterWithOptions(rule, tlimit02, sizeof(tlimit02)/sizeof(tlimit02[0]), att, valOn, sizeof(att)/sizeof(att[0])); 2922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarterWithOptions(rule, tlimit01, sizeof(tlimit01)/sizeof(tlimit01[0]), att, valOff, sizeof(att)/sizeof(att[0])); 2923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarterWithOptions(rule, tlimit02, sizeof(tlimit02)/sizeof(tlimit02[0]), att, valOff, sizeof(att)/sizeof(att[0])); 2924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* case level */ 2927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *rule = "&c<ch<<<cH<<<Ch<<<CH"; 2929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *tlimit01[] = {"c","CH","Ch","cH","ch"}; 2930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *tlimit02[] = {"c","CH","cH","Ch","ch"}; 2931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UColAttribute att[] = { UCOL_CASE_FIRST}; 2932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UColAttributeValue valOn[] = { UCOL_UPPER_FIRST}; 2933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*static const UColAttributeValue valOff[] = { UCOL_OFF};*/ 2934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("case level\n"); 2935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarterWithOptions(rule, tlimit01, sizeof(tlimit01)/sizeof(tlimit01[0]), att, valOn, sizeof(att)/sizeof(att[0])); 2936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarterWithOptions(rule, tlimit02, sizeof(tlimit02)/sizeof(tlimit02[0]), att, valOn, sizeof(att)/sizeof(att[0])); 2937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*genericRulesStarterWithOptions(rule, tlimit01, sizeof(tlimit01)/sizeof(tlimit01[0]), att, valOff, sizeof(att)/sizeof(att[0]));*/ 2938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*genericRulesStarterWithOptions(rule, tlimit02, sizeof(tlimit02)/sizeof(tlimit02[0]), att, valOff, sizeof(att)/sizeof(att[0]));*/ 2939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 2943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBocsuCoverage(void) { 2945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *testString = "\\u0041\\u0441\\u4441\\U00044441\\u4441\\u0441\\u0041"; 2947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar test[256] = {0}; 2948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t tlen = u_unescape(testString, test, 32); 2949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t key[256] = {0}; 2950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t klen = 0; 2951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_open("", &status); 2953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 2954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_IDENTICAL, &status); 2955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru klen = ucol_getSortKey(coll, test, tlen, key, 256); 2957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 2959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_data_err("Couldn't open UCA\n"); 2961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestVariableTopSetting(void) { 2965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *current = NULL; 2967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t varTopOriginal = 0, varTop1, varTop2; 2968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_open("", &status); 2969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 2970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t strength = 0; 2972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint16_t specs = 0; 2973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t chOffset = 0; 2974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t chLen = 0; 2975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t exOffset = 0; 2976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t exLen = 0; 2977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t oldChOffset = 0; 2978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t oldChLen = 0; 2979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t oldExOffset = 0; 2980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t oldExLen = 0; 2981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t prefixOffset = 0; 2982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t prefixLen = 0; 2983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool startOfRules = TRUE; 2985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColTokenParser src; 2986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColOptionSet opts; 2987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *rulesCopy = NULL; 2989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t rulesLen; 2990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationResult result; 2992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar first[256] = { 0 }; 2994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar second[256] = { 0 }; 2995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 299627f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t myQ = getTestOption(QUICK_OPTION); 299727f654740f2a26ad62a5c155af9199af9e69b889claireho 299827f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_memset(&src, 0, sizeof(UColTokenParser)); 2999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src.opts = &opts; 3001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 300227f654740f2a26ad62a5c155af9199af9e69b889claireho if(getTestOption(QUICK_OPTION) <= 0) { 300327f654740f2a26ad62a5c155af9199af9e69b889claireho setTestOption(QUICK_OPTION, 1); 3004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* this test will fail when normalization is turned on */ 3007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* therefore we always turn off exhaustive mode for it */ 3008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { /* QUICK > 0*/ 3009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Slide variable top over UCARules\n"); 3010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rulesLen = ucol_getRulesEx(coll, UCOL_FULL_RULES, rulesCopy, 0); 301127f654740f2a26ad62a5c155af9199af9e69b889claireho rulesCopy = (UChar *)uprv_malloc((rulesLen+UCOL_TOK_EXTRA_RULE_SPACE_SIZE)*sizeof(UChar)); 3012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rulesLen = ucol_getRulesEx(coll, UCOL_FULL_RULES, rulesCopy, rulesLen+UCOL_TOK_EXTRA_RULE_SPACE_SIZE); 3013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status) && rulesLen > 0) { 3015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status); 3016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src.current = src.source = rulesCopy; 3017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src.end = rulesCopy+rulesLen; 3018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src.extraCurrent = src.end; 3019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src.extraEnd = src.end+UCOL_TOK_EXTRA_RULE_SPACE_SIZE; 3020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 302127f654740f2a26ad62a5c155af9199af9e69b889claireho /* Note that as a result of tickets 7015 or 6912, ucol_tok_parseNextToken can cause the pointer to 302227f654740f2a26ad62a5c155af9199af9e69b889claireho the rules copy in src.source to get reallocated, freeing the original pointer in rulesCopy */ 3023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while ((current = ucol_tok_parseNextToken(&src, startOfRules, &parseError,&status)) != NULL) { 3024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strength = src.parsedToken.strength; 3025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru chOffset = src.parsedToken.charsOffset; 3026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru chLen = src.parsedToken.charsLen; 3027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exOffset = src.parsedToken.extensionOffset; 3028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exLen = src.parsedToken.extensionLen; 3029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prefixOffset = src.parsedToken.prefixOffset; 3030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prefixLen = src.parsedToken.prefixLen; 3031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru specs = src.parsedToken.flags; 3032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru startOfRules = FALSE; 3034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 303527f654740f2a26ad62a5c155af9199af9e69b889claireho log_verbose("%04X %d ", *(src.source+chOffset), chLen); 3036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strength == UCOL_PRIMARY) { 3038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 3039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru varTopOriginal = ucol_getVariableTop(coll, &status); 304027f654740f2a26ad62a5c155af9199af9e69b889claireho varTop1 = ucol_setVariableTop(coll, src.source+oldChOffset, oldChLen, &status); 3041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 3042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char buffer[256]; 3043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *buf = buffer; 3044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t i = 0, j; 3045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t CE = UCOL_NO_MORE_CES; 3046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* before we start screaming, let's see if there is a problem with the rules */ 304850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode collIterateStatus = U_ZERO_ERROR; 304950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho collIterate *s = uprv_new_collIterate(&collIterateStatus); 305027f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_init_collIterate(coll, src.source+oldChOffset, oldChLen, s, &collIterateStatus); 3051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 305250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho CE = ucol_getNextCE(coll, s, &status); 3053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < oldChLen; i++) { 305527f654740f2a26ad62a5c155af9199af9e69b889claireho j = sprintf(buf, "%04X ", *(src.source+oldChOffset+i)); 3056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buf += j; 3057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(status == U_PRIMARY_TOO_LONG_ERROR) { 3059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("= Expected failure for %s =", buffer); 3060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 306150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(uprv_collIterateAtEnd(s)) { 3062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Unexpected failure setting variable top at offset %d. Error %s. Codepoints: %s\n", 3063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru oldChOffset, u_errorName(status), buffer); 3064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 3065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("There is a goofy contraction in UCA rules that does not appear in the fractional UCA. Codepoints: %s\n", 3066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer); 3067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 306950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_delete_collIterate(s); 3070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru varTop2 = ucol_getVariableTop(coll, &status); 3072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if((varTop1 & 0xFFFF0000) != (varTop2 & 0xFFFF0000)) { 3073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("cannot retrieve set varTop value!\n"); 3074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 3075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if((varTop1 & 0xFFFF0000) > 0 && oldExLen == 0) { 3078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 307927f654740f2a26ad62a5c155af9199af9e69b889claireho u_strncpy(first, src.source+oldChOffset, oldChLen); 308027f654740f2a26ad62a5c155af9199af9e69b889claireho u_strncpy(first+oldChLen, src.source+chOffset, chLen); 308127f654740f2a26ad62a5c155af9199af9e69b889claireho u_strncpy(first+oldChLen+chLen, src.source+oldChOffset, oldChLen); 3082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first[2*oldChLen+chLen] = 0; 3083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(oldExLen == 0) { 308527f654740f2a26ad62a5c155af9199af9e69b889claireho u_strncpy(second, src.source+chOffset, chLen); 3086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru second[chLen] = 0; 3087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { /* This is skipped momentarily, but should work once UCARules are fully UCA conformant */ 308827f654740f2a26ad62a5c155af9199af9e69b889claireho u_strncpy(second, src.source+oldExOffset, oldExLen); 308927f654740f2a26ad62a5c155af9199af9e69b889claireho u_strncpy(second+oldChLen, src.source+chOffset, chLen); 309027f654740f2a26ad62a5c155af9199af9e69b889claireho u_strncpy(second+oldChLen+chLen, src.source+oldExOffset, oldExLen); 3091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru second[2*oldExLen+chLen] = 0; 3092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = ucol_strcoll(coll, first, -1, second, -1); 3094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result == UCOL_EQUAL) { 3095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(coll, first, second, UCOL_EQUAL); 3096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 309727f654740f2a26ad62a5c155af9199af9e69b889claireho log_verbose("Suspicious strcoll result for %04X and %04X\n", *(src.source+oldChOffset), *(src.source+chOffset)); 3098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strength != UCOL_TOK_RESET) { 3102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru oldChOffset = chOffset; 3103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru oldChLen = chLen; 3104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru oldExOffset = exOffset; 3105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru oldExLen = exLen; 3106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 3109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 3111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Unexpected failure getting rules %s\n", u_errorName(status)); 3112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 3113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 3115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error parsing rules %s\n", u_errorName(status)); 3116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 3117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 3119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 312127f654740f2a26ad62a5c155af9199af9e69b889claireho setTestOption(QUICK_OPTION, myQ); 3122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing setting variable top to contractions\n"); 3124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 3125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *conts = (UChar *)((uint8_t *)coll->image + coll->image->contractionUCACombos); 3126103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t maxUCAContractionLength = coll->image->contractionUCACombosWidth; 3127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(*conts != 0) { 3128103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* 3129103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * A continuation is NUL-terminated and NUL-padded 3130103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * except if it has the maximum length. 3131103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */ 3132103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t contractionLength = maxUCAContractionLength; 3133103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius while(contractionLength > 0 && conts[contractionLength - 1] == 0) { 3134103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius --contractionLength; 3135103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 3136103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(*(conts+1)==0) { /* pre-context */ 3137103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius varTop1 = ucol_setVariableTop(coll, conts, 1, &status); 3138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 3139103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius varTop1 = ucol_setVariableTop(coll, conts, contractionLength, &status); 3140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 314227f654740f2a26ad62a5c155af9199af9e69b889claireho if(status == U_PRIMARY_TOO_LONG_ERROR) { 314327f654740f2a26ad62a5c155af9199af9e69b889claireho /* ucol_setVariableTop() is documented to not accept 3-byte primaries, 314427f654740f2a26ad62a5c155af9199af9e69b889claireho * therefore it is not an error when it complains about them. */ 314527f654740f2a26ad62a5c155af9199af9e69b889claireho log_verbose("Couldn't set variable top to a contraction %04X %04X %04X - U_PRIMARY_TOO_LONG_ERROR\n", 314627f654740f2a26ad62a5c155af9199af9e69b889claireho *conts, *(conts+1), *(conts+2)); 314727f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 314827f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("Couldn't set variable top to a contraction %04X %04X %04X - %s\n", 314927f654740f2a26ad62a5c155af9199af9e69b889claireho *conts, *(conts+1), *(conts+2), u_errorName(status)); 315027f654740f2a26ad62a5c155af9199af9e69b889claireho } 3151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 3152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3153103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius conts+=maxUCAContractionLength; 3154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 3157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first[0] = 0x0040; 3159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first[1] = 0x0050; 3160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first[2] = 0x0000; 3161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setVariableTop(coll, first, -1, &status); 3163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 3165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Invalid contraction succeded in setting variable top!\n"); 3166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Test restoring variable top\n"); 3171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 3173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_restoreVariableTop(coll, varTopOriginal, &status); 3174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(varTopOriginal != ucol_getVariableTop(coll, &status)) { 3175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Couldn't restore old variable top\n"); 3176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing calling with error set\n"); 3179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_INTERNAL_PROGRAM_ERROR; 3181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru varTop1 = ucol_setVariableTop(coll, first, 1, &status); 3182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru varTop2 = ucol_getVariableTop(coll, &status); 3183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_restoreVariableTop(coll, varTop2, &status); 3184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru varTop1 = ucol_setVariableTop(NULL, first, 1, &status); 3185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru varTop2 = ucol_getVariableTop(NULL, &status); 3186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_restoreVariableTop(NULL, varTop2, &status); 3187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(status != U_INTERNAL_PROGRAM_ERROR) { 3188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Bad reaction to passed error!\n"); 3189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 319027f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_free(src.source); 3191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 3192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 3193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_data_err("Couldn't open UCA collator\n"); 3194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNonChars(void) { 3199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *test[] = { 320027f654740f2a26ad62a5c155af9199af9e69b889claireho "\\u0000", /* ignorable */ 320127f654740f2a26ad62a5c155af9199af9e69b889claireho "\\uFFFE", /* special merge-sort character with minimum non-ignorable weights */ 320227f654740f2a26ad62a5c155af9199af9e69b889claireho "\\uFDD0", "\\uFDEF", 320327f654740f2a26ad62a5c155af9199af9e69b889claireho "\\U0001FFFE", "\\U0001FFFF", /* UCA 6.0: noncharacters are treated like unassigned, */ 320427f654740f2a26ad62a5c155af9199af9e69b889claireho "\\U0002FFFE", "\\U0002FFFF", /* not like ignorable. */ 3205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\U0003FFFE", "\\U0003FFFF", 3206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\U0004FFFE", "\\U0004FFFF", 3207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\U0005FFFE", "\\U0005FFFF", 3208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\U0006FFFE", "\\U0006FFFF", 3209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\U0007FFFE", "\\U0007FFFF", 3210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\U0008FFFE", "\\U0008FFFF", 3211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\U0009FFFE", "\\U0009FFFF", 3212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\U000AFFFE", "\\U000AFFFF", 3213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\U000BFFFE", "\\U000BFFFF", 3214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\U000CFFFE", "\\U000CFFFF", 3215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\U000DFFFE", "\\U000DFFFF", 3216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\U000EFFFE", "\\U000EFFFF", 3217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\U000FFFFE", "\\U000FFFFF", 321827f654740f2a26ad62a5c155af9199af9e69b889claireho "\\U0010FFFE", "\\U0010FFFF", 321927f654740f2a26ad62a5c155af9199af9e69b889claireho "\\uFFFF" /* special character with maximum primary weight */ 3220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 3222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_open("en_US", &status); 3223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Test non characters\n"); 3225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 322727f654740f2a26ad62a5c155af9199af9e69b889claireho genericOrderingTestWithResult(coll, test, 35, UCOL_LESS); 3228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 322985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "Unable to open collator\n"); 3230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 3233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestExtremeCompression(void) { 3236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static char *test[4]; 3237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t j = 0, i = 0; 3238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<4; i++) { 3240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test[i] = (char *)malloc(2048*sizeof(char)); 3241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = 20; j < 500; j++) { 3244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<4; i++) { 3245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memset(test[i], 'a', (j-1)*sizeof(char)); 3246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test[i][j-1] = (char)('a'+i); 3247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test[i][j] = 0; 3248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarter("en_US", (const char **)test, 4); 3250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<4; i++) { 3254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(test[i]); 3255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0 3259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestExtremeCompression(void) { 3260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static char *test[4]; 3261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t j = 0, i = 0; 3262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 3263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_open("en_US", status); 3264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<4; i++) { 3265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test[i] = (char *)malloc(2048*sizeof(char)); 3266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = 10; j < 2048; j++) { 3268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<4; i++) { 3269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memset(test[i], 'a', (j-2)*sizeof(char)); 3270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test[i][j-1] = (char)('a'+i); 3271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test[i][j] = 0; 3272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarter("en_US", (const char **)test, 4); 3275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = 10; j < 2048; j++) { 3277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<1; i++) { 3278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memset(test[i], 'a', (j-1)*sizeof(char)); 3279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test[i][j] = 0; 3280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<4; i++) { 3283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(test[i]); 3284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 3287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSurrogates(void) { 3289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *test[] = { 3290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "z","\\ud900\\udc25", "\\ud805\\udc50", 3291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\ud800\\udc00y", "\\ud800\\udc00r", 3292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\ud800\\udc00f", "\\ud800\\udc00", 3293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\ud800\\udc00c", "\\ud800\\udc00b", 3294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\ud800\\udc00fa", "\\ud800\\udc00fb", 3295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\ud800\\udc00a", 3296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "c", "b" 3297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *rule = 3300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&z < \\ud900\\udc25 < \\ud805\\udc50" 3301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "< \\ud800\\udc00y < \\ud800\\udc00r" 3302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "< \\ud800\\udc00f << \\ud800\\udc00" 3303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "< \\ud800\\udc00fa << \\ud800\\udc00fb" 3304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "< \\ud800\\udc00a < c < b" ; 3305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter(rule, test, 14); 3307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* This is a test for prefix implementation, used by JIS X 4061 collation rules */ 3310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestPrefix(void) { 3311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t i; 3312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const struct { 3314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *rules; 3315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *data[50]; 3316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const uint32_t len; 3317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } tests[] = { 3318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&z <<< z|a", 3319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"zz", "za"}, 2 }, 3320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&z <<< z| a", 3322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"zz", "za"}, 2 }, 3323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "[strength I]" 3324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&a=\\ud900\\udc25" 3325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&z<<<\\ud900\\udc25|a", 3326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"aa", "az", "\\ud900\\udc25z", "\\ud900\\udc25a", "zz"}, 4 }, 3327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<(sizeof(tests)/sizeof(tests[0])); i++) { 3331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter(tests[i].rules, tests[i].data, tests[i].len); 3332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* This test uses data suplied by Masashiko Maedera to test the implementation */ 3336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* JIS X 4061 collation order implementation */ 3337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNewJapanese(void) { 3338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char * const test1[] = { 3340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30b7\\u30e3\\u30fc\\u30ec", 3341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30b7\\u30e3\\u30a4", 3342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30b7\\u30e4\\u30a3", 3343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30b7\\u30e3\\u30ec", 3344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3061\\u3087\\u3053", 3345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3061\\u3088\\u3053", 3346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30c1\\u30e7\\u30b3\\u30ec\\u30fc\\u30c8", 3347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3066\\u30fc\\u305f", 3348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30c6\\u30fc\\u30bf", 3349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30c6\\u30a7\\u30bf", 3350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3066\\u3048\\u305f", 3351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3067\\u30fc\\u305f", 3352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30c7\\u30fc\\u30bf", 3353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30c7\\u30a7\\u30bf", 3354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3067\\u3048\\u305f", 3355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3066\\u30fc\\u305f\\u30fc", 3356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30c6\\u30fc\\u30bf\\u30a1", 3357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30c6\\u30a7\\u30bf\\u30fc", 3358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3066\\u3047\\u305f\\u3041", 3359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3066\\u3048\\u305f\\u30fc", 3360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3067\\u30fc\\u305f\\u30fc", 3361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30c7\\u30fc\\u30bf\\u30a1", 3362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3067\\u30a7\\u305f\\u30a1", 3363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30c7\\u3047\\u30bf\\u3041", 3364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30c7\\u30a8\\u30bf\\u30a2", 3365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3072\\u3086", 3366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3073\\u3085\\u3042", 3367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3074\\u3085\\u3042", 3368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3073\\u3085\\u3042\\u30fc", 3369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d3\\u30e5\\u30a2\\u30fc", 3370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3074\\u3085\\u3042\\u30fc", 3371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d4\\u30e5\\u30a2\\u30fc", 3372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d2\\u30e5\\u30a6", 3373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d2\\u30e6\\u30a6", 3374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d4\\u30e5\\u30a6\\u30a2", 3375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3073\\u3085\\u30fc\\u3042\\u30fc", 3376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d3\\u30e5\\u30fc\\u30a2\\u30fc", 3377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d3\\u30e5\\u30a6\\u30a2\\u30fc", 3378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3072\\u3085\\u3093", 3379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3074\\u3085\\u3093", 3380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3075\\u30fc\\u308a", 3381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d5\\u30fc\\u30ea", 3382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3075\\u3045\\u308a", 3383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3075\\u30a5\\u308a", 3384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3075\\u30a5\\u30ea", 3385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d5\\u30a6\\u30ea", 3386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3076\\u30fc\\u308a", 3387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d6\\u30fc\\u30ea", 3388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3076\\u3045\\u308a", 3389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d6\\u30a5\\u308a", 3390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3077\\u3046\\u308a", 3391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d7\\u30a6\\u30ea", 3392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3075\\u30fc\\u308a\\u30fc", 3393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d5\\u30a5\\u30ea\\u30fc", 3394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3075\\u30a5\\u308a\\u30a3", 3395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d5\\u3045\\u308a\\u3043", 3396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d5\\u30a6\\u30ea\\u30fc", 3397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3075\\u3046\\u308a\\u3043", 3398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d6\\u30a6\\u30ea\\u30a4", 3399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3077\\u30fc\\u308a\\u30fc", 3400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3077\\u30a5\\u308a\\u30a4", 3401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3077\\u3046\\u308a\\u30fc", 3402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d7\\u30a6\\u30ea\\u30a4", 3403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d5\\u30fd", 3404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3075\\u309e", 3405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3076\\u309d", 3406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3076\\u3075", 3407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3076\\u30d5", 3408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d6\\u3075", 3409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d6\\u30d5", 3410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3076\\u309e", 3411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3076\\u3077", 3412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d6\\u3077", 3413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3077\\u309d", 3414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d7\\u30fd", 3415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3077\\u3075", 3416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 3417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *test2[] = { 3419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u306f\\u309d", /* H\\u309d */ 3420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30cf\\u30fd", /* K\\u30fd */ 3421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u306f\\u306f", /* HH */ 3422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u306f\\u30cf", /* HK */ 3423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30cf\\u30cf", /* KK */ 3424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u306f\\u309e", /* H\\u309e */ 3425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30cf\\u30fe", /* K\\u30fe */ 3426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u306f\\u3070", /* HH\\u309b */ 3427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30cf\\u30d0", /* KK\\u309b */ 3428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u306f\\u3071", /* HH\\u309c */ 3429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30cf\\u3071", /* KH\\u309c */ 3430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30cf\\u30d1", /* KK\\u309c */ 3431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3070\\u309d", /* H\\u309b\\u309d */ 3432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d0\\u30fd", /* K\\u309b\\u30fd */ 3433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3070\\u306f", /* H\\u309bH */ 3434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d0\\u30cf", /* K\\u309bK */ 3435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3070\\u309e", /* H\\u309b\\u309e */ 3436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d0\\u30fe", /* K\\u309b\\u30fe */ 3437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3070\\u3070", /* H\\u309bH\\u309b */ 3438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d0\\u3070", /* K\\u309bH\\u309b */ 3439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d0\\u30d0", /* K\\u309bK\\u309b */ 3440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3070\\u3071", /* H\\u309bH\\u309c */ 3441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d0\\u30d1", /* K\\u309bK\\u309c */ 3442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3071\\u309d", /* H\\u309c\\u309d */ 3443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d1\\u30fd", /* K\\u309c\\u30fd */ 3444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3071\\u306f", /* H\\u309cH */ 3445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d1\\u30cf", /* K\\u309cK */ 3446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3071\\u3070", /* H\\u309cH\\u309b */ 3447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3071\\u30d0", /* H\\u309cK\\u309b */ 3448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d1\\u30d0", /* K\\u309cK\\u309b */ 3449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3071\\u3071", /* H\\u309cH\\u309c */ 3450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30d1\\u30d1", /* K\\u309cK\\u309c */ 3451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 3453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *test3[] = { 3454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u221er\\u221e", 3455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u221eR#", 3456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u221et\\u221e", 3457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "#r\\u221e", 3458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "#R#", 3459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "#t%", 3460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "#T%", 3461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "8t\\u221e", 3462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "8T\\u221e", 3463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "8t#", 3464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "8T#", 3465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "8t%", 3466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "8T%", 3467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "8t8", 3468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "8T8", 3469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u03c9r\\u221e", 3470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u03a9R%", 3471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rr\\u221e", 3472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rR\\u221e", 3473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Rr\\u221e", 3474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "RR\\u221e", 3475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "RT%", 3476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rt8", 3477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "tr\\u221e", 3478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "tr8", 3479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "TR8", 3480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "tt8", 3481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30b7\\u30e3\\u30fc\\u30ec", 3482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UColAttribute att[] = { UCOL_STRENGTH }; 3485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UColAttributeValue val[] = { UCOL_QUATERNARY }; 3486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UColAttribute attShifted[] = { UCOL_STRENGTH, UCOL_ALTERNATE_HANDLING}; 3488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UColAttributeValue valShifted[] = { UCOL_QUATERNARY, UCOL_SHIFTED }; 3489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarterWithOptions("ja", test1, sizeof(test1)/sizeof(test1[0]), att, val, 1); 3491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarterWithOptions("ja", test2, sizeof(test2)/sizeof(test2[0]), att, val, 1); 3492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*genericLocaleStarter("ja", test3, sizeof(test3)/sizeof(test3[0]));*/ 3493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarterWithOptions("ja", test1, sizeof(test1)/sizeof(test1[0]), attShifted, valShifted, 2); 3494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarterWithOptions("ja", test2, sizeof(test2)/sizeof(test2[0]), attShifted, valShifted, 2); 3495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestStrCollIdenticalPrefix(void) { 3498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* rule = "&\\ud9b0\\udc70=\\ud9b0\\udc71"; 3499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* test[] = { 3500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ab\\ud9b0\\udc70", 3501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ab\\ud9b0\\udc71" 3502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarterWithResult(rule, test, sizeof(test)/sizeof(test[0]), UCOL_EQUAL); 3504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Contractions should have all their canonically equivalent */ 3506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* strings included */ 3507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestContractionClosure(void) { 3508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const struct { 3509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *rules; 3510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *data[10]; 3511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const uint32_t len; 3512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } tests[] = { 3513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&b=\\u00e4\\u00e4", 3514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "b", "\\u00e4\\u00e4", "a\\u0308a\\u0308", "\\u00e4a\\u0308", "a\\u0308\\u00e4" }, 5}, 3515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&b=\\u00C5", 3516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "b", "\\u00C5", "A\\u030A", "\\u212B" }, 4}, 3517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t i; 3519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<(sizeof(tests)/sizeof(tests[0])); i++) { 3522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarterWithResult(tests[i].rules, tests[i].data, tests[i].len, UCOL_EQUAL); 3523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* This tests also fails*/ 3527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBeforePrefixFailure(void) { 3528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const struct { 3529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *rules; 3530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *data[10]; 3531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const uint32_t len; 3532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } tests[] = { 3533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&g <<< a" 3534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[before 3]\\uff41 <<< x", 3535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"x", "\\uff41"}, 2 }, 3536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&\\u30A7=\\u30A7=\\u3047=\\uff6a" 3537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&\\u30A8=\\u30A8=\\u3048=\\uff74" 3538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[before 3]\\u30a7<<<\\u30a9", 3539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u30a9", "\\u30a7"}, 2 }, 3540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 3]\\u30a7<<<\\u30a9" 3541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&\\u30A7=\\u30A7=\\u3047=\\uff6a" 3542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&\\u30A8=\\u30A8=\\u3048=\\uff74", 3543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u30a9", "\\u30a7"}, 2 }, 3544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t i; 3546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<(sizeof(tests)/sizeof(tests[0])); i++) { 3549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter(tests[i].rules, tests[i].data, tests[i].len); 3550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0 3553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* rule1 = 3554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&\\u30A7=\\u30A7=\\u3047=\\uff6a" 3555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&\\u30A8=\\u30A8=\\u3048=\\uff74" 3556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[before 3]\\u30a7<<<\\u30c6|\\u30fc"; 3557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* rule2 = 3558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[before 3]\\u30a7<<<\\u30c6|\\u30fc" 3559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&\\u30A7=\\u30A7=\\u3047=\\uff6a" 3560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&\\u30A8=\\u30A8=\\u3048=\\uff74"; 3561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* test[] = { 3562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30c6\\u30fc\\u30bf", 3563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30c6\\u30a7\\u30bf", 3564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter(rule1, test, sizeof(test)/sizeof(test[0])); 3566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter(rule2, test, sizeof(test)/sizeof(test[0])); 3567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* this piece of code should be in some sort of verbose mode */ 3568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* it gets the collation elements for elements and prints them */ 3569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* This is useful when trying to see whether the problem is */ 3570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 3571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 3572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t i = 0; 3573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationElements *it = NULL; 3574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t CE; 3575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar string[256]; 3576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t uStringLen; 3577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = NULL; 3578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uStringLen = u_unescape(rule1, string, 256); 3580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_openRules(string, uStringLen, UCOL_DEFAULT, UCOL_DEFAULT, NULL, &status); 3582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*coll = ucol_open("ja_JP_JIS", &status);*/ 3584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru it = ucol_openElements(coll, string, 0, &status); 3585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < sizeof(test)/sizeof(test[0]); i++) { 3587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%s\n", test[i]); 3588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uStringLen = u_unescape(test[i], string, 256); 3589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setText(it, string, uStringLen, &status); 3590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while((CE=ucol_next(it, &status)) != UCOL_NULLORDER) { 3592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%08X\n", CE); 3593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n"); 3595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_closeElements(it); 3599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 3600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 3602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestPrefixCompose(void) { 3605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* rule1 = 3606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&\\u30a7<<<\\u30ab|\\u30fc=\\u30ac|\\u30fc"; 3607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 3608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* test[] = { 3609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30c6\\u30fc\\u30bf", 3610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30c6\\u30a7\\u30bf", 3611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 3614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 3615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*uint32_t i = 0;*/ 3616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*UCollationElements *it = NULL;*/ 3617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* uint32_t CE;*/ 3618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar string[256]; 3619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t uStringLen; 3620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = NULL; 3621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uStringLen = u_unescape(rule1, string, 256); 3623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_openRules(string, uStringLen, UCOL_DEFAULT, UCOL_DEFAULT, NULL, &status); 3625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 3626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 3632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru[last variable] last variable value 3633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru[last primary ignorable] largest CE for primary ignorable 3634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru[last secondary ignorable] largest CE for secondary ignorable 3635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru[last tertiary ignorable] largest CE for tertiary ignorable 3636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru[top] guaranteed to be above all implicit CEs, for now and in the future (in 1.8) 3637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 3638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestRuleOptions(void) { 3640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* values here are hardcoded and are correct for the current UCA 3641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * when the UCA changes, one might be forced to change these 364227f654740f2a26ad62a5c155af9199af9e69b889claireho * values. 364327f654740f2a26ad62a5c155af9199af9e69b889claireho */ 364427f654740f2a26ad62a5c155af9199af9e69b889claireho 364527f654740f2a26ad62a5c155af9199af9e69b889claireho /* 364627f654740f2a26ad62a5c155af9199af9e69b889claireho * These strings contain the last character before [variable top] 364727f654740f2a26ad62a5c155af9199af9e69b889claireho * and the first and second characters (by primary weights) after it. 364827f654740f2a26ad62a5c155af9199af9e69b889claireho * See FractionalUCA.txt. For example: 364927f654740f2a26ad62a5c155af9199af9e69b889claireho [last variable [0C FE, 05, 05]] # U+10A7F OLD SOUTH ARABIAN NUMERIC INDICATOR 365027f654740f2a26ad62a5c155af9199af9e69b889claireho [variable top = 0C FE] 365127f654740f2a26ad62a5c155af9199af9e69b889claireho [first regular [0D 0A, 05, 05]] # U+0060 GRAVE ACCENT 365227f654740f2a26ad62a5c155af9199af9e69b889claireho and 365327f654740f2a26ad62a5c155af9199af9e69b889claireho 00B4; [0D 0C, 05, 05] 365427f654740f2a26ad62a5c155af9199af9e69b889claireho * 365527f654740f2a26ad62a5c155af9199af9e69b889claireho * Note: Starting with UCA 6.0, the [variable top] collation element 365627f654740f2a26ad62a5c155af9199af9e69b889claireho * is not the weight of any character or string, 365727f654740f2a26ad62a5c155af9199af9e69b889claireho * which means that LAST_VARIABLE_CHAR_STRING sorts before [last variable]. 365827f654740f2a26ad62a5c155af9199af9e69b889claireho */ 365927f654740f2a26ad62a5c155af9199af9e69b889claireho#define LAST_VARIABLE_CHAR_STRING "\\U00010A7F" 366027f654740f2a26ad62a5c155af9199af9e69b889claireho#define FIRST_REGULAR_CHAR_STRING "\\u0060" 366127f654740f2a26ad62a5c155af9199af9e69b889claireho#define SECOND_REGULAR_CHAR_STRING "\\u00B4" 366227f654740f2a26ad62a5c155af9199af9e69b889claireho 366327f654740f2a26ad62a5c155af9199af9e69b889claireho /* 366427f654740f2a26ad62a5c155af9199af9e69b889claireho * This string has to match the character that has the [last regular] weight 366527f654740f2a26ad62a5c155af9199af9e69b889claireho * which changes with each UCA version. 366627f654740f2a26ad62a5c155af9199af9e69b889claireho * See the bottom of FractionalUCA.txt which says something like 366727f654740f2a26ad62a5c155af9199af9e69b889claireho [last regular [7A FE, 05, 05]] # U+1342E EGYPTIAN HIEROGLYPH AA032 366827f654740f2a26ad62a5c155af9199af9e69b889claireho * 366927f654740f2a26ad62a5c155af9199af9e69b889claireho * Note: Starting with UCA 6.0, the [last regular] collation element 367027f654740f2a26ad62a5c155af9199af9e69b889claireho * is not the weight of any character or string, 367127f654740f2a26ad62a5c155af9199af9e69b889claireho * which means that LAST_REGULAR_CHAR_STRING sorts before [last regular]. 3672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 367327f654740f2a26ad62a5c155af9199af9e69b889claireho#define LAST_REGULAR_CHAR_STRING "\\U0001342E" 367427f654740f2a26ad62a5c155af9199af9e69b889claireho 3675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const struct { 3676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *rules; 3677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *data[10]; 3678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const uint32_t len; 3679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } tests[] = { 3680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* - all befores here amount to zero */ 3681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 3][first tertiary ignorable]<<<a", 3682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u0000", "a"}, 2 3683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, /* you cannot go before first tertiary ignorable */ 3684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 3][last tertiary ignorable]<<<a", 3686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u0000", "a"}, 2 3687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, /* you cannot go before last tertiary ignorable */ 3688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 3][first secondary ignorable]<<<a", 3690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u0000", "a"}, 2 3691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, /* you cannot go before first secondary ignorable */ 3692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 3][last secondary ignorable]<<<a", 3694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u0000", "a"}, 2 3695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, /* you cannot go before first secondary ignorable */ 3696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 'normal' befores */ 3698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 3][first primary ignorable]<<<c<<<b &[first primary ignorable]<a", 3700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "c", "b", "\\u0332", "a" }, 4 3701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* we don't have a code point that corresponds to 3704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the last primary ignorable 3705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 3][last primary ignorable]<<<c<<<b &[last primary ignorable]<a", 3707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u0332", "\\u20e3", "c", "b", "a" }, 5 3708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 3][first variable]<<<c<<<b &[first variable]<a", 3711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "c", "b", "\\u0009", "a", "\\u000a" }, 5 3712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[last variable]<a &[before 3][last variable]<<<c<<<b ", 371527f654740f2a26ad62a5c155af9199af9e69b889claireho { LAST_VARIABLE_CHAR_STRING, "c", "b", /* [last variable] */ "a", FIRST_REGULAR_CHAR_STRING }, 5 3716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[first regular]<a" 3719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[before 1][first regular]<b", 372027f654740f2a26ad62a5c155af9199af9e69b889claireho { "b", FIRST_REGULAR_CHAR_STRING, "a", SECOND_REGULAR_CHAR_STRING }, 4 3721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 1][last regular]<b" 3724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[last regular]<a", 372527f654740f2a26ad62a5c155af9199af9e69b889claireho { LAST_REGULAR_CHAR_STRING, "b", /* [last regular] */ "a", "\\u4e00" }, 4 3726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 1][first implicit]<b" 3729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[first implicit]<a", 3730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "b", "\\u4e00", "a", "\\u4e01"}, 4 3731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 1][last implicit]<b" 3734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[last implicit]<a", 3735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "b", "\\U0010FFFD", "a" }, 3 3736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 3737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[last variable]<z" 3739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[last primary ignorable]<x" 3740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[last secondary ignorable]<<y" 3741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[last tertiary ignorable]<<<w" 3742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[top]<u", 374327f654740f2a26ad62a5c155af9199af9e69b889claireho {"\\ufffb", "w", "y", "\\u20e3", "x", LAST_VARIABLE_CHAR_STRING, "z", "u"}, 7 3744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t i; 3748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<(sizeof(tests)/sizeof(tests[0])); i++) { 3750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter(tests[i].rules, tests[i].data, tests[i].len); 3751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestOptimize(void) { 3756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* this is not really a test - just trying out 3757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * whether copying of UCA contents will fail 3758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Cannot really test, since the functionality 3759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * remains the same. 3760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const struct { 3762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *rules; 3763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *data[10]; 3764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const uint32_t len; 3765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } tests[] = { 3766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* - all befores here amount to zero */ 3767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "[optimize [\\uAC00-\\uD7FF]]", 3768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "a", "b"}, 2} 3769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t i; 3771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<(sizeof(tests)/sizeof(tests[0])); i++) { 3773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter(tests[i].rules, tests[i].data, tests[i].len); 3774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 3778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... we got inconsistent results when using the UTF-16BE iterator and the UTF-8 iterator. 3779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv ucol_strcollIter? 3780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... e.g. s1 = 0xfffc0062, and s2 = d8000021 3781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv these are the input strings? 3782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... yes, using the utf-16 iterator and UCA with normalization on, we have s1 > s2 3783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv will check - could be a problem with utf-8 iterator 3784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... but if we use the utf-8 iterator, i.e. s1 = efbfbc62 and s2 = eda08021, we have s1 < s2 3785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv hmmm 3786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... note that we have a standalone high surrogate 3787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv that doesn't sound right 3788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... we got the same inconsistent results on AIX and Win2000 3789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv so you have two strings, you convert them to utf-8 and to utf-16BE 3790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... yes 3791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv and then do the comparison 3792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... in one case, the input strings are in utf8, and in the other case the input strings are in utf-16be 3793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv utf-16 strings look like a little endian ones in the example you sent me 3794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv It could be a bug - let me try to test it out 3795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... ok 3796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... we can wait till the conf. call 3797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... next weke 3798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv that would be great 3799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv hmmm 3800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv I might be wrong 3801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv let me play with it some more 3802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... ok 3803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... also please check s3 = 0x0e3a0062 and s4 = 0x0e400021. both are in utf-16be 3804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... seems with icu 2.2 we have s3 > s4, but not in icu 2.4 that's built for db2 3805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... also s1 & s2 that I sent you earlier are also in utf-16be 3806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv ok 3807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... i ask sherman to send you more inconsistent data 3808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruweiv thanks 3809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querucycheng@ca.ibm.c... the 4 strings we sent are just samples 3810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 3811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0 3812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Alexis(void) { 3813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 3814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_open("", &status); 3815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char utf16be[2][4] = { 3818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { (char)0xd8, (char)0x00, (char)0x00, (char)0x21 }, 3819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { (char)0xff, (char)0xfc, (char)0x00, (char)0x62 } 3820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char utf8[2][4] = { 3823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { (char)0xed, (char)0xa0, (char)0x80, (char)0x21 }, 3824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { (char)0xef, (char)0xbf, (char)0xbc, (char)0x62 }, 3825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharIterator iterU161, iterU162; 3828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharIterator iterU81, iterU82; 3829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationResult resU16, resU8; 3831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setUTF16BE(&iterU161, utf16be[0], 4); 3833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setUTF16BE(&iterU162, utf16be[1], 4); 3834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setUTF8(&iterU81, utf8[0], 4); 3836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setUTF8(&iterU82, utf8[1], 4); 3837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 3839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resU16 = ucol_strcollIter(coll, &iterU161, &iterU162, &status); 3841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resU8 = ucol_strcollIter(coll, &iterU81, &iterU82, &status); 3842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(resU16 != resU8) { 3845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("different results\n"); 3846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 3849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 3851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CMSCOLL_ALEXIS2_BUFFER_SIZE 256 3853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void Alexis2(void) { 3854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 3855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar U16Source[CMSCOLL_ALEXIS2_BUFFER_SIZE], U16Target[CMSCOLL_ALEXIS2_BUFFER_SIZE]; 3856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char U16BESource[CMSCOLL_ALEXIS2_BUFFER_SIZE], U16BETarget[CMSCOLL_ALEXIS2_BUFFER_SIZE]; 3857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char U8Source[CMSCOLL_ALEXIS2_BUFFER_SIZE], U8Target[CMSCOLL_ALEXIS2_BUFFER_SIZE]; 3858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t U16LenS = 0, U16LenT = 0, U16BELenS = 0, U16BELenT = 0, U8LenS = 0, U8LenT = 0; 3859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UConverter *conv = NULL; 3861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharIterator U16BEItS, U16BEItT; 3863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharIterator U8ItS, U8ItT; 3864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationResult resU16, resU16BE, resU8; 3866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const pairs[][2] = { 3868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\ud800\\u0021", "\\uFFFC\\u0062"}, 3869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u0435\\u0308\\u0334", "\\u0415\\u0334\\u0340" }, 3870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u0E40\\u0021", "\\u00A1\\u0021"}, 3871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u0E40\\u0021", "\\uFE57\\u0062"}, 3872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u5F20", "\\u5F20\\u4E00\\u8E3F"}, 3873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u0000\\u0020", "\\u0000\\u0020\\u0000"}, 3874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "\\u0020", "\\u0020\\u0000"} 3875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 3876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru5F20 (my result here) 3877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru5F204E008E3F 3878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru5F20 (your result here) 3879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 3880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0; 3883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_open("", &status); 3885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(status == U_FILE_ACCESS_ERROR) { 3886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_data_err("Is your data around?\n"); 3887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 3888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(U_FAILURE(status)) { 3889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error opening collator\n"); 3890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 3891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 3893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru conv = ucnv_open("UTF16BE", &status); 3894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < sizeof(pairs)/sizeof(pairs[0]); i++) { 3895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U16LenS = u_unescape(pairs[i][0], U16Source, CMSCOLL_ALEXIS2_BUFFER_SIZE); 3896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U16LenT = u_unescape(pairs[i][1], U16Target, CMSCOLL_ALEXIS2_BUFFER_SIZE); 3897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resU16 = ucol_strcoll(coll, U16Source, U16LenS, U16Target, U16LenT); 3899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Result of strcoll is %i\n", resU16); 3901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U16BELenS = ucnv_fromUChars(conv, U16BESource, CMSCOLL_ALEXIS2_BUFFER_SIZE, U16Source, U16LenS, &status); 3903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U16BELenT = ucnv_fromUChars(conv, U16BETarget, CMSCOLL_ALEXIS2_BUFFER_SIZE, U16Target, U16LenT, &status); 3904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* use the original sizes, as the result from converter is in bytes */ 3906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setUTF16BE(&U16BEItS, U16BESource, U16LenS); 3907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setUTF16BE(&U16BEItT, U16BETarget, U16LenT); 3908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resU16BE = ucol_strcollIter(coll, &U16BEItS, &U16BEItT, &status); 3910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Result of U16BE is %i\n", resU16BE); 3912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(resU16 != resU16BE) { 3914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Different results between UTF16 and UTF16BE for %s & %s\n", pairs[i][0], pairs[i][1]); 3915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8(U8Source, CMSCOLL_ALEXIS2_BUFFER_SIZE, &U8LenS, U16Source, U16LenS, &status); 3918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUTF8(U8Target, CMSCOLL_ALEXIS2_BUFFER_SIZE, &U8LenT, U16Target, U16LenT, &status); 3919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setUTF8(&U8ItS, U8Source, U8LenS); 3921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setUTF8(&U8ItT, U8Target, U8LenT); 3922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resU8 = ucol_strcollIter(coll, &U8ItS, &U8ItT, &status); 3924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(resU16 != resU8) { 3926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Different results between UTF16 and UTF8 for %s & %s\n", pairs[i][0], pairs[i][1]); 3927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 3932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucnv_close(conv); 3933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestHebrewUCA(void) { 3936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 3937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *first[] = { 3938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "d790d6b8d79cd795d6bcd7a9", 3939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "d790d79cd79ed7a7d799d799d7a1", 3940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "d790d6b4d79ed795d6bcd7a9", 3941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char utf8String[3][256]; 3944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar utf16String[3][256]; 3945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0, j = 0; 3947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t sizeUTF8[3]; 3948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t sizeUTF16[3]; 3949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_open("", &status); 395185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(status)) { 395285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "Could not open UCA collation %s\n", u_errorName(status)); 395385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 395485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 3955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);*/ 3956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < sizeof(first)/sizeof(first[0]); i++) { 3958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sizeUTF8[i] = u_parseUTF8(first[i], -1, utf8String[i], 256, &status); 3959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strFromUTF8(utf16String[i], 256, &sizeUTF16[i], utf8String[i], sizeUTF8[i], &status); 3960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%i: "); 3961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = 0; j < sizeUTF16[i]; j++) { 3962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*log_verbose("\\u%04X", utf16String[i][j]);*/ 3963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%04X", utf16String[i][j]); 3964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n"); 3966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < sizeof(first)/sizeof(first[0])-1; i++) { 3968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = i + 1; j < sizeof(first)/sizeof(first[0]); j++) { 3969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(coll, utf16String[i], utf16String[j], UCOL_LESS); 3970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 3974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestPartialSortKeyTermination(void) { 3978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* cases[] = { 3979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1234\\u1234\\udc00", 3980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\udc00\\ud800\\ud800" 3981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = sizeof(UCollator); 3984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 3986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_open("", &status); 3988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharIterator iter; 3990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar currCase[256]; 3992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length = 0; 3993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t pKeyLen = 0; 3994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t key[256]; 3996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < sizeof(cases)/sizeof(cases[0]); i++) { 3998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t state[2] = {0, 0}; 3999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length = u_unescape(cases[i], currCase, 256); 4000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setString(&iter, currCase, length); 4001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pKeyLen = ucol_nextSortKeyPart(coll, &iter, state, key, 256, &status); 4002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Done\n"); 4004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 4007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSettings(void) { 4010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* cases[] = { 4011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "apple", 4012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Apple" 4013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* locales[] = { 4016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "", 4017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "en" 4018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 4021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0, j = 0; 4023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar source[256], target[256]; 4025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t sLen = 0, tLen = 0; 4026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *collateObject = NULL; 4028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < sizeof(locales)/sizeof(locales[0]); i++) { 4029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru collateObject = ucol_open(locales[i], &status); 4030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(collateObject, UCOL_PRIMARY); 4031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(collateObject, UCOL_CASE_LEVEL , UCOL_OFF, &status); 4032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = 1; j < sizeof(cases)/sizeof(cases[0]); j++) { 4033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sLen = u_unescape(cases[j-1], source, 256); 4034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source[sLen] = 0; 4035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tLen = u_unescape(cases[j], target, 256); 4036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source[tLen] = 0; 4037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(collateObject, source, target, UCOL_EQUAL); 4038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(collateObject); 4040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t TestEqualsForCollator(const char* locName, UCollator *source, UCollator *target) { 404485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 404585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t errorNo = 0; 404685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*const UChar *sourceRules = NULL;*/ 404785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*int32_t sourceRulesLen = 0;*/ 404885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UColAttributeValue french = UCOL_OFF; 404985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t cloneSize = 0; 405085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 4051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!ucol_equals(source, target)) { 405285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Same collators, different address not equal\n"); 405385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho errorNo++; 4054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(target); 405685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(uprv_strcmp(ucol_getLocaleByType(source, ULOC_REQUESTED_LOCALE, &status), ucol_getLocaleByType(source, ULOC_ACTUAL_LOCALE, &status)) == 0) { 405785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* currently, safeClone is implemented through getRules/openRules 405885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * so it is the same as the test below - I will comment that test out. 405985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 406085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* real thing */ 406185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho target = ucol_safeClone(source, NULL, &cloneSize, &status); 406285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(U_FAILURE(status)) { 406385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Error creating clone\n"); 406485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho errorNo++; 406585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return errorNo; 406685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 406785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(!ucol_equals(source, target)) { 406885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Collator different from it's clone\n"); 406985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho errorNo++; 407085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 407185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho french = ucol_getAttribute(source, UCOL_FRENCH_COLLATION, &status); 407285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(french == UCOL_ON) { 407385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_setAttribute(target, UCOL_FRENCH_COLLATION, UCOL_OFF, &status); 407485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 407585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_setAttribute(target, UCOL_FRENCH_COLLATION, UCOL_ON, &status); 407685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 407785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(U_FAILURE(status)) { 407885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Error setting attributes\n"); 407985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho errorNo++; 408085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return errorNo; 408185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 408285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(ucol_equals(source, target)) { 408385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Collators same even when options changed\n"); 408485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho errorNo++; 408585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 408685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(target); 408785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* commented out since safeClone uses exactly the same technique */ 408885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* 408985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sourceRules = ucol_getRules(source, &sourceRulesLen); 409085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho target = ucol_openRules(sourceRules, sourceRulesLen, UCOL_DEFAULT, UCOL_DEFAULT, &parseError, &status); 409185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(U_FAILURE(status)) { 409285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Error instantiating target from rules\n"); 409385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho errorNo++; 409485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return errorNo; 409585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 409685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(!ucol_equals(source, target)) { 409785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Collator different from collator that was created from the same rules\n"); 409885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho errorNo++; 409985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 410085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(target); 410185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 4102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 410385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return errorNo; 4104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestEquals(void) { 410885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* ucol_equals is not currently a public API. There is a chance that it will become 410985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * something like this, but currently it is only used by RuleBasedCollator::operator== 411085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 411185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* test whether the two collators instantiated from the same locale are equal */ 411285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 411385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UParseError parseError; 411485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t noOfLoc = uloc_countAvailable(); 411585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char *locName = NULL; 411685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCollator *source = NULL, *target = NULL; 411785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t i = 0; 4118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 411985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char* rules[] = { 412085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "&l < lj <<< Lj <<< LJ", 412185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "&n < nj <<< Nj <<< NJ", 412285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "&ae <<< \\u00e4", 412385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "&AE <<< \\u00c4" 412485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho }; 412585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* 412685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char* badRules[] = { 4127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&l <<< Lj", 412885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "&n < nj <<< nJ <<< NJ", 412985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "&a <<< \\u00e4", 413085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "&AE <<< \\u00c4 <<< x" 413185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho }; 413285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 4133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 413485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar sourceRules[1024], targetRules[1024]; 413585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t sourceRulesSize = 0, targetRulesSize = 0; 413685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t rulesSize = sizeof(rules)/sizeof(rules[0]); 4137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 413885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 0; i < rulesSize; i++) { 413985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sourceRulesSize += u_unescape(rules[i], sourceRules+sourceRulesSize, 1024 - sourceRulesSize); 414085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho targetRulesSize += u_unescape(rules[rulesSize-i-1], targetRules+targetRulesSize, 1024 - targetRulesSize); 414185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 4142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 414385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho source = ucol_openRules(sourceRules, sourceRulesSize, UCOL_DEFAULT, UCOL_DEFAULT, &parseError, &status); 414485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(status == U_FILE_ACCESS_ERROR) { 414585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_data_err("Is your data around?\n"); 414685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 414785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else if(U_FAILURE(status)) { 414885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Error opening collator\n"); 414985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 415085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 415185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho target = ucol_openRules(targetRules, targetRulesSize, UCOL_DEFAULT, UCOL_DEFAULT, &parseError, &status); 415285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(!ucol_equals(source, target)) { 415385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Equivalent collators not equal!\n"); 415485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 415585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(source); 415685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(target); 4157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 415885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho source = ucol_open("root", &status); 415985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho target = ucol_open("root", &status); 416085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("Testing root\n"); 416185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(!ucol_equals(source, source)) { 416285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Same collator not equal\n"); 416385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 416485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(TestEqualsForCollator(locName, source, target)) { 416585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Errors for root\n", locName); 416685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 416785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(source); 416885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 416985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 0; i<noOfLoc; i++) { 417085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho status = U_ZERO_ERROR; 417185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho locName = uloc_getAvailable(i); 417285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*if(hasCollationElements(locName)) {*/ 417385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("Testing equality for locale %s\n", locName); 417485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho source = ucol_open(locName, &status); 417585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho target = ucol_open(locName, &status); 417685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(status)) { 417785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Error opening collator for locale %s %s\n", locName, u_errorName(status)); 417885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho continue; 417985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 418085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(TestEqualsForCollator(locName, source, target)) { 418185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Errors for locale %s\n", locName); 418285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 418385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(source); 418485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /*}*/ 418585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 4186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestJ2726(void) { 418985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar a[2] = { 0x61, 0x00 }; /*"a"*/ 419085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar aSpace[3] = { 0x61, 0x20, 0x00 }; /*"a "*/ 419185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar spaceA[3] = { 0x20, 0x61, 0x00 }; /*" a"*/ 419285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 419385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCollator *coll = ucol_open("en", &status); 419485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status); 419585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_PRIMARY, &status); 419685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho doTest(coll, a, aSpace, UCOL_EQUAL); 419785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho doTest(coll, aSpace, a, UCOL_EQUAL); 419885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho doTest(coll, a, spaceA, UCOL_EQUAL); 419985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho doTest(coll, spaceA, a, UCOL_EQUAL); 420085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho doTest(coll, spaceA, aSpace, UCOL_EQUAL); 420185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho doTest(coll, aSpace, spaceA, UCOL_EQUAL); 420285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(coll); 4203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void NullRule(void) { 420685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar r[3] = {0}; 420785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 420885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCollator *coll = ucol_openRules(r, 1, UCOL_DEFAULT, UCOL_DEFAULT, NULL, &status); 420985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(U_SUCCESS(status)) { 421085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("This should have been an error!\n"); 421185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(coll); 421285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 421385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho status = U_ZERO_ERROR; 421485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 421585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho coll = ucol_openRules(r, 0, UCOL_DEFAULT, UCOL_DEFAULT, NULL, &status); 421685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(U_FAILURE(status)) { 421785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "Empty rules should have produced a valid collator -> %s\n", u_errorName(status)); 421885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 421985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(coll); 422085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 4221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test for CollationElementIterator previous and next for the whole set of 4225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * unicode characters with normalization on. 4226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNumericCollation(void) 4228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 4230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *basicTestStrings[]={ 4232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "hello1", 4233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "hello2", 4234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "hello2002", 4235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "hello2003", 4236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "hello123456", 4237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "hello1234567", 4238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "hello10000000", 4239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "hello100000000", 4240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "hello1000000000", 4241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "hello10000000000", 4242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *preZeroTestStrings[]={ 4245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "avery10000", 4246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "avery010000", 4247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "avery0010000", 4248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "avery00010000", 4249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "avery000010000", 4250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "avery0000010000", 4251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "avery00000010000", 4252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "avery000000010000", 4253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *thirtyTwoBitNumericStrings[]={ 4256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "avery42949672960", 4257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "avery42949672961", 4258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "avery42949672962", 4259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "avery429496729610" 4260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 426285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const static char *longNumericStrings[]={ 426385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Some of these sort out of the order that would expected if digits-as-numbers handled arbitrarily-long digit strings. 426485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho In fact, a single collation element can represent a maximum of 254 digits as a number. Digit strings longer than that 426585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho are treated as multiple collation elements. */ 426685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "num9234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123z", /*253digits, num + 9.23E252 + z */ 426785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "num10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", /*254digits, num + 1.00E253 */ 426885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "num100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", /*255digits, num + 1.00E253 + 0, out of numeric order but expected */ 426985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "num12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234", /*254digits, num + 1.23E253 */ 427085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "num123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345", /*255digits, num + 1.23E253 + 5 */ 427185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "num1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456", /*256digits, num + 1.23E253 + 56 */ 427285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "num12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567", /*257digits, num + 1.23E253 + 567 */ 427385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "num12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234a", /*254digits, num + 1.23E253 + a, out of numeric order but expected */ 427485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "num92345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234", /*254digits, num + 9.23E253, out of numeric order but expected */ 427585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho "num92345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234a", /*254digits, num + 9.23E253 + a, out of numeric order but expected */ 427685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho }; 427785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 4278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *supplementaryDigits[] = { 4279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\uD835\\uDFCE", /* 0 */ 4280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\uD835\\uDFCF", /* 1 */ 4281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\uD835\\uDFD0", /* 2 */ 4282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\uD835\\uDFD1", /* 3 */ 4283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\uD835\\uDFCF\\uD835\\uDFCE", /* 10 */ 4284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\uD835\\uDFCF\\uD835\\uDFCF", /* 11 */ 4285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\uD835\\uDFCF\\uD835\\uDFD0", /* 12 */ 4286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\uD835\\uDFD0\\uD835\\uDFCE", /* 20 */ 4287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\uD835\\uDFD0\\uD835\\uDFCF", /* 21 */ 4288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\uD835\\uDFD0\\uD835\\uDFD0" /* 22 */ 4289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *foreignDigits[] = { 4292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0661", 4293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0662", 4294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0663", 4295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0661\\u0660", 4296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0661\\u0662", 4297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0661\\u0663", 4298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0662\\u0660", 4299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0662\\u0662", 4300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0662\\u0663", 4301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0663\\u0660", 4302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0663\\u0662", 4303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0663\\u0663" 4304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *evenZeroes[] = { 4307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "2000", 4308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "2001", 4309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "2002", 4310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "2003" 4311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColAttribute att = UCOL_NUMERIC_COLLATION; 4314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColAttributeValue val = UCOL_ON; 4315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Open our collator. */ 4317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator* coll = ucol_open("root", &status); 4318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)){ 431985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "ERROR: in using ucol_open() -> %s\n", 4320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru myErrorName(status)); 4321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 4322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarterWithOptions("root", basicTestStrings, sizeof(basicTestStrings)/sizeof(basicTestStrings[0]), &att, &val, 1); 4324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarterWithOptions("root", thirtyTwoBitNumericStrings, sizeof(thirtyTwoBitNumericStrings)/sizeof(thirtyTwoBitNumericStrings[0]), &att, &val, 1); 432585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho genericLocaleStarterWithOptions("root", longNumericStrings, sizeof(longNumericStrings)/sizeof(longNumericStrings[0]), &att, &val, 1); 4326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarterWithOptions("en_US", foreignDigits, sizeof(foreignDigits)/sizeof(foreignDigits[0]), &att, &val, 1); 4327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarterWithOptions("root", supplementaryDigits, sizeof(supplementaryDigits)/sizeof(supplementaryDigits[0]), &att, &val, 1); 4328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarterWithOptions("root", evenZeroes, sizeof(evenZeroes)/sizeof(evenZeroes[0]), &att, &val, 1); 4329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Setting up our collator to do digits. */ 4331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_NUMERIC_COLLATION, UCOL_ON, &status); 4332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)){ 4333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR: in setting UCOL_NUMERIC_COLLATION as an attribute\n %s\n", 4334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru myErrorName(status)); 4335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 4336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 4339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Testing that prepended zeroes still yield the correct collation behavior. 4340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru We expect that every element in our strings array will be equal. 4341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericOrderingTestWithResult(coll, preZeroTestStrings, sizeof(preZeroTestStrings)/sizeof(preZeroTestStrings[0]), UCOL_EQUAL); 4343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 4345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestTibetanConformance(void) 4348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* test[] = { 4350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0FB2\\u0591\\u0F71\\u0061", 4351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0FB2\\u0F71\\u0061" 4352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 4355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_open("", &status); 4356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar source[100]; 4357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar target[100]; 4358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int result; 4359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 4360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 4361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_unescape(test[0], source, 100); 4362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_unescape(test[1], target, 100); 4363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(coll, source, target, UCOL_EQUAL); 4364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = ucol_strcoll(coll, source, -1, target, -1); 4365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("result %d\n", result); 4366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (UCOL_EQUAL != result) { 4367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Tibetan comparison error\n"); 4368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 4371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarterWithResult("", test, 2, UCOL_EQUAL); 4373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestPinyinProblem(void) { 4376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *test[] = { "\\u4E56\\u4E56\\u7761", "\\u4E56\\u5B69\\u5B50" }; 4377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarter("zh__PINYIN", test, sizeof(test)/sizeof(test[0])); 4378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TST_UCOL_MAX_INPUT 0x220001 4381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define topByte 0xFF000000; 4382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define bottomByte 0xFF; 4383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define fourBytes 0xFFFFFFFF; 4384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void showImplicit(UChar32 i) { 4387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i >= 0 && i <= TST_UCOL_MAX_INPUT) { 4388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%08X\t%08X\n", i, uprv_uca_getImplicitFromRaw(i)); 4389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestImplicitGeneration(void) { 4393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 4394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 last = 0; 4395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 current; 4396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 i = 0, j = 0; 4397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 roundtrip = 0; 4398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 lastBottom = 0; 4399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 currentBottom = 0; 4400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 lastTop = 0; 4401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 currentTop = 0; 4402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_open("root", &status); 4404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 440585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "Couldn't open UCA -> %s\n", u_errorName(status)); 4406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 4407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_uca_getRawFromImplicit(0xE20303E7); 4410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i <= TST_UCOL_MAX_INPUT; ++i) { 4412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru current = uprv_uca_getImplicitFromRaw(i) & fourBytes; 4413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* check that it round-trips AND that all intervening ones are illegal*/ 4415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru roundtrip = uprv_uca_getRawFromImplicit(current); 4416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (roundtrip != i) { 4417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("No roundtrip %08X\n", i); 4418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (last != 0) { 4420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (j = last + 1; j < current; ++j) { 4421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru roundtrip = uprv_uca_getRawFromImplicit(j); 4422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* raise an error if it *doesn't* find an error*/ 4423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (roundtrip != -1) { 4424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Fails to recognize illegal %08X\n", j); 4425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* now do other consistency checks*/ 4429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lastBottom = last & bottomByte; 4430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru currentBottom = current & bottomByte; 4431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lastTop = last & topByte; 4432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru currentTop = current & topByte; 4433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* print out some values for spot-checking*/ 4435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (lastTop != currentTop || i == 0x10000 || i == 0x110000) { 4436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru showImplicit(i-3); 4437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru showImplicit(i-2); 4438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru showImplicit(i-1); 4439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru showImplicit(i); 4440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru showImplicit(i+1); 4441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru showImplicit(i+2); 4442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru last = current; 4444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uprv_uca_getCodePointFromRaw(uprv_uca_getRawFromCodePoint(i)) != i) { 4446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("No raw <-> code point roundtrip for 0x%08X\n", i); 4447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru showImplicit(TST_UCOL_MAX_INPUT-2); 4450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru showImplicit(TST_UCOL_MAX_INPUT-1); 4451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru showImplicit(TST_UCOL_MAX_INPUT); 4452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 4453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Iterate through the given iterator, checking to see that all the strings 4457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * in the expected array are present. 4458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param expected array of strings we expect to see, or NULL 4459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param expectedCount number of elements of expected, or 0 4460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t checkUEnumeration(const char* msg, 4462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UEnumeration* iter, 4463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char** expected, 4464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t expectedCount) { 4465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 4466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0, n, j, bit; 4467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t seenMask = 0; 4468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_ASSERT(expectedCount >= 0 && expectedCount < 31); /* [sic] 31 not 32 */ 4470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru n = uenum_count(iter, &ec); 4471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!assertSuccess("count", &ec)) return -1; 4472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%s = [", msg); 4473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (;; ++i) { 4474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* s = uenum_next(iter, NULL, &ec); 4475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!assertSuccess("snext", &ec) || s == NULL) break; 4476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i != 0) log_verbose(","); 4477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%s", s); 4478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* check expected list */ 4479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (j=0, bit=1; j<expectedCount; ++j, bit<<=1) { 4480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((seenMask&bit) == 0 && 4481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcmp(s, expected[j]) == 0) { 4482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru seenMask |= bit; 4483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("] (%d)\n", i); 4488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertTrue("count verified", i==n); 4489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* did we see all expected strings? */ 4490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (j=0, bit=1; j<expectedCount; ++j, bit<<=1) { 4491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((seenMask&bit)!=0) { 4492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Ok: \"%s\" seen\n", expected[j]); 4493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: \"%s\" not seen\n", expected[j]); 4495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return n; 4498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test new API added for separate collation tree. 4502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSeparateTrees(void) { 4504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 4505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UEnumeration *e = NULL; 4506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t n = -1; 4507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool isAvailable; 4508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char loc[256]; 4509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* AVAIL[] = { "en", "de" }; 4511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* KW[] = { "collation" }; 4513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* KWVAL[] = { "phonebook", "stroke" }; 4515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_SERVICE 4517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru e = ucol_openAvailableLocales(&ec); 451885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (e != NULL) { 451985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho assertSuccess("ucol_openAvailableLocales", &ec); 452085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho assertTrue("ucol_openAvailableLocales!=0", e!=0); 452185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho n = checkUEnumeration("ucol_openAvailableLocales", e, AVAIL, LEN(AVAIL)); 452285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Don't need to check n because we check list */ 452385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uenum_close(e); 452485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 452585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_data_err("Error calling ucol_openAvailableLocales() -> %s (Are you missing data?)\n", u_errorName(ec)); 452685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 4527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 4528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru e = ucol_getKeywords(&ec); 453085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (e != NULL) { 453185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho assertSuccess("ucol_getKeywords", &ec); 453285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho assertTrue("ucol_getKeywords!=0", e!=0); 453385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho n = checkUEnumeration("ucol_getKeywords", e, KW, LEN(KW)); 453485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Don't need to check n because we check list */ 453585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uenum_close(e); 453685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 453785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_data_err("Error calling ucol_getKeywords() -> %s (Are you missing data?)\n", u_errorName(ec)); 453885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 4539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru e = ucol_getKeywordValues(KW[0], &ec); 454185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (e != NULL) { 454285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho assertSuccess("ucol_getKeywordValues", &ec); 454385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho assertTrue("ucol_getKeywordValues!=0", e!=0); 454485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho n = checkUEnumeration("ucol_getKeywordValues", e, KWVAL, LEN(KWVAL)); 454585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Don't need to check n because we check list */ 454685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uenum_close(e); 454785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 454885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_data_err("Error calling ucol_getKeywordValues() -> %s (Are you missing data?)\n", u_errorName(ec)); 454985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 4550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Try setting a warning before calling ucol_getKeywordValues */ 4552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ec = U_USING_FALLBACK_WARNING; 4553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru e = ucol_getKeywordValues(KW[0], &ec); 455485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (assertSuccess("ucol_getKeywordValues [with warning code set]", &ec)) { 455585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho assertTrue("ucol_getKeywordValues!=0 [with warning code set]", e!=0); 455685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho n = checkUEnumeration("ucol_getKeywordValues [with warning code set]", e, KWVAL, LEN(KWVAL)); 455785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Don't need to check n because we check list */ 455885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uenum_close(e); 455985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 4560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 4562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_DRAFT int32_t U_EXPORT2 4563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_getFunctionalEquivalent(char* result, int32_t resultCapacity, 4564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* locale, UBool* isAvailable, 4565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode* status); 4566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 456827f654740f2a26ad62a5c155af9199af9e69b889claireho n = ucol_getFunctionalEquivalent(loc, sizeof(loc), "collation", "de", 4569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &isAvailable, &ec); 457085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (assertSuccess("getFunctionalEquivalent", &ec)) { 457127f654740f2a26ad62a5c155af9199af9e69b889claireho assertEquals("getFunctionalEquivalent(de)", "de", loc); 457227f654740f2a26ad62a5c155af9199af9e69b889claireho assertTrue("getFunctionalEquivalent(de).isAvailable==TRUE", 457385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho isAvailable == TRUE); 457485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 4575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 457627f654740f2a26ad62a5c155af9199af9e69b889claireho n = ucol_getFunctionalEquivalent(loc, sizeof(loc), "collation", "de_DE", 4577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &isAvailable, &ec); 457885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (assertSuccess("getFunctionalEquivalent", &ec)) { 457927f654740f2a26ad62a5c155af9199af9e69b889claireho assertEquals("getFunctionalEquivalent(de_DE)", "de", loc); 458027f654740f2a26ad62a5c155af9199af9e69b889claireho assertTrue("getFunctionalEquivalent(de_DE).isAvailable==TRUE", 458185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho isAvailable == TRUE); 458285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 4583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* supercedes TestJ784 */ 4586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBeforePinyin(void) { 4587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char rules[] = { 4588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[before 2]A<<\\u0101<<<\\u0100<<\\u00E1<<<\\u00C1<<\\u01CE<<<\\u01CD<<\\u00E0<<<\\u00C0" 4589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[before 2]e<<\\u0113<<<\\u0112<<\\u00E9<<<\\u00C9<<\\u011B<<<\\u011A<<\\u00E8<<<\\u00C8" 4590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[before 2]i<<\\u012B<<<\\u012A<<\\u00ED<<<\\u00CD<<\\u01D0<<<\\u01CF<<\\u00EC<<<\\u00CC" 4591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[before 2]o<<\\u014D<<<\\u014C<<\\u00F3<<<\\u00D3<<\\u01D2<<<\\u01D1<<\\u00F2<<<\\u00D2" 4592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&[before 2]u<<\\u016B<<<\\u016A<<\\u00FA<<<\\u00DA<<\\u01D4<<<\\u01D3<<\\u00F9<<<\\u00D9" 4593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "&U<<\\u01D6<<<\\u01D5<<\\u01D8<<<\\u01D7<<\\u01DA<<<\\u01D9<<\\u01DC<<<\\u01DB<<\\u00FC" 4594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *test[] = { 4597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "l\\u0101", 4598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "la", 4599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "l\\u0101n", 4600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "lan ", 4601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "l\\u0113", 4602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "le", 4603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "l\\u0113n", 4604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "len" 4605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *test2[] = { 4608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "x\\u0101", 4609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "x\\u0100", 4610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "X\\u0101", 4611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "X\\u0100", 4612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "x\\u00E1", 4613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "x\\u00C1", 4614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "X\\u00E1", 4615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "X\\u00C1", 4616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "x\\u01CE", 4617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "x\\u01CD", 4618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "X\\u01CE", 4619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "X\\u01CD", 4620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "x\\u00E0", 4621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "x\\u00C0", 4622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "X\\u00E0", 4623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "X\\u00C0", 4624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xa", 4625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xA", 4626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Xa", 4627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "XA", 4628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "x\\u0101x", 4629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "x\\u0100x", 4630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "x\\u00E1x", 4631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "x\\u00C1x", 4632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "x\\u01CEx", 4633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "x\\u01CDx", 4634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "x\\u00E0x", 4635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "x\\u00C0x", 4636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xax", 4637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xAx" 4638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter(rules, test, sizeof(test)/sizeof(test[0])); 4641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarter("zh", test, sizeof(test)/sizeof(test[0])); 4642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter(rules, test2, sizeof(test2)/sizeof(test2[0])); 4643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarter("zh", test2, sizeof(test2)/sizeof(test2[0])); 4644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBeforeTightening(void) { 4647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const struct { 4648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *rules; 4649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode expectedStatus; 4650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } tests[] = { 4651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 1]a<x", U_ZERO_ERROR }, 4652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 1]a<<x", U_INVALID_FORMAT_ERROR }, 4653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 1]a<<<x", U_INVALID_FORMAT_ERROR }, 4654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 1]a=x", U_INVALID_FORMAT_ERROR }, 4655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 2]a<x",U_INVALID_FORMAT_ERROR }, 4656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 2]a<<x",U_ZERO_ERROR }, 4657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 2]a<<<x",U_INVALID_FORMAT_ERROR }, 4658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 2]a=x",U_INVALID_FORMAT_ERROR }, 4659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 3]a<x",U_INVALID_FORMAT_ERROR }, 4660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 3]a<<x",U_INVALID_FORMAT_ERROR }, 4661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 3]a<<<x",U_ZERO_ERROR }, 4662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 3]a=x",U_INVALID_FORMAT_ERROR }, 4663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before I]a = x",U_INVALID_FORMAT_ERROR } 4664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0; 4667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 4669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar rlz[RULE_BUFFER_LEN] = { 0 }; 4670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t rlen = 0; 4671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = NULL; 4673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) { 4676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rlen = u_unescape(tests[i].rules, rlz, RULE_BUFFER_LEN); 4677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_openRules(rlz, rlen, UCOL_DEFAULT, UCOL_DEFAULT,NULL, &status); 4678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(status != tests[i].expectedStatus) { 467985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "Opening a collator with rules %s returned error code %s, expected %s\n", 4680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tests[i].rules, u_errorName(status), u_errorName(tests[i].expectedStatus)); 4681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 4683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 4684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 468854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius/* 4689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&m < a 4690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 1] a < x <<< X << q <<< Q < z 4691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: m <<< M < x <<< X << q <<< Q < z < a < n 4692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&m < a 4694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 2] a << x <<< X << q <<< Q < z 4695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: m <<< M < x <<< X << q <<< Q << a < z < n 4696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&m < a 4698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 3] a <<< x <<< X << q <<< Q < z 4699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: m <<< M < x <<< X <<< a << q <<< Q < z < n 4700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&m << a 4703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 1] a < x <<< X << q <<< Q < z 4704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: x <<< X << q <<< Q < z < m <<< M << a < n 4705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&m << a 4707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 2] a << x <<< X << q <<< Q < z 4708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: m <<< M << x <<< X << q <<< Q << a < z < n 4709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&m << a 4711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 3] a <<< x <<< X << q <<< Q < z 4712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: m <<< M << x <<< X <<< a << q <<< Q < z < n 4713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&m <<< a 4716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 1] a < x <<< X << q <<< Q < z 4717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: x <<< X << q <<< Q < z < n < m <<< a <<< M 4718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&m <<< a 4720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 2] a << x <<< X << q <<< Q < z 4721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: x <<< X << q <<< Q << m <<< a <<< M < z < n 4722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&m <<< a 4724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 3] a <<< x <<< X << q <<< Q < z 4725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: m <<< x <<< X <<< a <<< M << q <<< Q < z < n 4726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 1] s < x <<< X << q <<< Q < z 4729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: r <<< R < x <<< X << q <<< Q < z < s < n 4730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 2] s << x <<< X << q <<< Q < z 4732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: r <<< R < x <<< X << q <<< Q << s < z < n 4733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 3] s <<< x <<< X << q <<< Q < z 4735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: r <<< R < x <<< X <<< s << q <<< Q < z < n 4736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 1] \u24DC < x <<< X << q <<< Q < z 4739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: x <<< X << q <<< Q < z < n < m <<< \u24DC <<< M 4740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 2] \u24DC << x <<< X << q <<< Q < z 4742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: x <<< X << q <<< Q << m <<< \u24DC <<< M < z < n 4743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru&[before 3] \u24DC <<< x <<< X << q <<< Q < z 4745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruassert: m <<< x <<< X <<< \u24DC <<< M << q <<< Q < z < n 474654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius*/ 4747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0 4750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* requires features not yet supported */ 4751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestMoreBefore(void) { 4752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const struct { 4753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* rules; 4754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* order[16]; 4755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t size; 4756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } tests[] = { 4757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&m < a &[before 1] a < x <<< X << q <<< Q < z", 4758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "m","M","x","X","q","Q","z","a","n" }, 9}, 4759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&m < a &[before 2] a << x <<< X << q <<< Q < z", 4760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "m","M","x","X","q","Q","a","z","n" }, 9}, 4761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&m < a &[before 3] a <<< x <<< X << q <<< Q < z", 4762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "m","M","x","X","a","q","Q","z","n" }, 9}, 4763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&m << a &[before 1] a < x <<< X << q <<< Q < z", 4764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "x","X","q","Q","z","m","M","a","n" }, 9}, 4765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&m << a &[before 2] a << x <<< X << q <<< Q < z", 4766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "m","M","x","X","q","Q","a","z","n" }, 9}, 4767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&m << a &[before 3] a <<< x <<< X << q <<< Q < z", 4768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "m","M","x","X","a","q","Q","z","n" }, 9}, 4769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&m <<< a &[before 1] a < x <<< X << q <<< Q < z", 4770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "x","X","q","Q","z","n","m","a","M" }, 9}, 4771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&m <<< a &[before 2] a << x <<< X << q <<< Q < z", 4772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "x","X","q","Q","m","a","M","z","n" }, 9}, 4773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&m <<< a &[before 3] a <<< x <<< X << q <<< Q < z", 4774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "m","x","X","a","M","q","Q","z","n" }, 9}, 4775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 1] s < x <<< X << q <<< Q < z", 4776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "r","R","x","X","q","Q","z","s","n" }, 9}, 4777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 2] s << x <<< X << q <<< Q < z", 4778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "r","R","x","X","q","Q","s","z","n" }, 9}, 4779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 3] s <<< x <<< X << q <<< Q < z", 4780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "r","R","x","X","s","q","Q","z","n" }, 9}, 4781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 1] \\u24DC < x <<< X << q <<< Q < z", 4782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "x","X","q","Q","z","n","m","\\u24DC","M" }, 9}, 4783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 2] \\u24DC << x <<< X << q <<< Q < z", 4784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "x","X","q","Q","m","\\u24DC","M","z","n" }, 9}, 4785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&[before 3] \\u24DC <<< x <<< X << q <<< Q < z", 4786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "m","x","X","\\u24DC","M","q","Q","z","n" }, 9} 4787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0; 4790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) { 4792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter(tests[i].rules, tests[i].order, tests[i].size); 4793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 4796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestTailorNULL( void ) { 4798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char* rule = "&a <<< '\\u0000'"; 4799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 4800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar rlz[RULE_BUFFER_LEN] = { 0 }; 4801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t rlen = 0; 4802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar a = 1, null = 0; 4803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationResult res = UCOL_EQUAL; 4804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = NULL; 4806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rlen = u_unescape(rule, rlz, RULE_BUFFER_LEN); 4809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_openRules(rlz, rlen, UCOL_DEFAULT, UCOL_DEFAULT,NULL, &status); 4810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 481285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "Could not open default collator! -> %s\n", u_errorName(status)); 4813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru res = ucol_strcoll(coll, &a, 1, &null, 1); 4815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(res != UCOL_LESS) { 4817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("NULL was not tailored properly!\n"); 4818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 4822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 4825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestUpperFirstQuaternary(void) 4826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* tests[] = { "B", "b", "Bb", "bB" }; 4828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColAttribute att[] = { UCOL_STRENGTH, UCOL_CASE_FIRST }; 4829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColAttributeValue attVals[] = { UCOL_QUATERNARY, UCOL_UPPER_FIRST }; 4830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarterWithOptions("root", tests, sizeof(tests)/sizeof(tests[0]), att, attVals, sizeof(att)/sizeof(att[0])); 4831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 4834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestJ4960(void) 4835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* tests[] = { "\\u00e2T", "aT" }; 4837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColAttribute att[] = { UCOL_STRENGTH, UCOL_CASE_LEVEL }; 4838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColAttributeValue attVals[] = { UCOL_PRIMARY, UCOL_ON }; 4839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* tests2[] = { "a", "A" }; 4840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* rule = "&[first tertiary ignorable]=A=a"; 4841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColAttribute att2[] = { UCOL_CASE_LEVEL }; 4842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColAttributeValue attVals2[] = { UCOL_ON }; 4843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Test whether we correctly ignore primary ignorables on case level when */ 4844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* we have only primary & case level */ 4845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarterWithOptionsAndResult("root", tests, sizeof(tests)/sizeof(tests[0]), att, attVals, sizeof(att)/sizeof(att[0]), UCOL_EQUAL); 4846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Test whether ICU4J will make case level for sortkeys that have primary strength */ 4847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* and case level */ 4848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarterWithOptions("root", tests2, sizeof(tests2)/sizeof(tests2[0]), att, attVals, sizeof(att)/sizeof(att[0])); 4849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Test whether completely ignorable letters have case level info (they shouldn't) */ 4850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarterWithOptionsAndResult(rule, tests2, sizeof(tests2)/sizeof(tests2[0]), att2, attVals2, sizeof(att2)/sizeof(att2[0]), UCOL_EQUAL); 4851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 4854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestJ5223(void) 4855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *test = "this is a test string"; 4857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar ustr[256]; 4858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t ustr_length = u_unescape(test, ustr, 256); 4859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru unsigned char sortkey[256]; 4860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t sortkey_length; 4861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 4862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static UCollator *coll = NULL; 4863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_open("root", &status); 4864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 486585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "Couldn't open UCA -> %s\n", u_errorName(status)); 4866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 4867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(coll, UCOL_PRIMARY); 4869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_PRIMARY, &status); 4870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 4871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 4872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Failed setting atributes\n"); 4873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 487485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 4875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortkey_length = ucol_getSortKey(coll, ustr, ustr_length, NULL, 0); 4876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (sortkey_length > 256) return; 4877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* we mark the position where the null byte should be written in advance */ 4879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortkey[sortkey_length-1] = 0xAA; 4880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* we set the buffer size one byte higher than needed */ 4882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortkey_length = ucol_getSortKey(coll, ustr, ustr_length, sortkey, 4883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortkey_length+1); 4884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* no error occurs (for me) */ 4886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (sortkey[sortkey_length-1] == 0xAA) { 4887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Hit bug at first try\n"); 4888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* we mark the position where the null byte should be written again */ 4891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortkey[sortkey_length-1] = 0xAA; 4892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* this time we set the buffer size to the exact amount needed */ 4894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortkey_length = ucol_getSortKey(coll, ustr, ustr_length, sortkey, 4895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortkey_length); 4896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* now the trailing null byte is not written */ 4898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (sortkey[sortkey_length-1] == 0xAA) { 4899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Hit bug at second try\n"); 4900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 4903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Regression test for Thai partial sort key problem */ 4906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 4907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestJ5232(void) 4908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *test[] = { 4910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0e40\\u0e01\\u0e47\\u0e1a\\u0e40\\u0e25\\u0e47\\u0e21", 4911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0e40\\u0e01\\u0e47\\u0e1a\\u0e40\\u0e25\\u0e48\\u0e21" 4912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 491385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 4914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarter("th", test, sizeof(test)/sizeof(test[0])); 4915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 4918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestJ5367(void) 4919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const static char *test[] = { "a", "y" }; 4921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* rules = "&Ny << Y &[first secondary ignorable] <<< a"; 4922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericRulesStarter(rules, test, sizeof(test)/sizeof(test[0])); 4923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 4926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestVI5913(void) 4927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 4929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, j; 4930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll =NULL; 4931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t resColl[100], expColl[100]; 4932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t rLen, tLen, ruleLen, sLen, kLen; 4933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar rule[256]={0x26, 0x62, 0x3c, 0x1FF3, 0}; /* &a<0x1FF3-omega with Ypogegrammeni*/ 4934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar rule2[256]={0x26, 0x7a, 0x3c, 0x0161, 0}; /* &z<s with caron*/ 4935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar rule3[256]={0x26, 0x7a, 0x3c, 0x0061, 0x00ea, 0}; /* &z<a+e with circumflex.*/ 493685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho static const UChar tData[][20]={ 4937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x1EAC, 0}, 4938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0041, 0x0323, 0x0302, 0}, 4939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x1EA0, 0x0302, 0}, 4940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x00C2, 0x0323, 0}, 4941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x1ED8, 0}, /* O with dot and circumflex */ 4942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x1ECC, 0x0302, 0}, 4943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x1EB7, 0}, 4944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x1EA1, 0x0306, 0}, 4945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 494685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho static const UChar tailorData[][20]={ 4947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x1FA2, 0}, /* Omega with 3 combining marks */ 4948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x03C9, 0x0313, 0x0300, 0x0345, 0}, 4949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x1FF3, 0x0313, 0x0300, 0}, 4950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x1F60, 0x0300, 0x0345, 0}, 4951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x1F62, 0x0345, 0}, 4952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x1FA0, 0x0300, 0}, 4953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 495485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho static const UChar tailorData2[][20]={ 4955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x1E63, 0x030C, 0}, /* s with dot below + caron */ 4956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0073, 0x0323, 0x030C, 0}, 4957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0073, 0x030C, 0x0323, 0}, 4958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 495985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho static const UChar tailorData3[][20]={ 4960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x007a, 0}, /* z */ 4961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0061, 0x0065, 0}, /* a + e */ 4962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0061, 0x00ea, 0}, /* a + e with circumflex */ 4963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0061, 0x1EC7, 0}, /* a+ e with dot below and circumflex */ 4964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0061, 0x1EB9, 0x0302, 0}, /* a + e with dot below + combining circumflex */ 4965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0061, 0x00EA, 0x0323, 0}, /* a + e with circumflex + combining dot below */ 4966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x00EA, 0x0323, 0}, /* e with circumflex + combining dot below */ 4967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x00EA, 0}, /* e with circumflex */ 4968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Test Vietnamese sort. */ 4971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_open("vi", &status); 497285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(U_FAILURE(status)) { 497385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "Couldn't open collator -> %s\n", u_errorName(status)); 497485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 497585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 4976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n\nVI collation:"); 4977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ( !ucol_equal(coll, tData[0], u_strlen(tData[0]), tData[2], u_strlen(tData[2])) ) { 4978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\\u1EAC not equals to \\u1EA0+\\u0302\n"); 4979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ( !ucol_equal(coll, tData[0], u_strlen(tData[0]), tData[3], u_strlen(tData[3])) ) { 4981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\\u1EAC not equals to \\u00c2+\\u0323\n"); 4982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ( !ucol_equal(coll, tData[5], u_strlen(tData[5]), tData[4], u_strlen(tData[4])) ) { 4984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\\u1ED8 not equals to \\u1ECC+\\u0302\n"); 4985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ( !ucol_equal(coll, tData[7], u_strlen(tData[7]), tData[6], u_strlen(tData[6])) ) { 4987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\\u1EB7 not equals to \\u1EA1+\\u0306\n"); 4988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (j=0; j<8; j++) { 4991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tLen = u_strlen(tData[j]); 4992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n Data :%s \tlen: %d key: ", tData[j], tLen); 4993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rLen = ucol_getSortKey(coll, tData[j], tLen, resColl, 100); 4994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<rLen; i++) { 4995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose(" %02X", resColl[i]); 4996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 5000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 500185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Test Romanian sort. */ 5002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_open("ro", &status); 5003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n\nRO collation:"); 5004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ( !ucol_equal(coll, tData[0], u_strlen(tData[0]), tData[1], u_strlen(tData[1])) ) { 5005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\\u1EAC not equals to \\u1EA0+\\u0302\n"); 5006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ( !ucol_equal(coll, tData[4], u_strlen(tData[4]), tData[5], u_strlen(tData[5])) ) { 5008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\\u1EAC not equals to \\u00c2+\\u0323\n"); 5009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ( !ucol_equal(coll, tData[6], u_strlen(tData[6]), tData[7], u_strlen(tData[7])) ) { 5011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\\u1EB7 not equals to \\u1EA1+\\u0306\n"); 5012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (j=4; j<8; j++) { 5015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tLen = u_strlen(tData[j]); 5016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n Data :%s \tlen: %d key: ", tData[j], tLen); 5017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rLen = ucol_getSortKey(coll, tData[j], tLen, resColl, 100); 5018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<rLen; i++) { 5019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose(" %02X", resColl[i]); 5020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 5023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Test the precomposed Greek character with 3 combining marks. */ 5025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n\nTailoring test: Greek character with 3 combining marks"); 5026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ruleLen = u_strlen(rule); 5027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_openRules(rule, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status); 502885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(status)) { 502985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("ucol_openRules failed with %s\n", u_errorName(status)); 503085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 503185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 5032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sLen = u_strlen(tailorData[0]); 5033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (j=1; j<6; j++) { 5034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tLen = u_strlen(tailorData[j]); 5035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ( !ucol_equal(coll, tailorData[0], sLen, tailorData[j], tLen)) { 5036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\n \\u1FA2 not equals to data[%d]:%s\n", j, tailorData[j]); 5037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Test getSortKey. */ 5040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tLen = u_strlen(tailorData[0]); 5041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru kLen=ucol_getSortKey(coll, tailorData[0], tLen, expColl, 100); 5042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (j=0; j<6; j++) { 5043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tLen = u_strlen(tailorData[j]); 5044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rLen = ucol_getSortKey(coll, tailorData[j], tLen, resColl, 100); 5045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ( kLen!=rLen || uprv_memcmp(expColl, resColl, rLen*sizeof(uint8_t))!=0 ) { 5046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\n Data[%d] :%s \tlen: %d key: ", j, tailorData[j], tLen); 5047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<rLen; i++) { 5048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err(" %02X", resColl[i]); 5049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 5053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n\nTailoring test for s with caron:"); 5055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ruleLen = u_strlen(rule2); 5056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_openRules(rule2, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status); 5057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tLen = u_strlen(tailorData2[0]); 5058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru kLen=ucol_getSortKey(coll, tailorData2[0], tLen, expColl, 100); 5059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (j=1; j<3; j++) { 5060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tLen = u_strlen(tailorData2[j]); 5061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rLen = ucol_getSortKey(coll, tailorData2[j], tLen, resColl, 100); 5062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ( kLen!=rLen || uprv_memcmp(expColl, resColl, rLen*sizeof(uint8_t))!=0 ) { 5063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\n After tailoring Data[%d] :%s \tlen: %d key: ", j, tailorData[j], tLen); 5064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<rLen; i++) { 5065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err(" %02X", resColl[i]); 5066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 5070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("\n\nTailoring test for &z< ae with circumflex:"); 507285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ruleLen = u_strlen(rule3); 507385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho coll = ucol_openRules(rule3, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status); 507485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tLen = u_strlen(tailorData3[3]); 507585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho kLen=ucol_getSortKey(coll, tailorData3[3], tLen, expColl, 100); 507685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (j=4; j<6; j++) { 507785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tLen = u_strlen(tailorData3[j]); 507885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho rLen = ucol_getSortKey(coll, tailorData3[j], tLen, resColl, 100); 507985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 508085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if ( kLen!=rLen || uprv_memcmp(expColl, resColl, rLen*sizeof(uint8_t))!=0 ) { 508185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("\n After tailoring Data[%d] :%s \tlen: %d key: ", j, tailorData[j], tLen); 508285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 0; i<rLen; i++) { 508385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err(" %02X", resColl[i]); 508485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 508585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 508685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 508785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("\n Test Data[%d] :%s \tlen: %d key: ", j, tailorData[j], tLen); 508885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 0; i<rLen; i++) { 508985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose(" %02X", resColl[i]); 5090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 509185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 509285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(coll); 509385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 5094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 509585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void 509685bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoTestTailor6179(void) 509785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 509885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 509985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t i; 510085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCollator *coll =NULL; 510185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint8_t resColl[100]; 510285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t rLen, tLen, ruleLen; 510385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* &[last primary ignorable]<< a &[first primary ignorable]<<b */ 5104103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius static const UChar rule1[]={ 5105103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 0x26,0x5B,0x6C,0x61,0x73,0x74,0x20,0x70,0x72,0x69,0x6D,0x61,0x72,0x79, 510685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 0x20,0x69,0x67,0x6E,0x6F,0x72,0x61,0x62,0x6C,0x65,0x5D,0x3C,0x3C,0x20,0x61,0x20, 510785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 0x26,0x5B,0x66,0x69,0x72,0x73,0x74,0x20,0x70,0x72,0x69,0x6D,0x61,0x72,0x79,0x20, 510885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 0x69,0x67,0x6E,0x6F,0x72,0x61,0x62,0x6C,0x65,0x5D,0x3C,0x3C,0x62,0x20, 0}; 510985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* &[last secondary ignorable]<<< a &[first secondary ignorable]<<<b */ 5110103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius static const UChar rule2[]={ 5111103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 0x26,0x5B,0x6C,0x61,0x73,0x74,0x20,0x73,0x65,0x63,0x6F,0x6E,0x64,0x61, 511285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 0x72,0x79,0x20,0x69,0x67,0x6E,0x6F,0x72,0x61,0x62,0x6C,0x65,0x5D,0x3C,0x3C,0x3C, 511385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 0x61,0x20,0x26,0x5B,0x66,0x69,0x72,0x73,0x74,0x20,0x73,0x65,0x63,0x6F,0x6E, 511485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 0x64,0x61,0x72,0x79,0x20,0x69,0x67,0x6E,0x6F,0x72,0x61,0x62,0x6C,0x65,0x5D,0x3C, 511585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 0x3C,0x3C,0x20,0x62,0}; 511685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 5117103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius static const UChar tData1[][4]={ 511885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {0x61, 0}, 511985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {0x62, 0}, 512085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 0xFDD0,0x009E, 0} 512185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho }; 5122103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius static const UChar tData2[][4]={ 5123103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius {0x61, 0}, 5124103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius {0x62, 0}, 5125103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { 0xFDD0,0x009E, 0} 512685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho }; 512785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 512850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* 512950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * These values from FractionalUCA.txt will change, 513050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * and need to be updated here. 513150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 5132103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius static const uint8_t firstPrimaryIgnCE[]={1, 0x88, 1, 5, 0}; 5133103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius static const uint8_t lastPrimaryIgnCE[]={1, 0xE3, 1, 5, 0}; 5134103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius static const uint8_t firstSecondaryIgnCE[]={1, 1, 0xbf, 0x04, 0}; 5135103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius static const uint8_t lastSecondaryIgnCE[]={1, 1, 0xbf, 0x04, 0}; 513685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 513785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Test [Last Primary ignorable] */ 513885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 5139103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_verbose("Tailoring test: &[last primary ignorable]<<a &[first primary ignorable]<<b\n"); 514085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ruleLen = u_strlen(rule1); 514185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho coll = ucol_openRules(rule1, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status); 514285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(status)) { 514385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "Tailoring test: &[last primary ignorable] failed! -> %s\n", u_errorName(status)); 514485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 514585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 514685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tLen = u_strlen(tData1[0]); 514785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho rLen = ucol_getSortKey(coll, tData1[0], tLen, resColl, 100); 5148103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (rLen != LEN(lastPrimaryIgnCE) || uprv_memcmp(resColl, lastPrimaryIgnCE, rLen) != 0) { 5149103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("Bad result for &[lpi]<<a...: Data[%d] :%s \tlen: %d key: ", 0, tData1[0], rLen); 515085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 0; i<rLen; i++) { 515185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err(" %02X", resColl[i]); 515285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 5153103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("\n"); 515485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 515585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tLen = u_strlen(tData1[1]); 515685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho rLen = ucol_getSortKey(coll, tData1[1], tLen, resColl, 100); 5157103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (rLen != LEN(firstPrimaryIgnCE) || uprv_memcmp(resColl, firstPrimaryIgnCE, rLen) != 0) { 5158103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("Bad result for &[lpi]<<a...: Data[%d] :%s \tlen: %d key: ", 1, tData1[1], rLen); 515985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 0; i<rLen; i++) { 516085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err(" %02X", resColl[i]); 516185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 5162103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("\n"); 516385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 516485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(coll); 516585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 516685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 516785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Test [Last Secondary ignorable] */ 5168103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_verbose("Tailoring test: &[last secondary ignorable]<<<a &[first secondary ignorable]<<<b\n"); 516985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ruleLen = u_strlen(rule1); 517085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho coll = ucol_openRules(rule2, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status); 517185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(status)) { 5172103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("Tailoring test: &[last secondary ignorable] failed! -> %s\n", u_errorName(status)); 517385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 517485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 517585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tLen = u_strlen(tData2[0]); 517685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho rLen = ucol_getSortKey(coll, tData2[0], tLen, resColl, 100); 5177103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (rLen != LEN(lastSecondaryIgnCE) || uprv_memcmp(resColl, lastSecondaryIgnCE, rLen) != 0) { 5178103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("Bad result for &[lsi]<<<a...: Data[%d] :%s \tlen: %d key: ", 0, tData2[0], rLen); 517985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 0; i<rLen; i++) { 518085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err(" %02X", resColl[i]); 518185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 5182103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("\n"); 518385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 51848393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliusif(isICUVersionAtLeast(52, 0, 1)) { /* TODO: debug & fix, see ticket #8982 */ 518585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tLen = u_strlen(tData2[1]); 518685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho rLen = ucol_getSortKey(coll, tData2[1], tLen, resColl, 100); 5187103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (rLen != LEN(firstSecondaryIgnCE) || uprv_memcmp(resColl, firstSecondaryIgnCE, rLen) != 0) { 5188103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("Bad result for &[lsi]<<<a...: Data[%d] :%s \tlen: %d key: ", 1, tData2[1], rLen); 518985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 0; i<rLen; i++) { 519085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err(" %02X", resColl[i]); 519185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 5192103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err("\n"); 519385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 5194103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 519585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(coll); 519685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 519785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 519885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void 519985bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoTestUCAPrecontext(void) 520085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 520185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 520285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t i, j; 520385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCollator *coll =NULL; 520485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint8_t resColl[100], prevColl[100]; 520585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t rLen, tLen, ruleLen; 520685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar rule1[256]= {0x26, 0xb7, 0x3c, 0x61, 0}; /* & middle-dot < a */ 520785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar rule2[256]= {0x26, 0x4C, 0xb7, 0x3c, 0x3c, 0x61, 0}; 520885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* & l middle-dot << a a is an expansion. */ 520985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 521085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar tData1[][20]={ 521185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 0xb7, 0}, /* standalone middle dot(0xb7) */ 521285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 0x387, 0}, /* standalone middle dot(0x387) */ 521385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 0x61, 0}, /* a */ 521485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 0x6C, 0}, /* l */ 521585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 0x4C, 0x0332, 0}, /* l with [first primary ignorable] */ 521685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 0x6C, 0xb7, 0}, /* l with middle dot(0xb7) */ 521785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 0x6C, 0x387, 0}, /* l with middle dot(0x387) */ 521885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 0x4C, 0xb7, 0}, /* L with middle dot(0xb7) */ 521985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 0x4C, 0x387, 0}, /* L with middle dot(0x387) */ 522085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 0x6C, 0x61, 0x387, 0}, /* la with middle dot(0x387) */ 522185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 0x4C, 0x61, 0xb7, 0}, /* La with middle dot(0xb7) */ 522285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho }; 522385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 522485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("\n\nEN collation:"); 522585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho coll = ucol_open("en", &status); 522685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(status)) { 522785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "Tailoring test: &z <<a|- failed! -> %s\n", u_errorName(status)); 522885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 522985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 523085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (j=0; j<11; j++) { 523185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tLen = u_strlen(tData1[j]); 523285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho rLen = ucol_getSortKey(coll, tData1[j], tLen, resColl, 100); 523385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if ((j>0) && (strcmp((char *)resColl, (char *)prevColl)<0)) { 523485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("\n Expecting greater key than previous test case: Data[%d] :%s.", 523585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho j, tData1[j]); 523685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 523785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("\n Data[%d] :%s \tlen: %d key: ", j, tData1[j], rLen); 523885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 0; i<rLen; i++) { 523985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose(" %02X", resColl[i]); 524085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 524185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_memcpy(prevColl, resColl, sizeof(uint8_t)*(rLen+1)); 524285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 524385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(coll); 524485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 524585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 524685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("\n\nJA collation:"); 524785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho coll = ucol_open("ja", &status); 524885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(status)) { 524985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Tailoring test: &z <<a|- failed!"); 525085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 525185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 525285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (j=0; j<11; j++) { 525385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tLen = u_strlen(tData1[j]); 525485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho rLen = ucol_getSortKey(coll, tData1[j], tLen, resColl, 100); 525585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if ((j>0) && (strcmp((char *)resColl, (char *)prevColl)<0)) { 525685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("\n Expecting greater key than previous test case: Data[%d] :%s.", 525785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho j, tData1[j]); 525885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 525985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("\n Data[%d] :%s \tlen: %d key: ", j, tData1[j], rLen); 526085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 0; i<rLen; i++) { 526185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose(" %02X", resColl[i]); 526285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 526385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_memcpy(prevColl, resColl, sizeof(uint8_t)*(rLen+1)); 526485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 526585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(coll); 526685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 526785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 526885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("\n\nTailoring test: & middle dot < a "); 526985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ruleLen = u_strlen(rule1); 527085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho coll = ucol_openRules(rule1, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status); 527185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(status)) { 527285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Tailoring test: & middle dot < a failed!"); 527385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 527485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 527585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (j=0; j<11; j++) { 527685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tLen = u_strlen(tData1[j]); 527785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho rLen = ucol_getSortKey(coll, tData1[j], tLen, resColl, 100); 527885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if ((j>0) && (strcmp((char *)resColl, (char *)prevColl)<0)) { 527985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("\n Expecting greater key than previous test case: Data[%d] :%s.", 528085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho j, tData1[j]); 528185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 528285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("\n Data[%d] :%s \tlen: %d key: ", j, tData1[j], rLen); 5283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<rLen; i++) { 5284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose(" %02X", resColl[i]); 5285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 528685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_memcpy(prevColl, resColl, sizeof(uint8_t)*(rLen+1)); 528785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 528885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(coll); 528985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 529085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 529185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("\n\nTailoring test: & l middle-dot << a "); 529285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ruleLen = u_strlen(rule2); 529385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho coll = ucol_openRules(rule2, ruleLen, UCOL_OFF, UCOL_TERTIARY, NULL,&status); 529485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(status)) { 529585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Tailoring test: & l middle-dot << a failed!"); 529685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 529785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 529885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (j=0; j<11; j++) { 529985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tLen = u_strlen(tData1[j]); 530085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho rLen = ucol_getSortKey(coll, tData1[j], tLen, resColl, 100); 530185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if ((j>0) && (j!=3) && (strcmp((char *)resColl, (char *)prevColl)<0)) { 530285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("\n Expecting greater key than previous test case: Data[%d] :%s.", 530385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho j, tData1[j]); 530485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 530585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if ((j==3)&&(strcmp((char *)resColl, (char *)prevColl)>0)) { 530685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("\n Expecting smaller key than previous test case: Data[%d] :%s.", 530785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho j, tData1[j]); 530885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 530985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("\n Data[%d] :%s \tlen: %d key: ", j, tData1[j], rLen); 531085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for(i = 0; i<rLen; i++) { 531185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose(" %02X", resColl[i]); 531285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 531385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uprv_memcpy(prevColl, resColl, sizeof(uint8_t)*(rLen+1)); 531485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 531585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(coll); 531685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 531785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 531885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void 531985bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoTestOutOfBuffer5468(void) 532085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 532185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho static const char *test = "\\u4e00"; 532285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar ustr[256]; 532385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t ustr_length = u_unescape(test, ustr, 256); 532485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho unsigned char shortKeyBuf[1]; 532585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t sortkey_length; 532685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 532785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho static UCollator *coll = NULL; 532885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 532985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho coll = ucol_open("root", &status); 533085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if(U_FAILURE(status)) { 533185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "Couldn't open UCA -> %s\n", u_errorName(status)); 533285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 533385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 533485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_setStrength(coll, UCOL_PRIMARY); 533585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_PRIMARY, &status); 533685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 533785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(status)) { 533885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Failed setting atributes\n"); 533985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 534085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 534185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 534285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho sortkey_length = ucol_getSortKey(coll, ustr, ustr_length, shortKeyBuf, sizeof(shortKeyBuf)); 534385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (sortkey_length != 4) { 534485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("expecting length of sortKey is 4 got:%d ", sortkey_length); 534585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 534685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_verbose("length of sortKey is %d", sortkey_length); 534785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(coll); 5348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TSKC_DATA_SIZE 5 5351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TSKC_BUF_SIZE 50 5352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 5353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestSortKeyConsistency(void) 5354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 5355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode icuRC = U_ZERO_ERROR; 5356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator* ucol; 5357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar data[] = { 0xFFFD, 0x0006, 0x0006, 0x0006, 0xFFFD}; 5358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t bufFull[TSKC_DATA_SIZE][TSKC_BUF_SIZE]; 5360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t bufPart[TSKC_DATA_SIZE][TSKC_BUF_SIZE]; 536185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t i, j, i2; 5362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol = ucol_openFromShortString("LEN_S4", FALSE, NULL, &icuRC); 5364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(icuRC)) 536585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 536685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(icuRC, "ucol_openFromShortString failed -> %s\n", u_errorName(icuRC)); 5367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 536885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 5369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < TSKC_DATA_SIZE; i++) 5371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 5372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharIterator uiter; 5373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t state[2] = { 0, 0 }; 5374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t dataLen = i+1; 537585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (j=0; j<TSKC_BUF_SIZE; j++) 537685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho bufFull[i][j] = bufPart[i][j] = 0; 5377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Full sort key */ 5379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(ucol, data, dataLen, bufFull[i], TSKC_BUF_SIZE); 5380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Partial sort key */ 5382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uiter_setString(&uiter, data, dataLen); 5383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_nextSortKeyPart(ucol, &uiter, state, bufPart[i], TSKC_BUF_SIZE, &icuRC); 5384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(icuRC)) 538585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 538685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("ucol_nextSortKeyPart failed\n"); 538785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(ucol); 538885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 538985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 5390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 539185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (i2=0; i2<i; i2++) 539285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 539385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UBool fullMatch = TRUE; 539485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UBool partMatch = TRUE; 539585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (j=0; j<TSKC_BUF_SIZE; j++) 539685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 539785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho fullMatch = fullMatch && (bufFull[i][j] != bufFull[i2][j]); 539885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho partMatch = partMatch && (bufPart[i][j] != bufPart[i2][j]); 539985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 540085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (fullMatch != partMatch) { 540185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err(fullMatch ? "full key was consistent, but partial key changed\n" 540285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho : "partial key was consistent, but full key changed\n"); 540385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(ucol); 540485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 540585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 540685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 5407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*=============================================*/ 5410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(ucol); 5411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 541385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* ticket: 6101 */ 541485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void TestCroatianSortKey(void) { 541585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho const char* collString = "LHR_AN_CX_EX_FX_HX_NX_S3"; 541685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 541785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCollator *ucol; 541885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCharIterator iter; 541985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 542085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho static const UChar text[] = { 0x0044, 0xD81A }; 542185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 542285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho size_t length = sizeof(text)/sizeof(*text); 542385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 542485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint8_t textSortKey[32]; 542585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho size_t lenSortKey = 32; 542685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho size_t actualSortKeyLen; 542785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint32_t uStateInfo[2] = { 0, 0 }; 542885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 542985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol = ucol_openFromShortString(collString, FALSE, NULL, &status); 543085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(status)) { 543185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "ucol_openFromShortString error in Craotian test. -> %s\n", u_errorName(status)); 543285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 543385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 543485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 543585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uiter_setString(&iter, text, length); 543685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 543785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho actualSortKeyLen = ucol_nextSortKeyPart( 543885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol, &iter, (uint32_t*)uStateInfo, 543985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho textSortKey, lenSortKey, &status 544085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ); 544185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 544285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (actualSortKeyLen == lenSortKey) { 544385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("ucol_nextSortKeyPart did not give correct result in Croatian test.\n"); 544485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 544585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 544685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(ucol); 544785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 544885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 544985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* ticket: 6140 */ 545085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* This test ensures that codepoints such as 0x3099 are flagged correctly by the collator since 545185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * they are both Hiragana and Katakana 545285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho */ 545385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define SORTKEYLEN 50 545485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hostatic void TestHiragana(void) { 545585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 545685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCollator* ucol; 545785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCollationResult strcollresult; 545885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar data1[] = { 0x3058, 0x30B8 }; /* Hiragana and Katakana letter Zi */ 545985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UChar data2[] = { 0x3057, 0x3099, 0x30B7, 0x3099 }; 546085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t data1Len = sizeof(data1)/sizeof(*data1); 546185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t data2Len = sizeof(data2)/sizeof(*data2); 546285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t i, j; 546385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint8_t sortKey1[SORTKEYLEN]; 546485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint8_t sortKey2[SORTKEYLEN]; 546585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 546685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCharIterator uiter1; 546785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UCharIterator uiter2; 546885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint32_t state1[2] = { 0, 0 }; 546985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uint32_t state2[2] = { 0, 0 }; 547085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t keySize1; 547185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t keySize2; 547285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 547385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol = ucol_openFromShortString("LJA_AN_CX_EX_FX_HO_NX_S4", FALSE, NULL, 547485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho &status); 547585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_FAILURE(status)) { 547685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err_status(status, "Error status: %s; Unable to open collator from short string.\n", u_errorName(status)); 547785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return; 547885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 547985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 548085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Start of full sort keys */ 548185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Full sort key1 */ 548285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho keySize1 = ucol_getSortKey(ucol, data1, data1Len, sortKey1, SORTKEYLEN); 548385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Full sort key2 */ 548485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho keySize2 = ucol_getSortKey(ucol, data2, data2Len, sortKey2, SORTKEYLEN); 548585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (keySize1 == keySize2) { 548685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (i = 0; i < keySize1; i++) { 548785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (sortKey1[i] != sortKey2[i]) { 548885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Full sort keys are different. Should be equal."); 548985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 549085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 549185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 549285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Full sort keys sizes doesn't match: %d %d", keySize1, keySize2); 549385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 549485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* End of full sort keys */ 549585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 549685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Start of partial sort keys */ 549785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Partial sort key1 */ 549885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uiter_setString(&uiter1, data1, data1Len); 549985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho keySize1 = ucol_nextSortKeyPart(ucol, &uiter1, state1, sortKey1, SORTKEYLEN, &status); 550085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Partial sort key2 */ 550185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho uiter_setString(&uiter2, data2, data2Len); 550285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho keySize2 = ucol_nextSortKeyPart(ucol, &uiter2, state2, sortKey2, SORTKEYLEN, &status); 550385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_SUCCESS(status) && keySize1 == keySize2) { 550485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho for (j = 0; j < keySize1; j++) { 550585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (sortKey1[j] != sortKey2[j]) { 550685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Partial sort keys are different. Should be equal"); 550785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 550885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 550985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 551085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Error Status: %s or Partial sort keys sizes doesn't match: %d %d", u_errorName(status), keySize1, keySize2); 551185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 551285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* End of partial sort keys */ 551385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 551485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Start of strcoll */ 551585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho /* Use ucol_strcoll() to determine ordering */ 551685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho strcollresult = ucol_strcoll(ucol, data1, data1Len, data2, data2Len); 551785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (strcollresult != UCOL_EQUAL) { 551885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho log_err("Result from ucol_strcoll() should be UCOL_EQUAL."); 551985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 552085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 552185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho ucol_close(ucol); 552285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 5523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 552427f654740f2a26ad62a5c155af9199af9e69b889claireho/* Convenient struct for running collation tests */ 552527f654740f2a26ad62a5c155af9199af9e69b889clairehotypedef struct { 552627f654740f2a26ad62a5c155af9199af9e69b889claireho const UChar source[MAX_TOKEN_LEN]; /* String on left */ 552727f654740f2a26ad62a5c155af9199af9e69b889claireho const UChar target[MAX_TOKEN_LEN]; /* String on right */ 552827f654740f2a26ad62a5c155af9199af9e69b889claireho UCollationResult result; /* -1, 0 or +1, depending on collation */ 552927f654740f2a26ad62a5c155af9199af9e69b889claireho} OneTestCase; 553027f654740f2a26ad62a5c155af9199af9e69b889claireho 553127f654740f2a26ad62a5c155af9199af9e69b889claireho/* 553227f654740f2a26ad62a5c155af9199af9e69b889claireho * Utility function to test one collation test case. 553327f654740f2a26ad62a5c155af9199af9e69b889claireho * @param testcases Array of test cases. 553427f654740f2a26ad62a5c155af9199af9e69b889claireho * @param n_testcases Size of the array testcases. 553527f654740f2a26ad62a5c155af9199af9e69b889claireho * @param str_rules Array of rules. These rules should be specifying the same rule in different formats. 553627f654740f2a26ad62a5c155af9199af9e69b889claireho * @param n_rules Size of the array str_rules. 553727f654740f2a26ad62a5c155af9199af9e69b889claireho */ 553827f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void doTestOneTestCase(const OneTestCase testcases[], 553927f654740f2a26ad62a5c155af9199af9e69b889claireho int n_testcases, 554027f654740f2a26ad62a5c155af9199af9e69b889claireho const char* str_rules[], 554127f654740f2a26ad62a5c155af9199af9e69b889claireho int n_rules) 554227f654740f2a26ad62a5c155af9199af9e69b889claireho{ 554327f654740f2a26ad62a5c155af9199af9e69b889claireho int rule_no, testcase_no; 554427f654740f2a26ad62a5c155af9199af9e69b889claireho UChar rule[500]; 554527f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t length = 0; 554627f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode status = U_ZERO_ERROR; 554727f654740f2a26ad62a5c155af9199af9e69b889claireho UParseError parse_error; 554827f654740f2a26ad62a5c155af9199af9e69b889claireho UCollator *myCollation; 554927f654740f2a26ad62a5c155af9199af9e69b889claireho 555027f654740f2a26ad62a5c155af9199af9e69b889claireho for (rule_no = 0; rule_no < n_rules; ++rule_no) { 555127f654740f2a26ad62a5c155af9199af9e69b889claireho 555227f654740f2a26ad62a5c155af9199af9e69b889claireho length = u_unescape(str_rules[rule_no], rule, 500); 555327f654740f2a26ad62a5c155af9199af9e69b889claireho if (length == 0) { 555427f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("ERROR: The rule cannot be unescaped: %s\n"); 555527f654740f2a26ad62a5c155af9199af9e69b889claireho return; 555627f654740f2a26ad62a5c155af9199af9e69b889claireho } 555727f654740f2a26ad62a5c155af9199af9e69b889claireho myCollation = ucol_openRules(rule, length, UCOL_ON, UCOL_TERTIARY, &parse_error, &status); 555827f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(status)){ 555927f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(status, "ERROR: in creation of rule based collator: %s\n", myErrorName(status)); 556027f654740f2a26ad62a5c155af9199af9e69b889claireho return; 556127f654740f2a26ad62a5c155af9199af9e69b889claireho } 556227f654740f2a26ad62a5c155af9199af9e69b889claireho log_verbose("Testing the <<* syntax\n"); 556327f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_setAttribute(myCollation, UCOL_NORMALIZATION_MODE, UCOL_ON, &status); 556427f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_setStrength(myCollation, UCOL_TERTIARY); 556527f654740f2a26ad62a5c155af9199af9e69b889claireho for (testcase_no = 0; testcase_no < n_testcases; ++testcase_no) { 556627f654740f2a26ad62a5c155af9199af9e69b889claireho doTest(myCollation, 556727f654740f2a26ad62a5c155af9199af9e69b889claireho testcases[testcase_no].source, 556827f654740f2a26ad62a5c155af9199af9e69b889claireho testcases[testcase_no].target, 556927f654740f2a26ad62a5c155af9199af9e69b889claireho testcases[testcase_no].result 557027f654740f2a26ad62a5c155af9199af9e69b889claireho ); 557127f654740f2a26ad62a5c155af9199af9e69b889claireho } 557227f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_close(myCollation); 557327f654740f2a26ad62a5c155af9199af9e69b889claireho } 557427f654740f2a26ad62a5c155af9199af9e69b889claireho} 557527f654740f2a26ad62a5c155af9199af9e69b889claireho 557627f654740f2a26ad62a5c155af9199af9e69b889clairehoconst static OneTestCase rangeTestcases[] = { 557727f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0061}, {0x0062}, UCOL_LESS }, /* "a" < "b" */ 557827f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0062}, {0x0063}, UCOL_LESS }, /* "b" < "c" */ 557927f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0061}, {0x0063}, UCOL_LESS }, /* "a" < "c" */ 558027f654740f2a26ad62a5c155af9199af9e69b889claireho 558127f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0062}, {0x006b}, UCOL_LESS }, /* "b" << "k" */ 558227f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x006b}, {0x006c}, UCOL_LESS }, /* "k" << "l" */ 558327f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0062}, {0x006c}, UCOL_LESS }, /* "b" << "l" */ 558427f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0061}, {0x006c}, UCOL_LESS }, /* "a" < "l" */ 558527f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0061}, {0x006d}, UCOL_LESS }, /* "a" < "m" */ 558627f654740f2a26ad62a5c155af9199af9e69b889claireho 558727f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0079}, {0x006d}, UCOL_LESS }, /* "y" < "f" */ 558827f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0079}, {0x0067}, UCOL_LESS }, /* "y" < "g" */ 558927f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0061}, {0x0068}, UCOL_LESS }, /* "y" < "h" */ 559027f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0061}, {0x0065}, UCOL_LESS }, /* "g" < "e" */ 559127f654740f2a26ad62a5c155af9199af9e69b889claireho 559227f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0061}, {0x0031}, UCOL_EQUAL }, /* "a" = "1" */ 559327f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0061}, {0x0032}, UCOL_EQUAL }, /* "a" = "2" */ 559427f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0061}, {0x0033}, UCOL_EQUAL }, /* "a" = "3" */ 559527f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0061}, {0x0066}, UCOL_LESS }, /* "a" < "f" */ 559627f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x006c, 0x0061}, {0x006b, 0x0062}, UCOL_LESS }, /* "la" < "123" */ 559727f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0061, 0x0061, 0x0061}, {0x0031, 0x0032, 0x0033}, UCOL_EQUAL }, /* "aaa" = "123" */ 559827f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0062}, {0x007a}, UCOL_LESS }, /* "b" < "z" */ 559927f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0061, 0x007a, 0x0062}, {0x0032, 0x0079, 0x006d}, UCOL_LESS }, /* "azm" = "2yc" */ 560050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}; 560150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 560227f654740f2a26ad62a5c155af9199af9e69b889clairehostatic int nRangeTestcases = LEN(rangeTestcases); 560327f654740f2a26ad62a5c155af9199af9e69b889claireho 560427f654740f2a26ad62a5c155af9199af9e69b889clairehoconst static OneTestCase rangeTestcasesSupplemental[] = { 560527f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xfffe}, {0xffff}, UCOL_LESS }, /* U+FFFE < U+FFFF */ 560627f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xffff}, {0xd800, 0xdc00}, UCOL_LESS }, /* U+FFFF < U+10000 */ 560727f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xd800, 0xdc00}, {0xd800, 0xdc01}, UCOL_LESS }, /* U+10000 < U+10001 */ 560827f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xfffe}, {0xd800, 0xdc01}, UCOL_LESS }, /* U+FFFE < U+10001 */ 560927f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xd800, 0xdc01}, {0xd800, 0xdc02}, UCOL_LESS }, /* U+10000 < U+10001 */ 561027f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xd800, 0xdc01}, {0xd800, 0xdc02}, UCOL_LESS }, /* U+10000 < U+10001 */ 561127f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xfffe}, {0xd800, 0xdc02}, UCOL_LESS }, /* U+FFFE < U+10001 */ 561250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}; 561350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 561427f654740f2a26ad62a5c155af9199af9e69b889clairehostatic int nRangeTestcasesSupplemental = LEN(rangeTestcasesSupplemental); 561527f654740f2a26ad62a5c155af9199af9e69b889claireho 561627f654740f2a26ad62a5c155af9199af9e69b889clairehoconst static OneTestCase rangeTestcasesQwerty[] = { 561727f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0071}, {0x0077}, UCOL_LESS }, /* "q" < "w" */ 561827f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0077}, {0x0065}, UCOL_LESS }, /* "w" < "e" */ 561927f654740f2a26ad62a5c155af9199af9e69b889claireho 562027f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0079}, {0x0075}, UCOL_LESS }, /* "y" < "u" */ 562127f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0071}, {0x0075}, UCOL_LESS }, /* "q" << "u" */ 562227f654740f2a26ad62a5c155af9199af9e69b889claireho 562327f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0074}, {0x0069}, UCOL_LESS }, /* "t" << "i" */ 562427f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x006f}, {0x0070}, UCOL_LESS }, /* "o" << "p" */ 562527f654740f2a26ad62a5c155af9199af9e69b889claireho 562627f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0079}, {0x0065}, UCOL_LESS }, /* "y" < "e" */ 562727f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0069}, {0x0075}, UCOL_LESS }, /* "i" < "u" */ 562827f654740f2a26ad62a5c155af9199af9e69b889claireho 562927f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0071, 0x0075, 0x0065, 0x0073, 0x0074}, 563027f654740f2a26ad62a5c155af9199af9e69b889claireho {0x0077, 0x0065, 0x0072, 0x0065}, UCOL_LESS }, /* "quest" < "were" */ 563127f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0071, 0x0075, 0x0061, 0x0063, 0x006b}, 563227f654740f2a26ad62a5c155af9199af9e69b889claireho {0x0071, 0x0075, 0x0065, 0x0073, 0x0074}, UCOL_LESS }, /* "quack" < "quest" */ 563350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}; 563450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 563527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic int nRangeTestcasesQwerty = LEN(rangeTestcasesQwerty); 563627f654740f2a26ad62a5c155af9199af9e69b889claireho 563750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestSameStrengthList(void) 563850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 563927f654740f2a26ad62a5c155af9199af9e69b889claireho const char* strRules[] = { 564027f654740f2a26ad62a5c155af9199af9e69b889claireho /* Normal */ 564127f654740f2a26ad62a5c155af9199af9e69b889claireho "&a<b<c<d &b<<k<<l<<m &k<<<x<<<y<<<z &y<f<g<h<e &a=1=2=3", 564250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 564327f654740f2a26ad62a5c155af9199af9e69b889claireho /* Lists */ 564427f654740f2a26ad62a5c155af9199af9e69b889claireho "&a<*bcd &b<<*klm &k<<<*xyz &y<*fghe &a=*123", 564527f654740f2a26ad62a5c155af9199af9e69b889claireho }; 564627f654740f2a26ad62a5c155af9199af9e69b889claireho doTestOneTestCase(rangeTestcases, nRangeTestcases, strRules, LEN(strRules)); 564727f654740f2a26ad62a5c155af9199af9e69b889claireho} 564827f654740f2a26ad62a5c155af9199af9e69b889claireho 564927f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestSameStrengthListQuoted(void) 565027f654740f2a26ad62a5c155af9199af9e69b889claireho{ 565127f654740f2a26ad62a5c155af9199af9e69b889claireho const char* strRules[] = { 565227f654740f2a26ad62a5c155af9199af9e69b889claireho /* Lists with quoted characters */ 565327f654740f2a26ad62a5c155af9199af9e69b889claireho "&\\u0061<*bcd &b<<*klm &k<<<*xyz &y<*f\\u0067\\u0068e &a=*123", 565427f654740f2a26ad62a5c155af9199af9e69b889claireho "&'\\u0061'<*bcd &b<<*klm &k<<<*xyz &y<*f'\\u0067\\u0068'e &a=*123", 565527f654740f2a26ad62a5c155af9199af9e69b889claireho 565627f654740f2a26ad62a5c155af9199af9e69b889claireho "&\\u0061<*b\\u0063d &b<<*klm &k<<<*xyz &\\u0079<*fgh\\u0065 &a=*\\u0031\\u0032\\u0033", 565727f654740f2a26ad62a5c155af9199af9e69b889claireho "&'\\u0061'<*b'\\u0063'd &b<<*klm &k<<<*xyz &'\\u0079'<*fgh'\\u0065' &a=*'\\u0031\\u0032\\u0033'", 565827f654740f2a26ad62a5c155af9199af9e69b889claireho 565927f654740f2a26ad62a5c155af9199af9e69b889claireho "&\\u0061<*\\u0062c\\u0064 &b<<*klm &k<<<*xyz &y<*fghe &a=*\\u0031\\u0032\\u0033", 566027f654740f2a26ad62a5c155af9199af9e69b889claireho "&'\\u0061'<*'\\u0062'c'\\u0064' &b<<*klm &k<<<*xyz &y<*fghe &a=*'\\u0031\\u0032\\u0033'", 566127f654740f2a26ad62a5c155af9199af9e69b889claireho }; 566227f654740f2a26ad62a5c155af9199af9e69b889claireho doTestOneTestCase(rangeTestcases, nRangeTestcases, strRules, LEN(strRules)); 566327f654740f2a26ad62a5c155af9199af9e69b889claireho} 566427f654740f2a26ad62a5c155af9199af9e69b889claireho 566527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestSameStrengthListSupplemental(void) 566627f654740f2a26ad62a5c155af9199af9e69b889claireho{ 566727f654740f2a26ad62a5c155af9199af9e69b889claireho const char* strRules[] = { 566827f654740f2a26ad62a5c155af9199af9e69b889claireho "&\\ufffe<\\uffff<\\U00010000<\\U00010001<\\U00010002", 566927f654740f2a26ad62a5c155af9199af9e69b889claireho "&\\ufffe<\\uffff<\\ud800\\udc00<\\ud800\\udc01<\\ud800\\udc02", 567027f654740f2a26ad62a5c155af9199af9e69b889claireho "&\\ufffe<*\\uffff\\U00010000\\U00010001\\U00010002", 567127f654740f2a26ad62a5c155af9199af9e69b889claireho "&\\ufffe<*\\uffff\\ud800\\udc00\\ud800\\udc01\\ud800\\udc02", 567227f654740f2a26ad62a5c155af9199af9e69b889claireho }; 567327f654740f2a26ad62a5c155af9199af9e69b889claireho doTestOneTestCase(rangeTestcasesSupplemental, nRangeTestcasesSupplemental, strRules, LEN(strRules)); 567427f654740f2a26ad62a5c155af9199af9e69b889claireho} 567527f654740f2a26ad62a5c155af9199af9e69b889claireho 567627f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestSameStrengthListQwerty(void) 567727f654740f2a26ad62a5c155af9199af9e69b889claireho{ 567827f654740f2a26ad62a5c155af9199af9e69b889claireho const char* strRules[] = { 567927f654740f2a26ad62a5c155af9199af9e69b889claireho "&q<w<e<r &w<<t<<y<<u &t<<<i<<<o<<<p &o=a=s=d", /* Normal */ 568027f654740f2a26ad62a5c155af9199af9e69b889claireho "&q<*wer &w<<*tyu &t<<<*iop &o=*asd", /* Lists */ 568127f654740f2a26ad62a5c155af9199af9e69b889claireho "&\\u0071<\\u0077<\\u0065<\\u0072 &\\u0077<<\\u0074<<\\u0079<<\\u0075 &\\u0074<<<\\u0069<<<\\u006f<<<\\u0070 &\\u006f=\\u0061=\\u0073=\\u0064", 568227f654740f2a26ad62a5c155af9199af9e69b889claireho "&'\\u0071'<\\u0077<\\u0065<\\u0072 &\\u0077<<'\\u0074'<<\\u0079<<\\u0075 &\\u0074<<<\\u0069<<<'\\u006f'<<<\\u0070 &\\u006f=\\u0061='\\u0073'=\\u0064", 568327f654740f2a26ad62a5c155af9199af9e69b889claireho "&\\u0071<*\\u0077\\u0065\\u0072 &\\u0077<<*\\u0074\\u0079\\u0075 &\\u0074<<<*\\u0069\\u006f\\u0070 &\\u006f=*\\u0061\\u0073\\u0064", 568427f654740f2a26ad62a5c155af9199af9e69b889claireho 568527f654740f2a26ad62a5c155af9199af9e69b889claireho /* Quoted characters also will work if two quoted characters are not consecutive. */ 568627f654740f2a26ad62a5c155af9199af9e69b889claireho "&\\u0071<*'\\u0077'\\u0065\\u0072 &\\u0077<<*\\u0074'\\u0079'\\u0075 &\\u0074<<<*\\u0069\\u006f'\\u0070' &'\\u006f'=*\\u0061\\u0073\\u0064", 568727f654740f2a26ad62a5c155af9199af9e69b889claireho 568827f654740f2a26ad62a5c155af9199af9e69b889claireho /* Consecutive quoted charactes do not work, because a '' will be treated as a quote character. */ 568927f654740f2a26ad62a5c155af9199af9e69b889claireho /* "&\\u0071<*'\\u0077''\\u0065''\\u0072' &\\u0077<<*'\\u0074''\\u0079''\\u0075' &\\u0074<<<*'\\u0069''\\u006f''\\u0070' &'\\u006f'=*\\u0061\\u0073\\u0064",*/ 569027f654740f2a26ad62a5c155af9199af9e69b889claireho 569127f654740f2a26ad62a5c155af9199af9e69b889claireho }; 569227f654740f2a26ad62a5c155af9199af9e69b889claireho doTestOneTestCase(rangeTestcasesQwerty, nRangeTestcasesQwerty, strRules, LEN(strRules)); 569327f654740f2a26ad62a5c155af9199af9e69b889claireho} 569427f654740f2a26ad62a5c155af9199af9e69b889claireho 569527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestSameStrengthListQuotedQwerty(void) 569627f654740f2a26ad62a5c155af9199af9e69b889claireho{ 569727f654740f2a26ad62a5c155af9199af9e69b889claireho const char* strRules[] = { 569827f654740f2a26ad62a5c155af9199af9e69b889claireho "&q<w<e<r &w<<t<<y<<u &t<<<i<<<o<<<p &o=a=s=d", /* Normal */ 569927f654740f2a26ad62a5c155af9199af9e69b889claireho "&q<*wer &w<<*tyu &t<<<*iop &o=*asd", /* Lists */ 570027f654740f2a26ad62a5c155af9199af9e69b889claireho "&q<*w'e'r &w<<*'t'yu &t<<<*io'p' &o=*'a's'd'", /* Lists with quotes */ 570127f654740f2a26ad62a5c155af9199af9e69b889claireho 570227f654740f2a26ad62a5c155af9199af9e69b889claireho /* Lists with continuous quotes may not work, because '' will be treated as a quote character. */ 570327f654740f2a26ad62a5c155af9199af9e69b889claireho /* "&q<*'w''e''r' &w<<*'t''y''u' &t<<<*'i''o''p' &o=*'a''s''d'", */ 570427f654740f2a26ad62a5c155af9199af9e69b889claireho }; 570527f654740f2a26ad62a5c155af9199af9e69b889claireho doTestOneTestCase(rangeTestcasesQwerty, nRangeTestcasesQwerty, strRules, LEN(strRules)); 570627f654740f2a26ad62a5c155af9199af9e69b889claireho} 570727f654740f2a26ad62a5c155af9199af9e69b889claireho 570827f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestSameStrengthListRanges(void) 570927f654740f2a26ad62a5c155af9199af9e69b889claireho{ 571027f654740f2a26ad62a5c155af9199af9e69b889claireho const char* strRules[] = { 571127f654740f2a26ad62a5c155af9199af9e69b889claireho "&a<*b-d &b<<*k-m &k<<<*x-z &y<*f-he &a=*1-3", 571227f654740f2a26ad62a5c155af9199af9e69b889claireho }; 571327f654740f2a26ad62a5c155af9199af9e69b889claireho doTestOneTestCase(rangeTestcases, nRangeTestcases, strRules, LEN(strRules)); 571427f654740f2a26ad62a5c155af9199af9e69b889claireho} 571527f654740f2a26ad62a5c155af9199af9e69b889claireho 571627f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestSameStrengthListSupplementalRanges(void) 571727f654740f2a26ad62a5c155af9199af9e69b889claireho{ 571827f654740f2a26ad62a5c155af9199af9e69b889claireho const char* strRules[] = { 571927f654740f2a26ad62a5c155af9199af9e69b889claireho "&\\ufffe<*\\uffff-\\U00010002", 572027f654740f2a26ad62a5c155af9199af9e69b889claireho }; 572127f654740f2a26ad62a5c155af9199af9e69b889claireho doTestOneTestCase(rangeTestcasesSupplemental, nRangeTestcasesSupplemental, strRules, LEN(strRules)); 572227f654740f2a26ad62a5c155af9199af9e69b889claireho} 572327f654740f2a26ad62a5c155af9199af9e69b889claireho 572427f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestSpecialCharacters(void) 572527f654740f2a26ad62a5c155af9199af9e69b889claireho{ 572627f654740f2a26ad62a5c155af9199af9e69b889claireho const char* strRules[] = { 572727f654740f2a26ad62a5c155af9199af9e69b889claireho /* Normal */ 572827f654740f2a26ad62a5c155af9199af9e69b889claireho "&';'<'+'<','<'-'<'&'<'*'", 572927f654740f2a26ad62a5c155af9199af9e69b889claireho 573027f654740f2a26ad62a5c155af9199af9e69b889claireho /* List */ 573127f654740f2a26ad62a5c155af9199af9e69b889claireho "&';'<*'+,-&*'", 573227f654740f2a26ad62a5c155af9199af9e69b889claireho 573327f654740f2a26ad62a5c155af9199af9e69b889claireho /* Range */ 573427f654740f2a26ad62a5c155af9199af9e69b889claireho "&';'<*'+'-'-&*'", 573527f654740f2a26ad62a5c155af9199af9e69b889claireho }; 573627f654740f2a26ad62a5c155af9199af9e69b889claireho 573727f654740f2a26ad62a5c155af9199af9e69b889claireho const static OneTestCase specialCharacterStrings[] = { 573827f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x003b}, {0x002b}, UCOL_LESS }, /* ; < + */ 573927f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x002b}, {0x002c}, UCOL_LESS }, /* + < , */ 574027f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x002c}, {0x002d}, UCOL_LESS }, /* , < - */ 574127f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x002d}, {0x0026}, UCOL_LESS }, /* - < & */ 574227f654740f2a26ad62a5c155af9199af9e69b889claireho }; 574327f654740f2a26ad62a5c155af9199af9e69b889claireho doTestOneTestCase(specialCharacterStrings, LEN(specialCharacterStrings), strRules, LEN(strRules)); 574427f654740f2a26ad62a5c155af9199af9e69b889claireho} 574527f654740f2a26ad62a5c155af9199af9e69b889claireho 574627f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestPrivateUseCharacters(void) 574727f654740f2a26ad62a5c155af9199af9e69b889claireho{ 574827f654740f2a26ad62a5c155af9199af9e69b889claireho const char* strRules[] = { 574927f654740f2a26ad62a5c155af9199af9e69b889claireho /* Normal */ 575027f654740f2a26ad62a5c155af9199af9e69b889claireho "&'\\u5ea7'<'\\uE2D8'<'\\uE2D9'<'\\uE2DA'<'\\uE2DB'<'\\uE2DC'<'\\u4e8d'", 575127f654740f2a26ad62a5c155af9199af9e69b889claireho "&\\u5ea7<\\uE2D8<\\uE2D9<\\uE2DA<\\uE2DB<\\uE2DC<\\u4e8d", 575227f654740f2a26ad62a5c155af9199af9e69b889claireho }; 575327f654740f2a26ad62a5c155af9199af9e69b889claireho 575427f654740f2a26ad62a5c155af9199af9e69b889claireho const static OneTestCase privateUseCharacterStrings[] = { 575527f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x5ea7}, {0xe2d8}, UCOL_LESS }, 575627f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xe2d8}, {0xe2d9}, UCOL_LESS }, 575727f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xe2d9}, {0xe2da}, UCOL_LESS }, 575827f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xe2da}, {0xe2db}, UCOL_LESS }, 575927f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xe2db}, {0xe2dc}, UCOL_LESS }, 576027f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xe2dc}, {0x4e8d}, UCOL_LESS }, 576127f654740f2a26ad62a5c155af9199af9e69b889claireho }; 576227f654740f2a26ad62a5c155af9199af9e69b889claireho doTestOneTestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), strRules, LEN(strRules)); 576327f654740f2a26ad62a5c155af9199af9e69b889claireho} 576427f654740f2a26ad62a5c155af9199af9e69b889claireho 576527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestPrivateUseCharactersInList(void) 576627f654740f2a26ad62a5c155af9199af9e69b889claireho{ 576727f654740f2a26ad62a5c155af9199af9e69b889claireho const char* strRules[] = { 576827f654740f2a26ad62a5c155af9199af9e69b889claireho /* List */ 576927f654740f2a26ad62a5c155af9199af9e69b889claireho "&'\\u5ea7'<*'\\uE2D8\\uE2D9\\uE2DA\\uE2DB\\uE2DC\\u4e8d'", 577027f654740f2a26ad62a5c155af9199af9e69b889claireho /* "&'\\u5ea7'<*\\uE2D8'\\uE2D9\\uE2DA'\\uE2DB'\\uE2DC\\u4e8d'", */ 577127f654740f2a26ad62a5c155af9199af9e69b889claireho "&\\u5ea7<*\\uE2D8\\uE2D9\\uE2DA\\uE2DB\\uE2DC\\u4e8d", 577227f654740f2a26ad62a5c155af9199af9e69b889claireho }; 577327f654740f2a26ad62a5c155af9199af9e69b889claireho 577427f654740f2a26ad62a5c155af9199af9e69b889claireho const static OneTestCase privateUseCharacterStrings[] = { 577527f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x5ea7}, {0xe2d8}, UCOL_LESS }, 577627f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xe2d8}, {0xe2d9}, UCOL_LESS }, 577727f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xe2d9}, {0xe2da}, UCOL_LESS }, 577827f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xe2da}, {0xe2db}, UCOL_LESS }, 577927f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xe2db}, {0xe2dc}, UCOL_LESS }, 578027f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xe2dc}, {0x4e8d}, UCOL_LESS }, 578127f654740f2a26ad62a5c155af9199af9e69b889claireho }; 578227f654740f2a26ad62a5c155af9199af9e69b889claireho doTestOneTestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), strRules, LEN(strRules)); 578327f654740f2a26ad62a5c155af9199af9e69b889claireho} 578427f654740f2a26ad62a5c155af9199af9e69b889claireho 578527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestPrivateUseCharactersInRange(void) 578627f654740f2a26ad62a5c155af9199af9e69b889claireho{ 578727f654740f2a26ad62a5c155af9199af9e69b889claireho const char* strRules[] = { 578827f654740f2a26ad62a5c155af9199af9e69b889claireho /* Range */ 578927f654740f2a26ad62a5c155af9199af9e69b889claireho "&'\\u5ea7'<*'\\uE2D8'-'\\uE2DC\\u4e8d'", 579027f654740f2a26ad62a5c155af9199af9e69b889claireho "&\\u5ea7<*\\uE2D8-\\uE2DC\\u4e8d", 579127f654740f2a26ad62a5c155af9199af9e69b889claireho /* "&\\u5ea7<\\uE2D8'\\uE2D8'-'\\uE2D9'\\uE2DA-\\uE2DB\\uE2DC\\u4e8d", */ 579227f654740f2a26ad62a5c155af9199af9e69b889claireho }; 579327f654740f2a26ad62a5c155af9199af9e69b889claireho 579427f654740f2a26ad62a5c155af9199af9e69b889claireho const static OneTestCase privateUseCharacterStrings[] = { 579527f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x5ea7}, {0xe2d8}, UCOL_LESS }, 579627f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xe2d8}, {0xe2d9}, UCOL_LESS }, 579727f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xe2d9}, {0xe2da}, UCOL_LESS }, 579827f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xe2da}, {0xe2db}, UCOL_LESS }, 579927f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xe2db}, {0xe2dc}, UCOL_LESS }, 580027f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xe2dc}, {0x4e8d}, UCOL_LESS }, 580127f654740f2a26ad62a5c155af9199af9e69b889claireho }; 580227f654740f2a26ad62a5c155af9199af9e69b889claireho doTestOneTestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), strRules, LEN(strRules)); 580327f654740f2a26ad62a5c155af9199af9e69b889claireho} 580427f654740f2a26ad62a5c155af9199af9e69b889claireho 580527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestInvalidListsAndRanges(void) 580627f654740f2a26ad62a5c155af9199af9e69b889claireho{ 580727f654740f2a26ad62a5c155af9199af9e69b889claireho const char* invalidRules[] = { 580827f654740f2a26ad62a5c155af9199af9e69b889claireho /* Range not in starred expression */ 580927f654740f2a26ad62a5c155af9199af9e69b889claireho "&\\ufffe<\\uffff-\\U00010002", 581027f654740f2a26ad62a5c155af9199af9e69b889claireho 581127f654740f2a26ad62a5c155af9199af9e69b889claireho /* Range without start */ 581227f654740f2a26ad62a5c155af9199af9e69b889claireho "&a<*-c", 581327f654740f2a26ad62a5c155af9199af9e69b889claireho 581427f654740f2a26ad62a5c155af9199af9e69b889claireho /* Range without end */ 581527f654740f2a26ad62a5c155af9199af9e69b889claireho "&a<*b-", 581627f654740f2a26ad62a5c155af9199af9e69b889claireho 581727f654740f2a26ad62a5c155af9199af9e69b889claireho /* More than one hyphen */ 581827f654740f2a26ad62a5c155af9199af9e69b889claireho "&a<*b-g-l", 581927f654740f2a26ad62a5c155af9199af9e69b889claireho 582027f654740f2a26ad62a5c155af9199af9e69b889claireho /* Range in the wrong order */ 582127f654740f2a26ad62a5c155af9199af9e69b889claireho "&a<*k-b", 582227f654740f2a26ad62a5c155af9199af9e69b889claireho 582327f654740f2a26ad62a5c155af9199af9e69b889claireho }; 582427f654740f2a26ad62a5c155af9199af9e69b889claireho 582527f654740f2a26ad62a5c155af9199af9e69b889claireho UChar rule[500]; 582627f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode status = U_ZERO_ERROR; 582727f654740f2a26ad62a5c155af9199af9e69b889claireho UParseError parse_error; 582827f654740f2a26ad62a5c155af9199af9e69b889claireho int n_rules = LEN(invalidRules); 582927f654740f2a26ad62a5c155af9199af9e69b889claireho int rule_no; 583027f654740f2a26ad62a5c155af9199af9e69b889claireho int length; 583127f654740f2a26ad62a5c155af9199af9e69b889claireho UCollator *myCollation; 583227f654740f2a26ad62a5c155af9199af9e69b889claireho 583327f654740f2a26ad62a5c155af9199af9e69b889claireho for (rule_no = 0; rule_no < n_rules; ++rule_no) { 583427f654740f2a26ad62a5c155af9199af9e69b889claireho 583527f654740f2a26ad62a5c155af9199af9e69b889claireho length = u_unescape(invalidRules[rule_no], rule, 500); 583627f654740f2a26ad62a5c155af9199af9e69b889claireho if (length == 0) { 583727f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("ERROR: The rule cannot be unescaped: %s\n"); 583827f654740f2a26ad62a5c155af9199af9e69b889claireho return; 583927f654740f2a26ad62a5c155af9199af9e69b889claireho } 584027f654740f2a26ad62a5c155af9199af9e69b889claireho myCollation = ucol_openRules(rule, length, UCOL_ON, UCOL_TERTIARY, &parse_error, &status); 584127f654740f2a26ad62a5c155af9199af9e69b889claireho if(!U_FAILURE(status)){ 584227f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("ERROR: Could not cause a failure as expected: \n"); 584327f654740f2a26ad62a5c155af9199af9e69b889claireho } 584427f654740f2a26ad62a5c155af9199af9e69b889claireho status = U_ZERO_ERROR; 584527f654740f2a26ad62a5c155af9199af9e69b889claireho } 584627f654740f2a26ad62a5c155af9199af9e69b889claireho} 584727f654740f2a26ad62a5c155af9199af9e69b889claireho 584827f654740f2a26ad62a5c155af9199af9e69b889claireho/* 584927f654740f2a26ad62a5c155af9199af9e69b889claireho * This test ensures that characters placed before a character in a different script have the same lead byte 585027f654740f2a26ad62a5c155af9199af9e69b889claireho * in their collation key before and after script reordering. 585127f654740f2a26ad62a5c155af9199af9e69b889claireho */ 585227f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestBeforeRuleWithScriptReordering(void) 585327f654740f2a26ad62a5c155af9199af9e69b889claireho{ 585450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UParseError error; 585550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode status = U_ZERO_ERROR; 585650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UCollator *myCollation; 585727f654740f2a26ad62a5c155af9199af9e69b889claireho char srules[500] = "&[before 1]\\u03b1 < \\u0e01"; 585827f654740f2a26ad62a5c155af9199af9e69b889claireho UChar rules[500]; 585927f654740f2a26ad62a5c155af9199af9e69b889claireho uint32_t rulesLength = 0; 586027f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t reorderCodes[1] = {USCRIPT_GREEK}; 586127f654740f2a26ad62a5c155af9199af9e69b889claireho UCollationResult collResult; 586250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 586327f654740f2a26ad62a5c155af9199af9e69b889claireho uint8_t baseKey[256]; 586427f654740f2a26ad62a5c155af9199af9e69b889claireho uint32_t baseKeyLength; 586527f654740f2a26ad62a5c155af9199af9e69b889claireho uint8_t beforeKey[256]; 586627f654740f2a26ad62a5c155af9199af9e69b889claireho uint32_t beforeKeyLength; 586727f654740f2a26ad62a5c155af9199af9e69b889claireho 586827f654740f2a26ad62a5c155af9199af9e69b889claireho UChar base[] = { 0x03b1 }; /* base */ 586927f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t baseLen = sizeof(base)/sizeof(*base); 587027f654740f2a26ad62a5c155af9199af9e69b889claireho 587127f654740f2a26ad62a5c155af9199af9e69b889claireho UChar before[] = { 0x0e01 }; /* ko kai */ 587227f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t beforeLen = sizeof(before)/sizeof(*before); 587327f654740f2a26ad62a5c155af9199af9e69b889claireho 587427f654740f2a26ad62a5c155af9199af9e69b889claireho /*UChar *data[] = { before, base }; 587527f654740f2a26ad62a5c155af9199af9e69b889claireho genericRulesStarter(srules, data, 2);*/ 587627f654740f2a26ad62a5c155af9199af9e69b889claireho 587727f654740f2a26ad62a5c155af9199af9e69b889claireho log_verbose("Testing the &[before 1] rule with [reorder grek]\n"); 587827f654740f2a26ad62a5c155af9199af9e69b889claireho 587927f654740f2a26ad62a5c155af9199af9e69b889claireho 588027f654740f2a26ad62a5c155af9199af9e69b889claireho /* build collator */ 588127f654740f2a26ad62a5c155af9199af9e69b889claireho log_verbose("Testing the &[before 1] rule with [scriptReorder grek]\n"); 588227f654740f2a26ad62a5c155af9199af9e69b889claireho 588327f654740f2a26ad62a5c155af9199af9e69b889claireho rulesLength = u_unescape(srules, rules, LEN(rules)); 588427f654740f2a26ad62a5c155af9199af9e69b889claireho myCollation = ucol_openRules(rules, rulesLength, UCOL_ON, UCOL_TERTIARY, &error, &status); 588527f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(status)) { 588650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err_status(status, "ERROR: in creation of rule based collator: %s\n", myErrorName(status)); 588750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 588850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 588927f654740f2a26ad62a5c155af9199af9e69b889claireho 589027f654740f2a26ad62a5c155af9199af9e69b889claireho /* check collation results - before rule applied but not script reordering */ 589127f654740f2a26ad62a5c155af9199af9e69b889claireho collResult = ucol_strcoll(myCollation, base, baseLen, before, beforeLen); 589227f654740f2a26ad62a5c155af9199af9e69b889claireho if (collResult != UCOL_GREATER) { 589327f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("Collation result not correct before script reordering = %d\n", collResult); 589427f654740f2a26ad62a5c155af9199af9e69b889claireho } 589527f654740f2a26ad62a5c155af9199af9e69b889claireho 589627f654740f2a26ad62a5c155af9199af9e69b889claireho /* check the lead byte of the collation keys before script reordering */ 589727f654740f2a26ad62a5c155af9199af9e69b889claireho baseKeyLength = ucol_getSortKey(myCollation, base, baseLen, baseKey, 256); 589827f654740f2a26ad62a5c155af9199af9e69b889claireho beforeKeyLength = ucol_getSortKey(myCollation, before, beforeLen, beforeKey, 256); 589927f654740f2a26ad62a5c155af9199af9e69b889claireho if (baseKey[0] != beforeKey[0]) { 590027f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("Different lead byte for sort keys using before rule and before script reordering. base character lead byte = %02x, before character lead byte = %02x\n", baseKey[0], beforeKey[0]); 590127f654740f2a26ad62a5c155af9199af9e69b889claireho } 590227f654740f2a26ad62a5c155af9199af9e69b889claireho 590327f654740f2a26ad62a5c155af9199af9e69b889claireho /* reorder the scripts */ 590427f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_setReorderCodes(myCollation, reorderCodes, 1, &status); 590527f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(status)) { 590627f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(status, "ERROR: while setting script order: %s\n", myErrorName(status)); 590727f654740f2a26ad62a5c155af9199af9e69b889claireho return; 590827f654740f2a26ad62a5c155af9199af9e69b889claireho } 590927f654740f2a26ad62a5c155af9199af9e69b889claireho 591027f654740f2a26ad62a5c155af9199af9e69b889claireho /* check collation results - before rule applied and after script reordering */ 591127f654740f2a26ad62a5c155af9199af9e69b889claireho collResult = ucol_strcoll(myCollation, base, baseLen, before, beforeLen); 591227f654740f2a26ad62a5c155af9199af9e69b889claireho if (collResult != UCOL_GREATER) { 591327f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("Collation result not correct after script reordering = %d\n", collResult); 591427f654740f2a26ad62a5c155af9199af9e69b889claireho } 591527f654740f2a26ad62a5c155af9199af9e69b889claireho 591627f654740f2a26ad62a5c155af9199af9e69b889claireho /* check the lead byte of the collation keys after script reordering */ 591727f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_getSortKey(myCollation, base, baseLen, baseKey, 256); 591827f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_getSortKey(myCollation, before, beforeLen, beforeKey, 256); 591927f654740f2a26ad62a5c155af9199af9e69b889claireho if (baseKey[0] != beforeKey[0]) { 592027f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("Different lead byte for sort keys using before fule and after script reordering. base character lead byte = %02x, before character lead byte = %02x\n", baseKey[0], beforeKey[0]); 592150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 592227f654740f2a26ad62a5c155af9199af9e69b889claireho 592350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ucol_close(myCollation); 592450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 592550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 592627f654740f2a26ad62a5c155af9199af9e69b889claireho/* 592727f654740f2a26ad62a5c155af9199af9e69b889claireho * Test that in a primary-compressed sort key all bytes except the first one are unchanged under script reordering. 592827f654740f2a26ad62a5c155af9199af9e69b889claireho */ 592927f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestNonLeadBytesDuringCollationReordering(void) 593027f654740f2a26ad62a5c155af9199af9e69b889claireho{ 593127f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode status = U_ZERO_ERROR; 593227f654740f2a26ad62a5c155af9199af9e69b889claireho UCollator *myCollation; 593327f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t reorderCodes[1] = {USCRIPT_GREEK}; 593427f654740f2a26ad62a5c155af9199af9e69b889claireho 593527f654740f2a26ad62a5c155af9199af9e69b889claireho uint8_t baseKey[256]; 593627f654740f2a26ad62a5c155af9199af9e69b889claireho uint32_t baseKeyLength; 593727f654740f2a26ad62a5c155af9199af9e69b889claireho uint8_t reorderKey[256]; 593827f654740f2a26ad62a5c155af9199af9e69b889claireho uint32_t reorderKeyLength; 593927f654740f2a26ad62a5c155af9199af9e69b889claireho 594027f654740f2a26ad62a5c155af9199af9e69b889claireho UChar testString[] = { 0x03b1, 0x03b2, 0x03b3 }; 594127f654740f2a26ad62a5c155af9199af9e69b889claireho 5942b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uint32_t i; 594327f654740f2a26ad62a5c155af9199af9e69b889claireho 594427f654740f2a26ad62a5c155af9199af9e69b889claireho 594527f654740f2a26ad62a5c155af9199af9e69b889claireho log_verbose("Testing non-lead bytes in a sort key with and without reordering\n"); 594627f654740f2a26ad62a5c155af9199af9e69b889claireho 594727f654740f2a26ad62a5c155af9199af9e69b889claireho /* build collator tertiary */ 594827f654740f2a26ad62a5c155af9199af9e69b889claireho myCollation = ucol_open("", &status); 594927f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_setStrength(myCollation, UCOL_TERTIARY); 595027f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(status)) { 595127f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(status, "ERROR: in creation of collator: %s\n", myErrorName(status)); 595227f654740f2a26ad62a5c155af9199af9e69b889claireho return; 595327f654740f2a26ad62a5c155af9199af9e69b889claireho } 595427f654740f2a26ad62a5c155af9199af9e69b889claireho baseKeyLength = ucol_getSortKey(myCollation, testString, LEN(testString), baseKey, 256); 595527f654740f2a26ad62a5c155af9199af9e69b889claireho 595627f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_setReorderCodes(myCollation, reorderCodes, LEN(reorderCodes), &status); 595727f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(status)) { 595827f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(status, "ERROR: setting reorder codes: %s\n", myErrorName(status)); 595927f654740f2a26ad62a5c155af9199af9e69b889claireho return; 596027f654740f2a26ad62a5c155af9199af9e69b889claireho } 596127f654740f2a26ad62a5c155af9199af9e69b889claireho reorderKeyLength = ucol_getSortKey(myCollation, testString, LEN(testString), reorderKey, 256); 596227f654740f2a26ad62a5c155af9199af9e69b889claireho 596327f654740f2a26ad62a5c155af9199af9e69b889claireho if (baseKeyLength != reorderKeyLength) { 5964b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("Key lengths not the same during reordering.\n"); 596527f654740f2a26ad62a5c155af9199af9e69b889claireho return; 596627f654740f2a26ad62a5c155af9199af9e69b889claireho } 596727f654740f2a26ad62a5c155af9199af9e69b889claireho 596827f654740f2a26ad62a5c155af9199af9e69b889claireho for (i = 1; i < baseKeyLength; i++) { 596927f654740f2a26ad62a5c155af9199af9e69b889claireho if (baseKey[i] != reorderKey[i]) { 597027f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("Collation key bytes not the same at position %d.\n", i); 597127f654740f2a26ad62a5c155af9199af9e69b889claireho return; 597227f654740f2a26ad62a5c155af9199af9e69b889claireho } 597327f654740f2a26ad62a5c155af9199af9e69b889claireho } 597427f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_close(myCollation); 597527f654740f2a26ad62a5c155af9199af9e69b889claireho 597627f654740f2a26ad62a5c155af9199af9e69b889claireho /* build collator quaternary */ 597727f654740f2a26ad62a5c155af9199af9e69b889claireho myCollation = ucol_open("", &status); 597827f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_setStrength(myCollation, UCOL_QUATERNARY); 597927f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(status)) { 598027f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(status, "ERROR: in creation of collator: %s\n", myErrorName(status)); 598127f654740f2a26ad62a5c155af9199af9e69b889claireho return; 598227f654740f2a26ad62a5c155af9199af9e69b889claireho } 598327f654740f2a26ad62a5c155af9199af9e69b889claireho baseKeyLength = ucol_getSortKey(myCollation, testString, LEN(testString), baseKey, 256); 598427f654740f2a26ad62a5c155af9199af9e69b889claireho 598527f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_setReorderCodes(myCollation, reorderCodes, LEN(reorderCodes), &status); 598627f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(status)) { 598727f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(status, "ERROR: setting reorder codes: %s\n", myErrorName(status)); 598827f654740f2a26ad62a5c155af9199af9e69b889claireho return; 598927f654740f2a26ad62a5c155af9199af9e69b889claireho } 599027f654740f2a26ad62a5c155af9199af9e69b889claireho reorderKeyLength = ucol_getSortKey(myCollation, testString, LEN(testString), reorderKey, 256); 599127f654740f2a26ad62a5c155af9199af9e69b889claireho 599227f654740f2a26ad62a5c155af9199af9e69b889claireho if (baseKeyLength != reorderKeyLength) { 5993b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("Key lengths not the same during reordering.\n"); 599427f654740f2a26ad62a5c155af9199af9e69b889claireho return; 599527f654740f2a26ad62a5c155af9199af9e69b889claireho } 599627f654740f2a26ad62a5c155af9199af9e69b889claireho 599727f654740f2a26ad62a5c155af9199af9e69b889claireho for (i = 1; i < baseKeyLength; i++) { 599827f654740f2a26ad62a5c155af9199af9e69b889claireho if (baseKey[i] != reorderKey[i]) { 599927f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("Collation key bytes not the same at position %d.\n", i); 600027f654740f2a26ad62a5c155af9199af9e69b889claireho return; 600127f654740f2a26ad62a5c155af9199af9e69b889claireho } 600227f654740f2a26ad62a5c155af9199af9e69b889claireho } 600327f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_close(myCollation); 600427f654740f2a26ad62a5c155af9199af9e69b889claireho} 600527f654740f2a26ad62a5c155af9199af9e69b889claireho 600627f654740f2a26ad62a5c155af9199af9e69b889claireho/* 600727f654740f2a26ad62a5c155af9199af9e69b889claireho * Test reordering API. 600827f654740f2a26ad62a5c155af9199af9e69b889claireho */ 600927f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestReorderingAPI(void) 601027f654740f2a26ad62a5c155af9199af9e69b889claireho{ 601127f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode status = U_ZERO_ERROR; 601227f654740f2a26ad62a5c155af9199af9e69b889claireho UCollator *myCollation; 601327f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t reorderCodes[3] = {USCRIPT_GREEK, USCRIPT_HAN, UCOL_REORDER_CODE_PUNCTUATION}; 6014b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t duplicateReorderCodes[] = {USCRIPT_CUNEIFORM, USCRIPT_GREEK, UCOL_REORDER_CODE_CURRENCY, USCRIPT_EGYPTIAN_HIEROGLYPHS}; 6015b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t reorderCodesStartingWithDefault[] = {UCOL_REORDER_CODE_DEFAULT, USCRIPT_GREEK, USCRIPT_HAN, UCOL_REORDER_CODE_PUNCTUATION}; 601627f654740f2a26ad62a5c155af9199af9e69b889claireho UCollationResult collResult; 601727f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t retrievedReorderCodesLength; 6018b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t retrievedReorderCodes[10]; 601927f654740f2a26ad62a5c155af9199af9e69b889claireho UChar greekString[] = { 0x03b1 }; 602027f654740f2a26ad62a5c155af9199af9e69b889claireho UChar punctuationString[] = { 0x203e }; 6021b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int loopIndex; 602227f654740f2a26ad62a5c155af9199af9e69b889claireho 602327f654740f2a26ad62a5c155af9199af9e69b889claireho log_verbose("Testing non-lead bytes in a sort key with and without reordering\n"); 602427f654740f2a26ad62a5c155af9199af9e69b889claireho 602527f654740f2a26ad62a5c155af9199af9e69b889claireho /* build collator tertiary */ 602627f654740f2a26ad62a5c155af9199af9e69b889claireho myCollation = ucol_open("", &status); 602727f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_setStrength(myCollation, UCOL_TERTIARY); 602827f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(status)) { 602927f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(status, "ERROR: in creation of collator: %s\n", myErrorName(status)); 603027f654740f2a26ad62a5c155af9199af9e69b889claireho return; 603127f654740f2a26ad62a5c155af9199af9e69b889claireho } 603227f654740f2a26ad62a5c155af9199af9e69b889claireho 603327f654740f2a26ad62a5c155af9199af9e69b889claireho /* set the reorderding */ 603427f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_setReorderCodes(myCollation, reorderCodes, LEN(reorderCodes), &status); 603527f654740f2a26ad62a5c155af9199af9e69b889claireho if (U_FAILURE(status)) { 603627f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(status, "ERROR: setting reorder codes: %s\n", myErrorName(status)); 603727f654740f2a26ad62a5c155af9199af9e69b889claireho return; 603827f654740f2a26ad62a5c155af9199af9e69b889claireho } 603927f654740f2a26ad62a5c155af9199af9e69b889claireho 6040b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* get the reordering */ 604127f654740f2a26ad62a5c155af9199af9e69b889claireho retrievedReorderCodesLength = ucol_getReorderCodes(myCollation, NULL, 0, &status); 604227f654740f2a26ad62a5c155af9199af9e69b889claireho if (status != U_BUFFER_OVERFLOW_ERROR) { 604327f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(status, "ERROR: getting error codes should have returned U_BUFFER_OVERFLOW_ERROR : %s\n", myErrorName(status)); 604427f654740f2a26ad62a5c155af9199af9e69b889claireho return; 604527f654740f2a26ad62a5c155af9199af9e69b889claireho } 604627f654740f2a26ad62a5c155af9199af9e69b889claireho status = U_ZERO_ERROR; 604727f654740f2a26ad62a5c155af9199af9e69b889claireho if (retrievedReorderCodesLength != LEN(reorderCodes)) { 604827f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(status, "ERROR: retrieved reorder codes length was %d but should have been %d\n", retrievedReorderCodesLength, LEN(reorderCodes)); 604927f654740f2a26ad62a5c155af9199af9e69b889claireho return; 605027f654740f2a26ad62a5c155af9199af9e69b889claireho } 6051b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* now let's really get it */ 6052b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho retrievedReorderCodesLength = ucol_getReorderCodes(myCollation, retrievedReorderCodes, LEN(retrievedReorderCodes), &status); 6053b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(status)) { 6054b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: getting reorder codes: %s\n", myErrorName(status)); 6055b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6056b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6057b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (retrievedReorderCodesLength != LEN(reorderCodes)) { 6058b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: retrieved reorder codes length was %d but should have been %d\n", retrievedReorderCodesLength, LEN(reorderCodes)); 6059b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6060b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6061b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (loopIndex = 0; loopIndex < retrievedReorderCodesLength; loopIndex++) { 6062b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (retrievedReorderCodes[loopIndex] != reorderCodes[loopIndex]) { 6063b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: retrieved reorder code doesn't match set reorder code at index %d\n", loopIndex); 6064b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6065b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6066b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 606727f654740f2a26ad62a5c155af9199af9e69b889claireho collResult = ucol_strcoll(myCollation, greekString, LEN(greekString), punctuationString, LEN(punctuationString)); 606827f654740f2a26ad62a5c155af9199af9e69b889claireho if (collResult != UCOL_LESS) { 606927f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(status, "ERROR: collation result should have been UCOL_LESS\n"); 607027f654740f2a26ad62a5c155af9199af9e69b889claireho return; 607127f654740f2a26ad62a5c155af9199af9e69b889claireho } 607227f654740f2a26ad62a5c155af9199af9e69b889claireho 607327f654740f2a26ad62a5c155af9199af9e69b889claireho /* clear the reordering */ 607427f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_setReorderCodes(myCollation, NULL, 0, &status); 607527f654740f2a26ad62a5c155af9199af9e69b889claireho if (U_FAILURE(status)) { 607627f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(status, "ERROR: setting reorder codes to NULL: %s\n", myErrorName(status)); 607727f654740f2a26ad62a5c155af9199af9e69b889claireho return; 607827f654740f2a26ad62a5c155af9199af9e69b889claireho } 607927f654740f2a26ad62a5c155af9199af9e69b889claireho 6080b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* get the reordering again */ 608127f654740f2a26ad62a5c155af9199af9e69b889claireho retrievedReorderCodesLength = ucol_getReorderCodes(myCollation, NULL, 0, &status); 608227f654740f2a26ad62a5c155af9199af9e69b889claireho if (retrievedReorderCodesLength != 0) { 608327f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(status, "ERROR: retrieved reorder codes length was %d but should have been %d\n", retrievedReorderCodesLength, 0); 608427f654740f2a26ad62a5c155af9199af9e69b889claireho return; 608527f654740f2a26ad62a5c155af9199af9e69b889claireho } 608627f654740f2a26ad62a5c155af9199af9e69b889claireho 608727f654740f2a26ad62a5c155af9199af9e69b889claireho collResult = ucol_strcoll(myCollation, greekString, LEN(greekString), punctuationString, LEN(punctuationString)); 608827f654740f2a26ad62a5c155af9199af9e69b889claireho if (collResult != UCOL_GREATER) { 608927f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(status, "ERROR: collation result should have been UCOL_GREATER\n"); 609027f654740f2a26ad62a5c155af9199af9e69b889claireho return; 609127f654740f2a26ad62a5c155af9199af9e69b889claireho } 609227f654740f2a26ad62a5c155af9199af9e69b889claireho 6093b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* test for error condition on duplicate reorder codes */ 6094b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ucol_setReorderCodes(myCollation, duplicateReorderCodes, LEN(duplicateReorderCodes), &status); 6095b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (!U_FAILURE(status)) { 6096b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: setting duplicate reorder codes did not generate a failure\n"); 6097b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6098b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6099b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6100b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho status = U_ZERO_ERROR; 6101b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* test for reorder codes after a reset code */ 6102b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ucol_setReorderCodes(myCollation, reorderCodesStartingWithDefault, LEN(reorderCodesStartingWithDefault), &status); 6103b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (!U_FAILURE(status)) { 6104b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: reorderd code sequence starting with default and having following codes didn't cause an error\n"); 6105b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6106b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6107b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 610827f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_close(myCollation); 610927f654740f2a26ad62a5c155af9199af9e69b889claireho} 611027f654740f2a26ad62a5c155af9199af9e69b889claireho 611127f654740f2a26ad62a5c155af9199af9e69b889claireho/* 6112b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Test reordering API. 611327f654740f2a26ad62a5c155af9199af9e69b889claireho */ 6114b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestReorderingAPIWithRuleCreatedCollator(void) 611527f654740f2a26ad62a5c155af9199af9e69b889claireho{ 611627f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode status = U_ZERO_ERROR; 611727f654740f2a26ad62a5c155af9199af9e69b889claireho UCollator *myCollation; 6118b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar rules[90]; 6119b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t rulesReorderCodes[2] = {USCRIPT_HAN, USCRIPT_GREEK}; 6120b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t reorderCodes[3] = {USCRIPT_GREEK, USCRIPT_HAN, UCOL_REORDER_CODE_PUNCTUATION}; 6121b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCollationResult collResult; 6122b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t retrievedReorderCodesLength; 6123b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t retrievedReorderCodes[10]; 6124b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar greekString[] = { 0x03b1 }; 6125b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar punctuationString[] = { 0x203e }; 6126b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar hanString[] = { 0x65E5, 0x672C }; 6127b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int loopIndex; 612827f654740f2a26ad62a5c155af9199af9e69b889claireho 6129b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_verbose("Testing non-lead bytes in a sort key with and without reordering\n"); 6130b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6131b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* build collator from rules */ 6132b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho u_uastrcpy(rules, "[reorder Hani Grek]"); 6133b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myCollation = ucol_openRules(rules, u_strlen(rules), UCOL_DEFAULT, UCOL_TERTIARY, NULL, &status); 6134b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(U_FAILURE(status)) { 6135b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: in creation of collator: %s\n", myErrorName(status)); 6136b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6137b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6138b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6139b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* get the reordering */ 6140b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho retrievedReorderCodesLength = ucol_getReorderCodes(myCollation, retrievedReorderCodes, LEN(retrievedReorderCodes), &status); 6141b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(status)) { 6142b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: getting reorder codes: %s\n", myErrorName(status)); 6143b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6144b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6145b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (retrievedReorderCodesLength != LEN(rulesReorderCodes)) { 6146b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: retrieved reorder codes length was %d but should have been %d\n", retrievedReorderCodesLength, LEN(rulesReorderCodes)); 6147b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6148b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6149b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (loopIndex = 0; loopIndex < retrievedReorderCodesLength; loopIndex++) { 6150b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (retrievedReorderCodes[loopIndex] != rulesReorderCodes[loopIndex]) { 6151b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: retrieved reorder code doesn't match set reorder code at index %d\n", loopIndex); 615227f654740f2a26ad62a5c155af9199af9e69b889claireho return; 615327f654740f2a26ad62a5c155af9199af9e69b889claireho } 6154b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6155b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho collResult = ucol_strcoll(myCollation, greekString, LEN(greekString), hanString, LEN(hanString)); 6156b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (collResult != UCOL_GREATER) { 6157b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: collation result should have been UCOL_LESS\n"); 6158b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6159b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6160b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6161b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6162b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* set the reorderding */ 6163b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ucol_setReorderCodes(myCollation, reorderCodes, LEN(reorderCodes), &status); 6164b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(status)) { 6165b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: setting reorder codes: %s\n", myErrorName(status)); 6166b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6167b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6168b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6169b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* get the reordering */ 6170b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho retrievedReorderCodesLength = ucol_getReorderCodes(myCollation, NULL, 0, &status); 6171b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (status != U_BUFFER_OVERFLOW_ERROR) { 6172b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: getting error codes should have returned U_BUFFER_OVERFLOW_ERROR : %s\n", myErrorName(status)); 6173b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6174b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6175b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho status = U_ZERO_ERROR; 6176b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (retrievedReorderCodesLength != LEN(reorderCodes)) { 6177b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: retrieved reorder codes length was %d but should have been %d\n", retrievedReorderCodesLength, LEN(reorderCodes)); 6178b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6179b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6180b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* now let's really get it */ 6181b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho retrievedReorderCodesLength = ucol_getReorderCodes(myCollation, retrievedReorderCodes, LEN(retrievedReorderCodes), &status); 6182b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(status)) { 6183b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: getting reorder codes: %s\n", myErrorName(status)); 6184b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6185b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6186b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (retrievedReorderCodesLength != LEN(reorderCodes)) { 6187b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: retrieved reorder codes length was %d but should have been %d\n", retrievedReorderCodesLength, LEN(reorderCodes)); 6188b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6189b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6190b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (loopIndex = 0; loopIndex < retrievedReorderCodesLength; loopIndex++) { 6191b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (retrievedReorderCodes[loopIndex] != reorderCodes[loopIndex]) { 6192b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: retrieved reorder code doesn't match set reorder code at index %d\n", loopIndex); 619327f654740f2a26ad62a5c155af9199af9e69b889claireho return; 619427f654740f2a26ad62a5c155af9199af9e69b889claireho } 6195b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6196b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho collResult = ucol_strcoll(myCollation, greekString, LEN(greekString), punctuationString, LEN(punctuationString)); 6197b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (collResult != UCOL_LESS) { 6198b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: collation result should have been UCOL_LESS\n"); 6199b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6200b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6201b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6202b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* clear the reordering */ 6203b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ucol_setReorderCodes(myCollation, NULL, 0, &status); 6204b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(status)) { 6205b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: setting reorder codes to NULL: %s\n", myErrorName(status)); 6206b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6207b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6208b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6209b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* get the reordering again */ 6210b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho retrievedReorderCodesLength = ucol_getReorderCodes(myCollation, NULL, 0, &status); 6211b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (retrievedReorderCodesLength != 0) { 6212b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: retrieved reorder codes length was %d but should have been %d\n", retrievedReorderCodesLength, 0); 6213b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6214b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6215b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6216b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho collResult = ucol_strcoll(myCollation, greekString, LEN(greekString), punctuationString, LEN(punctuationString)); 6217b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (collResult != UCOL_GREATER) { 6218b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: collation result should have been UCOL_GREATER\n"); 6219b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6220b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6221b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6222b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ucol_close(myCollation); 6223b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 6224b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6225b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic int compareUScriptCodes(const void * a, const void * b) 6226b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{ 6227b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return ( *(int32_t*)a - *(int32_t*)b ); 6228b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 6229b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6230b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestEquivalentReorderingScripts(void) { 6231b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode status = U_ZERO_ERROR; 6232b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t equivalentScripts[50]; 6233b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t equivalentScriptsLength; 6234b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int loopIndex; 6235b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t equivalentScriptsResult[] = { 6236b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_BOPOMOFO, 6237b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_LISU, 6238b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_LYCIAN, 6239b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_CARIAN, 6240b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_LYDIAN, 6241b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_YI, 6242b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_OLD_ITALIC, 6243b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_GOTHIC, 6244b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_DESERET, 6245b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_SHAVIAN, 6246b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_OSMANYA, 6247b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_LINEAR_B, 6248b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_CYPRIOT, 6249b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_OLD_SOUTH_ARABIAN, 6250b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_AVESTAN, 6251b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_IMPERIAL_ARAMAIC, 6252b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_INSCRIPTIONAL_PARTHIAN, 6253b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_INSCRIPTIONAL_PAHLAVI, 6254b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_UGARITIC, 6255b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_OLD_PERSIAN, 6256b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_CUNEIFORM, 6257103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius USCRIPT_EGYPTIAN_HIEROGLYPHS, 6258103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius USCRIPT_PHONETIC_POLLARD, 6259103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius USCRIPT_SORA_SOMPENG, 6260103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius USCRIPT_MEROITIC_CURSIVE, 6261103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius USCRIPT_MEROITIC_HIEROGLYPHS 6262b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 6263b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6264b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho qsort(equivalentScriptsResult, LEN(equivalentScriptsResult), sizeof(int32_t), compareUScriptCodes); 6265b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6266b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* UScript.GOTHIC */ 6267b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho equivalentScriptsLength = ucol_getEquivalentReorderCodes(USCRIPT_GOTHIC, equivalentScripts, LEN(equivalentScripts), &status); 6268b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(status)) { 6269b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: retrieving equivalent reorder codes: %s\n", myErrorName(status)); 6270b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6271b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6272b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* 6273b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fprintf(stdout, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); 6274b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fprintf(stdout, "equivalentScriptsLength = %d\n", equivalentScriptsLength); 6275b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (loopIndex = 0; loopIndex < equivalentScriptsLength; loopIndex++) { 6276b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fprintf(stdout, "%d = %x\n", loopIndex, equivalentScripts[loopIndex]); 6277b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6278b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */ 6279b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (equivalentScriptsLength != LEN(equivalentScriptsResult)) { 6280b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: retrieved equivalent script length wrong: expected = %d, was = %d\n", LEN(equivalentScriptsResult), equivalentScriptsLength); 6281b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6282b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6283b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (loopIndex = 0; loopIndex < equivalentScriptsLength; loopIndex++) { 6284b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (equivalentScriptsResult[loopIndex] != equivalentScripts[loopIndex]) { 6285b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: equivalent scripts results don't match: expected = %d, was = %d\n", equivalentScriptsResult[loopIndex], equivalentScripts[loopIndex]); 6286b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6287b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6288b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6289b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6290b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* UScript.SHAVIAN */ 6291b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho equivalentScriptsLength = ucol_getEquivalentReorderCodes(USCRIPT_SHAVIAN, equivalentScripts, LEN(equivalentScripts), &status); 6292b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(status)) { 6293b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: retrieving equivalent reorder codes: %s\n", myErrorName(status)); 6294b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6295b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6296b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (equivalentScriptsLength != LEN(equivalentScriptsResult)) { 6297b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: retrieved equivalent script length wrong: expected = %d, was = %d\n", LEN(equivalentScriptsResult), equivalentScriptsLength); 6298b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6299b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6300b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (loopIndex = 0; loopIndex < equivalentScriptsLength; loopIndex++) { 6301b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (equivalentScriptsResult[loopIndex] != equivalentScripts[loopIndex]) { 6302b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: equivalent scripts results don't match: expected = %d, was = %d\n", equivalentScriptsResult[loopIndex], equivalentScripts[loopIndex]); 6303b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 630427f654740f2a26ad62a5c155af9199af9e69b889claireho } 630527f654740f2a26ad62a5c155af9199af9e69b889claireho } 630627f654740f2a26ad62a5c155af9199af9e69b889claireho} 630727f654740f2a26ad62a5c155af9199af9e69b889claireho 6308b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestReorderingAcrossCloning(void) 6309b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{ 6310b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode status = U_ZERO_ERROR; 6311b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCollator *myCollation; 6312b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t reorderCodes[3] = {USCRIPT_GREEK, USCRIPT_HAN, UCOL_REORDER_CODE_PUNCTUATION}; 6313b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCollator *clonedCollation; 6314b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t bufferSize; 6315b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t retrievedReorderCodesLength; 6316b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t retrievedReorderCodes[10]; 6317b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int loopIndex; 6318b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6319b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_verbose("Testing non-lead bytes in a sort key with and without reordering\n"); 6320b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6321b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* build collator tertiary */ 6322b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myCollation = ucol_open("", &status); 6323b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ucol_setStrength(myCollation, UCOL_TERTIARY); 6324b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(U_FAILURE(status)) { 6325b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: in creation of collator: %s\n", myErrorName(status)); 6326b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6327b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6328b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6329b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* set the reorderding */ 6330b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ucol_setReorderCodes(myCollation, reorderCodes, LEN(reorderCodes), &status); 6331b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(status)) { 6332b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: setting reorder codes: %s\n", myErrorName(status)); 6333b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6334b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6335b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6336b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* clone the collator */ 6337b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho clonedCollation = ucol_safeClone(myCollation, NULL, &bufferSize, &status); 6338b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(status)) { 6339b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: cloning collator: %s\n", myErrorName(status)); 6340b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6341b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6342b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6343b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* get the reordering */ 6344b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho retrievedReorderCodesLength = ucol_getReorderCodes(clonedCollation, retrievedReorderCodes, LEN(retrievedReorderCodes), &status); 6345b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(status)) { 6346b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: getting reorder codes: %s\n", myErrorName(status)); 6347b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6348b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6349b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (retrievedReorderCodesLength != LEN(reorderCodes)) { 6350b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: retrieved reorder codes length was %d but should have been %d\n", retrievedReorderCodesLength, LEN(reorderCodes)); 6351b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6352b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6353b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (loopIndex = 0; loopIndex < retrievedReorderCodesLength; loopIndex++) { 6354b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (retrievedReorderCodes[loopIndex] != reorderCodes[loopIndex]) { 6355b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: retrieved reorder code doesn't match set reorder code at index %d\n", loopIndex); 6356b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6357b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6358b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6359b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6360b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /*uprv_free(buffer);*/ 6361b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ucol_close(myCollation); 6362b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ucol_close(clonedCollation); 6363b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 6364b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6365b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* 6366b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Utility function to test one collation reordering test case set. 6367b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * @param testcases Array of test cases. 6368b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * @param n_testcases Size of the array testcases. 6369b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * @param reorderTokens Array of reordering codes. 6370b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * @param reorderTokensLen Size of the array reorderTokens. 6371b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */ 6372b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void doTestOneReorderingAPITestCase(const OneTestCase testCases[], uint32_t testCasesLen, const int32_t reorderTokens[], int32_t reorderTokensLen) 6373b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{ 6374b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uint32_t testCaseNum; 6375b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode status = U_ZERO_ERROR; 6376b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCollator *myCollation; 6377b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6378b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho myCollation = ucol_open("", &status); 6379b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(status)) { 6380b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: in creation of collator: %s\n", myErrorName(status)); 6381b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6382b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6383b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ucol_setReorderCodes(myCollation, reorderTokens, reorderTokensLen, &status); 6384b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(U_FAILURE(status)) { 6385b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR: while setting script order: %s\n", myErrorName(status)); 6386b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 6387b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6388b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6389b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (testCaseNum = 0; testCaseNum < testCasesLen; ++testCaseNum) { 6390b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho doTest(myCollation, 6391b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho testCases[testCaseNum].source, 6392b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho testCases[testCaseNum].target, 6393b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho testCases[testCaseNum].result 6394b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ); 6395b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 6396b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ucol_close(myCollation); 6397b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 6398b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 639927f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestGreekFirstReorder(void) 640027f654740f2a26ad62a5c155af9199af9e69b889claireho{ 640127f654740f2a26ad62a5c155af9199af9e69b889claireho const char* strRules[] = { 640227f654740f2a26ad62a5c155af9199af9e69b889claireho "[reorder Grek]" 640327f654740f2a26ad62a5c155af9199af9e69b889claireho }; 640427f654740f2a26ad62a5c155af9199af9e69b889claireho 640527f654740f2a26ad62a5c155af9199af9e69b889claireho const int32_t apiRules[] = { 640627f654740f2a26ad62a5c155af9199af9e69b889claireho USCRIPT_GREEK 640727f654740f2a26ad62a5c155af9199af9e69b889claireho }; 640827f654740f2a26ad62a5c155af9199af9e69b889claireho 640927f654740f2a26ad62a5c155af9199af9e69b889claireho const static OneTestCase privateUseCharacterStrings[] = { 641027f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0391}, {0x0391}, UCOL_EQUAL }, 641127f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0041}, {0x0391}, UCOL_GREATER }, 641227f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x03B1, 0x0041}, {0x03B1, 0x0391}, UCOL_GREATER }, 641327f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0060}, {0x0391}, UCOL_LESS }, 641427f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0391}, {0xe2dc}, UCOL_LESS }, 641527f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0391}, {0x0060}, UCOL_GREATER }, 641627f654740f2a26ad62a5c155af9199af9e69b889claireho }; 641727f654740f2a26ad62a5c155af9199af9e69b889claireho 641827f654740f2a26ad62a5c155af9199af9e69b889claireho /* Test rules creation */ 641927f654740f2a26ad62a5c155af9199af9e69b889claireho doTestOneTestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), strRules, LEN(strRules)); 642027f654740f2a26ad62a5c155af9199af9e69b889claireho 642127f654740f2a26ad62a5c155af9199af9e69b889claireho /* Test collation reordering API */ 642227f654740f2a26ad62a5c155af9199af9e69b889claireho doTestOneReorderingAPITestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), apiRules, LEN(apiRules)); 642327f654740f2a26ad62a5c155af9199af9e69b889claireho} 642427f654740f2a26ad62a5c155af9199af9e69b889claireho 642527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestGreekLastReorder(void) 642627f654740f2a26ad62a5c155af9199af9e69b889claireho{ 642727f654740f2a26ad62a5c155af9199af9e69b889claireho const char* strRules[] = { 642827f654740f2a26ad62a5c155af9199af9e69b889claireho "[reorder Zzzz Grek]" 642927f654740f2a26ad62a5c155af9199af9e69b889claireho }; 643027f654740f2a26ad62a5c155af9199af9e69b889claireho 643127f654740f2a26ad62a5c155af9199af9e69b889claireho const int32_t apiRules[] = { 643227f654740f2a26ad62a5c155af9199af9e69b889claireho USCRIPT_UNKNOWN, USCRIPT_GREEK 643327f654740f2a26ad62a5c155af9199af9e69b889claireho }; 643427f654740f2a26ad62a5c155af9199af9e69b889claireho 643527f654740f2a26ad62a5c155af9199af9e69b889claireho const static OneTestCase privateUseCharacterStrings[] = { 643627f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0391}, {0x0391}, UCOL_EQUAL }, 643727f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0041}, {0x0391}, UCOL_LESS }, 643827f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x03B1, 0x0041}, {0x03B1, 0x0391}, UCOL_LESS }, 643927f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0060}, {0x0391}, UCOL_LESS }, 644027f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0391}, {0xe2dc}, UCOL_GREATER }, 644127f654740f2a26ad62a5c155af9199af9e69b889claireho }; 644227f654740f2a26ad62a5c155af9199af9e69b889claireho 644327f654740f2a26ad62a5c155af9199af9e69b889claireho /* Test rules creation */ 644427f654740f2a26ad62a5c155af9199af9e69b889claireho doTestOneTestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), strRules, LEN(strRules)); 644527f654740f2a26ad62a5c155af9199af9e69b889claireho 644627f654740f2a26ad62a5c155af9199af9e69b889claireho /* Test collation reordering API */ 644727f654740f2a26ad62a5c155af9199af9e69b889claireho doTestOneReorderingAPITestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), apiRules, LEN(apiRules)); 644827f654740f2a26ad62a5c155af9199af9e69b889claireho} 644927f654740f2a26ad62a5c155af9199af9e69b889claireho 645027f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestNonScriptReorder(void) 645127f654740f2a26ad62a5c155af9199af9e69b889claireho{ 645227f654740f2a26ad62a5c155af9199af9e69b889claireho const char* strRules[] = { 645327f654740f2a26ad62a5c155af9199af9e69b889claireho "[reorder Grek Symbol DIGIT Latn Punct space Zzzz cURRENCy]" 645427f654740f2a26ad62a5c155af9199af9e69b889claireho }; 645527f654740f2a26ad62a5c155af9199af9e69b889claireho 645627f654740f2a26ad62a5c155af9199af9e69b889claireho const int32_t apiRules[] = { 645727f654740f2a26ad62a5c155af9199af9e69b889claireho USCRIPT_GREEK, UCOL_REORDER_CODE_SYMBOL, UCOL_REORDER_CODE_DIGIT, USCRIPT_LATIN, 645827f654740f2a26ad62a5c155af9199af9e69b889claireho UCOL_REORDER_CODE_PUNCTUATION, UCOL_REORDER_CODE_SPACE, USCRIPT_UNKNOWN, 645927f654740f2a26ad62a5c155af9199af9e69b889claireho UCOL_REORDER_CODE_CURRENCY 646027f654740f2a26ad62a5c155af9199af9e69b889claireho }; 646127f654740f2a26ad62a5c155af9199af9e69b889claireho 646227f654740f2a26ad62a5c155af9199af9e69b889claireho const static OneTestCase privateUseCharacterStrings[] = { 646327f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0391}, {0x0041}, UCOL_LESS }, 646427f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0041}, {0x0391}, UCOL_GREATER }, 646527f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0060}, {0x0041}, UCOL_LESS }, 646627f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0060}, {0x0391}, UCOL_GREATER }, 646727f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x0024}, {0x0041}, UCOL_GREATER }, 646827f654740f2a26ad62a5c155af9199af9e69b889claireho }; 646927f654740f2a26ad62a5c155af9199af9e69b889claireho 647027f654740f2a26ad62a5c155af9199af9e69b889claireho /* Test rules creation */ 647127f654740f2a26ad62a5c155af9199af9e69b889claireho doTestOneTestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), strRules, LEN(strRules)); 647227f654740f2a26ad62a5c155af9199af9e69b889claireho 647327f654740f2a26ad62a5c155af9199af9e69b889claireho /* Test collation reordering API */ 647427f654740f2a26ad62a5c155af9199af9e69b889claireho doTestOneReorderingAPITestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), apiRules, LEN(apiRules)); 647527f654740f2a26ad62a5c155af9199af9e69b889claireho} 647627f654740f2a26ad62a5c155af9199af9e69b889claireho 647727f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestHaniReorder(void) 647827f654740f2a26ad62a5c155af9199af9e69b889claireho{ 647927f654740f2a26ad62a5c155af9199af9e69b889claireho const char* strRules[] = { 648027f654740f2a26ad62a5c155af9199af9e69b889claireho "[reorder Hani]" 648127f654740f2a26ad62a5c155af9199af9e69b889claireho }; 648227f654740f2a26ad62a5c155af9199af9e69b889claireho const int32_t apiRules[] = { 648327f654740f2a26ad62a5c155af9199af9e69b889claireho USCRIPT_HAN 648427f654740f2a26ad62a5c155af9199af9e69b889claireho }; 648527f654740f2a26ad62a5c155af9199af9e69b889claireho 648627f654740f2a26ad62a5c155af9199af9e69b889claireho const static OneTestCase privateUseCharacterStrings[] = { 648727f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x4e00}, {0x0041}, UCOL_LESS }, 648827f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x4e00}, {0x0060}, UCOL_GREATER }, 648927f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xD86D, 0xDF40}, {0x0041}, UCOL_LESS }, 649027f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xD86D, 0xDF40}, {0x0060}, UCOL_GREATER }, 649127f654740f2a26ad62a5c155af9199af9e69b889claireho { {0x4e00}, {0xD86D, 0xDF40}, UCOL_LESS }, 649227f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xfa27}, {0x0041}, UCOL_LESS }, 649327f654740f2a26ad62a5c155af9199af9e69b889claireho { {0xD869, 0xDF00}, {0x0041}, UCOL_LESS }, 649427f654740f2a26ad62a5c155af9199af9e69b889claireho }; 649527f654740f2a26ad62a5c155af9199af9e69b889claireho 649627f654740f2a26ad62a5c155af9199af9e69b889claireho /* Test rules creation */ 649727f654740f2a26ad62a5c155af9199af9e69b889claireho doTestOneTestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), strRules, LEN(strRules)); 649827f654740f2a26ad62a5c155af9199af9e69b889claireho 649927f654740f2a26ad62a5c155af9199af9e69b889claireho /* Test collation reordering API */ 650027f654740f2a26ad62a5c155af9199af9e69b889claireho doTestOneReorderingAPITestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), apiRules, LEN(apiRules)); 650127f654740f2a26ad62a5c155af9199af9e69b889claireho} 650227f654740f2a26ad62a5c155af9199af9e69b889claireho 6503103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void TestHaniReorderWithOtherRules(void) 6504103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius{ 6505103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const char* strRules[] = { 6506103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "[reorder Hani] &b<a" 6507103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 650854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /*const int32_t apiRules[] = { 6509103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius USCRIPT_HAN 651054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius };*/ 6511103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6512103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const static OneTestCase privateUseCharacterStrings[] = { 6513103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x4e00}, {0x0041}, UCOL_LESS }, 6514103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x4e00}, {0x0060}, UCOL_GREATER }, 6515103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0xD86D, 0xDF40}, {0x0041}, UCOL_LESS }, 6516103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0xD86D, 0xDF40}, {0x0060}, UCOL_GREATER }, 6517103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x4e00}, {0xD86D, 0xDF40}, UCOL_LESS }, 6518103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0xfa27}, {0x0041}, UCOL_LESS }, 6519103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0xD869, 0xDF00}, {0x0041}, UCOL_LESS }, 6520103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x0062}, {0x0061}, UCOL_LESS }, 6521103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 6522103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6523103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* Test rules creation */ 6524103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius doTestOneTestCase(privateUseCharacterStrings, LEN(privateUseCharacterStrings), strRules, LEN(strRules)); 6525103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 6526103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6527b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestMultipleReorder(void) 6528b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{ 6529b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const char* strRules[] = { 6530b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho "[reorder Grek Zzzz DIGIT Latn Hani]" 6531b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 6532b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6533b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const int32_t apiRules[] = { 6534b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho USCRIPT_GREEK, USCRIPT_UNKNOWN, UCOL_REORDER_CODE_DIGIT, USCRIPT_LATIN, USCRIPT_HAN 6535b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 6536b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6537b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const static OneTestCase collationTestCases[] = { 6538b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { {0x0391}, {0x0041}, UCOL_LESS}, 6539b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { {0x0031}, {0x0041}, UCOL_LESS}, 6540b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { {0x0041}, {0x4e00}, UCOL_LESS}, 6541b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 6542b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6543b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* Test rules creation */ 6544b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho doTestOneTestCase(collationTestCases, LEN(collationTestCases), strRules, LEN(strRules)); 6545b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6546b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* Test collation reordering API */ 6547b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho doTestOneReorderingAPITestCase(collationTestCases, LEN(collationTestCases), apiRules, LEN(apiRules)); 6548b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 6549b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6550103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/* 6551103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Test that covers issue reported in ticket 8814 6552103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */ 655354dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void TestReorderWithNumericCollation(void) 6554103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius{ 6555103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UErrorCode status = U_ZERO_ERROR; 6556103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UCollator *myCollation; 6557103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UCollator *myReorderCollation; 6558103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t reorderCodes[] = {UCOL_REORDER_CODE_SPACE, UCOL_REORDER_CODE_PUNCTUATION, UCOL_REORDER_CODE_SYMBOL, UCOL_REORDER_CODE_DIGIT, USCRIPT_GREEK,USCRIPT_LATIN, USCRIPT_HEBREW, UCOL_REORDER_CODE_OTHERS}; 6559103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* UChar fortyS[] = { 0x0034, 0x0030, 0x0053 }; 6560103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar fortyThreeP[] = { 0x0034, 0x0033, 0x0050 }; */ 6561103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar fortyS[] = { 0x0053 }; 6562103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar fortyThreeP[] = { 0x0050 }; 6563103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius uint8_t fortyS_sortKey[128]; 6564103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t fortyS_sortKey_Length; 6565103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius uint8_t fortyThreeP_sortKey[128]; 6566103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t fortyThreeP_sortKey_Length; 6567103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius uint8_t fortyS_sortKey_reorder[128]; 6568103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t fortyS_sortKey_reorder_Length; 6569103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius uint8_t fortyThreeP_sortKey_reorder[128]; 6570103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t fortyThreeP_sortKey_reorder_Length; 6571103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UCollationResult collResult; 6572103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UCollationResult collResultReorder; 6573103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6574103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_verbose("Testing reordering with and without numeric collation\n"); 6575103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6576103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* build collator tertiary with numeric */ 6577103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius myCollation = ucol_open("", &status); 6578103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* 6579103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ucol_setStrength(myCollation, UCOL_TERTIARY); 6580103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */ 6581103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ucol_setAttribute(myCollation, UCOL_NUMERIC_COLLATION, UCOL_ON, &status); 6582103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(status)) { 6583103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err_status(status, "ERROR: in creation of collator: %s\n", myErrorName(status)); 6584103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 6585103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 6586103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6587103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* build collator tertiary with numeric and reordering */ 6588103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius myReorderCollation = ucol_open("", &status); 6589103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* 6590103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ucol_setStrength(myReorderCollation, UCOL_TERTIARY); 6591103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */ 6592103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ucol_setAttribute(myReorderCollation, UCOL_NUMERIC_COLLATION, UCOL_ON, &status); 6593103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ucol_setReorderCodes(myReorderCollation, reorderCodes, LEN(reorderCodes), &status); 6594103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(U_FAILURE(status)) { 6595103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err_status(status, "ERROR: in creation of collator: %s\n", myErrorName(status)); 6596103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 6597103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 6598103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6599103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fortyS_sortKey_Length = ucol_getSortKey(myCollation, fortyS, LEN(fortyS), fortyS_sortKey, 128); 6600103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fortyThreeP_sortKey_Length = ucol_getSortKey(myCollation, fortyThreeP, LEN(fortyThreeP), fortyThreeP_sortKey, 128); 6601103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fortyS_sortKey_reorder_Length = ucol_getSortKey(myReorderCollation, fortyS, LEN(fortyS), fortyS_sortKey_reorder, 128); 6602103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fortyThreeP_sortKey_reorder_Length = ucol_getSortKey(myReorderCollation, fortyThreeP, LEN(fortyThreeP), fortyThreeP_sortKey_reorder, 128); 6603103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6604103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (fortyS_sortKey_Length < 0 || fortyThreeP_sortKey_Length < 0 || fortyS_sortKey_reorder_Length < 0 || fortyThreeP_sortKey_reorder_Length < 0) { 6605103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err_status(status, "ERROR: couldn't generate sort keys\n"); 6606103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 6607103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 6608103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius collResult = ucol_strcoll(myCollation, fortyS, LEN(fortyS), fortyThreeP, LEN(fortyThreeP)); 6609103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius collResultReorder = ucol_strcoll(myReorderCollation, fortyS, LEN(fortyS), fortyThreeP, LEN(fortyThreeP)); 6610103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* 6611103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "\tcollResult = %x\n", collResult); 6612103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "\tcollResultReorder = %x\n", collResultReorder); 6613103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "\nfortyS\n"); 6614103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius for (i = 0; i < fortyS_sortKey_Length; i++) { 6615103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "%x --- %x\n", fortyS_sortKey[i], fortyS_sortKey_reorder[i]); 6616103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 6617103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "\nfortyThreeP\n"); 6618103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius for (i = 0; i < fortyThreeP_sortKey_Length; i++) { 6619103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fprintf(stderr, "%x --- %x\n", fortyThreeP_sortKey[i], fortyThreeP_sortKey_reorder[i]); 6620103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 6621103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */ 6622103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (collResult != collResultReorder) { 6623103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius log_err_status(status, "ERROR: collation results should have been the same.\n"); 6624103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 6625103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 6626103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6627103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ucol_close(myCollation); 6628103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ucol_close(myReorderCollation); 6629103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 6630103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 663127f654740f2a26ad62a5c155af9199af9e69b889clairehostatic int compare_uint8_t_arrays(const uint8_t* a, const uint8_t* b) 663227f654740f2a26ad62a5c155af9199af9e69b889claireho{ 663327f654740f2a26ad62a5c155af9199af9e69b889claireho for (; *a == *b; ++a, ++b) { 663427f654740f2a26ad62a5c155af9199af9e69b889claireho if (*a == 0) { 663527f654740f2a26ad62a5c155af9199af9e69b889claireho return 0; 663627f654740f2a26ad62a5c155af9199af9e69b889claireho } 663727f654740f2a26ad62a5c155af9199af9e69b889claireho } 663827f654740f2a26ad62a5c155af9199af9e69b889claireho return (*a < *b ? -1 : 1); 663927f654740f2a26ad62a5c155af9199af9e69b889claireho} 664027f654740f2a26ad62a5c155af9199af9e69b889claireho 6641103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void TestImportRulesDeWithPhonebook(void) 6642103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius{ 6643103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const char* normalRules[] = { 6644103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "&a<\\u00e6<\\u00c6<\\u00dc<\\u00fc", 6645103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "&a<<\\u00e6<<\\u00c6<<\\u00dc<<\\u00fc", 6646103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "&a<<\\u00e6<<<\\u00c6<<\\u00dc<<\\u00fc", 6647103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 6648103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const OneTestCase normalTests[] = { 6649103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x00e6}, {0x00c6}, UCOL_LESS}, 6650103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x00fc}, {0x00dc}, UCOL_GREATER}, 6651103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 6652103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6653103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const char* importRules[] = { 6654103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "&a<\\u00e6<\\u00c6<\\u00dc<\\u00fc[import de-u-co-phonebk]", 6655103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "&a<<\\u00e6<<\\u00c6<<\\u00dc<<\\u00fc[import de-u-co-phonebk]", 6656103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "&a<<\\u00e6<<<\\u00c6<<\\u00dc<<\\u00fc[import de-u-co-phonebk]", 6657103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 6658103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const OneTestCase importTests[] = { 6659103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x00e6}, {0x00c6}, UCOL_LESS}, 6660103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x00fc}, {0x00dc}, UCOL_LESS}, 6661103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 6662103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6663103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius doTestOneTestCase(normalTests, LEN(normalTests), normalRules, LEN(normalRules)); 66648393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius // BEGIN Android-remove. Android does not use rule-based collation0 66658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius // doTestOneTestCase(importTests, LEN(importTests), importRules, LEN(importRules)); 66668393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius // END Android-remove 6667103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 6668103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 666954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if 0 6670103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void TestImportRulesFiWithEor(void) 6671103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius{ 6672103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* DUCET. */ 6673103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const char* defaultRules[] = { 6674103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "&a<b", /* Dummy rule. */ 6675103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 6676103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6677103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const OneTestCase defaultTests[] = { 6678103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x0110}, {0x00F0}, UCOL_LESS}, 6679103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x00a3}, {0x00a5}, UCOL_LESS}, 6680103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x0061}, {0x0061, 0x00a3}, UCOL_LESS}, 6681103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 6682103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6683103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* European Ordering rules: ignore currency characters. */ 6684103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const char* eorRules[] = { 6685103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "[import root-u-co-eor]", 6686103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 6687103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6688103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const OneTestCase eorTests[] = { 6689103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x0110}, {0x00F0}, UCOL_LESS}, 6690103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x00a3}, {0x00a5}, UCOL_EQUAL}, 6691103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x0061}, {0x0061, 0x00a3}, UCOL_EQUAL}, 6692103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 6693103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6694103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const char* fiStdRules[] = { 6695103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "[import fi-u-co-standard]", 6696103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 6697103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6698103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const OneTestCase fiStdTests[] = { 6699103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x0110}, {0x00F0}, UCOL_GREATER}, 6700103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x00a3}, {0x00a5}, UCOL_LESS}, 6701103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x0061}, {0x0061, 0x00a3}, UCOL_LESS}, 6702103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 6703103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6704103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* Both European Ordering Rules and Fi Standard Rules. */ 6705103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const char* eorFiStdRules[] = { 6706103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "[import root-u-co-eor][import fi-u-co-standard]", 6707103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 6708103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6709103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* This is essentially same as the one before once fi.txt is updated with import. */ 6710103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const char* fiEorRules[] = { 6711103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "[import fi-u-co-eor]", 6712103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 6713103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6714103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const OneTestCase fiEorTests[] = { 6715103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x0110}, {0x00F0}, UCOL_GREATER}, 6716103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x00a3}, {0x00a5}, UCOL_EQUAL}, 6717103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x0061}, {0x0061, 0x00a3}, UCOL_EQUAL}, 6718103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 6719103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6720103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius doTestOneTestCase(defaultTests, LEN(defaultTests), defaultRules, LEN(defaultRules)); 6721103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius doTestOneTestCase(eorTests, LEN(eorTests), eorRules, LEN(eorRules)); 6722103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius doTestOneTestCase(fiStdTests, LEN(fiStdTests), fiStdRules, LEN(fiStdRules)); 6723103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius doTestOneTestCase(fiEorTests, LEN(fiEorTests), eorFiStdRules, LEN(eorFiStdRules)); 6724103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6725103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* TODO: Fix ICU ticket #8962 by uncommenting the following test after fi.txt is updated with the following rule: 6726103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius eor{ 6727103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius Sequence{ 6728103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "[import root-u-co-eor][import fi-u-co-standard]" 6729103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 6730103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius Version{"21.0"} 6731103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 6732103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */ 6733103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* doTestOneTestCase(fiEorTests, LEN(fiEorTests), fiEorRules, LEN(fiEorRules)); */ 6734103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6735103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 673654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif 6737103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6738103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if 0 6739103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/* 6740103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * This test case tests inclusion with the unihan rules, but this cannot be included now, unless 6741103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * the resource files are built with -includeUnihanColl option. 6742103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * TODO: Uncomment this function and make it work when unihan rules are built by default. 6743103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */ 6744103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void TestImportRulesCJKWithUnihan(void) 6745103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius{ 6746103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* DUCET. */ 6747103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const char* defaultRules[] = { 6748103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "&a<b", /* Dummy rule. */ 6749103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 6750103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6751103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const OneTestCase defaultTests[] = { 6752103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x3402}, {0x4e1e}, UCOL_GREATER}, 6753103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 6754103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6755103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* European Ordering rules: ignore currency characters. */ 6756103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const char* unihanRules[] = { 6757103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius "[import ko-u-co-unihan]", 6758103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 6759103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6760103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const OneTestCase unihanTests[] = { 6761103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { {0x3402}, {0x4e1e}, UCOL_LESS}, 6762103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 6763103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6764103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius doTestOneTestCase(defaultTests, LEN(defaultTests), defaultRules, LEN(defaultRules)); 6765103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius doTestOneTestCase(unihanTests, LEN(unihanTests), unihanRules, LEN(unihanRules)); 6766103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 6767103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 6768103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 6769103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 677027f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestImport(void) 677127f654740f2a26ad62a5c155af9199af9e69b889claireho{ 677227f654740f2a26ad62a5c155af9199af9e69b889claireho UCollator* vicoll; 677327f654740f2a26ad62a5c155af9199af9e69b889claireho UCollator* escoll; 677427f654740f2a26ad62a5c155af9199af9e69b889claireho UCollator* viescoll; 677527f654740f2a26ad62a5c155af9199af9e69b889claireho UCollator* importviescoll; 677627f654740f2a26ad62a5c155af9199af9e69b889claireho UParseError error; 677727f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode status = U_ZERO_ERROR; 677827f654740f2a26ad62a5c155af9199af9e69b889claireho UChar* virules; 677927f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t viruleslength; 678027f654740f2a26ad62a5c155af9199af9e69b889claireho UChar* esrules; 678127f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t esruleslength; 678227f654740f2a26ad62a5c155af9199af9e69b889claireho UChar* viesrules; 678327f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t viesruleslength; 678427f654740f2a26ad62a5c155af9199af9e69b889claireho char srules[500] = "[import vi][import es]"; 678527f654740f2a26ad62a5c155af9199af9e69b889claireho UChar rules[500]; 678627f654740f2a26ad62a5c155af9199af9e69b889claireho uint32_t length = 0; 678727f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t itemCount; 678827f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t i, k; 678927f654740f2a26ad62a5c155af9199af9e69b889claireho UChar32 start; 679027f654740f2a26ad62a5c155af9199af9e69b889claireho UChar32 end; 679127f654740f2a26ad62a5c155af9199af9e69b889claireho UChar str[500]; 679227f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t strLength; 679327f654740f2a26ad62a5c155af9199af9e69b889claireho 679427f654740f2a26ad62a5c155af9199af9e69b889claireho uint8_t sk1[500]; 679527f654740f2a26ad62a5c155af9199af9e69b889claireho uint8_t sk2[500]; 679627f654740f2a26ad62a5c155af9199af9e69b889claireho 679727f654740f2a26ad62a5c155af9199af9e69b889claireho UBool b; 679827f654740f2a26ad62a5c155af9199af9e69b889claireho USet* tailoredSet; 679927f654740f2a26ad62a5c155af9199af9e69b889claireho USet* importTailoredSet; 680027f654740f2a26ad62a5c155af9199af9e69b889claireho 680127f654740f2a26ad62a5c155af9199af9e69b889claireho 680227f654740f2a26ad62a5c155af9199af9e69b889claireho vicoll = ucol_open("vi", &status); 680327f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(status)){ 680427f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(status, "ERROR: Call ucol_open(\"vi\", ...): %s\n", myErrorName(status)); 680527f654740f2a26ad62a5c155af9199af9e69b889claireho return; 680627f654740f2a26ad62a5c155af9199af9e69b889claireho } 680727f654740f2a26ad62a5c155af9199af9e69b889claireho 680827f654740f2a26ad62a5c155af9199af9e69b889claireho virules = (UChar*) ucol_getRules(vicoll, &viruleslength); 680927f654740f2a26ad62a5c155af9199af9e69b889claireho escoll = ucol_open("es", &status); 681027f654740f2a26ad62a5c155af9199af9e69b889claireho esrules = (UChar*) ucol_getRules(escoll, &esruleslength); 681127f654740f2a26ad62a5c155af9199af9e69b889claireho viesrules = (UChar*)uprv_malloc((viruleslength+esruleslength+1)*sizeof(UChar*)); 681227f654740f2a26ad62a5c155af9199af9e69b889claireho viesrules[0] = 0; 681327f654740f2a26ad62a5c155af9199af9e69b889claireho u_strcat(viesrules, virules); 681427f654740f2a26ad62a5c155af9199af9e69b889claireho u_strcat(viesrules, esrules); 681527f654740f2a26ad62a5c155af9199af9e69b889claireho viesruleslength = viruleslength + esruleslength; 681627f654740f2a26ad62a5c155af9199af9e69b889claireho viescoll = ucol_openRules(viesrules, viesruleslength, UCOL_ON, UCOL_TERTIARY, &error, &status); 681727f654740f2a26ad62a5c155af9199af9e69b889claireho 681827f654740f2a26ad62a5c155af9199af9e69b889claireho /* u_strFromUTF8(rules, 500, &length, srules, strlen(srules), &status); */ 681927f654740f2a26ad62a5c155af9199af9e69b889claireho length = u_unescape(srules, rules, 500); 682027f654740f2a26ad62a5c155af9199af9e69b889claireho importviescoll = ucol_openRules(rules, length, UCOL_ON, UCOL_TERTIARY, &error, &status); 682127f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(status)){ 682227f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(status, "ERROR: in creation of rule based collator: %s\n", myErrorName(status)); 682327f654740f2a26ad62a5c155af9199af9e69b889claireho return; 682427f654740f2a26ad62a5c155af9199af9e69b889claireho } 682527f654740f2a26ad62a5c155af9199af9e69b889claireho 682627f654740f2a26ad62a5c155af9199af9e69b889claireho tailoredSet = ucol_getTailoredSet(viescoll, &status); 682727f654740f2a26ad62a5c155af9199af9e69b889claireho importTailoredSet = ucol_getTailoredSet(importviescoll, &status); 682827f654740f2a26ad62a5c155af9199af9e69b889claireho 682927f654740f2a26ad62a5c155af9199af9e69b889claireho if(!uset_equals(tailoredSet, importTailoredSet)){ 683027f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("Tailored sets not equal"); 683127f654740f2a26ad62a5c155af9199af9e69b889claireho } 683227f654740f2a26ad62a5c155af9199af9e69b889claireho 683327f654740f2a26ad62a5c155af9199af9e69b889claireho uset_close(importTailoredSet); 683427f654740f2a26ad62a5c155af9199af9e69b889claireho 683527f654740f2a26ad62a5c155af9199af9e69b889claireho itemCount = uset_getItemCount(tailoredSet); 683627f654740f2a26ad62a5c155af9199af9e69b889claireho 683727f654740f2a26ad62a5c155af9199af9e69b889claireho for( i = 0; i < itemCount; i++){ 683827f654740f2a26ad62a5c155af9199af9e69b889claireho strLength = uset_getItem(tailoredSet, i, &start, &end, str, 500, &status); 683927f654740f2a26ad62a5c155af9199af9e69b889claireho if(strLength < 2){ 684027f654740f2a26ad62a5c155af9199af9e69b889claireho for (; start <= end; start++){ 684127f654740f2a26ad62a5c155af9199af9e69b889claireho k = 0; 684227f654740f2a26ad62a5c155af9199af9e69b889claireho U16_APPEND(str, k, 500, start, b); 684327f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_getSortKey(viescoll, str, 1, sk1, 500); 684427f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_getSortKey(importviescoll, str, 1, sk2, 500); 684527f654740f2a26ad62a5c155af9199af9e69b889claireho if(compare_uint8_t_arrays(sk1, sk2) != 0){ 684627f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("Sort key for %s not equal\n", str); 684727f654740f2a26ad62a5c155af9199af9e69b889claireho break; 684827f654740f2a26ad62a5c155af9199af9e69b889claireho } 684927f654740f2a26ad62a5c155af9199af9e69b889claireho } 685027f654740f2a26ad62a5c155af9199af9e69b889claireho }else{ 685127f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_getSortKey(viescoll, str, strLength, sk1, 500); 685227f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_getSortKey(importviescoll, str, strLength, sk2, 500); 685327f654740f2a26ad62a5c155af9199af9e69b889claireho if(compare_uint8_t_arrays(sk1, sk2) != 0){ 685427f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("ZZSort key for %s not equal\n", str); 685527f654740f2a26ad62a5c155af9199af9e69b889claireho break; 685627f654740f2a26ad62a5c155af9199af9e69b889claireho } 685727f654740f2a26ad62a5c155af9199af9e69b889claireho 685827f654740f2a26ad62a5c155af9199af9e69b889claireho } 685927f654740f2a26ad62a5c155af9199af9e69b889claireho } 686027f654740f2a26ad62a5c155af9199af9e69b889claireho 686127f654740f2a26ad62a5c155af9199af9e69b889claireho uset_close(tailoredSet); 686227f654740f2a26ad62a5c155af9199af9e69b889claireho 686327f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_free(viesrules); 686427f654740f2a26ad62a5c155af9199af9e69b889claireho 686527f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_close(vicoll); 686627f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_close(escoll); 686727f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_close(viescoll); 686827f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_close(importviescoll); 686927f654740f2a26ad62a5c155af9199af9e69b889claireho} 687027f654740f2a26ad62a5c155af9199af9e69b889claireho 687127f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestImportWithType(void) 687227f654740f2a26ad62a5c155af9199af9e69b889claireho{ 687327f654740f2a26ad62a5c155af9199af9e69b889claireho UCollator* vicoll; 687427f654740f2a26ad62a5c155af9199af9e69b889claireho UCollator* decoll; 687527f654740f2a26ad62a5c155af9199af9e69b889claireho UCollator* videcoll; 687627f654740f2a26ad62a5c155af9199af9e69b889claireho UCollator* importvidecoll; 687727f654740f2a26ad62a5c155af9199af9e69b889claireho UParseError error; 687827f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode status = U_ZERO_ERROR; 687927f654740f2a26ad62a5c155af9199af9e69b889claireho const UChar* virules; 688027f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t viruleslength; 688127f654740f2a26ad62a5c155af9199af9e69b889claireho const UChar* derules; 688227f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t deruleslength; 688327f654740f2a26ad62a5c155af9199af9e69b889claireho UChar* viderules; 688427f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t videruleslength; 688527f654740f2a26ad62a5c155af9199af9e69b889claireho const char srules[500] = "[import vi][import de-u-co-phonebk]"; 688627f654740f2a26ad62a5c155af9199af9e69b889claireho UChar rules[500]; 688727f654740f2a26ad62a5c155af9199af9e69b889claireho uint32_t length = 0; 688827f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t itemCount; 688927f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t i, k; 689027f654740f2a26ad62a5c155af9199af9e69b889claireho UChar32 start; 689127f654740f2a26ad62a5c155af9199af9e69b889claireho UChar32 end; 689227f654740f2a26ad62a5c155af9199af9e69b889claireho UChar str[500]; 689327f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t strLength; 689427f654740f2a26ad62a5c155af9199af9e69b889claireho 689527f654740f2a26ad62a5c155af9199af9e69b889claireho uint8_t sk1[500]; 689627f654740f2a26ad62a5c155af9199af9e69b889claireho uint8_t sk2[500]; 689727f654740f2a26ad62a5c155af9199af9e69b889claireho 689827f654740f2a26ad62a5c155af9199af9e69b889claireho USet* tailoredSet; 689927f654740f2a26ad62a5c155af9199af9e69b889claireho USet* importTailoredSet; 690027f654740f2a26ad62a5c155af9199af9e69b889claireho 690127f654740f2a26ad62a5c155af9199af9e69b889claireho vicoll = ucol_open("vi", &status); 690227f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(status)){ 690327f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(status, "ERROR: in creation of rule based collator: %s\n", myErrorName(status)); 690427f654740f2a26ad62a5c155af9199af9e69b889claireho return; 690527f654740f2a26ad62a5c155af9199af9e69b889claireho } 690627f654740f2a26ad62a5c155af9199af9e69b889claireho virules = ucol_getRules(vicoll, &viruleslength); 690727f654740f2a26ad62a5c155af9199af9e69b889claireho /* decoll = ucol_open("de@collation=phonebook", &status); */ 690827f654740f2a26ad62a5c155af9199af9e69b889claireho decoll = ucol_open("de-u-co-phonebk", &status); 690927f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(status)){ 691027f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(status, "ERROR: in creation of rule based collator: %s\n", myErrorName(status)); 691127f654740f2a26ad62a5c155af9199af9e69b889claireho return; 691227f654740f2a26ad62a5c155af9199af9e69b889claireho } 691327f654740f2a26ad62a5c155af9199af9e69b889claireho 691427f654740f2a26ad62a5c155af9199af9e69b889claireho 691527f654740f2a26ad62a5c155af9199af9e69b889claireho derules = ucol_getRules(decoll, &deruleslength); 691627f654740f2a26ad62a5c155af9199af9e69b889claireho viderules = (UChar*)uprv_malloc((viruleslength+deruleslength+1)*sizeof(UChar*)); 691727f654740f2a26ad62a5c155af9199af9e69b889claireho viderules[0] = 0; 691827f654740f2a26ad62a5c155af9199af9e69b889claireho u_strcat(viderules, virules); 691927f654740f2a26ad62a5c155af9199af9e69b889claireho u_strcat(viderules, derules); 692027f654740f2a26ad62a5c155af9199af9e69b889claireho videruleslength = viruleslength + deruleslength; 692127f654740f2a26ad62a5c155af9199af9e69b889claireho videcoll = ucol_openRules(viderules, videruleslength, UCOL_ON, UCOL_TERTIARY, &error, &status); 692227f654740f2a26ad62a5c155af9199af9e69b889claireho 692327f654740f2a26ad62a5c155af9199af9e69b889claireho /* u_strFromUTF8(rules, 500, &length, srules, strlen(srules), &status); */ 692427f654740f2a26ad62a5c155af9199af9e69b889claireho length = u_unescape(srules, rules, 500); 692527f654740f2a26ad62a5c155af9199af9e69b889claireho importvidecoll = ucol_openRules(rules, length, UCOL_ON, UCOL_TERTIARY, &error, &status); 692627f654740f2a26ad62a5c155af9199af9e69b889claireho if(U_FAILURE(status)){ 692727f654740f2a26ad62a5c155af9199af9e69b889claireho log_err_status(status, "ERROR: in creation of rule based collator: %s\n", myErrorName(status)); 692827f654740f2a26ad62a5c155af9199af9e69b889claireho return; 692927f654740f2a26ad62a5c155af9199af9e69b889claireho } 693027f654740f2a26ad62a5c155af9199af9e69b889claireho 693127f654740f2a26ad62a5c155af9199af9e69b889claireho tailoredSet = ucol_getTailoredSet(videcoll, &status); 693227f654740f2a26ad62a5c155af9199af9e69b889claireho importTailoredSet = ucol_getTailoredSet(importvidecoll, &status); 693327f654740f2a26ad62a5c155af9199af9e69b889claireho 693427f654740f2a26ad62a5c155af9199af9e69b889claireho if(!uset_equals(tailoredSet, importTailoredSet)){ 693527f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("Tailored sets not equal"); 693627f654740f2a26ad62a5c155af9199af9e69b889claireho } 693727f654740f2a26ad62a5c155af9199af9e69b889claireho 693827f654740f2a26ad62a5c155af9199af9e69b889claireho uset_close(importTailoredSet); 693927f654740f2a26ad62a5c155af9199af9e69b889claireho 694027f654740f2a26ad62a5c155af9199af9e69b889claireho itemCount = uset_getItemCount(tailoredSet); 694127f654740f2a26ad62a5c155af9199af9e69b889claireho 694227f654740f2a26ad62a5c155af9199af9e69b889claireho for( i = 0; i < itemCount; i++){ 694327f654740f2a26ad62a5c155af9199af9e69b889claireho strLength = uset_getItem(tailoredSet, i, &start, &end, str, 500, &status); 694427f654740f2a26ad62a5c155af9199af9e69b889claireho if(strLength < 2){ 694527f654740f2a26ad62a5c155af9199af9e69b889claireho for (; start <= end; start++){ 694627f654740f2a26ad62a5c155af9199af9e69b889claireho k = 0; 694727f654740f2a26ad62a5c155af9199af9e69b889claireho U16_APPEND_UNSAFE(str, k, start); 694827f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_getSortKey(videcoll, str, 1, sk1, 500); 694927f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_getSortKey(importvidecoll, str, 1, sk2, 500); 695027f654740f2a26ad62a5c155af9199af9e69b889claireho if(compare_uint8_t_arrays(sk1, sk2) != 0){ 695127f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("Sort key for %s not equal\n", str); 695227f654740f2a26ad62a5c155af9199af9e69b889claireho break; 695327f654740f2a26ad62a5c155af9199af9e69b889claireho } 695427f654740f2a26ad62a5c155af9199af9e69b889claireho } 695527f654740f2a26ad62a5c155af9199af9e69b889claireho }else{ 695627f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_getSortKey(videcoll, str, strLength, sk1, 500); 695727f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_getSortKey(importvidecoll, str, strLength, sk2, 500); 695827f654740f2a26ad62a5c155af9199af9e69b889claireho if(compare_uint8_t_arrays(sk1, sk2) != 0){ 695927f654740f2a26ad62a5c155af9199af9e69b889claireho log_err("Sort key for %s not equal\n", str); 696027f654740f2a26ad62a5c155af9199af9e69b889claireho break; 696127f654740f2a26ad62a5c155af9199af9e69b889claireho } 696227f654740f2a26ad62a5c155af9199af9e69b889claireho 696327f654740f2a26ad62a5c155af9199af9e69b889claireho } 696427f654740f2a26ad62a5c155af9199af9e69b889claireho } 696527f654740f2a26ad62a5c155af9199af9e69b889claireho 696627f654740f2a26ad62a5c155af9199af9e69b889claireho uset_close(tailoredSet); 696727f654740f2a26ad62a5c155af9199af9e69b889claireho 696827f654740f2a26ad62a5c155af9199af9e69b889claireho uprv_free(viderules); 696927f654740f2a26ad62a5c155af9199af9e69b889claireho 697027f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_close(videcoll); 697127f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_close(importvidecoll); 697227f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_close(vicoll); 697327f654740f2a26ad62a5c155af9199af9e69b889claireho ucol_close(decoll); 6974b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 6975b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6976b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* 'IV INTERNATIONAL SCIENTIFIC - PRACTICAL CONFERENCE "GEOPOLITICS, GEOECONOMICS AND INTERNATIONAL RELATIONS PROBLEMS" 22-23 June 2010, St. Petersburg, Russia' */ 6977b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar longUpperStr1[]= { /* 155 chars */ 6978b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x49, 0x56, 0x20, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4E, 0x41, 0x54, 0x49, 0x4F, 0x4E, 0x41, 0x4C, 6979b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x20, 0x53, 0x43, 0x49, 0x45, 0x4E, 0x54, 0x49, 0x46, 0x49, 0x43, 0x20, 0x2D, 0x20, 0x50, 0x52, 6980b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x41, 0x43, 0x54, 0x49, 0x43, 0x41, 0x4C, 0x20, 0x43, 0x4F, 0x4E, 0x46, 0x45, 0x52, 0x45, 0x4E, 6981b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x43, 0x45, 0x20, 0x22, 0x47, 0x45, 0x4F, 0x50, 0x4F, 0x4C, 0x49, 0x54, 0x49, 0x43, 0x53, 0x2C, 6982b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x20, 0x47, 0x45, 0x4F, 0x45, 0x43, 0x4F, 0x4E, 0x4F, 0x4D, 0x49, 0x43, 0x53, 0x20, 0x41, 0x4E, 6983b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x44, 0x20, 0x49, 0x4E, 0x54, 0x45, 0x52, 0x4E, 0x41, 0x54, 0x49, 0x4F, 0x4E, 0x41, 0x4C, 0x20, 6984b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x52, 0x45, 0x4C, 0x41, 0x54, 0x49, 0x4F, 0x4E, 0x53, 0x20, 0x50, 0x52, 0x4F, 0x42, 0x4C, 0x45, 6985b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x4D, 0x53, 0x22, 0x20, 0x32, 0x32, 0x2D, 0x32, 0x33, 0x20, 0x4A, 0x75, 0x6E, 0x65, 0x20, 0x32, 6986b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x30, 0x31, 0x30, 0x2C, 0x20, 0x53, 0x74, 0x2E, 0x20, 0x50, 0x65, 0x74, 0x65, 0x72, 0x73, 0x62, 6987b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x75, 0x72, 0x67, 0x2C, 0x20, 0x52, 0x75, 0x73, 0x73, 0x69, 0x61 6988b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}; 6989b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6990b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* 'BACEDIFOGUHAJEKILOMUNAPE ' with diacritics on vowels, repeated 5 times */ 6991b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar longUpperStr2[]= { /* 125 chars, > 128 collation elements */ 6992b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x42,0xC1,0x43,0xC9,0x44,0xCD,0x46,0xD3,0x47,0xDA,0x48,0xC0,0x4A,0xC8,0x4B,0xCC,0x4C,0xD2,0x4D,0xD9,0x4E,0xC2,0x50,0xCA,0x20, 6993b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x42,0xC1,0x43,0xC9,0x44,0xCD,0x46,0xD3,0x47,0xDA,0x48,0xC0,0x4A,0xC8,0x4B,0xCC,0x4C,0xD2,0x4D,0xD9,0x4E,0xC2,0x50,0xCA,0x20, 6994b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x42,0xC1,0x43,0xC9,0x44,0xCD,0x46,0xD3,0x47,0xDA,0x48,0xC0,0x4A,0xC8,0x4B,0xCC,0x4C,0xD2,0x4D,0xD9,0x4E,0xC2,0x50,0xCA,0x20, 6995b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x42,0xC1,0x43,0xC9,0x44,0xCD,0x46,0xD3,0x47,0xDA,0x48,0xC0,0x4A,0xC8,0x4B,0xCC,0x4C,0xD2,0x4D,0xD9,0x4E,0xC2,0x50,0xCA,0x20, 6996b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x42,0xC1,0x43,0xC9,0x44,0xCD,0x46,0xD3,0x47,0xDA,0x48,0xC0,0x4A,0xC8,0x4B,0xCC,0x4C,0xD2,0x4D,0xD9,0x4E,0xC2,0x50,0xCA,0x20 6997b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}; 6998b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 6999b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* 'ABCDEFGHIJKLMNOPQRSTUVWXYZ ' repeated 12 times */ 7000b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar longUpperStr3[]= { /* 324 chars */ 7001b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20, 7002b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20, 7003b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20, 7004b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20, 7005b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20, 7006b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20, 7007b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20, 7008b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20, 7009b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20, 7010b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20, 7011b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20, 7012b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x20 7013b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}; 7014b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 7015b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define MY_ARRAY_LEN(array) (sizeof(array)/sizeof(array[0])) 7016b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 7017b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotypedef struct { 7018b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UChar * longUpperStrPtr; 7019b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t longUpperStrLen; 7020b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} LongUpperStrItem; 7021b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 7022b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* String pointers must be in reverse collation order of the corresponding strings */ 7023b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const LongUpperStrItem longUpperStrItems[] = { 7024b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { longUpperStr1, MY_ARRAY_LEN(longUpperStr1) }, 7025b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { longUpperStr2, MY_ARRAY_LEN(longUpperStr2) }, 7026b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { longUpperStr3, MY_ARRAY_LEN(longUpperStr3) }, 7027b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { NULL, 0 } 7028b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}; 702927f654740f2a26ad62a5c155af9199af9e69b889claireho 7030b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoenum { kCollKeyLenMax = 800 }; /* longest expected is 749, but may change with collation changes */ 7031b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 7032b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* Text fix for #8445; without fix, could have crash due to stack or heap corruption */ 7033b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestCaseLevelBufferOverflow(void) 7034b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{ 7035b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode status = U_ZERO_ERROR; 7036b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UCollator * ucol = ucol_open("root", &status); 7037b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ( U_SUCCESS(status) ) { 7038b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ucol_setAttribute(ucol, UCOL_CASE_LEVEL, UCOL_ON, &status); 7039b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ( U_SUCCESS(status) ) { 7040b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const LongUpperStrItem * itemPtr; 7041b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uint8_t sortKeyA[kCollKeyLenMax], sortKeyB[kCollKeyLenMax]; 7042b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for ( itemPtr = longUpperStrItems; itemPtr->longUpperStrPtr != NULL; itemPtr++ ) { 7043b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t sortKeyLen; 7044b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (itemPtr > longUpperStrItems) { 7045b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uprv_strcpy((char *)sortKeyB, (char *)sortKeyA); 7046b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 7047b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sortKeyLen = ucol_getSortKey(ucol, itemPtr->longUpperStrPtr, itemPtr->longUpperStrLen, sortKeyA, kCollKeyLenMax); 7048b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (sortKeyLen <= 0 || sortKeyLen > kCollKeyLenMax) { 7049b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("ERROR sort key length from ucol_getSortKey is %d\n", sortKeyLen); 7050b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 7051b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 7052b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ( itemPtr > longUpperStrItems ) { 7053b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int compareResult = uprv_strcmp((char *)sortKeyA, (char *)sortKeyB); 7054b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (compareResult >= 0) { 7055b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err("ERROR in sort key comparison result, expected -1, got %d\n", compareResult); 7056b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 7057b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 7058b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 7059b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 7060b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR in ucol_setAttribute UCOL_CASE_LEVEL on: %s\n", myErrorName(status)); 7061b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 7062b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ucol_close(ucol); 7063b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 7064b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho log_err_status(status, "ERROR in ucol_open for root: %s\n", myErrorName(status)); 7065b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 706627f654740f2a26ad62a5c155af9199af9e69b889claireho} 706727f654740f2a26ad62a5c155af9199af9e69b889claireho 706827f654740f2a26ad62a5c155af9199af9e69b889claireho 7069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TEST(x) addTest(root, &x, "tscoll/cmsccoll/" # x) 7070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 7071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addMiscCollTest(TestNode** root) 7072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 7073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestRuleOptions); 7074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestBeforePrefixFailure); 7075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestContractionClosure); 7076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestPrefixCompose); 7077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestStrCollIdenticalPrefix); 7078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestPrefix); 7079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestNewJapanese); 7080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*TEST(TestLimitations);*/ 7081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestNonChars); 7082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestExtremeCompression); 708354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius TEST(TestSurrogates); 7084ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho /* BEGIN android-removed 7085ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho To save space, Android does not include the collation tailoring rules. 7086ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho We skip the tailing tests for collations. */ 7087ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho /* TEST(TestVariableTopSetting); */ 7088ea1f1813c8b13a850b13f256aeb5152bb0942e81claireho /* END android-removed */ 7089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestBocsuCoverage); 7090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestCyrillicTailoring); 7091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestCase); 7092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(IncompleteCntTest); 7093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(BlackBirdTest); 7094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(FunkyATest); 7095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(BillFairmanTest); 7096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(RamsRulesTest); 7097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(IsTailoredTest); 7098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestCollations); 7099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestChMove); 7100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestImplicitTailoring); 7101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestFCDProblem); 7102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestEmptyRule); 7103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*TEST(TestJ784);*/ /* 'zh' locale has changed - now it is getting tested by TestBeforePinyin */ 7104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestJ815); 7105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*TEST(TestJ831);*/ /* we changed lv locale */ 7106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestBefore); 7107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestRedundantRules); 7108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestExpansionSyntax); 7109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestHangulTailoring); 7110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestUCARules); 7111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestIncrementalNormalize); 7112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestComposeDecompose); 7113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestCompressOverlap); 7114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestContraction); 7115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestExpansion); 7116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*TEST(PrintMarkDavis);*/ /* this test doesn't test - just prints sortkeys */ 7117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*TEST(TestGetCaseBit);*/ /*this one requires internal things to be exported */ 7118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestOptimize); 7119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestSuppressContractions); 7120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(Alexis2); 7121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestHebrewUCA); 7122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestPartialSortKeyTermination); 7123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestSettings); 7124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestEquals); 7125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestJ2726); 7126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(NullRule); 7127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestNumericCollation); 7128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestTibetanConformance); 7129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestPinyinProblem); 7130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestImplicitGeneration); 7131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestSeparateTrees); 7132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestBeforePinyin); 7133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestBeforeTightening); 7134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*TEST(TestMoreBefore);*/ 7135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestTailorNULL); 7136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestUpperFirstQuaternary); 7137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestJ4960); 7138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestJ5223); 7139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestJ5232); 7140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestJ5367); 714185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho TEST(TestHiragana); 7142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestSortKeyConsistency); 7143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST(TestVI5913); /* VI, RO tailored rules */ 714485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho TEST(TestCroatianSortKey); 714585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho TEST(TestTailor6179); 714685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho TEST(TestUCAPrecontext); 714785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho TEST(TestOutOfBuffer5468); 714850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST(TestSameStrengthList); 714927f654740f2a26ad62a5c155af9199af9e69b889claireho 715027f654740f2a26ad62a5c155af9199af9e69b889claireho TEST(TestSameStrengthListQuoted); 715127f654740f2a26ad62a5c155af9199af9e69b889claireho TEST(TestSameStrengthListSupplemental); 715227f654740f2a26ad62a5c155af9199af9e69b889claireho TEST(TestSameStrengthListQwerty); 715327f654740f2a26ad62a5c155af9199af9e69b889claireho TEST(TestSameStrengthListQuotedQwerty); 715427f654740f2a26ad62a5c155af9199af9e69b889claireho TEST(TestSameStrengthListRanges); 715527f654740f2a26ad62a5c155af9199af9e69b889claireho TEST(TestSameStrengthListSupplementalRanges); 715627f654740f2a26ad62a5c155af9199af9e69b889claireho TEST(TestSpecialCharacters); 715727f654740f2a26ad62a5c155af9199af9e69b889claireho TEST(TestPrivateUseCharacters); 715827f654740f2a26ad62a5c155af9199af9e69b889claireho TEST(TestPrivateUseCharactersInList); 715927f654740f2a26ad62a5c155af9199af9e69b889claireho TEST(TestPrivateUseCharactersInRange); 716027f654740f2a26ad62a5c155af9199af9e69b889claireho TEST(TestInvalidListsAndRanges); 716154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius TEST(TestImportRulesDeWithPhonebook); 716254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* TEST(TestImportRulesFiWithEor); EOR rules removed from CLDR 21 */ 716354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* TEST(TestImportRulesCJKWithUnihan); */ 7164b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* BEGIN android-removed: Due to Android does not include reverse UCA table. 716527f654740f2a26ad62a5c155af9199af9e69b889claireho TEST(TestImport); 716627f654740f2a26ad62a5c155af9199af9e69b889claireho TEST(TestImportWithType); 7167b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho END android-removed */ 716827f654740f2a26ad62a5c155af9199af9e69b889claireho 716927f654740f2a26ad62a5c155af9199af9e69b889claireho TEST(TestBeforeRuleWithScriptReordering); 717027f654740f2a26ad62a5c155af9199af9e69b889claireho TEST(TestNonLeadBytesDuringCollationReordering); 717127f654740f2a26ad62a5c155af9199af9e69b889claireho TEST(TestReorderingAPI); 7172b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST(TestReorderingAPIWithRuleCreatedCollator); 7173b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST(TestEquivalentReorderingScripts); 717427f654740f2a26ad62a5c155af9199af9e69b889claireho TEST(TestGreekFirstReorder); 717527f654740f2a26ad62a5c155af9199af9e69b889claireho TEST(TestGreekLastReorder); 717627f654740f2a26ad62a5c155af9199af9e69b889claireho TEST(TestNonScriptReorder); 717727f654740f2a26ad62a5c155af9199af9e69b889claireho TEST(TestHaniReorder); 7178103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius TEST(TestHaniReorderWithOtherRules); 7179b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST(TestMultipleReorder); 7180b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST(TestReorderingAcrossCloning); 718154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius TEST(TestReorderWithNumericCollation); 7182103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 7183b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST(TestCaseLevelBufferOverflow); 7184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 7185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 7186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_COLLATION */ 7187