capitst.c revision 50294ead5e5d23f5bbfed76e00e6b510bd41eee1
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************** 250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Copyright (c) 1997-2010 International Business Machines 3b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Corporation and others. All Rights Reserved. 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/ 5c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/***************************************************************************** 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File CAPITEST.C 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History: 10b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru* Name Description 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Madhu Katragadda Ported for C API 12b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru* Brian Rower Added TestOpenVsOpenRules 13c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru****************************************************************************** 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*//* C API TEST For COLLATOR */ 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h> 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h> 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h> 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uloc.h" 24b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/ulocdata.h" 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ures.h" 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucoleitr.h" 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h" 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "capitst.h" 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ccolltst.h" 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "putilimp.h" 32b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "cstring.h" 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestAttribute(void); 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestDefault(void); 36b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestDefaultKeyword(void); 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int TestBufferSize(); /* defined in "colutil.c" */ 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 40b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* next two function is modified from "i18n/ucol.cpp" to avoid include "ucol_imp.h" */ 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void uprv_appendByteToHexString(char *dst, uint8_t val) { 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t len = (uint32_t)strlen(dst); 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(dst+len, "%02X", val); 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char* U_EXPORT2 ucol_sortKeyToString(const UCollator *coll, const uint8_t *sortkey, char *buffer, uint32_t *len) { 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t strength = UCOL_PRIMARY; 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t res_size = 0; 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool doneCase = FALSE; 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *current = buffer; 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const uint8_t *currentSk = sortkey; 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode error_code = U_ZERO_ERROR; 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcpy(current, "["); 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(strength <= UCOL_QUATERNARY && strength <= ucol_getAttribute(coll,UCOL_STRENGTH, &error_code)) { 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(error_code)) { 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ucol_getAttribute returned error: %s\n", u_errorName(error_code)); 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strength > UCOL_PRIMARY) { 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(current, " . "); 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(*currentSk != 0x01 && *currentSk != 0x00) { /* print a level */ 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_appendByteToHexString(current, *currentSk++); 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(current, " "); 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(ucol_getAttribute(coll,UCOL_CASE_LEVEL, &error_code) == UCOL_ON && strength == UCOL_SECONDARY && doneCase == FALSE) { 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doneCase = TRUE; 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(ucol_getAttribute(coll,UCOL_CASE_LEVEL, &error_code) == UCOL_OFF || doneCase == TRUE || strength != UCOL_SECONDARY) { 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strength ++; 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(error_code)) { 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ucol_getAttribute returned error: %s\n", u_errorName(error_code)); 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_appendByteToHexString(current, *currentSk++); /* This should print '01' */ 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strength == UCOL_QUATERNARY && ucol_getAttribute(coll,UCOL_ALTERNATE_HANDLING, &error_code) == UCOL_NON_IGNORABLE) { 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(ucol_getAttribute(coll,UCOL_STRENGTH, &error_code) == UCOL_IDENTICAL) { 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(current, " . "); 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(*currentSk != 0) { 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_appendByteToHexString(current, *currentSk++); 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(current, " "); 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_appendByteToHexString(current, *currentSk++); 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(error_code)) { 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ucol_getAttribute returned error: %s\n", u_errorName(error_code)); 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(current, "]"); 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(res_size > *len) { 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return buffer; 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* end of avoid include "ucol_imp.h" */ 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addCollAPITest(TestNode** root) 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* WEIVTODO: return tests here */ 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestProperty, "tscoll/capitst/TestProperty"); 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestRuleBasedColl, "tscoll/capitst/TestRuleBasedColl"); 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestCompare, "tscoll/capitst/TestCompare"); 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestSortKey, "tscoll/capitst/TestSortKey"); 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestHashCode, "tscoll/capitst/TestHashCode"); 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestElemIter, "tscoll/capitst/TestElemIter"); 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestGetAll, "tscoll/capitst/TestGetAll"); 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*addTest(root, &TestGetDefaultRules, "tscoll/capitst/TestGetDefaultRules");*/ 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestDecomposition, "tscoll/capitst/TestDecomposition"); 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestSafeClone, "tscoll/capitst/TestSafeClone"); 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestCloneBinary, "tscoll/capitst/TestCloneBinary"); 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestGetSetAttr, "tscoll/capitst/TestGetSetAttr"); 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestBounds, "tscoll/capitst/TestBounds"); 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestGetLocale, "tscoll/capitst/TestGetLocale"); 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestSortKeyBufferOverrun, "tscoll/capitst/TestSortKeyBufferOverrun"); 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestAttribute, "tscoll/capitst/TestAttribute"); 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestGetTailoredSet, "tscoll/capitst/TestGetTailoredSet"); 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestMergeSortKeys, "tscoll/capitst/TestMergeSortKeys"); 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestShortString, "tscoll/capitst/TestShortString"); 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestGetContractionsAndUnsafes, "tscoll/capitst/TestGetContractionsAndUnsafes"); 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestOpenBinary, "tscoll/capitst/TestOpenBinary"); 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestDefault, "tscoll/capitst/TestDefault"); 133b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru addTest(root, &TestDefaultKeyword, "tscoll/capitst/TestDefaultKeyword"); 134b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru addTest(root, &TestOpenVsOpenRules, "tscoll/capitst/TestOpenVsOpenRules"); 135b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru addTest(root, &TestGetKeywordValuesForLocale, "tscoll/capitst/TestGetKeywordValuesForLocale"); 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestGetSetAttr(void) { 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_open(NULL, &status); 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru struct attrTest { 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColAttribute att; 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColAttributeValue val[5]; 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t valueSize; 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColAttributeValue nonValue; 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } attrs[] = { 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {UCOL_FRENCH_COLLATION, {UCOL_ON, UCOL_OFF}, 2, UCOL_SHIFTED}, 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {UCOL_ALTERNATE_HANDLING, {UCOL_NON_IGNORABLE, UCOL_SHIFTED}, 2, UCOL_OFF},/* attribute for handling variable elements*/ 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {UCOL_CASE_FIRST, {UCOL_OFF, UCOL_LOWER_FIRST, UCOL_UPPER_FIRST}, 3, UCOL_SHIFTED},/* who goes first, lower case or uppercase */ 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {UCOL_CASE_LEVEL, {UCOL_ON, UCOL_OFF}, 2, UCOL_SHIFTED},/* do we have an extra case level */ 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {UCOL_NORMALIZATION_MODE, {UCOL_ON, UCOL_OFF}, 2, UCOL_SHIFTED},/* attribute for normalization */ 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {UCOL_DECOMPOSITION_MODE, {UCOL_ON, UCOL_OFF}, 2, UCOL_SHIFTED}, 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {UCOL_STRENGTH, {UCOL_PRIMARY, UCOL_SECONDARY, UCOL_TERTIARY, UCOL_QUATERNARY, UCOL_IDENTICAL}, 5, UCOL_SHIFTED},/* attribute for strength */ 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {UCOL_HIRAGANA_QUATERNARY_MODE, {UCOL_ON, UCOL_OFF}, 2, UCOL_SHIFTED},/* when turned on, this attribute */ 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColAttribute currAttr; 157b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UColAttributeValue value; 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t i = 0, j = 0; 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1606d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (coll == NULL) { 1616d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(status, "Unable to open collator. %s\n", u_errorName(status)); 1626d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru return; 1636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<sizeof(attrs)/sizeof(attrs[0]); i++) { 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru currAttr = attrs[i].att; 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, currAttr, UCOL_DEFAULT, &status); 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 1686d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(status, "ucol_setAttribute with the default value returned error: %s\n", u_errorName(status)); 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru value = ucol_getAttribute(coll, currAttr, &status); 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ucol_getAttribute returned error: %s\n", u_errorName(status)); 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = 0; j<attrs[i].valueSize; j++) { 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, currAttr, attrs[i].val[j], &status); 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ucol_setAttribute with the value %i returned error: %s\n", attrs[i].val[j], u_errorName(status)); 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, currAttr, attrs[i].nonValue, &status); 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ucol_setAttribute with the bad value didn't return an error\n"); 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, currAttr, value, &status); 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ucol_setAttribute with the default valuereturned error: %s\n", u_errorName(status)); 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru value = ucol_getAttribute(coll, UCOL_ATTRIBUTE_COUNT, &status); 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ucol_getAttribute for UCOL_ATTRIBUTE_COUNT didn't return an error\n"); 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_ATTRIBUTE_COUNT, UCOL_DEFAULT, &status); 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ucol_setAttribute for UCOL_ATTRIBUTE_COUNT didn't return an error\n"); 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doAssert(int condition, const char *message) 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (condition==0) { 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR : %s\n", message); 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* We don't have default rules, at least not in the previous sense */ 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestGetDefaultRules(){ 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t size=0; 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status=U_ZERO_ERROR; 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll=NULL; 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len1 = 0, len2=0; 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t *binColData = NULL; 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UResourceBundle *res = NULL; 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UResourceBundle *binColl = NULL; 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t *binResult = NULL; 231b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 232b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar * defaultRulesArray=ucol_getDefaultRulesArray(&size); 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Test the function ucol_getDefaultRulesArray()\n"); 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_openRules(defaultRulesArray, size, UCOL_ON, UCOL_PRIMARY, &status); 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status) && coll !=NULL) { 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru binColData = (uint8_t*)ucol_cloneRuleData(coll, &len1, &status); 239b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 242b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status=U_ZERO_ERROR; 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru res=ures_open(NULL, "root", &status); 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR: Failed to get resource for \"root Locale\" with %s", myErrorName(status)); 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 249b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru binColl=ures_getByKey(res, "%%Collation", binColl, &status); 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)){ 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru binResult=(uint8_t*)ures_getBinary(binColl, &len2, &status); 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR: ures_getBinary() failed\n"); 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else{ 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR: ures_getByKey(locale(default), %%Collation) failed"); 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(len1 != len2){ 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error: ucol_getDefaultRulesArray() failed to return the correct length.\n"); 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(memcmp(binColData, binResult, len1) != 0){ 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error: ucol_getDefaultRulesArray() failed\n"); 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(binColData); 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_close(binColl); 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_close(res); 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 271b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Collator Properties 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_open, ucol_strcoll, getStrength/setStrength 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru getDecomposition/setDecomposition, getDisplayName*/ 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestProperty() 279b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{ 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *col, *ruled; 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *disName; 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len = 0, i = 0; 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *source, *target; 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t tempLength; 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 286b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* 28750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Expected version of the English collator. 28850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Currently, the major/minor version numbers change when the builder code 28950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * changes, 29050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * number 2 is from the tailoring data version and 29150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * number 3 is the UCA version. 29250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * This changes with every UCA version change, and the expected value 29350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * needs to be adjusted. 29450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Same in intltest/apicoll.cpp. 29550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 29650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UVersionInfo currVersionArray = {0x31, 0xC0, 0x00, 0x2A}; 29750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UVersionInfo currUCAVersionArray = {5, 2, 0, 0}; 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UVersionInfo versionArray = {0, 0, 0, 0}; 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UVersionInfo versionUCAArray = {0, 0, 0, 0}; 300b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("The property tests begin : \n"); 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Test ucol_strcoll : \n"); 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col = ucol_open("en_US", &status); 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 3056d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(status, "Default Collator creation failed.: %s\n", myErrorName(status)); 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getVersion(col, versionArray); 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<4; ++i) { 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (versionArray[i] != currVersionArray[i]) { 312b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("Testing ucol_getVersion() - unexpected result: %hu.%hu.%hu.%hu\n", 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru versionArray[0], versionArray[1], versionArray[2], versionArray[3]); 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getUCAVersion(col, versionUCAArray); 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<4; ++i) { 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (versionUCAArray[i] != currUCAVersionArray[i]) { 321b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("Testing ucol_getUCAVersion() - unexpected result: %hu.%hu.%hu.%hu\n", 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru versionUCAArray[0], versionUCAArray[1], versionUCAArray[2], versionUCAArray[3]); 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source=(UChar*)malloc(sizeof(UChar) * 12); 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target=(UChar*)malloc(sizeof(UChar) * 12); 329b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(source, "ab"); 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(target, "abc"); 333b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert((ucol_strcoll(col, source, u_strlen(source), target, u_strlen(target)) == UCOL_LESS), "ab < abc comparison failed"); 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(source, "ab"); 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(target, "AB"); 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert((ucol_strcoll(col, source, u_strlen(source), target, u_strlen(target)) == UCOL_LESS), "ab < AB comparison failed"); 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* u_uastrcpy(source, "black-bird"); 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(target, "blackbird"); */ 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(target, "black-bird"); 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(source, "blackbird"); 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 345b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru doAssert((ucol_strcoll(col, source, u_strlen(source), target, u_strlen(target)) == UCOL_GREATER), 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "black-bird > blackbird comparison failed"); 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(source, "black bird"); 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(target, "black-bird"); 349b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru doAssert((ucol_strcoll(col, source, u_strlen(source), target, u_strlen(target)) == UCOL_LESS), 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "black bird < black-bird comparison failed"); 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(source, "Hello"); 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(target, "hello"); 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 354b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru doAssert((ucol_strcoll(col, source, u_strlen(source), target, u_strlen(target)) == UCOL_GREATER), 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Hello > hello comparison failed"); 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(source); 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(target); 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Test ucol_strcoll ends.\n"); 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing ucol_getStrength() method ...\n"); 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (ucol_getStrength(col) == UCOL_TERTIARY), "collation object has the wrong strength"); 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (ucol_getStrength(col) != UCOL_PRIMARY), "collation object's strength is primary difference"); 363b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing ucol_setStrength() method ...\n"); 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(col, UCOL_SECONDARY); 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (ucol_getStrength(col) != UCOL_TERTIARY), "collation object's strength is secondary difference"); 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (ucol_getStrength(col) != UCOL_PRIMARY), "collation object's strength is primary difference"); 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (ucol_getStrength(col) == UCOL_SECONDARY), "collation object has the wrong strength"); 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 370b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Get display name for the default collation in German : \n"); 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru len=ucol_getDisplayName("en_US", "de_DE", NULL, 0, &status); 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(status==U_BUFFER_OVERFLOW_ERROR){ 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status=U_ZERO_ERROR; 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru disName=(UChar*)malloc(sizeof(UChar) * (len+1)); 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getDisplayName("en_US", "de_DE", disName, len+1, &status); 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("the display name for default collation in german: %s\n", austrdup(disName) ); 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(disName); 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR: in getDisplayName: %s\n", myErrorName(status)); 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Default collation getDisplayName ended.\n"); 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ruled = ucol_open("da_DK", &status); 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("ucol_getRules() testing ...\n"); 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getRules(ruled, &tempLength); 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( tempLength != 0, "getRules() result incorrect" ); 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("getRules tests end.\n"); 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *buffer = (UChar *)malloc(200000*sizeof(UChar)); 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t bufLen = 200000; 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[0] = '\0'; 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("ucol_getRulesEx() testing ...\n"); 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempLength = ucol_getRulesEx(col,UCOL_TAILORING_ONLY,buffer,bufLen ); 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( tempLength == 0x0a, "getRulesEx() result incorrect" ); 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("getRules tests end.\n"); 400b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("ucol_getRulesEx() testing ...\n"); 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempLength=ucol_getRulesEx(col,UCOL_FULL_RULES,buffer,bufLen ); 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( tempLength != 0, "getRulesEx() result incorrect" ); 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("getRules tests end.\n"); 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(buffer); 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(ruled); 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(col); 409b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("open an collator for french locale"); 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col = ucol_open("fr_FR", &status); 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR: Creating French collation failed.: %s\n", myErrorName(status)); 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(col, UCOL_PRIMARY); 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing ucol_getStrength() method again ...\n"); 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (ucol_getStrength(col) != UCOL_TERTIARY), "collation object has the wrong strength"); 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (ucol_getStrength(col) == UCOL_PRIMARY), "collation object's strength is not primary difference"); 420b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing French ucol_setStrength() method ...\n"); 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(col, UCOL_TERTIARY); 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (ucol_getStrength(col) == UCOL_TERTIARY), "collation object's strength is not tertiary difference"); 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (ucol_getStrength(col) != UCOL_PRIMARY), "collation object's strength is primary difference"); 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (ucol_getStrength(col) != UCOL_SECONDARY), "collation object's strength is secondary difference"); 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(col); 427b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Get display name for the french collation in english : \n"); 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru len=ucol_getDisplayName("fr_FR", "en_US", NULL, 0, &status); 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(status==U_BUFFER_OVERFLOW_ERROR){ 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status=U_ZERO_ERROR; 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru disName=(UChar*)malloc(sizeof(UChar) * (len+1)); 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getDisplayName("fr_FR", "en_US", disName, len+1, &status); 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("the display name for french collation in english: %s\n", austrdup(disName) ); 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(disName); 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR: in getDisplayName: %s\n", myErrorName(status)); 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Default collation getDisplayName ended.\n"); 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Test RuleBasedCollator and getRules*/ 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestRuleBasedColl() 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *col1, *col2, *col3, *col4; 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationElements *iter1, *iter2; 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar ruleset1[60]; 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar ruleset2[50]; 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar teststr[10]; 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar teststr2[10]; 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *rule1, *rule2, *rule3, *rule4; 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t tempLength; 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(ruleset1, "&9 < a, A < b, B < c, C; ch, cH, Ch, CH < d, D, e, E"); 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(ruleset2, "&9 < a, A < b, B < c, C < d, D, e, E"); 459b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col1 = ucol_openRules(ruleset1, u_strlen(ruleset1), UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH, NULL,&status); 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 4636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(status, "RuleBased Collator creation failed.: %s\n", myErrorName(status)); 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("PASS: RuleBased Collator creation passed\n"); 468b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col2 = ucol_openRules(ruleset2, u_strlen(ruleset2), UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH, NULL, &status); 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("RuleBased Collator creation failed.: %s\n", myErrorName(status)); 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("PASS: RuleBased Collator creation passed\n"); 477b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 478b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col3= ucol_open(NULL, &status); 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Default Collator creation failed.: %s\n", myErrorName(status)); 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("PASS: Default Collator creation passed\n"); 487b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rule1 = ucol_getRules(col1, &tempLength); 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rule2 = ucol_getRules(col2, &tempLength); 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rule3 = ucol_getRules(col3, &tempLength); 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert((u_strcmp(rule1, rule2) != 0), "Default collator getRules failed"); 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert((u_strcmp(rule2, rule3) != 0), "Default collator getRules failed"); 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert((u_strcmp(rule1, rule3) != 0), "Default collator getRules failed"); 495b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col4=ucol_openRules(rule2, u_strlen(rule2), UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH, NULL, &status); 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("RuleBased Collator creation failed.: %s\n", myErrorName(status)); 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rule4= ucol_getRules(col4, &tempLength); 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert((u_strcmp(rule2, rule4) == 0), "Default collator getRules failed"); 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(col1); 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(col2); 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(col3); 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(col4); 508b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* tests that modifier ! is always ignored */ 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(ruleset1, "!&a<b"); 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru teststr[0] = 0x0e40; 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru teststr[1] = 0x0e01; 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru teststr[2] = 0x0e2d; 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col1 = ucol_openRules(ruleset1, u_strlen(ruleset1), UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH, NULL, &status); 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("RuleBased Collator creation failed.: %s\n", myErrorName(status)); 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col2 = ucol_open("en_US", &status); 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("en_US Collator creation failed.: %s\n", myErrorName(status)); 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter1 = ucol_openElements(col1, teststr, 3, &status); 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iter2 = ucol_openElements(col2, teststr, 3, &status); 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR: CollationElement iterator creation failed.: %s\n", myErrorName(status)); 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (TRUE) { 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* testing with en since thai has its own tailoring */ 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t ce = ucol_next(iter1, &status); 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t ce2 = ucol_next(iter2, &status); 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR: CollationElement iterator creation failed.: %s\n", myErrorName(status)); 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ce2 != ce) { 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("! modifier test failed"); 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ce == UCOL_NULLORDER) { 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_closeElements(iter1); 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_closeElements(iter2); 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(col1); 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(col2); 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test that we can start a rule without a & or < */ 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(ruleset1, "< z < a"); 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col1 = ucol_openRules(ruleset1, u_strlen(ruleset1), UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH, NULL, &status); 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("RuleBased Collator creation failed.: %s\n", myErrorName(status)); 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(teststr, "z"); 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(teststr2, "a"); 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_greaterOrEqual(col1, teststr, 1, teststr2, 1)) { 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Rule \"z < a\" fails"); 560b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(col1); 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestCompare() 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *col; 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar* test1; 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar* test2; 570b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("The compare tests begin : \n"); 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status=U_ZERO_ERROR; 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col = ucol_open("en_US", &status); 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 5756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(status, "ucal_open() collation creation failed.: %s\n", myErrorName(status)); 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1=(UChar*)malloc(sizeof(UChar) * 6); 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test2=(UChar*)malloc(sizeof(UChar) * 6); 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(test1, "Abcda"); 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(test2, "abcda"); 582b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Use tertiary comparison level testing ....\n"); 584b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (!ucol_equal(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" != \"abcda\" "); 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (ucol_greater(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" >>> \"abcda\" "); 587b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru doAssert( (ucol_greaterOrEqual(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" >>> \"abcda\""); 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(col, UCOL_SECONDARY); 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Use secondary comparison level testing ....\n"); 591b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (ucol_equal(col, test1, u_strlen(test1), test2, u_strlen(test2) )), "Result should be \"Abcda\" == \"abcda\""); 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (!ucol_greater(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" == \"abcda\""); 594b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru doAssert( (ucol_greaterOrEqual(col, test1, u_strlen(test1), test2, u_strlen(test2) )), "Result should be \"Abcda\" == \"abcda\""); 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(col, UCOL_PRIMARY); 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Use primary comparison level testing ....\n"); 598b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (ucol_equal(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" == \"abcda\""); 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (!ucol_greater(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" == \"abcda\""); 601b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru doAssert( (ucol_greaterOrEqual(col, test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"Abcda\" == \"abcda\""); 602b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("The compare tests end.\n"); 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(col); 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(test1); 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(test2); 608b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru--------------------------------------------- 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tests decomposition setting 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestDecomposition() { 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *en_US, *el_GR, *vi_VN; 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru en_US = ucol_open("en_US", &status); 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru el_GR = ucol_open("el_GR", &status); 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru vi_VN = ucol_open("vi_VN", &status); 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 6226d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(status, "ERROR: collation creation failed.: %s\n", myErrorName(status)); 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_getAttribute(vi_VN, UCOL_NORMALIZATION_MODE, &status) != UCOL_ON || 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_FAILURE(status)) 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR: vi_VN collation did not have cannonical decomposition for normalization!\n"); 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_getAttribute(el_GR, UCOL_NORMALIZATION_MODE, &status) != UCOL_ON || 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_FAILURE(status)) 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR: el_GR collation did not have cannonical decomposition for normalization!\n"); 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_getAttribute(en_US, UCOL_NORMALIZATION_MODE, &status) != UCOL_OFF || 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_FAILURE(status)) 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR: en_US collation had cannonical decomposition for normalization!\n"); 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(en_US); 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(el_GR); 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(vi_VN); 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CLONETEST_COLLATOR_COUNT 4 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestSafeClone() { 654c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UChar test1[6]; 655c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UChar test2[6]; 656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar umlautUStr[] = {0x00DC, 0}; 657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar oeStr[] = {0x0055, 0x0045, 0}; 658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator * someCollators [CLONETEST_COLLATOR_COUNT]; 659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator * someClonedCollators [CLONETEST_COLLATOR_COUNT]; 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator * col; 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode err = U_ZERO_ERROR; 662c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int8_t index = 6; /* Leave this here to test buffer alingment in memory*/ 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t buffer [CLONETEST_COLLATOR_COUNT] [U_COL_SAFECLONE_BUFFERSIZE]; 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t bufferSize = U_COL_SAFECLONE_BUFFERSIZE; 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char sampleRuleChars[] = "&Z < CH"; 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar sampleRule[sizeof(sampleRuleChars)]; 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (TestBufferSize()) { 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("U_COL_SAFECLONE_BUFFERSIZE should be larger than sizeof(UCollator)\n"); 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(test1, "abCda"); 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(test2, "abcda"); 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(sampleRule, sampleRuleChars); 676b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* one default collator & two complex ones */ 678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru someCollators[0] = ucol_open("en_US", &err); 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru someCollators[1] = ucol_open("ko", &err); 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru someCollators[2] = ucol_open("ja_JP", &err); 681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru someCollators[3] = ucol_openRules(sampleRule, -1, UCOL_ON, UCOL_TERTIARY, NULL, &err); 682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err)) { 683c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for (index = 0; index < CLONETEST_COLLATOR_COUNT; index++) { 684c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ucol_close(someCollators[index]); 685c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_data_err("Couldn't open one or more collators\n"); 687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Check the various error & informational states: */ 691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Null status - just returns NULL */ 693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (0 != ucol_safeClone(someCollators[0], buffer[0], &bufferSize, 0)) 694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: Cloned Collator failed to deal correctly with null status\n"); 696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* error status - should return 0 & keep error the same */ 698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_MEMORY_ALLOCATION_ERROR; 699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (0 != ucol_safeClone(someCollators[0], buffer[0], &bufferSize, &err) || err != U_MEMORY_ALLOCATION_ERROR) 700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: Cloned Collator failed to deal correctly with incoming error status\n"); 702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Null buffer size pointer - just returns NULL & set error to U_ILLEGAL_ARGUMENT_ERROR*/ 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (0 != ucol_safeClone(someCollators[0], buffer[0], 0, &err) || err != U_ILLEGAL_ARGUMENT_ERROR) 707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: Cloned Collator failed to deal correctly with null bufferSize pointer\n"); 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 711b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* buffer size pointer is 0 - fill in pbufferSize with a size */ 713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bufferSize = 0; 714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (0 != ucol_safeClone(someCollators[0], buffer[0], &bufferSize, &err) || U_FAILURE(err) || bufferSize <= 0) 715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: Cloned Collator failed a sizing request ('preflighting')\n"); 717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Verify our define is large enough */ 719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_COL_SAFECLONE_BUFFERSIZE < bufferSize) 720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: Pre-calculated buffer size is too small\n"); 722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Verify we can use this run-time calculated size */ 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (0 == (col = ucol_safeClone(someCollators[0], buffer[0], &bufferSize, &err)) || U_FAILURE(err)) 725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: Collator can't be cloned with run-time size\n"); 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (col) ucol_close(col); 729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* size one byte too small - should allocate & let us know */ 730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru --bufferSize; 731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (0 == (col = ucol_safeClone(someCollators[0], 0, &bufferSize, &err)) || err != U_SAFECLONE_ALLOCATED_WARNING) 732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: Cloned Collator failed to deal correctly with too-small buffer size\n"); 734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (col) ucol_close(col); 736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bufferSize = U_COL_SAFECLONE_BUFFERSIZE; 738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Null buffer pointer - return Collator & set error to U_SAFECLONE_ALLOCATED_ERROR */ 741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (0 == (col = ucol_safeClone(someCollators[0], 0, &bufferSize, &err)) || err != U_SAFECLONE_ALLOCATED_WARNING) 742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: Cloned Collator failed to deal correctly with null buffer pointer\n"); 744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (col) ucol_close(col); 746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Null Collator - return NULL & set U_ILLEGAL_ARGUMENT_ERROR */ 749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (0 != ucol_safeClone(0, buffer[0], &bufferSize, &err) || err != U_ILLEGAL_ARGUMENT_ERROR) 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: Cloned Collator failed to deal correctly with null Collator pointer\n"); 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Test that a cloned collator doesn't accidentally use UCA. */ 757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col=ucol_open("de@collation=phonebook", &err); 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bufferSize = U_COL_SAFECLONE_BUFFERSIZE; 759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru someClonedCollators[0] = ucol_safeClone(col, buffer[0], &bufferSize, &err); 760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (ucol_greater(col, umlautUStr, u_strlen(umlautUStr), oeStr, u_strlen(oeStr))), "Original German phonebook collation sorts differently than expected"); 761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (ucol_greater(someClonedCollators[0], umlautUStr, u_strlen(umlautUStr), oeStr, u_strlen(oeStr))), "Cloned German phonebook collation sorts differently than expected"); 762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!ucol_equals(someClonedCollators[0], col)) { 763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: Cloned German phonebook collator is not equal to original.\n"); 764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(col); 766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(someClonedCollators[0]); 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* change orig & clone & make sure they are independent */ 771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (index = 0; index < CLONETEST_COLLATOR_COUNT; index++) 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(someCollators[index], UCOL_IDENTICAL); 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bufferSize = 1; 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(ucol_safeClone(someCollators[index], buffer[index], &bufferSize, &err)); 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (err != U_SAFECLONE_ALLOCATED_WARNING) { 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: collator number %d was not allocated.\n", index); 780c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_err("FAIL: status of Collator[%d] is %d (hex: %x).\n", index, err, err); 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bufferSize = U_COL_SAFECLONE_BUFFERSIZE; 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru someClonedCollators[index] = ucol_safeClone(someCollators[index], buffer[index], &bufferSize, &err); 786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (someClonedCollators[index] == NULL 787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || someClonedCollators[index] < (UCollator *)buffer[index] 788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || someClonedCollators[index] > (UCollator *)(buffer[index]+(U_COL_SAFECLONE_BUFFERSIZE-1))) 789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: Cloned collator didn't use provided buffer.\n"); 791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!ucol_equals(someClonedCollators[index], someCollators[index])) { 794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAIL: Cloned collator is not equal to original at index = %d.\n", index); 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Check the usability */ 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(someCollators[index], UCOL_PRIMARY); 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(someCollators[index], UCOL_CASE_LEVEL, UCOL_OFF, &err); 800b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (ucol_equal(someCollators[index], test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"abcda\" == \"abCda\""); 802b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Close the original to make sure that the clone is usable. */ 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(someCollators[index]); 805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(someClonedCollators[index], UCOL_TERTIARY); 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(someClonedCollators[index], UCOL_CASE_LEVEL, UCOL_OFF, &err); 808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (ucol_greater(someClonedCollators[index], test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"abCda\" >>> \"abcda\" "); 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(someClonedCollators[index]); 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestCloneBinary(){ 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode err = U_ZERO_ERROR; 816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator * col = ucol_open("en_US", &err); 817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator * c; 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t size; 819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t * buffer; 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(err)) { 822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_data_err("Couldn't open collator. Error: %s\n", u_errorName(err)); 823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru size = ucol_cloneBinary(col, NULL, 0, &err); 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(size==0 || err!=U_BUFFER_OVERFLOW_ERROR) { 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ucol_cloneBinary - couldn't check size. Error: %s\n", u_errorName(err)); 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer = (uint8_t *) malloc(size); 834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_cloneBinary(col, buffer, size, &err); 835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err)) { 836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ucol_cloneBinary - couldn't clone.. Error: %s\n", u_errorName(err)); 837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(buffer); 838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* how to check binary result ? */ 842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = ucol_openBinary(buffer, size, col, &err); 844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err)) { 845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ucol_openBinary failed. Error: %s\n", u_errorName(err)); 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar t[] = {0x41, 0x42, 0x43, 0}; /* ABC */ 848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t *k1, *k2; 849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int l1, l2; 850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru l1 = ucol_getSortKey(col, t, -1, NULL,0); 851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru l2 = ucol_getSortKey(c, t, -1, NULL,0); 852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru k1 = (uint8_t *) malloc(sizeof(uint8_t) * l1); 853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru k2 = (uint8_t *) malloc(sizeof(uint8_t) * l2); 854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(col, t, -1, k1, l1); 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(col, t, -1, k2, l2); 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (strcmp((char *)k1,(char *)k2) != 0){ 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ucol_openBinary - new collator should equal to old one\n"); 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(k1); 860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(k2); 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(buffer); 863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(c); 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(col); 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 867b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TestOpenVsOpenRules ensures that collators from ucol_open and ucol_openRules 868b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru will generate identical sort keys 869b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru*/ 870b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid TestOpenVsOpenRules(){ 871b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 872b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* create an array of all the locales */ 873b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t numLocales = uloc_countAvailable(); 874b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t sizeOfStdSet; 875b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uint32_t adder; 876b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar str[41]; /* create an array of UChar of size maximum strSize + 1 */ 877b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru USet *stdSet; 878b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru char* curLoc; 879b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UCollator * c1; 880b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UCollator * c2; 881b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UChar* rules; 882b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t rulesLength; 883b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t sortKeyLen1, sortKeyLen2; 884b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uint8_t *sortKey1 = NULL, *sortKey2 = NULL; 885b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ULocaleData *uld; 88650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t x, y, z; 887b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru USet *eSet; 888b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t eSize; 889b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int strSize; 890b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 891b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode err = U_ZERO_ERROR; 892b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 893b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* create a set of standard characters that aren't very interesting... 894b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru and then we can find some interesting ones later */ 895b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 896b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru stdSet = uset_open(0x61, 0x7A); 897b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uset_addRange(stdSet, 0x41, 0x5A); 898b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uset_addRange(stdSet, 0x30, 0x39); 899b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru sizeOfStdSet = uset_size(stdSet); 900b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 901b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru adder = 1; 90250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(getTestOption(QUICK_OPTION)) 903b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { 904b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru adder = 10; 905b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 906b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 907b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(x = 0; x < numLocales; x+=adder){ 908b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru curLoc = (char *)uloc_getAvailable(x); 909b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_verbose("Processing %s\n", curLoc); 910b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 911b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* create a collator the normal API way */ 912b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru c1 = ucol_open(curLoc, &err); 913b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(err)) { 914b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("ERROR: Normal collation creation failed with locale: %s : %s\n", curLoc, myErrorName(err)); 915b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 916b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 917b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 918b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* grab the rules */ 919b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru rules = ucol_getRules(c1, &rulesLength); 920b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 921b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* use those rules to create a collator from rules */ 922b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru c2 = ucol_openRules(rules, rulesLength, UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH, NULL, &err); 923b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(err)) { 924b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("ERROR: Creating collator from rules failed with locale: %s : %s\n", curLoc, myErrorName(err)); 925b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 926b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 927b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 928b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uld = ulocdata_open(curLoc, &err); 929b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 930b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /*now that we have some collators, we get several strings */ 931b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 932b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(y = 0; y < 5; y++){ 933b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 934b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* get a set of ALL the characters in this locale */ 935b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru eSet = ulocdata_getExemplarSet(uld, NULL, 0, ULOCDATA_ES_STANDARD, &err); 936b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru eSize = uset_size(eSet); 937b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 938b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* make a string with these characters in it */ 939b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru strSize = (rand()%40) + 1; 940b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 941b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for(z = 0; z < strSize; z++){ 942b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru str[z] = uset_charAt(eSet, rand()%eSize); 943b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 944b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 945b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* change the set to only include 'abnormal' characters (not A-Z, a-z, 0-9 */ 946b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uset_removeAll(eSet, stdSet); 947b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru eSize = uset_size(eSet); 948b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 949b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* if there are some non-normal characters left, put a few into the string, just to make sure we have some */ 950b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(eSize > 0){ 951b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru str[2%strSize] = uset_charAt(eSet, rand()%eSize); 952b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru str[3%strSize] = uset_charAt(eSet, rand()%eSize); 953b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru str[5%strSize] = uset_charAt(eSet, rand()%eSize); 954b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru str[10%strSize] = uset_charAt(eSet, rand()%eSize); 955b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru str[13%strSize] = uset_charAt(eSet, rand()%eSize); 956b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 957b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* terminate the string */ 958b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru str[strSize-1] = '\0'; 959b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_verbose("String used: %S\n", str); 960b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 961b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* get sort keys for both of them, and check that the keys are identicle */ 962b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru sortKeyLen1 = ucol_getSortKey(c1, str, u_strlen(str), NULL, 0); 963b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru sortKey1 = (uint8_t*)malloc(sizeof(uint8_t) * (sortKeyLen1 + 1)); 964b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /*memset(sortKey1, 0xFE, sortKeyLen1);*/ 965b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ucol_getSortKey(c1, str, u_strlen(str), sortKey1, sortKeyLen1 + 1); 966b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 967b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru sortKeyLen2 = ucol_getSortKey(c2, str, u_strlen(str), NULL, 0); 968b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru sortKey2 = (uint8_t*)malloc(sizeof(uint8_t) * (sortKeyLen2 + 1)); 969b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /*memset(sortKey2, 0xFE, sortKeyLen2);*/ 970b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ucol_getSortKey(c2, str, u_strlen(str), sortKey2, sortKeyLen2 + 1); 971b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 972b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* Check that the lengths are the same */ 973b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru doAssert((sortKeyLen1 == sortKeyLen2), "Sort key lengths do not match."); 974b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 975b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* check that the keys are the same */ 976b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru doAssert((memcmp(sortKey1, sortKey2, sortKeyLen1) == 0), "Keys are not equivalent"); 977b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 978b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* clean up after each string */ 979b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru free(sortKey1); 980b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru free(sortKey2); 981b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uset_close(eSet); 982b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 983b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* clean up after each locale */ 984b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ulocdata_close(uld); 985b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ucol_close(c1); 986b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ucol_close(c2); 987b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 988b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* final clean up */ 989b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uset_close(stdSet); 990b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 991b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/* 992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru---------------------------------------------------------------------------- 993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ctor -- Tests the getSortKey 994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestSortKey() 996b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{ 997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t *sortk1 = NULL, *sortk2 = NULL, *sortk3 = NULL, *sortkEmpty = NULL; 998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t sortklen, osortklen; 999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t toStringLen=0; 1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *col; 1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *test1, *test2, *test3; 1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char toStringBuffer[256], *resultP; 1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t s1[] = { 0x9f, 0x00 }; 1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t s2[] = { 0x61, 0x00 }; 1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int strcmpResult; 1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcmpResult = strcmp((const char *)s1, (const char *)s2); 1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("strcmp(0x9f..., 0x61...) = %d\n", strcmpResult); 1012b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strcmpResult <= 0) { 1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERR: expected strcmp(\"9f 00\", \"61 00\") to be >=0 (GREATER).. got %d. Calling strcmp() for sortkeys may not work! \n", 1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcmpResult); 1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing SortKey begins...\n"); 1020b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* this is supposed to open default date format, but later on it treats it like it is "en_US" 1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru - very bad if you try to run the tests on machine where default locale is NOT "en_US" */ 1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* col = ucol_open(NULL, &status); */ 1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col = ucol_open("en_US", &status); 1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 10256d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(status, "ERROR: Default collation creation failed.: %s\n", myErrorName(status)); 1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(ucol_getStrength(col) != UCOL_DEFAULT_STRENGTH) 1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR: default collation did not have UCOL_DEFAULT_STRENGTH !\n"); 1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Need to use identical strength */ 1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(col, UCOL_STRENGTH, UCOL_IDENTICAL, &status); 1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1=(UChar*)malloc(sizeof(UChar) * 6); 1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test2=(UChar*)malloc(sizeof(UChar) * 6); 1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3=(UChar*)malloc(sizeof(UChar) * 6); 1040b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(test1,0xFE, sizeof(UChar)*6); 1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(test2,0xFE, sizeof(UChar)*6); 1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(test3,0xFE, sizeof(UChar)*6); 1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(test1, "Abcda"); 1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(test2, "abcda"); 1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(test3, "abcda"); 1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Use tertiary comparison level testing ....\n"); 1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortklen=ucol_getSortKey(col, test1, u_strlen(test1), NULL, 0); 1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortk1=(uint8_t*)malloc(sizeof(uint8_t) * (sortklen+1)); 1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(sortk1,0xFE, sortklen); 1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(col, test1, u_strlen(test1), sortk1, sortklen+1); 1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortklen=ucol_getSortKey(col, test2, u_strlen(test2), NULL, 0); 1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortk2=(uint8_t*)malloc(sizeof(uint8_t) * (sortklen+1)); 1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(sortk2,0xFE, sortklen); 1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(col, test2, u_strlen(test2), sortk2, sortklen+1); 1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru osortklen = sortklen; 1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortklen=ucol_getSortKey(col, test2, u_strlen(test3), NULL, 0); 1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortk3=(uint8_t*)malloc(sizeof(uint8_t) * (sortklen+1)); 1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(sortk3,0xFE, sortklen); 1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(col, test2, u_strlen(test2), sortk3, sortklen+1); 1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (sortklen == osortklen), "Sortkey length should be the same (abcda, abcda)"); 1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (memcmp(sortk1, sortk2, sortklen) > 0), "Result should be \"Abcda\" > \"abcda\""); 1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (memcmp(sortk2, sortk1, sortklen) < 0), "Result should be \"abcda\" < \"Abcda\""); 1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (memcmp(sortk2, sortk3, sortklen) == 0), "Result should be \"abcda\" == \"abcda\""); 1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 107450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho resultP = ucol_sortKeyToString(col, sortk3, toStringBuffer, &toStringLen); 1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (resultP != 0), "sortKeyToString failed!"); 1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 1 /* verobse log of sortkeys */ 1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char junk2[1000]; 1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char junk3[1000]; 1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcpy(junk2, "abcda[2] "); 1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcpy(junk3, " abcda[3] "); 1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0;i<sortklen;i++) 1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(junk2+strlen(junk2), "%02X ",(int)( 0xFF & sortk2[i])); 1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(junk3+strlen(junk3), "%02X ",(int)( 0xFF & sortk3[i])); 1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1091b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%s\n", junk2); 1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%s\n", junk3); 1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(sortk1); 1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(sortk2); 1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(sortk3); 1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Use secondary comparision level testing ...\n"); 1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setStrength(col, UCOL_SECONDARY); 1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortklen=ucol_getSortKey(col, test1, u_strlen(test1), NULL, 0); 1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortk1=(uint8_t*)malloc(sizeof(uint8_t) * (sortklen+1)); 1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(col, test1, u_strlen(test1), sortk1, sortklen+1); 1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortklen=ucol_getSortKey(col, test2, u_strlen(test2), NULL, 0); 1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortk2=(uint8_t*)malloc(sizeof(uint8_t) * (sortklen+1)); 1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(col, test2, u_strlen(test2), sortk2, sortklen+1); 1109b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( !(memcmp(sortk1, sortk2, sortklen) > 0), "Result should be \"Abcda\" == \"abcda\""); 1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( !(memcmp(sortk2, sortk1, sortklen) < 0), "Result should be \"abcda\" == \"Abcda\""); 1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (memcmp(sortk1, sortk2, sortklen) == 0), "Result should be \"abcda\" == \"abcda\""); 1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("getting sortkey for an empty string\n"); 1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(col, UCOL_STRENGTH, UCOL_TERTIARY, &status); 1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortklen = ucol_getSortKey(col, test1, 0, NULL, 0); 1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortkEmpty = (uint8_t*)malloc(sizeof(uint8_t) * sortklen+1); 1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortklen = ucol_getSortKey(col, test1, 0, sortkEmpty, sortklen+1); 1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(sortklen != 3 || sortkEmpty[0] != 1 || sortkEmpty[0] != 1 || sortkEmpty[2] != 0) { 1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Empty string generated wrong sortkey!\n"); 1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(sortkEmpty); 1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing passing invalid string\n"); 1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortklen = ucol_getSortKey(col, NULL, 0, NULL, 0); 1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(sortklen != 0) { 1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Invalid string didn't return sortkey size of 0\n"); 1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1129b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1130b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing sortkey ends...\n"); 1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(col); 1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(test1); 1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(test2); 1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(test3); 1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(sortk1); 1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(sortk2); 1138b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestHashCode() 1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t *sortk1, *sortk2, *sortk3; 1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t sortk1len, sortk2len, sortk3len; 1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *col; 1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *test1, *test2, *test3; 1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing getHashCode begins...\n"); 1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col = ucol_open("en_US", &status); 1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 11506d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(status, "ERROR: Default collation creation failed.: %s\n", myErrorName(status)); 1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1=(UChar*)malloc(sizeof(UChar) * 6); 1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test2=(UChar*)malloc(sizeof(UChar) * 6); 1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3=(UChar*)malloc(sizeof(UChar) * 6); 1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(test1, "Abcda"); 1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(test2, "abcda"); 1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(test3, "abcda"); 1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Use tertiary comparison level testing ....\n"); 1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortk1len=ucol_getSortKey(col, test1, u_strlen(test1), NULL, 0); 1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortk1=(uint8_t*)malloc(sizeof(uint8_t) * (sortk1len+1)); 1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(col, test1, u_strlen(test1), sortk1, sortk1len+1); 1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortk2len=ucol_getSortKey(col, test2, u_strlen(test2), NULL, 0); 1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortk2=(uint8_t*)malloc(sizeof(uint8_t) * (sortk2len+1)); 1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(col, test2, u_strlen(test2), sortk2, sortk2len+1); 1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortk3len=ucol_getSortKey(col, test2, u_strlen(test3), NULL, 0); 1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortk3=(uint8_t*)malloc(sizeof(uint8_t) * (sortk3len+1)); 1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getSortKey(col, test2, u_strlen(test2), sortk3, sortk3len+1); 1170b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1171b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("ucol_hashCode() testing ...\n"); 1173b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1174b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru doAssert( ucol_keyHashCode(sortk1, sortk1len) != ucol_keyHashCode(sortk2, sortk2len), "Hash test1 result incorrect" ); 1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( !(ucol_keyHashCode(sortk1, sortk1len) == ucol_keyHashCode(sortk2, sortk2len)), "Hash test2 result incorrect" ); 1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( ucol_keyHashCode(sortk2, sortk2len) == ucol_keyHashCode(sortk3, sortk3len), "Hash result not equal" ); 1177b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("hashCode tests end.\n"); 1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(col); 1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(sortk1); 1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(sortk2); 1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(sortk3); 1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(test1); 1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(test2); 1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(test3); 1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *---------------------------------------------------------------------------- 1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Tests the UCollatorElements API. 1192b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * 1193b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestElemIter() 1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t offset; 1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t order1, order2, order3; 1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *testString1, *testString2; 1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *col; 1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollationElements *iterator1, *iterator2, *iterator3; 1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing UCollatorElements begins...\n"); 1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru col = ucol_open("en_US", &status); 1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(col, UCOL_NORMALIZATION_MODE, UCOL_OFF, &status); 1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 12066d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(status, "ERROR: Default collation creation failed.: %s\n", myErrorName(status)); 1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testString1=(UChar*)malloc(sizeof(UChar) * 150); 1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testString2=(UChar*)malloc(sizeof(UChar) * 150); 1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(testString1, "XFILE What subset of all possible test cases has the highest probability of detecting the most errors?"); 1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(testString2, "Xf_ile What subset of all possible test cases has the lowest probability of detecting the least errors?"); 1214b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Constructors and comparison testing....\n"); 1216b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iterator1 = ucol_openElements(col, testString1, u_strlen(testString1), &status); 1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR: Default collationElement iterator creation failed.: %s\n", myErrorName(status)); 1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(col); 1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else{ log_verbose("PASS: Default collationElement iterator1 creation passed\n");} 1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iterator2 = ucol_openElements(col, testString1, u_strlen(testString1), &status); 1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR: Default collationElement iterator creation failed.: %s\n", myErrorName(status)); 1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(col); 1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else{ log_verbose("PASS: Default collationElement iterator2 creation passed\n");} 1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iterator3 = ucol_openElements(col, testString2, u_strlen(testString2), &status); 1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ERROR: Default collationElement iterator creation failed.: %s\n", myErrorName(status)); 1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(col); 1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else{ log_verbose("PASS: Default collationElement iterator3 creation passed\n");} 1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru offset=ucol_getOffset(iterator1); 1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setOffset(iterator1, 6, &status); 1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error in setOffset for UCollatorElements iterator.: %s\n", myErrorName(status)); 1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(ucol_getOffset(iterator1)==6) 1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("setOffset and getOffset working fine\n"); 1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else{ 1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error in set and get Offset got %d instead of 6\n", ucol_getOffset(iterator1)); 1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setOffset(iterator1, 0, &status); 1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru order1 = ucol_next(iterator1, &status); 1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Somehow ran out of memory stepping through the iterator1.: %s\n", myErrorName(status)); 1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru order2=ucol_getOffset(iterator2); 1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert((order1 != order2), "The first iterator advance failed"); 1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru order2 = ucol_next(iterator2, &status); 1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Somehow ran out of memory stepping through the iterator2.: %s\n", myErrorName(status)); 1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru order3 = ucol_next(iterator3, &status); 1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Somehow ran out of memory stepping through the iterator3.: %s\n", myErrorName(status)); 1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1271b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert((order1 == order2), "The second iterator advance failed should be the same as first one"); 1273b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoAssert( (ucol_primaryOrder(order1) == ucol_primaryOrder(order3)), "The primary orders should be identical"); 1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoAssert( (ucol_secondaryOrder(order1) == ucol_secondaryOrder(order3)), "The secondary orders should be identical"); 1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoAssert( (ucol_tertiaryOrder(order1) == ucol_tertiaryOrder(order3)), "The tertiary orders should be identical"); 1277b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru order1=ucol_next(iterator1, &status); 1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Somehow ran out of memory stepping through the iterator2.: %s\n", myErrorName(status)); 1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru order3=ucol_next(iterator3, &status); 1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Somehow ran out of memory stepping through the iterator2.: %s\n", myErrorName(status)); 1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoAssert( (ucol_primaryOrder(order1) == ucol_primaryOrder(order3)), "The primary orders should be identical"); 1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoAssert( (ucol_tertiaryOrder(order1) != ucol_tertiaryOrder(order3)), "The tertiary orders should be different"); 1290b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru order1=ucol_next(iterator1, &status); 1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Somehow ran out of memory stepping through the iterator2.: %s\n", myErrorName(status)); 1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru order3=ucol_next(iterator3, &status); 1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Somehow ran out of memory stepping through the iterator2.: %s\n", myErrorName(status)); 1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* this here, my friends, is either pure lunacy or something so obsolete that even it's mother 1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * doesn't care about it. Essentialy, this test complains if secondary values for 'I' and '_' 1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * are the same. According to the UCA, this is not true. Therefore, remove the test. 1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Besides, if primary strengths for two code points are different, it doesn't matter one bit 1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * what is the relation between secondary or any other strengths. 1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * killed by weiv 06/11/2002. 1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( ((order1 & UCOL_SECONDARYMASK) != (order3 & UCOL_SECONDARYMASK)), "The secondary orders should be different"); 1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doAssert( (order1 != UCOL_NULLORDER), "Unexpected end of iterator reached"); 1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(testString1); 1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(testString2); 1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_closeElements(iterator1); 1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_closeElements(iterator2); 1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_closeElements(iterator3); 1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(col); 1319b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing CollationElementIterator ends...\n"); 1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestGetLocale() { 1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *rules = "&a<x<y<z"; 1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar rlz[256] = {0}; 1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t rlzLen = u_unescape(rules, rlz, 256); 1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = NULL; 1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *locale = NULL; 1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0; 1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Now that the collation tree is separate, actual==valid at all times. [alan] */ 1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const struct { 1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* requestedLocale; 1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* validLocale; 1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* actualLocale; 1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } testStruct[] = { 1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "sr_RS", "sr_Cyrl_RS", "ru" }, 1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "sh_YU", "sr_Latn_RS", "hr" }, /* this used to be sh, but now sh collation aliases hr */ 1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "en_BE_FOO", "en_BE", "en_BE" }, 1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "fr_FR_NONEXISTANT", "fr_FR", "fr" } 1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test opening collators for different locales */ 1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<sizeof(testStruct)/sizeof(testStruct[0]); i++) { 1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_open(testStruct[i].requestedLocale, &status); 1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 13516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(status, "Failed to open collator for %s with %s\n", testStruct[i].requestedLocale, u_errorName(status)); 1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1355b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru locale = ucol_getLocaleByType(coll, ULOC_REQUESTED_LOCALE, &status); 1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strcmp(locale, testStruct[i].requestedLocale) != 0) { 1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("[Coll %s]: Error in requested locale, expected %s, got %s\n", testStruct[i].requestedLocale, testStruct[i].requestedLocale, locale); 1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1359b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru locale = ucol_getLocaleByType(coll, ULOC_VALID_LOCALE, &status); 1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strcmp(locale, testStruct[i].validLocale) != 0) { 1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("[Coll %s]: Error in valid locale, expected %s, got %s\n", testStruct[i].requestedLocale, testStruct[i].validLocale, locale); 1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1363b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru locale = ucol_getLocaleByType(coll, ULOC_ACTUAL_LOCALE, &status); 1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strcmp(locale, testStruct[i].actualLocale) != 0) { 1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("[Coll %s]: Error in actual locale, expected %s, got %s\n", testStruct[i].requestedLocale, testStruct[i].actualLocale, locale); 1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* completely non-existant locale for collator should get a default collator */ 1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *defaultColl = ucol_open(NULL, &status); 1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_open("blahaha", &status); 1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 1375b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(strcmp(ucol_getLocaleByType(coll, ULOC_REQUESTED_LOCALE, &status), "blahaha")) { 1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Nonexisting locale didn't preserve the requested locale\n"); 1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1378b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(strcmp(ucol_getLocaleByType(coll, ULOC_VALID_LOCALE, &status), 1379b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ucol_getLocaleByType(defaultColl, ULOC_VALID_LOCALE, &status))) { 1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Valid locale for nonexisting locale locale collator differs " 1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "from valid locale for default collator\n"); 1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1383b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(strcmp(ucol_getLocaleByType(coll, ULOC_ACTUAL_LOCALE, &status), 1384b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ucol_getLocaleByType(defaultColl, ULOC_ACTUAL_LOCALE, &status))) { 1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Actual locale for nonexisting locale locale collator differs " 1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "from actual locale for default collator\n"); 1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(defaultColl); 1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_data_err("Couldn't open collators\n"); 1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1395b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* collator instantiated from rules should have all three locales NULL */ 1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_openRules(rlz, rlzLen, UCOL_DEFAULT, UCOL_DEFAULT, NULL, &status); 1399b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru locale = ucol_getLocaleByType(coll, ULOC_REQUESTED_LOCALE, &status); 1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(locale != NULL) { 1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("For collator instantiated from rules, requested locale returned %s instead of NULL\n", locale); 1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1403b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru locale = ucol_getLocaleByType(coll, ULOC_VALID_LOCALE, &status); 1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(locale != NULL) { 1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("For collator instantiated from rules, valid locale returned %s instead of NULL\n", locale); 1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1407b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru locale = ucol_getLocaleByType(coll, ULOC_ACTUAL_LOCALE, &status); 1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(locale != NULL) { 1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("For collator instantiated from rules, actual locale returned %s instead of NULL\n", locale); 1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestGetAll() 1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, count; 1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count=ucol_countAvailable(); 1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* use something sensible w/o hardcoding the count */ 1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(count < 0){ 1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error in countAvailable(), it returned %d\n", count); 1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else{ 1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("PASS: countAvailable() successful, it returned %d\n", count); 1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0;i<count;i++) 1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("%s\n", ucol_getAvailable(i)); 1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustruct teststruct { 1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *original; 1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t key[256]; 1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} ; 1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int compare_teststruct(const void *string1, const void *string2) { 1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return(strcmp((const char *)((struct teststruct *)string1)->key, (const char *)((struct teststruct *)string2)->key)); 1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestBounds() { 1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_open("sh", &status); 1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t sortkey[512], lower[512], upper[512]; 1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buffer[512]; 1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char * const test[] = { 1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "John Smith", 1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "JOHN SMITH", 1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "john SMITH", 1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "j\\u00F6hn sm\\u00EFth", 1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "J\\u00F6hn Sm\\u00EFth", 1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "J\\u00D6HN SM\\u00CFTH", 1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "john smithsonian", 1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "John Smithsonian", 1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1462b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru struct teststruct tests[] = { 1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKI MIHALJ" } , 1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKI MIHALJ" } , 1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKI PIRO\\u0160KA" }, 1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABAI ANDRIJA" } , 1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABAI LAJO\\u0160" } , 1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABAI MARIJA" } , 1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABAI STEVAN" } , 1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABAI STEVAN" } , 1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABARKAPA BRANKO" } , 1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABARKAPA MILENKO" } , 1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABARKAPA MIROSLAV" } , 1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABARKAPA SIMO" } , 1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABARKAPA STANKO" } , 1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABARKAPA TAMARA" } , 1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABARKAPA TOMA\\u0160" } , 1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABDARI\\u0106 NIKOLA" } , 1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABDARI\\u0106 ZORICA" } , 1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABI NANDOR" } , 1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABOVI\\u0106 MILAN" } , 1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABRADI AGNEZIJA" } , 1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABRADI IVAN" } , 1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABRADI JELENA" } , 1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABRADI LJUBICA" } , 1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABRADI STEVAN" } , 1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABRDA MARTIN" } , 1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABRILO BOGDAN" } , 1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABRILO BRANISLAV" } , 1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABRILO LAZAR" } , 1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABRILO LJUBICA" } , 1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CABRILO SPASOJA" } , 1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CADE\\u0160 ZDENKA" } , 1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CADESKI BLAGOJE" } , 1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CADOVSKI VLADIMIR" } , 1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAGLJEVI\\u0106 TOMA" } , 1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAGOROVI\\u0106 VLADIMIR" } , 1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAJA VANKA" } , 1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAJI\\u0106 BOGOLJUB" } , 1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAJI\\u0106 BORISLAV" } , 1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAJI\\u0106 RADOSLAV" } , 1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAK\\u0160IRAN MILADIN" } , 1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKAN EUGEN" } , 1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKAN EVGENIJE" } , 1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKAN IVAN" } , 1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKAN JULIJAN" } , 1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKAN MIHAJLO" } , 1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKAN STEVAN" } , 1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKAN VLADIMIR" } , 1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKAN VLADIMIR" } , 1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKAN VLADIMIR" } , 1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKARA ANA" } , 1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKAREVI\\u0106 MOMIR" } , 1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKAREVI\\u0106 NEDELJKO" } , 1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKI \\u0160ANDOR" } , 1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKI AMALIJA" } , 1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKI ANDRA\\u0160" } , 1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKI LADISLAV" } , 1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKI LAJO\\u0160" } , 1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"\\u010CAKI LASLO" } , 1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0, j = 0, k = 0, buffSize = 0, skSize = 0, lowerSize = 0, upperSize = 0; 1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t arraySize = sizeof(tests)/sizeof(tests[0]); 1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status) && coll) { 1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<arraySize; i++) { 1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffSize = u_unescape(tests[i].original, buffer, 512); 1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru skSize = ucol_getSortKey(coll, buffer, buffSize, tests[i].key, 512); 1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru qsort(tests, arraySize, sizeof(struct teststruct), compare_teststruct); 1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < arraySize-1; i++) { 1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = i+1; j < arraySize; j++) { 1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lowerSize = ucol_getBound(tests[i].key, -1, UCOL_BOUND_LOWER, 1, lower, 512, &status); 1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru upperSize = ucol_getBound(tests[j].key, -1, UCOL_BOUND_UPPER, 1, upper, 512, &status); 1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(k = i; k <= j; k++) { 1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strcmp((const char *)lower, (const char *)tests[k].key) > 0) { 1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Problem with lower! j = %i (%s vs %s)\n", k, tests[k].original, tests[i].original); 1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strcmp((const char *)upper, (const char *)tests[k].key) <= 0) { 1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Problem with upper! j = %i (%s vs %s)\n", k, tests[k].original, tests[j].original); 1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0 1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < 1000; i++) { 1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lowerRND = (rand()/(RAND_MAX/arraySize)); 1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru upperRND = lowerRND + (rand()/(RAND_MAX/(arraySize-lowerRND))); 1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lowerSize = ucol_getBound(tests[lowerRND].key, -1, UCOL_BOUND_LOWER, 1, lower, 512, &status); 1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru upperSize = ucol_getBound(tests[upperRND].key, -1, UCOL_BOUND_UPPER_LONG, 1, upper, 512, &status); 1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = lowerRND; j<=upperRND; j++) { 1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strcmp(lower, tests[j].key) > 0) { 1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Problem with lower! j = %i (%s vs %s)\n", j, tests[j].original, tests[lowerRND].original); 1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strcmp(upper, tests[j].key) <= 0) { 1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Problem with upper! j = %i (%s vs %s)\n", j, tests[j].original, tests[upperRND].original); 1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<sizeof(test)/sizeof(test[0]); i++) { 1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffSize = u_unescape(test[i], buffer, 512); 1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru skSize = ucol_getSortKey(coll, buffer, buffSize, sortkey, 512); 1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lowerSize = ucol_getBound(sortkey, skSize, UCOL_BOUND_LOWER, 1, lower, 512, &status); 1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru upperSize = ucol_getBound(sortkey, skSize, UCOL_BOUND_UPPER_LONG, 1, upper, 512, &status); 1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = i+1; j<sizeof(test)/sizeof(test[0]); j++) { 1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffSize = u_unescape(test[j], buffer, 512); 1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru skSize = ucol_getSortKey(coll, buffer, buffSize, sortkey, 512); 1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strcmp((const char *)lower, (const char *)sortkey) > 0) { 1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Problem with lower! i = %i, j = %i (%s vs %s)\n", i, j, test[i], test[j]); 1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strcmp((const char *)upper, (const char *)sortkey) <= 0) { 1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Problem with upper! i = %i, j = %i (%s vs %s)\n", i, j, test[i], test[j]); 1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_data_err("Couldn't open collator\n"); 1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void doOverrunTest(UCollator *coll, const UChar *uString, int32_t strLen) { 1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t skLen = 0, skLen2 = 0; 1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t sortKey[256]; 1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, j; 1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t filler = 0xFF; 1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru skLen = ucol_getSortKey(coll, uString, strLen, NULL, 0); 1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < skLen; i++) { 1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(sortKey, filler, 256); 1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru skLen2 = ucol_getSortKey(coll, uString, strLen, sortKey, i); 1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(skLen != skLen2) { 1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("For buffer size %i, got different sortkey length. Expected %i got %i\n", i, skLen, skLen2); 1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = i; j < 256; j++) { 1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(sortKey[j] != filler) { 1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Something run over index %i\n", j); 1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* j1865 reports that if a shorter buffer is passed to 1622b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru* to get sort key, a buffer overrun happens in some 1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* cases. This test tries to check this. 1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestSortKeyBufferOverrun(void) { 1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* cString = "A very Merry liTTle-lamB.."; 1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar uString[256]; 1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t strLen = 0; 1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_open("root", &status); 1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strLen = u_unescape(cString, uString, 256); 1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing non ignorable\n"); 1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, &status); 1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doOverrunTest(coll, uString, strLen); 1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing shifted\n"); 1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &status); 1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doOverrunTest(coll, uString, strLen); 1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing shifted quaternary\n"); 1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_QUATERNARY, &status); 1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doOverrunTest(coll, uString, strLen); 1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing with french secondaries\n"); 1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_FRENCH_COLLATION, UCOL_ON, &status); 1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_TERTIARY, &status); 1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, &status); 1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doOverrunTest(coll, uString, strLen); 1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestAttribute() 1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode error = U_ZERO_ERROR; 1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_open(NULL, &error); 1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(error)) { 16626d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(error, "Creation of default collator failed\n"); 1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_FRENCH_COLLATION, UCOL_OFF, &error); 1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_getAttribute(coll, UCOL_FRENCH_COLLATION, &error) != UCOL_OFF || 1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_FAILURE(error)) { 16696d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(error, "Setting and retrieving of the french collation failed\n"); 1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_FRENCH_COLLATION, UCOL_ON, &error); 1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_getAttribute(coll, UCOL_FRENCH_COLLATION, &error) != UCOL_ON || 1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_FAILURE(error)) { 16756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(error, "Setting and retrieving of the french collation failed\n"); 1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, &error); 1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_getAttribute(coll, UCOL_ALTERNATE_HANDLING, &error) != UCOL_SHIFTED || 1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_FAILURE(error)) { 16816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(error, "Setting and retrieving of the alternate handling failed\n"); 1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_ALTERNATE_HANDLING, UCOL_NON_IGNORABLE, &error); 1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_getAttribute(coll, UCOL_ALTERNATE_HANDLING, &error) != UCOL_NON_IGNORABLE || 1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_FAILURE(error)) { 16876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(error, "Setting and retrieving of the alternate handling failed\n"); 1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_CASE_FIRST, UCOL_LOWER_FIRST, &error); 1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_getAttribute(coll, UCOL_CASE_FIRST, &error) != UCOL_LOWER_FIRST || 1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_FAILURE(error)) { 16936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(error, "Setting and retrieving of the case first attribute failed\n"); 1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_CASE_FIRST, UCOL_UPPER_FIRST, &error); 1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_getAttribute(coll, UCOL_CASE_FIRST, &error) != UCOL_UPPER_FIRST || 1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_FAILURE(error)) { 16996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(error, "Setting and retrieving of the case first attribute failed\n"); 1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_CASE_LEVEL, UCOL_ON, &error); 1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_getAttribute(coll, UCOL_CASE_LEVEL, &error) != UCOL_ON || 1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_FAILURE(error)) { 17056d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(error, "Setting and retrieving of the case level attribute failed\n"); 1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_CASE_LEVEL, UCOL_OFF, &error); 1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_getAttribute(coll, UCOL_CASE_LEVEL, &error) != UCOL_OFF || 1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_FAILURE(error)) { 17116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(error, "Setting and retrieving of the case level attribute failed\n"); 1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &error); 1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_getAttribute(coll, UCOL_NORMALIZATION_MODE, &error) != UCOL_ON || 1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_FAILURE(error)) { 17176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(error, "Setting and retrieving of the normalization on/off attribute failed\n"); 1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_OFF, &error); 1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_getAttribute(coll, UCOL_NORMALIZATION_MODE, &error) != UCOL_OFF || 1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_FAILURE(error)) { 17236d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(error, "Setting and retrieving of the normalization on/off attribute failed\n"); 1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_PRIMARY, &error); 1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_getAttribute(coll, UCOL_STRENGTH, &error) != UCOL_PRIMARY || 1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_FAILURE(error)) { 17296d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(error, "Setting and retrieving of the collation strength failed\n"); 1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_SECONDARY, &error); 1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_getAttribute(coll, UCOL_STRENGTH, &error) != UCOL_SECONDARY || 1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_FAILURE(error)) { 17356d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(error, "Setting and retrieving of the collation strength failed\n"); 1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_TERTIARY, &error); 1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_getAttribute(coll, UCOL_STRENGTH, &error) != UCOL_TERTIARY || 1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_FAILURE(error)) { 17416d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(error, "Setting and retrieving of the collation strength failed\n"); 1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_QUATERNARY, &error); 1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_getAttribute(coll, UCOL_STRENGTH, &error) != UCOL_QUATERNARY || 1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_FAILURE(error)) { 17476d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(error, "Setting and retrieving of the collation strength failed\n"); 1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_STRENGTH, UCOL_IDENTICAL, &error); 1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_getAttribute(coll, UCOL_STRENGTH, &error) != UCOL_IDENTICAL || 1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_FAILURE(error)) { 17536d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(error, "Setting and retrieving of the collation strength failed\n"); 1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestGetTailoredSet() { 1760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru struct { 1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *rules; 1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *tests[20]; 1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t testsize; 1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } setTest[] = { 1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "&a < \\u212b", { "\\u212b", "A\\u030a", "\\u00c5" }, 3}, 1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "& S < \\u0161 <<< \\u0160", { "\\u0161", "s\\u030C", "\\u0160", "S\\u030C" }, 4} 1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0, j = 0; 1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pError; 1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = NULL; 1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buff[1024]; 1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t buffLen = 0; 1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru USet *set = NULL; 1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < sizeof(setTest)/sizeof(setTest[0]); i++) { 1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffLen = u_unescape(setTest[i].rules, buff, 1024); 1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_openRules(buff, buffLen, UCOL_DEFAULT, UCOL_DEFAULT, &pError, &status); 1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru set = ucol_getTailoredSet(coll, &status); 1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uset_size(set) != setTest[i].testsize) { 1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Tailored set size different (%d) than expected (%d)\n", uset_size(set), setTest[i].testsize); 1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(j = 0; j < setTest[i].testsize; j++) { 1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffLen = u_unescape(setTest[i].tests[j], buff, 1024); 1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!uset_containsString(set, buff, buffLen)) { 1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Tailored set doesn't contain %s... It should\n", setTest[i].tests[j]); 1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uset_close(set); 1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 17946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(status, "Couldn't open collator with rules %s\n", setTest[i].rules); 1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int tMemCmp(const uint8_t *first, const uint8_t *second) { 1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t firstLen = (int32_t)strlen((const char *)first); 1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t secondLen = (int32_t)strlen((const char *)second); 1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return memcmp(first, second, uprv_min(firstLen, secondLen)); 1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char * strengthsC[] = { 1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UCOL_PRIMARY", 1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UCOL_SECONDARY", 1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UCOL_TERTIARY", 1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UCOL_QUATERNARY", 1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "UCOL_IDENTICAL" 1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1812b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestMergeSortKeys(void) { 1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_open("en", &status); 1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 1817b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* cases[] = { 1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "abc", 1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "abcd", 1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "abcde" 1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t casesSize = sizeof(cases)/sizeof(cases[0]); 1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* prefix = "foo"; 1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* suffix = "egg"; 1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char outBuff1[256], outBuff2[256]; 1827b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t **sortkeys = (uint8_t **)malloc(casesSize*sizeof(uint8_t *)); 1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t **mergedPrefixkeys = (uint8_t **)malloc(casesSize*sizeof(uint8_t *)); 1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t **mergedSuffixkeys = (uint8_t **)malloc(casesSize*sizeof(uint8_t *)); 1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t *sortKeysLen = (uint32_t *)malloc(casesSize*sizeof(uint32_t)); 1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t prefixKey[256], suffixKey[256]; 1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t prefixKeyLen = 0, suffixKeyLen = 0, i = 0; 1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buffer[256]; 1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t unescapedLen = 0, l1 = 0, l2 = 0; 1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UColAttributeValue strength; 1837b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("ucol_mergeSortkeys test\n"); 1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing order of the test cases\n"); 1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericLocaleStarter("en", cases, casesSize); 1841b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<casesSize; i++) { 1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortkeys[i] = (uint8_t *)malloc(256*sizeof(uint8_t)); 1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mergedPrefixkeys[i] = (uint8_t *)malloc(256*sizeof(uint8_t)); 1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mergedSuffixkeys[i] = (uint8_t *)malloc(256*sizeof(uint8_t)); 1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1847b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru unescapedLen = u_unescape(prefix, buffer, 256); 1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prefixKeyLen = ucol_getSortKey(coll, buffer, unescapedLen, prefixKey, 256); 1850b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru unescapedLen = u_unescape(suffix, buffer, 256); 1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru suffixKeyLen = ucol_getSortKey(coll, buffer, unescapedLen, suffixKey, 256); 1853b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Massaging data with prefixes and different strengths\n"); 1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strength = UCOL_PRIMARY; 1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(strength <= UCOL_IDENTICAL) { 1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Strength %s\n", strengthsC[strength<=UCOL_QUATERNARY?strength:4]); 1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_setAttribute(coll, UCOL_STRENGTH, strength, &status); 1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<casesSize; i++) { 1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru unescapedLen = u_unescape(cases[i], buffer, 256); 1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sortKeysLen[i] = ucol_getSortKey(coll, buffer, unescapedLen, sortkeys[i], 256); 1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_mergeSortkeys(prefixKey, prefixKeyLen, sortkeys[i], sortKeysLen[i], mergedPrefixkeys[i], 256); 1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_mergeSortkeys(sortkeys[i], sortKeysLen[i], suffixKey, suffixKeyLen, mergedSuffixkeys[i], 256); 1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(i>0) { 1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(tMemCmp(mergedPrefixkeys[i-1], mergedPrefixkeys[i]) >= 0) { 1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error while comparing prefixed keys @ strength %s:\n", strengthsC[strength<=UCOL_QUATERNARY?strength:4]); 1867b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("%s\n%s\n", 1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_sortKeyToString(coll, mergedPrefixkeys[i-1], outBuff1, &l1), 1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_sortKeyToString(coll, mergedPrefixkeys[i], outBuff2, &l2)); 1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(tMemCmp(mergedSuffixkeys[i-1], mergedSuffixkeys[i]) >= 0) { 1872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Error while comparing suffixed keys @ strength %s:\n", strengthsC[strength<=UCOL_QUATERNARY?strength:4]); 1873b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("%s\n%s\n", 1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_sortKeyToString(coll, mergedSuffixkeys[i-1], outBuff1, &l1), 1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_sortKeyToString(coll, mergedSuffixkeys[i], outBuff2, &l2)); 1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strength == UCOL_QUATERNARY) { 1880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strength = UCOL_IDENTICAL; 1881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strength++; 1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1885b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t smallBuf[3]; 1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t reqLen = 0; 1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing buffer overflow\n"); 1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru reqLen = ucol_mergeSortkeys(prefixKey, prefixKeyLen, suffixKey, suffixKeyLen, smallBuf, 3); 1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(reqLen != (prefixKeyLen+suffixKeyLen-1)) { 1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Wrong preflight size for merged sortkey\n"); 1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1895b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar empty = 0; 1898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t emptyKey[20], abcKey[50], mergedKey[100]; 1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t emptyKeyLen = 0, abcKeyLen = 0, mergedKeyLen = 0; 1900b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("testing merging with sortkeys generated for empty strings\n"); 1902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru emptyKeyLen = ucol_getSortKey(coll, &empty, 0, emptyKey, 20); 1903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru unescapedLen = u_unescape(cases[0], buffer, 256); 1904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru abcKeyLen = ucol_getSortKey(coll, buffer, unescapedLen, abcKey, 50); 1905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mergedKeyLen = ucol_mergeSortkeys(emptyKey, emptyKeyLen, abcKey, abcKeyLen, mergedKey, 100); 1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(mergedKey[0] != 2) { 1907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Empty sortkey didn't produce a level separator\n"); 1908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* try with zeros */ 1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mergedKeyLen = ucol_mergeSortkeys(emptyKey, 0, abcKey, abcKeyLen, mergedKey, 100); 1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(mergedKeyLen != 0 || mergedKey[0] != 0) { 1912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Empty key didn't produce null mergedKey\n"); 1913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mergedKeyLen = ucol_mergeSortkeys(abcKey, abcKeyLen, emptyKey, 0, mergedKey, 100); 1915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(mergedKeyLen != 0 || mergedKey[0] != 0) { 1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Empty key didn't produce null mergedKey\n"); 1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1918b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1920b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<casesSize; i++) { 1922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(sortkeys[i]); 1923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(mergedPrefixkeys[i]); 1924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(mergedSuffixkeys[i]); 1925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(sortkeys); 1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(mergedPrefixkeys); 1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(mergedSuffixkeys); 1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(sortKeysLen); 1930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* need to finish this up */ 1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_data_err("Couldn't open collator"); 1934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1936b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestShortString(void) 1937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru struct { 1939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *input; 1940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *expectedOutput; 1941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *locale; 1942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode expectedStatus; 1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t expectedOffset; 1944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t expectedIdentifier; 1945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } testCases[] = { 194650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* 194750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * The following expectedOutput contains a collation weight (2D00 from UCA 5.2) 194850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * which is the primary weight for the T character (U+0041) in the input. 194950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * When that character gets a different weight in FractionalUCA.txt, 195050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * the expectedOutput needs to be adjusted. 195150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * That is, when we upgrade to a new UCA version or change collation 195250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * in such a way that the absolute weight for 'A' changes, 195350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * we will get a test failure here and need to adjust the test case. 195450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 195550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho {"LDE_RDE_KPHONEBOOK_T0041_ZLATN","B2D00_KPHONEBOOK_LDE", "de@collation=phonebook", U_USING_FALLBACK_WARNING, 0, 0 }, 195650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"LEN_RUS_NO_AS_S4","AS_LEN_NO_S4", NULL, U_USING_FALLBACK_WARNING, 0, 0 }, 1958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"LDE_VPHONEBOOK_EO_SI","EO_KPHONEBOOK_LDE_SI", "de@collation=phonebook", U_ZERO_ERROR, 0, 0 }, 1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"LDE_Kphonebook","KPHONEBOOK_LDE", "de@collation=phonebook", U_ZERO_ERROR, 0, 0 }, 1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"Xqde_DE@collation=phonebookq_S3_EX","KPHONEBOOK_LDE", "de@collation=phonebook", U_USING_FALLBACK_WARNING, 0, 0 }, 1961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"LFR_FO", "LFR", NULL, U_ZERO_ERROR, 0, 0 }, 1962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"SO_LX_AS", "", NULL, U_ILLEGAL_ARGUMENT_ERROR, 8, 0 }, 1963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {"S3_ASS_MMM", "", NULL, U_ILLEGAL_ARGUMENT_ERROR, 5, 0 } 1964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1966c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t i = 0; 1967c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UCollator *coll = NULL, *fromNormalized = NULL; 1968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 1969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1970c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru char fromShortBuffer[256], normalizedBuffer[256], fromNormalizedBuffer[256]; 1971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* locale = NULL; 1972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { 1975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 1976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(testCases[i].locale) { 1977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru locale = testCases[i].locale; 1978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru locale = NULL; 1980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_openFromShortString(testCases[i].input, FALSE, &parseError, &status); 1983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(status != testCases[i].expectedStatus) { 19846d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(status, "Got status '%s' that is different from expected '%s' for '%s'\n", 1985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(status), u_errorName(testCases[i].expectedStatus), testCases[i].input); 19866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru continue; 1987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1988b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getShortDefinitionString(coll, locale, fromShortBuffer, 256, &status); 1991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strcmp(fromShortBuffer, testCases[i].expectedOutput)) { 1993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Got short string '%s' from the collator. Expected '%s' for input '%s'\n", 1994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fromShortBuffer, testCases[i].expectedOutput, testCases[i].input); 1995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_normalizeShortDefinitionString(testCases[i].input, normalizedBuffer, 256, &parseError, &status); 1998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fromNormalized = ucol_openFromShortString(normalizedBuffer, FALSE, &parseError, &status); 1999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getShortDefinitionString(fromNormalized, locale, fromNormalizedBuffer, 256, &status); 2000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(strcmp(fromShortBuffer, fromNormalizedBuffer)) { 2002b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("Strings obtained from collators instantiated by short string ('%s') and from normalized string ('%s') differ\n", 2003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fromShortBuffer, fromNormalizedBuffer); 2004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!ucol_equals(coll, fromNormalized)) { 2008b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("Collator from short string ('%s') differs from one obtained through a normalized version ('%s')\n", 2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testCases[i].input, normalizedBuffer); 2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(fromNormalized); 2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(parseError.offset != testCases[i].expectedOffset) { 2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Got parse error offset %i, but expected %i instead for '%s'\n", 2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parseError.offset, testCases[i].expectedOffset, testCases[i].input); 2019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void 2026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerudoSetsTest(const char *locale, const USet *ref, USet *set, const char* inSet, const char* outSet, UErrorCode *status) { 2027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buffer[512]; 2028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t bufLen; 2029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uset_clear(set); 2031b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru bufLen = u_unescape(inSet, buffer, 512); 2032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uset_applyPattern(set, buffer, bufLen, 0, status); 2033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(*status)) { 2034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s: Failure setting pattern %s\n", locale, u_errorName(*status)); 2035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!uset_containsAll(ref, set)) { 2038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s: Some stuff from %s is not present in the set\n", locale, inSet); 2039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uset_clear(set); 2042b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru bufLen = u_unescape(outSet, buffer, 512); 2043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uset_applyPattern(set, buffer, bufLen, 0, status); 2044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(*status)) { 2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s: Failure setting pattern %s\n", locale, u_errorName(*status)); 2046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!uset_containsNone(ref, set)) { 2049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("%s: Some stuff from %s is present in the set\n", locale, outSet); 2050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2056b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void 2057b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruTestGetContractionsAndUnsafes(void) 2058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 2059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static struct { 2060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* locale; 2061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* inConts; 2062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* outConts; 2063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* inExp; 2064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* outExp; 2065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* unsafeCodeUnits; 2066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* safeCodeUnits; 2067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } tests[] = { 2068b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "ru", 2069b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "[{\\u0474\\u030F}{\\u0475\\u030F}{\\u04D8\\u0308}{\\u04D9\\u0308}{\\u04E8\\u0308}{\\u04E9\\u0308}]", 2070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[{\\u0430\\u0306}{\\u0410\\u0306}{\\u0430\\u0308}{\\u0410\\u0306}{\\u0433\\u0301}{\\u0413\\u0301}]", 2071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u00e6]", 2072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[a]", 2073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0474\\u0475\\u04d8\\u04d9\\u04e8\\u04e9]", 2074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[aAbB\\u0430\\u0410\\u0433\\u0413]" 2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "uk", 2077b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "[{\\u0474\\u030F}{\\u0475\\u030F}{\\u04D8\\u0308}{\\u04D9\\u0308}{\\u04E8\\u0308}{\\u04E9\\u0308}" 2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "{\\u0430\\u0306}{\\u0410\\u0306}{\\u0430\\u0308}{\\u0410\\u0306}{\\u0433\\u0301}{\\u0413\\u0301}]", 2079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[]", 2080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u00e6]", 2081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[a]", 2082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0474\\u0475\\u04D8\\u04D9\\u04E8\\u04E9\\u0430\\u0410\\u0433\\u0413]", 2083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[aAbBxv]", 2084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 2085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "sh", 2086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[{C\\u0301}{C\\u030C}{C\\u0341}{DZ\\u030C}{Dz\\u030C}{D\\u017D}{D\\u017E}{lj}{nj}]", 2087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[{\\u309d\\u3099}{\\u30fd\\u3099}]", 2088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u00e6]", 2089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[a]", 2090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[nlcdzNLCDZ]", 2091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[jabv]" 2092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 2093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "ja", 2094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[{\\u3053\\u3099\\u309D}{\\u3053\\u3099\\u309D\\u3099}{\\u3053\\u3099\\u309E}{\\u3053\\u3099\\u30FC}{\\u3053\\u309D}{\\u3053\\u309D\\u3099}{\\u3053\\u309E}{\\u3053\\u30FC}{\\u30B3\\u3099\\u30FC}{\\u30B3\\u3099\\u30FD}{\\u30B3\\u3099\\u30FD\\u3099}{\\u30B3\\u3099\\u30FE}{\\u30B3\\u30FC}{\\u30B3\\u30FD}{\\u30B3\\u30FD\\u3099}{\\u30B3\\u30FE}]", 2095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[{\\u30FD\\u3099}{\\u309D\\u3099}{\\u3053\\u3099}{\\u30B3\\u3099}{lj}{nj}]", 2096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u30FE\\u00e6]", 2097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[a]", 2098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u3099]", 2099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[]" 2100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = NULL; 2108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0; 2109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t noConts = 0; 2110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru USet *conts = uset_open(0,0); 2111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru USet *exp = uset_open(0, 0); 2112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru USet *set = uset_open(0,0); 2113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t setBufferLen = 65536; 2114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buffer[65536]; 2115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t setLen = 0; 2116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) { 2118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing locale: %s\n", tests[i].locale); 2119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru coll = ucol_open(tests[i].locale, &status); 21206d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (coll == NULL || U_FAILURE(status)) { 21216d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(status, "Unable to open collator for locale %s ==> %s\n", tests[i].locale, u_errorName(status)); 21226d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru continue; 21236d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 2124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_getContractionsAndExpansions(coll, conts, exp, TRUE, &status); 2125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doSetsTest(tests[i].locale, conts, set, tests[i].inConts, tests[i].outConts, &status); 2126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setLen = uset_toPattern(conts, buffer, setBufferLen, TRUE, &status); 2127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 2128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*log_verbose("Contractions %i: %s\n", uset_getItemCount(conts), aescstrdup(buffer, setLen));*/ 2129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error %s. %i\n", u_errorName(status), setLen); 2131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 2132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doSetsTest(tests[i].locale, exp, set, tests[i].inExp, tests[i].outExp, &status); 2134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setLen = uset_toPattern(exp, buffer, setBufferLen, TRUE, &status); 2135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 2136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*log_verbose("Expansions %i: %s\n", uset_getItemCount(exp), aescstrdup(buffer, setLen));*/ 2137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error %s. %i\n", u_errorName(status), setLen); 2139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 2140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru noConts = ucol_getUnsafeSet(coll, conts, &status); 2143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doSetsTest(tests[i].locale, conts, set, tests[i].unsafeCodeUnits, tests[i].safeCodeUnits, &status); 2144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setLen = uset_toPattern(conts, buffer, setBufferLen, TRUE, &status); 2145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 2146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Unsafe %i: %s\n", uset_getItemCount(exp), aescstrdup(buffer, setLen)); 2147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error %s. %i\n", u_errorName(status), setLen); 2149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 2150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 2153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uset_close(conts); 2157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uset_close(exp); 2158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uset_close(set); 2159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2161b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void 2162b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruTestOpenBinary(void) 2163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 2164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 2166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char rule[] = "&h < d < c < b"; 2167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *wUCA[] = { "a", "h", "d", "c", "b", "i" }; 2168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *noUCA[] = {"d", "c", "b", "a", "h", "i" }; 2169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* we have to use Cyrillic letters because latin-1 always gets copied */ 2171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char rule[] = "&\\u0452 < \\u0434 < \\u0433 < \\u0432"; /* &dje < d < g < v */ 2172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *wUCA[] = { "\\u0430", "\\u0452", "\\u0434", "\\u0433", "\\u0432", "\\u0435" }; /* a, dje, d, g, v, e */ 2173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *noUCA[] = {"\\u0434", "\\u0433", "\\u0432", "\\u0430", "\\u0435", "\\u0452" }; /* d, g, v, a, e, dje */ 2174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar uRules[256]; 2176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t uRulesLen = u_unescape(rule, uRules, 256); 2177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_openRules(uRules, uRulesLen, UCOL_DEFAULT, UCOL_DEFAULT, NULL, &status); 2179c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UCollator *UCA = NULL; 2180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *cloneNOUCA = NULL, *cloneWUCA = NULL; 2181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t imageBuffer[32768]; 2183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t *image = imageBuffer; 2184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t imageBufferCapacity = 32768; 2185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t imageSize; 2187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2188c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if((coll==NULL)||(U_FAILURE(status))) { 2189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_data_err("could not load collators or error occured: %s\n", 2190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(status)); 2191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2192b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2193c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UCA = ucol_open("root", &status); 2194c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if((UCA==NULL)||(U_FAILURE(status))) { 2195c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_data_err("could not load UCA collator or error occured: %s\n", 2196c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru u_errorName(status)); 2197c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 2198b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru imageSize = ucol_cloneBinary(coll, image, imageBufferCapacity, &status); 2200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 2201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru image = (uint8_t *)malloc(imageSize*sizeof(uint8_t)); 2202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 2203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru imageSize = ucol_cloneBinary(coll, imageBuffer, imageSize, &status); 2204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cloneWUCA = ucol_openBinary(image, imageSize, UCA, &status); 2208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cloneNOUCA = ucol_openBinary(image, imageSize, NULL, &status); 2209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericOrderingTest(coll, wUCA, sizeof(wUCA)/sizeof(wUCA[0])); 2211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericOrderingTest(cloneWUCA, wUCA, sizeof(wUCA)/sizeof(wUCA[0])); 2213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru genericOrderingTest(cloneNOUCA, noUCA, sizeof(noUCA)/sizeof(noUCA[0])); 2214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(image != imageBuffer) { 2216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(image); 2217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 2219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(cloneNOUCA); 2220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(cloneWUCA); 2221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(UCA); 2222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestDefault(void) { 2225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Tests for code coverage. */ 2226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCollator *coll = ucol_open("es@collation=pinyin", &status); 22286d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (coll == NULL || status == U_FILE_ACCESS_ERROR) { 22296d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_data_err("Unable to open collator es@collation=pinyin\n"); 22306d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru return; 22316d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 2232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (status != U_USING_DEFAULT_WARNING) { 2233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* What do you mean that you know about using pinyin collation in Spanish!? This should be in the zh locale. */ 2234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("es@collation=pinyin should return U_USING_DEFAULT_WARNING, but returned %s\n", u_errorName(status)); 2235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucol_close(coll); 2237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_getKeywordValues("funky", &status) != NULL) { 2238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Collators should not know about the funky keyword.\n"); 2239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (status != U_ILLEGAL_ARGUMENT_ERROR) { 2241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("funky keyword didn't fail as expected %s\n", u_errorName(status)); 2242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucol_getKeywordValues("collation", &status) != NULL) { 2244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("ucol_getKeywordValues should not work when given a bad status.\n"); 2245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2248b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestDefaultKeyword(void) { 2249b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* Tests for code coverage. */ 2250b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2251b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const char *loc = "zh_TW@collation=default"; 2252b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UCollator *coll = ucol_open(loc, &status); 2253b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(U_FAILURE(status)) { 2254b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_info("Warning: ucol_open(%s, ...) returned %s, at least it didn't crash.\n", loc, u_errorName(status)); 2255b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else if (status != U_USING_FALLBACK_WARNING) { 2256b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("ucol_open(%s, ...) should return an error or some sort of U_USING_FALLBACK_WARNING, but returned %s\n", loc, u_errorName(status)); 2257b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2258b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ucol_close(coll); 2259b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 2260b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 2261b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestGetKeywordValuesForLocale(void) { 2262b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define PREFERRED_SIZE 16 2263b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define MAX_NUMBER_OF_KEYWORDS 6 2264b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const char *PREFERRED[PREFERRED_SIZE][MAX_NUMBER_OF_KEYWORDS+1] = { 2265b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "und", "standard", NULL, NULL, NULL, NULL, NULL }, 2266b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "en_US", "standard", NULL, NULL, NULL, NULL, NULL }, 2267b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "en_029", "standard", NULL, NULL, NULL, NULL, NULL }, 2268b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "de_DE", "standard", "phonebook", NULL, NULL, NULL, NULL }, 2269b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "de_Latn_DE", "standard", "phonebook", NULL, NULL, NULL, NULL }, 2270b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "zh", "pinyin", "big5han", "gb2312han", "standard", "stroke", "unihan" }, 2271b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "zh_Hans", "pinyin", "big5han", "gb2312han", "standard", "stroke", "unihan" }, 2272b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "zh_CN", "pinyin", "big5han", "gb2312han", "standard", "stroke", "unihan" }, 2273b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "zh_Hant", "stroke", "big5han", "gb2312han", "pinyin", "standard", "unihan" }, 2274b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "zh_TW", "stroke", "big5han", "gb2312han", "pinyin", "standard", "unihan" }, 2275b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "zh__PINYIN", "pinyin", "big5han", "gb2312han", "standard", "stroke", "unihan" }, 2276b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "es_ES", "standard", "traditional", NULL, NULL, NULL, NULL }, 2277b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "es__TRADITIONAL","traditional", "standard", NULL, NULL, NULL, NULL }, 2278b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "und@collation=phonebook", "standard", NULL, NULL, NULL, NULL, NULL }, 2279b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "de_DE@collation=big5han", "standard", "phonebook", NULL, NULL, NULL, NULL }, 2280b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "zzz@collation=xxx", "standard", NULL, NULL, NULL, NULL, NULL } 2281b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }; 2282b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const int32_t expectedLength[PREFERRED_SIZE] = { 1, 1, 1, 2, 2, 6, 6, 6, 6, 6, 6, 2, 2, 1, 2, 1 }; 2283b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 2284b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2285b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UEnumeration *keywordValues = NULL; 2286b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t i, n, size, valueLength; 2287b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const char *locale = NULL, *value = NULL; 2288b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool errorOccurred = FALSE; 2289b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 2290b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for (i = 0; i < PREFERRED_SIZE; i++) { 2291b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru locale = PREFERRED[i][0]; 2292b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru value = NULL; 2293b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru valueLength = 0; 2294b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru size = 0; 2295b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 2296b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru keywordValues = ucol_getKeywordValuesForLocale("collation", locale, TRUE, &status); 2297b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (keywordValues == NULL || U_FAILURE(status)) { 22986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru log_err_status(status, "Error getting keyword values: %s\n", u_errorName(status)); 2299b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru break; 2300b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2301b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru size = uenum_count(keywordValues, &status); 2302b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 2303b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (size == expectedLength[i]) { 2304b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for (n = 0; n < expectedLength[i]; n++) { 2305b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ((value = uenum_next(keywordValues, &valueLength, &status)) != NULL && U_SUCCESS(status)) { 2306b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (uprv_strcmp(value, PREFERRED[i][n+1]) != 0) { 2307b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("Keyword values differ: Got [%s] Expected [%s] for locale: %s\n", value, PREFERRED[i][n+1], locale); 2308b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errorOccurred = TRUE; 2309b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru break; 2310b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2311b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 2312b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 2313b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("While getting keyword value from locale: %s got this error: %s\n", locale, u_errorName(status)); 2314b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errorOccurred = TRUE; 2315b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru break; 2316b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2317b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2318b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (errorOccurred) { 2319b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru break; 2320b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2321b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 2322b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("Number of keywords (%d) does not match expected size (%d) for locale: %s\n", size, expectedLength[i], locale); 2323b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru break; 2324b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2325b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uenum_close(keywordValues); 2326b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru keywordValues = NULL; 2327b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2328b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (keywordValues != NULL) { 2329b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uenum_close(keywordValues); 2330b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2331b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 2332b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 2333b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 2334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_COLLATION */ 2335