| Index: source/test/cintltst/citertst.c
|
| diff --git a/source/test/cintltst/citertst.c b/source/test/cintltst/citertst.c
|
| deleted file mode 100644
|
| index c49487ab8d18cc0c613ad33058cfa9e35bae447a..0000000000000000000000000000000000000000
|
| --- a/source/test/cintltst/citertst.c
|
| +++ /dev/null
|
| @@ -1,1258 +0,0 @@
|
| -/********************************************************************
|
| - * COPYRIGHT:
|
| - * Copyright (c) 1997-2014, International Business Machines Corporation and
|
| - * others. All Rights Reserved.
|
| - ********************************************************************/
|
| -/********************************************************************************
|
| -*
|
| -* File CITERTST.C
|
| -*
|
| -* Modification History:
|
| -* Date Name Description
|
| -* Madhu Katragadda Ported for C API
|
| -* 02/19/01 synwee Modified test case for new collation iterator
|
| -*********************************************************************************/
|
| -/*
|
| - * Collation Iterator tests.
|
| - * (Let me reiterate my position...)
|
| - */
|
| -
|
| -#include "unicode/utypes.h"
|
| -
|
| -#if !UCONFIG_NO_COLLATION
|
| -
|
| -#include "unicode/ucol.h"
|
| -#include "unicode/ucoleitr.h"
|
| -#include "unicode/uloc.h"
|
| -#include "unicode/uchar.h"
|
| -#include "unicode/ustring.h"
|
| -#include "unicode/putil.h"
|
| -#include "callcoll.h"
|
| -#include "cmemory.h"
|
| -#include "cintltst.h"
|
| -#include "citertst.h"
|
| -#include "ccolltst.h"
|
| -#include "filestrm.h"
|
| -#include "cstring.h"
|
| -#include "ucol_imp.h"
|
| -#include "uparse.h"
|
| -#include <stdio.h>
|
| -
|
| -extern uint8_t ucol_uprv_getCaseBits(const UChar *, uint32_t, UErrorCode *);
|
| -
|
| -void addCollIterTest(TestNode** root)
|
| -{
|
| - addTest(root, &TestPrevious, "tscoll/citertst/TestPrevious");
|
| - addTest(root, &TestOffset, "tscoll/citertst/TestOffset");
|
| - addTest(root, &TestSetText, "tscoll/citertst/TestSetText");
|
| - addTest(root, &TestMaxExpansion, "tscoll/citertst/TestMaxExpansion");
|
| - addTest(root, &TestUnicodeChar, "tscoll/citertst/TestUnicodeChar");
|
| - addTest(root, &TestNormalizedUnicodeChar,
|
| - "tscoll/citertst/TestNormalizedUnicodeChar");
|
| - addTest(root, &TestNormalization, "tscoll/citertst/TestNormalization");
|
| - addTest(root, &TestBug672, "tscoll/citertst/TestBug672");
|
| - addTest(root, &TestBug672Normalize, "tscoll/citertst/TestBug672Normalize");
|
| - addTest(root, &TestSmallBuffer, "tscoll/citertst/TestSmallBuffer");
|
| - addTest(root, &TestDiscontiguos, "tscoll/citertst/TestDiscontiguos");
|
| - addTest(root, &TestSearchCollatorElements, "tscoll/citertst/TestSearchCollatorElements");
|
| -}
|
| -
|
| -/* The locales we support */
|
| -
|
| -static const char * LOCALES[] = {"en_AU", "en_BE", "en_CA"};
|
| -
|
| -static void TestBug672() {
|
| - UErrorCode status = U_ZERO_ERROR;
|
| - UChar pattern[20];
|
| - UChar text[50];
|
| - int i;
|
| - int result[3][3];
|
| -
|
| - u_uastrcpy(pattern, "resume");
|
| - u_uastrcpy(text, "Time to resume updating my resume.");
|
| -
|
| - for (i = 0; i < 3; ++ i) {
|
| - UCollator *coll = ucol_open(LOCALES[i], &status);
|
| - UCollationElements *pitr = ucol_openElements(coll, pattern, -1,
|
| - &status);
|
| - UCollationElements *titer = ucol_openElements(coll, text, -1,
|
| - &status);
|
| - if (U_FAILURE(status)) {
|
| - log_err_status(status, "ERROR: in creation of either the collator or the collation iterator :%s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| -
|
| - log_verbose("locale tested %s\n", LOCALES[i]);
|
| -
|
| - while (ucol_next(pitr, &status) != UCOL_NULLORDER &&
|
| - U_SUCCESS(status)) {
|
| - }
|
| - if (U_FAILURE(status)) {
|
| - log_err("ERROR: reversing collation iterator :%s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| - ucol_reset(pitr);
|
| -
|
| - ucol_setOffset(titer, u_strlen(pattern), &status);
|
| - if (U_FAILURE(status)) {
|
| - log_err("ERROR: setting offset in collator :%s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| - result[i][0] = ucol_getOffset(titer);
|
| - log_verbose("Text iterator set to offset %d\n", result[i][0]);
|
| -
|
| - /* Use previous() */
|
| - ucol_previous(titer, &status);
|
| - result[i][1] = ucol_getOffset(titer);
|
| - log_verbose("Current offset %d after previous\n", result[i][1]);
|
| -
|
| - /* Add one to index */
|
| - log_verbose("Adding one to current offset...\n");
|
| - ucol_setOffset(titer, ucol_getOffset(titer) + 1, &status);
|
| - if (U_FAILURE(status)) {
|
| - log_err("ERROR: setting offset in collator :%s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| - result[i][2] = ucol_getOffset(titer);
|
| - log_verbose("Current offset in text = %d\n", result[i][2]);
|
| - ucol_closeElements(pitr);
|
| - ucol_closeElements(titer);
|
| - ucol_close(coll);
|
| - }
|
| -
|
| - if (uprv_memcmp(result[0], result[1], 3) != 0 ||
|
| - uprv_memcmp(result[1], result[2], 3) != 0) {
|
| - log_err("ERROR: Different locales have different offsets at the same character\n");
|
| - }
|
| -}
|
| -
|
| -
|
| -
|
| -/* Running this test with normalization enabled showed up a bug in the incremental
|
| - normalization code. */
|
| -static void TestBug672Normalize() {
|
| - UErrorCode status = U_ZERO_ERROR;
|
| - UChar pattern[20];
|
| - UChar text[50];
|
| - int i;
|
| - int result[3][3];
|
| -
|
| - u_uastrcpy(pattern, "resume");
|
| - u_uastrcpy(text, "Time to resume updating my resume.");
|
| -
|
| - for (i = 0; i < 3; ++ i) {
|
| - UCollator *coll = ucol_open(LOCALES[i], &status);
|
| - UCollationElements *pitr = NULL;
|
| - UCollationElements *titer = NULL;
|
| -
|
| - ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
|
| -
|
| - pitr = ucol_openElements(coll, pattern, -1, &status);
|
| - titer = ucol_openElements(coll, text, -1, &status);
|
| - if (U_FAILURE(status)) {
|
| - log_err_status(status, "ERROR: in creation of either the collator or the collation iterator :%s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| -
|
| - log_verbose("locale tested %s\n", LOCALES[i]);
|
| -
|
| - while (ucol_next(pitr, &status) != UCOL_NULLORDER &&
|
| - U_SUCCESS(status)) {
|
| - }
|
| - if (U_FAILURE(status)) {
|
| - log_err("ERROR: reversing collation iterator :%s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| - ucol_reset(pitr);
|
| -
|
| - ucol_setOffset(titer, u_strlen(pattern), &status);
|
| - if (U_FAILURE(status)) {
|
| - log_err("ERROR: setting offset in collator :%s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| - result[i][0] = ucol_getOffset(titer);
|
| - log_verbose("Text iterator set to offset %d\n", result[i][0]);
|
| -
|
| - /* Use previous() */
|
| - ucol_previous(titer, &status);
|
| - result[i][1] = ucol_getOffset(titer);
|
| - log_verbose("Current offset %d after previous\n", result[i][1]);
|
| -
|
| - /* Add one to index */
|
| - log_verbose("Adding one to current offset...\n");
|
| - ucol_setOffset(titer, ucol_getOffset(titer) + 1, &status);
|
| - if (U_FAILURE(status)) {
|
| - log_err("ERROR: setting offset in collator :%s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| - result[i][2] = ucol_getOffset(titer);
|
| - log_verbose("Current offset in text = %d\n", result[i][2]);
|
| - ucol_closeElements(pitr);
|
| - ucol_closeElements(titer);
|
| - ucol_close(coll);
|
| - }
|
| -
|
| - if (uprv_memcmp(result[0], result[1], 3) != 0 ||
|
| - uprv_memcmp(result[1], result[2], 3) != 0) {
|
| - log_err("ERROR: Different locales have different offsets at the same character\n");
|
| - }
|
| -}
|
| -
|
| -
|
| -
|
| -
|
| -/**
|
| - * Test for CollationElementIterator previous and next for the whole set of
|
| - * unicode characters.
|
| - */
|
| -static void TestUnicodeChar()
|
| -{
|
| - UChar source[0x100];
|
| - UCollator *en_us;
|
| - UCollationElements *iter;
|
| - UErrorCode status = U_ZERO_ERROR;
|
| - UChar codepoint;
|
| -
|
| - UChar *test;
|
| - en_us = ucol_open("en_US", &status);
|
| - if (U_FAILURE(status)){
|
| - log_err_status(status, "ERROR: in creation of collation data using ucol_open()\n %s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| -
|
| - for (codepoint = 1; codepoint < 0xFFFE;)
|
| - {
|
| - test = source;
|
| -
|
| - while (codepoint % 0xFF != 0)
|
| - {
|
| - if (u_isdefined(codepoint))
|
| - *(test ++) = codepoint;
|
| - codepoint ++;
|
| - }
|
| -
|
| - if (u_isdefined(codepoint))
|
| - *(test ++) = codepoint;
|
| -
|
| - if (codepoint != 0xFFFF)
|
| - codepoint ++;
|
| -
|
| - *test = 0;
|
| - iter=ucol_openElements(en_us, source, u_strlen(source), &status);
|
| - if(U_FAILURE(status)){
|
| - log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
|
| - myErrorName(status));
|
| - ucol_close(en_us);
|
| - return;
|
| - }
|
| - /* A basic test to see if it's working at all */
|
| - log_verbose("codepoint testing %x\n", codepoint);
|
| - backAndForth(iter);
|
| - ucol_closeElements(iter);
|
| -
|
| - /* null termination test */
|
| - iter=ucol_openElements(en_us, source, -1, &status);
|
| - if(U_FAILURE(status)){
|
| - log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
|
| - myErrorName(status));
|
| - ucol_close(en_us);
|
| - return;
|
| - }
|
| - /* A basic test to see if it's working at all */
|
| - backAndForth(iter);
|
| - ucol_closeElements(iter);
|
| - }
|
| -
|
| - ucol_close(en_us);
|
| -}
|
| -
|
| -/**
|
| - * Test for CollationElementIterator previous and next for the whole set of
|
| - * unicode characters with normalization on.
|
| - */
|
| -static void TestNormalizedUnicodeChar()
|
| -{
|
| - UChar source[0x100];
|
| - UCollator *th_th;
|
| - UCollationElements *iter;
|
| - UErrorCode status = U_ZERO_ERROR;
|
| - UChar codepoint;
|
| -
|
| - UChar *test;
|
| - /* thai should have normalization on */
|
| - th_th = ucol_open("th_TH", &status);
|
| - if (U_FAILURE(status)){
|
| - log_err_status(status, "ERROR: in creation of thai collation using ucol_open()\n %s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| -
|
| - for (codepoint = 1; codepoint < 0xFFFE;)
|
| - {
|
| - test = source;
|
| -
|
| - while (codepoint % 0xFF != 0)
|
| - {
|
| - if (u_isdefined(codepoint))
|
| - *(test ++) = codepoint;
|
| - codepoint ++;
|
| - }
|
| -
|
| - if (u_isdefined(codepoint))
|
| - *(test ++) = codepoint;
|
| -
|
| - if (codepoint != 0xFFFF)
|
| - codepoint ++;
|
| -
|
| - *test = 0;
|
| - iter=ucol_openElements(th_th, source, u_strlen(source), &status);
|
| - if(U_FAILURE(status)){
|
| - log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
|
| - myErrorName(status));
|
| - ucol_close(th_th);
|
| - return;
|
| - }
|
| -
|
| - backAndForth(iter);
|
| - ucol_closeElements(iter);
|
| -
|
| - iter=ucol_openElements(th_th, source, -1, &status);
|
| - if(U_FAILURE(status)){
|
| - log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
|
| - myErrorName(status));
|
| - ucol_close(th_th);
|
| - return;
|
| - }
|
| -
|
| - backAndForth(iter);
|
| - ucol_closeElements(iter);
|
| - }
|
| -
|
| - ucol_close(th_th);
|
| -}
|
| -
|
| -/**
|
| -* Test the incremental normalization
|
| -*/
|
| -static void TestNormalization()
|
| -{
|
| - UErrorCode status = U_ZERO_ERROR;
|
| - const char *str =
|
| - "&a < \\u0300\\u0315 < A\\u0300\\u0315 < \\u0316\\u0315B < \\u0316\\u0300\\u0315";
|
| - UCollator *coll;
|
| - UChar rule[50];
|
| - int rulelen = u_unescape(str, rule, 50);
|
| - int count = 0;
|
| - const char *testdata[] =
|
| - {"\\u1ED9", "o\\u0323\\u0302",
|
| - "\\u0300\\u0315", "\\u0315\\u0300",
|
| - "A\\u0300\\u0315B", "A\\u0315\\u0300B",
|
| - "A\\u0316\\u0315B", "A\\u0315\\u0316B",
|
| - "\\u0316\\u0300\\u0315", "\\u0315\\u0300\\u0316",
|
| - "A\\u0316\\u0300\\u0315B", "A\\u0315\\u0300\\u0316B",
|
| - "\\u0316\\u0315\\u0300", "A\\u0316\\u0315\\u0300B"};
|
| - int32_t srclen;
|
| - UChar source[10];
|
| - UCollationElements *iter;
|
| -
|
| - coll = ucol_openRules(rule, rulelen, UCOL_ON, UCOL_TERTIARY, NULL, &status);
|
| - ucol_setAttribute(coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
|
| - if (U_FAILURE(status)){
|
| - log_err_status(status, "ERROR: in creation of collator using ucol_openRules()\n %s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| -
|
| - srclen = u_unescape(testdata[0], source, 10);
|
| - iter = ucol_openElements(coll, source, srclen, &status);
|
| - backAndForth(iter);
|
| - ucol_closeElements(iter);
|
| -
|
| - srclen = u_unescape(testdata[1], source, 10);
|
| - iter = ucol_openElements(coll, source, srclen, &status);
|
| - backAndForth(iter);
|
| - ucol_closeElements(iter);
|
| -
|
| - while (count < 12) {
|
| - srclen = u_unescape(testdata[count], source, 10);
|
| - iter = ucol_openElements(coll, source, srclen, &status);
|
| -
|
| - if (U_FAILURE(status)){
|
| - log_err("ERROR: in creation of collator element iterator\n %s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| - backAndForth(iter);
|
| - ucol_closeElements(iter);
|
| -
|
| - iter = ucol_openElements(coll, source, -1, &status);
|
| -
|
| - if (U_FAILURE(status)){
|
| - log_err("ERROR: in creation of collator element iterator\n %s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| - backAndForth(iter);
|
| - ucol_closeElements(iter);
|
| - count ++;
|
| - }
|
| - ucol_close(coll);
|
| -}
|
| -
|
| -/**
|
| - * Test for CollationElementIterator.previous()
|
| - *
|
| - * @bug 4108758 - Make sure it works with contracting characters
|
| - *
|
| - */
|
| -static void TestPrevious()
|
| -{
|
| - UCollator *coll=NULL;
|
| - UChar rule[50];
|
| - UChar *source;
|
| - UCollator *c1, *c2, *c3;
|
| - UCollationElements *iter;
|
| - UErrorCode status = U_ZERO_ERROR;
|
| - UChar test1[50];
|
| - UChar test2[50];
|
| -
|
| - u_uastrcpy(test1, "What subset of all possible test cases?");
|
| - u_uastrcpy(test2, "has the highest probability of detecting");
|
| - coll = ucol_open("en_US", &status);
|
| -
|
| - iter=ucol_openElements(coll, test1, u_strlen(test1), &status);
|
| - log_verbose("English locale testing back and forth\n");
|
| - if(U_FAILURE(status)){
|
| - log_err_status(status, "ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
|
| - myErrorName(status));
|
| - ucol_close(coll);
|
| - return;
|
| - }
|
| - /* A basic test to see if it's working at all */
|
| - backAndForth(iter);
|
| - ucol_closeElements(iter);
|
| - ucol_close(coll);
|
| -
|
| - /* Test with a contracting character sequence */
|
| - u_uastrcpy(rule, "&a,A < b,B < c,C, d,D < z,Z < ch,cH,Ch,CH");
|
| - c1 = ucol_openRules(rule, u_strlen(rule), UCOL_OFF, UCOL_DEFAULT_STRENGTH, NULL, &status);
|
| -
|
| - log_verbose("Contraction rule testing back and forth with no normalization\n");
|
| -
|
| - if (c1 == NULL || U_FAILURE(status))
|
| - {
|
| - log_err("Couldn't create a RuleBasedCollator with a contracting sequence\n %s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| - source=(UChar*)malloc(sizeof(UChar) * 20);
|
| - u_uastrcpy(source, "abchdcba");
|
| - iter=ucol_openElements(c1, source, u_strlen(source), &status);
|
| - if(U_FAILURE(status)){
|
| - log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| - backAndForth(iter);
|
| - ucol_closeElements(iter);
|
| - ucol_close(c1);
|
| -
|
| - /* Test with an expanding character sequence */
|
| - u_uastrcpy(rule, "&a < b < c/abd < d");
|
| - c2 = ucol_openRules(rule, u_strlen(rule), UCOL_OFF, UCOL_DEFAULT_STRENGTH, NULL, &status);
|
| - log_verbose("Expansion rule testing back and forth with no normalization\n");
|
| - if (c2 == NULL || U_FAILURE(status))
|
| - {
|
| - log_err("Couldn't create a RuleBasedCollator with a contracting sequence.\n %s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| - u_uastrcpy(source, "abcd");
|
| - iter=ucol_openElements(c2, source, u_strlen(source), &status);
|
| - if(U_FAILURE(status)){
|
| - log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| - backAndForth(iter);
|
| - ucol_closeElements(iter);
|
| - ucol_close(c2);
|
| - /* Now try both */
|
| - u_uastrcpy(rule, "&a < b < c/aba < d < z < ch");
|
| - c3 = ucol_openRules(rule, u_strlen(rule), UCOL_DEFAULT, UCOL_DEFAULT_STRENGTH,NULL, &status);
|
| - log_verbose("Expansion/contraction rule testing back and forth with no normalization\n");
|
| -
|
| - if (c3 == NULL || U_FAILURE(status))
|
| - {
|
| - log_err("Couldn't create a RuleBasedCollator with a contracting sequence.\n %s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| - u_uastrcpy(source, "abcdbchdc");
|
| - iter=ucol_openElements(c3, source, u_strlen(source), &status);
|
| - if(U_FAILURE(status)){
|
| - log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| - backAndForth(iter);
|
| - ucol_closeElements(iter);
|
| - ucol_close(c3);
|
| - source[0] = 0x0e41;
|
| - source[1] = 0x0e02;
|
| - source[2] = 0x0e41;
|
| - source[3] = 0x0e02;
|
| - source[4] = 0x0e27;
|
| - source[5] = 0x61;
|
| - source[6] = 0x62;
|
| - source[7] = 0x63;
|
| - source[8] = 0;
|
| -
|
| - coll = ucol_open("th_TH", &status);
|
| - log_verbose("Thai locale testing back and forth with normalization\n");
|
| - iter=ucol_openElements(coll, source, u_strlen(source), &status);
|
| - if(U_FAILURE(status)){
|
| - log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| - backAndForth(iter);
|
| - ucol_closeElements(iter);
|
| - ucol_close(coll);
|
| -
|
| - /* prev test */
|
| - source[0] = 0x0061;
|
| - source[1] = 0x30CF;
|
| - source[2] = 0x3099;
|
| - source[3] = 0x30FC;
|
| - source[4] = 0;
|
| -
|
| - coll = ucol_open("ja_JP", &status);
|
| - log_verbose("Japanese locale testing back and forth with normalization\n");
|
| - iter=ucol_openElements(coll, source, u_strlen(source), &status);
|
| - if(U_FAILURE(status)){
|
| - log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
|
| - myErrorName(status));
|
| - return;
|
| - }
|
| - backAndForth(iter);
|
| - ucol_closeElements(iter);
|
| - ucol_close(coll);
|
| -
|
| - free(source);
|
| -}
|
| -
|
| -/**
|
| - * Test for getOffset() and setOffset()
|
| - */
|
| -static void TestOffset()
|
| -{
|
| - UErrorCode status= U_ZERO_ERROR;
|
| - UCollator *en_us=NULL;
|
| - UCollationElements *iter, *pristine;
|
| - int32_t offset;
|
| - OrderAndOffset *orders;
|
| - int32_t orderLength=0;
|
| - int count = 0;
|
| - UChar test1[50];
|
| - UChar test2[50];
|
| -
|
| - u_uastrcpy(test1, "What subset of all possible test cases?");
|
| - u_uastrcpy(test2, "has the highest probability of detecting");
|
| - en_us = ucol_open("en_US", &status);
|
| - log_verbose("Testing getOffset and setOffset for collations\n");
|
| - iter = ucol_openElements(en_us, test1, u_strlen(test1), &status);
|
| - if(U_FAILURE(status)){
|
| - log_err_status(status, "ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
|
| - myErrorName(status));
|
| - ucol_close(en_us);
|
| - return;
|
| - }
|
| -
|
| - /* testing boundaries */
|
| - ucol_setOffset(iter, 0, &status);
|
| - if (U_FAILURE(status) || ucol_previous(iter, &status) != UCOL_NULLORDER) {
|
| - log_err("Error: After setting offset to 0, we should be at the end "
|
| - "of the backwards iteration");
|
| - }
|
| - ucol_setOffset(iter, u_strlen(test1), &status);
|
| - if (U_FAILURE(status) || ucol_next(iter, &status) != UCOL_NULLORDER) {
|
| - log_err("Error: After setting offset to end of the string, we should "
|
| - "be at the end of the backwards iteration");
|
| - }
|
| -
|
| - /* Run all the way through the iterator, then get the offset */
|
| -
|
| - orders = getOrders(iter, &orderLength);
|
| -
|
| - offset = ucol_getOffset(iter);
|
| -
|
| - if (offset != u_strlen(test1))
|
| - {
|
| - log_err("offset at end != length %d vs %d\n", offset,
|
| - u_strlen(test1) );
|
| - }
|
| -
|
| - /* Now set the offset back to the beginning and see if it works */
|
| - pristine=ucol_openElements(en_us, test1, u_strlen(test1), &status);
|
| - if(U_FAILURE(status)){
|
| - log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
|
| - myErrorName(status));
|
| - ucol_close(en_us);
|
| - return;
|
| - }
|
| - status = U_ZERO_ERROR;
|
| -
|
| - ucol_setOffset(iter, 0, &status);
|
| - if (U_FAILURE(status))
|
| - {
|
| - log_err("setOffset failed. %s\n", myErrorName(status));
|
| - }
|
| - else
|
| - {
|
| - assertEqual(iter, pristine);
|
| - }
|
| -
|
| - ucol_closeElements(pristine);
|
| - ucol_closeElements(iter);
|
| - free(orders);
|
| -
|
| - /* testing offsets in normalization buffer */
|
| - test1[0] = 0x61;
|
| - test1[1] = 0x300;
|
| - test1[2] = 0x316;
|
| - test1[3] = 0x62;
|
| - test1[4] = 0;
|
| - ucol_setAttribute(en_us, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
|
| - iter = ucol_openElements(en_us, test1, 4, &status);
|
| - if(U_FAILURE(status)){
|
| - log_err("ERROR: in creation of collation element iterator using ucol_openElements()\n %s\n",
|
| - myErrorName(status));
|
| - ucol_close(en_us);
|
| - return;
|
| - }
|
| -
|
| - count = 0;
|
| - while (ucol_next(iter, &status) != UCOL_NULLORDER &&
|
| - U_SUCCESS(status)) {
|
| - switch (count) {
|
| - case 0:
|
| - if (ucol_getOffset(iter) != 1) {
|
| - log_err("ERROR: Offset of iteration should be 1\n");
|
| - }
|
| - break;
|
| - case 3:
|
| - if (ucol_getOffset(iter) != 4) {
|
| - log_err("ERROR: Offset of iteration should be 4\n");
|
| - }
|
| - break;
|
| - default:
|
| - if (ucol_getOffset(iter) != 3) {
|
| - log_err("ERROR: Offset of iteration should be 3\n");
|
| - }
|
| - }
|
| - count ++;
|
| - }
|
| -
|
| - ucol_reset(iter);
|
| - count = 0;
|
| - while (ucol_previous(iter, &status) != UCOL_NULLORDER &&
|
| - U_SUCCESS(status)) {
|
| - switch (count) {
|
| - case 0:
|
| - case 1:
|
| - if (ucol_getOffset(iter) != 3) {
|
| - log_err("ERROR: Offset of iteration should be 3\n");
|
| - }
|
| - break;
|
| - case 2:
|
| - if (ucol_getOffset(iter) != 1) {
|
| - log_err("ERROR: Offset of iteration should be 1\n");
|
| - }
|
| - break;
|
| - default:
|
| - if (ucol_getOffset(iter) != 0) {
|
| - log_err("ERROR: Offset of iteration should be 0\n");
|
| - }
|
| - }
|
| - count ++;
|
| - }
|
| -
|
| - if(U_FAILURE(status)){
|
| - log_err("ERROR: in iterating collation elements %s\n",
|
| - myErrorName(status));
|
| - }
|
| -
|
| - ucol_closeElements(iter);
|
| - ucol_close(en_us);
|
| -}
|
| -
|
| -/**
|
| - * Test for setText()
|
| - */
|
| -static void TestSetText()
|
| -{
|
| - int32_t c,i;
|
| - UErrorCode status = U_ZERO_ERROR;
|
| - UCollator *en_us=NULL;
|
| - UCollationElements *iter1, *iter2;
|
| - UChar test1[50];
|
| - UChar test2[50];
|
| -
|
| - u_uastrcpy(test1, "What subset of all possible test cases?");
|
| - u_uastrcpy(test2, "has the highest probability of detecting");
|
| - en_us = ucol_open("en_US", &status);
|
| - log_verbose("testing setText for Collation elements\n");
|
| - iter1=ucol_openElements(en_us, test1, u_strlen(test1), &status);
|
| - if(U_FAILURE(status)){
|
| - log_err_status(status, "ERROR: in creation of collation element iterator1 using ucol_openElements()\n %s\n",
|
| - myErrorName(status));
|
| - ucol_close(en_us);
|
| - return;
|
| - }
|
| - iter2=ucol_openElements(en_us, test2, u_strlen(test2), &status);
|
| - if(U_FAILURE(status)){
|
| - log_err("ERROR: in creation of collation element iterator2 using ucol_openElements()\n %s\n",
|
| - myErrorName(status));
|
| - ucol_close(en_us);
|
| - return;
|
| - }
|
| -
|
| - /* Run through the second iterator just to exercise it */
|
| - c = ucol_next(iter2, &status);
|
| - i = 0;
|
| -
|
| - while ( ++i < 10 && (c != UCOL_NULLORDER))
|
| - {
|
| - if (U_FAILURE(status))
|
| - {
|
| - log_err("iter2->next() returned an error. %s\n", myErrorName(status));
|
| - ucol_closeElements(iter2);
|
| - ucol_closeElements(iter1);
|
| - ucol_close(en_us);
|
| - return;
|
| - }
|
| -
|
| - c = ucol_next(iter2, &status);
|
| - }
|
| -
|
| - /* Now set it to point to the same string as the first iterator */
|
| - ucol_setText(iter2, test1, u_strlen(test1), &status);
|
| - if (U_FAILURE(status))
|
| - {
|
| - log_err("call to iter2->setText(test1) failed. %s\n", myErrorName(status));
|
| - }
|
| - else
|
| - {
|
| - assertEqual(iter1, iter2);
|
| - }
|
| -
|
| - /* Now set it to point to a null string with fake length*/
|
| - ucol_setText(iter2, NULL, 2, &status);
|
| - if (status != U_ILLEGAL_ARGUMENT_ERROR)
|
| - {
|
| - log_err("call to iter2->setText(null, 2) should yield an illegal-argument-error - %s\n",
|
| - myErrorName(status));
|
| - }
|
| -
|
| - ucol_closeElements(iter2);
|
| - ucol_closeElements(iter1);
|
| - ucol_close(en_us);
|
| -}
|
| -
|
| -/** @bug 4108762
|
| - * Test for getMaxExpansion()
|
| - */
|
| -static void TestMaxExpansion()
|
| -{
|
| - UErrorCode status = U_ZERO_ERROR;
|
| - UCollator *coll ;/*= ucol_open("en_US", &status);*/
|
| - UChar ch = 0;
|
| - UChar32 unassigned = 0xEFFFD;
|
| - UChar supplementary[2];
|
| - uint32_t stringOffset = 0;
|
| - UBool isError = FALSE;
|
| - uint32_t sorder = 0;
|
| - UCollationElements *iter ;/*= ucol_openElements(coll, &ch, 1, &status);*/
|
| - uint32_t temporder = 0;
|
| -
|
| - UChar rule[256];
|
| - u_uastrcpy(rule, "&a < ab < c/aba < d < z < ch");
|
| - coll = ucol_openRules(rule, u_strlen(rule), UCOL_DEFAULT,
|
| - UCOL_DEFAULT_STRENGTH,NULL, &status);
|
| - if(U_SUCCESS(status) && coll) {
|
| - iter = ucol_openElements(coll, &ch, 1, &status);
|
| -
|
| - while (ch < 0xFFFF && U_SUCCESS(status)) {
|
| - int count = 1;
|
| - uint32_t order;
|
| - int32_t size = 0;
|
| -
|
| - ch ++;
|
| -
|
| - ucol_setText(iter, &ch, 1, &status);
|
| - order = ucol_previous(iter, &status);
|
| -
|
| - /* thai management */
|
| - if (order == 0)
|
| - order = ucol_previous(iter, &status);
|
| -
|
| - while (U_SUCCESS(status) &&
|
| - ucol_previous(iter, &status) != UCOL_NULLORDER) {
|
| - count ++;
|
| - }
|
| -
|
| - size = ucol_getMaxExpansion(iter, order);
|
| - if (U_FAILURE(status) || size < count) {
|
| - log_err("Failure at codepoint %d, maximum expansion count < %d\n",
|
| - ch, count);
|
| - }
|
| - }
|
| -
|
| - /* testing for exact max expansion */
|
| - ch = 0;
|
| - while (ch < 0x61) {
|
| - uint32_t order;
|
| - int32_t size;
|
| - ucol_setText(iter, &ch, 1, &status);
|
| - order = ucol_previous(iter, &status);
|
| - size = ucol_getMaxExpansion(iter, order);
|
| - if (U_FAILURE(status) || size != 1) {
|
| - log_err("Failure at codepoint %d, maximum expansion count < %d\n",
|
| - ch, 1);
|
| - }
|
| - ch ++;
|
| - }
|
| -
|
| - ch = 0x63;
|
| - ucol_setText(iter, &ch, 1, &status);
|
| - temporder = ucol_previous(iter, &status);
|
| -
|
| - if (U_FAILURE(status) || ucol_getMaxExpansion(iter, temporder) != 3) {
|
| - log_err("Failure at codepoint %d, maximum expansion count != %d\n",
|
| - ch, 3);
|
| - }
|
| -
|
| - ch = 0x64;
|
| - ucol_setText(iter, &ch, 1, &status);
|
| - temporder = ucol_previous(iter, &status);
|
| -
|
| - if (U_FAILURE(status) || ucol_getMaxExpansion(iter, temporder) != 1) {
|
| - log_err("Failure at codepoint %d, maximum expansion count != %d\n",
|
| - ch, 3);
|
| - }
|
| -
|
| - U16_APPEND(supplementary, stringOffset, 2, unassigned, isError);
|
| - (void)isError; /* Suppress set but not used warning. */
|
| - ucol_setText(iter, supplementary, 2, &status);
|
| - sorder = ucol_previous(iter, &status);
|
| -
|
| - if (U_FAILURE(status) || ucol_getMaxExpansion(iter, sorder) != 2) {
|
| - log_err("Failure at codepoint %d, maximum expansion count < %d\n",
|
| - ch, 2);
|
| - }
|
| -
|
| - /* testing jamo */
|
| - ch = 0x1165;
|
| -
|
| - ucol_setText(iter, &ch, 1, &status);
|
| - temporder = ucol_previous(iter, &status);
|
| - if (U_FAILURE(status) || ucol_getMaxExpansion(iter, temporder) > 3) {
|
| - log_err("Failure at codepoint %d, maximum expansion count > %d\n",
|
| - ch, 3);
|
| - }
|
| -
|
| - ucol_closeElements(iter);
|
| - ucol_close(coll);
|
| -
|
| - /* testing special jamo &a<\u1160 */
|
| - rule[0] = 0x26;
|
| - rule[1] = 0x71;
|
| - rule[2] = 0x3c;
|
| - rule[3] = 0x1165;
|
| - rule[4] = 0x2f;
|
| - rule[5] = 0x71;
|
| - rule[6] = 0x71;
|
| - rule[7] = 0x71;
|
| - rule[8] = 0x71;
|
| - rule[9] = 0;
|
| -
|
| - coll = ucol_openRules(rule, u_strlen(rule), UCOL_DEFAULT,
|
| - UCOL_DEFAULT_STRENGTH,NULL, &status);
|
| - iter = ucol_openElements(coll, &ch, 1, &status);
|
| -
|
| - temporder = ucol_previous(iter, &status);
|
| - if (U_FAILURE(status) || ucol_getMaxExpansion(iter, temporder) != 6) {
|
| - log_err("Failure at codepoint %d, maximum expansion count > %d\n",
|
| - ch, 5);
|
| - }
|
| -
|
| - ucol_closeElements(iter);
|
| - ucol_close(coll);
|
| - } else {
|
| - log_err_status(status, "Couldn't open collator -> %s\n", u_errorName(status));
|
| - }
|
| -
|
| -}
|
| -
|
| -
|
| -static void assertEqual(UCollationElements *i1, UCollationElements *i2)
|
| -{
|
| - int32_t c1, c2;
|
| - int32_t count = 0;
|
| - UErrorCode status = U_ZERO_ERROR;
|
| -
|
| - do
|
| - {
|
| - c1 = ucol_next(i1, &status);
|
| - c2 = ucol_next(i2, &status);
|
| -
|
| - if (c1 != c2)
|
| - {
|
| - log_err("Error in iteration %d assetEqual between\n %d and %d, they are not equal\n", count, c1, c2);
|
| - break;
|
| - }
|
| -
|
| - count += 1;
|
| - }
|
| - while (c1 != UCOL_NULLORDER);
|
| -}
|
| -
|
| -/**
|
| - * Testing iterators with extremely small buffers
|
| - */
|
| -static void TestSmallBuffer()
|
| -{
|
| - UErrorCode status = U_ZERO_ERROR;
|
| - UCollator *coll;
|
| - UCollationElements *testiter,
|
| - *iter;
|
| - int32_t count = 0;
|
| - OrderAndOffset *testorders,
|
| - *orders;
|
| -
|
| - UChar teststr[500];
|
| - UChar str[] = {0x300, 0x31A, 0};
|
| - /*
|
| - creating a long string of decomposable characters,
|
| - since by default the writable buffer is of size 256
|
| - */
|
| - while (count < 500) {
|
| - if ((count & 1) == 0) {
|
| - teststr[count ++] = 0x300;
|
| - }
|
| - else {
|
| - teststr[count ++] = 0x31A;
|
| - }
|
| - }
|
| -
|
| - coll = ucol_open("th_TH", &status);
|
| - if(U_SUCCESS(status) && coll) {
|
| - testiter = ucol_openElements(coll, teststr, 500, &status);
|
| - iter = ucol_openElements(coll, str, 2, &status);
|
| -
|
| - orders = getOrders(iter, &count);
|
| - if (count != 2) {
|
| - log_err("Error collation elements size is not 2 for \\u0300\\u031A\n");
|
| - }
|
| -
|
| - /*
|
| - this will rearrange the string data to 250 characters of 0x300 first then
|
| - 250 characters of 0x031A
|
| - */
|
| - testorders = getOrders(testiter, &count);
|
| -
|
| - if (count != 500) {
|
| - log_err("Error decomposition does not give the right sized collation elements\n");
|
| - }
|
| -
|
| - while (count != 0) {
|
| - /* UCA collation element for 0x0F76 */
|
| - if ((count > 250 && testorders[-- count].order != orders[1].order) ||
|
| - (count <= 250 && testorders[-- count].order != orders[0].order)) {
|
| - log_err("Error decomposition does not give the right collation element at %d count\n", count);
|
| - break;
|
| - }
|
| - }
|
| -
|
| - free(testorders);
|
| - free(orders);
|
| -
|
| - ucol_reset(testiter);
|
| -
|
| - /* ensures closing of elements done properly to clear writable buffer */
|
| - ucol_next(testiter, &status);
|
| - ucol_next(testiter, &status);
|
| - ucol_closeElements(testiter);
|
| - ucol_closeElements(iter);
|
| - ucol_close(coll);
|
| - } else {
|
| - log_err_status(status, "Couldn't open collator -> %s\n", u_errorName(status));
|
| - }
|
| -}
|
| -
|
| -/**
|
| -* Testing the discontigous contractions
|
| -*/
|
| -static void TestDiscontiguos() {
|
| - const char *rulestr =
|
| - "&z < AB < X\\u0300 < ABC < X\\u0300\\u0315";
|
| - UChar rule[50];
|
| - int rulelen = u_unescape(rulestr, rule, 50);
|
| - const char *src[] = {
|
| - "ADB", "ADBC", "A\\u0315B", "A\\u0315BC",
|
| - /* base character blocked */
|
| - "XD\\u0300", "XD\\u0300\\u0315",
|
| - /* non blocking combining character */
|
| - "X\\u0319\\u0300", "X\\u0319\\u0300\\u0315",
|
| - /* blocking combining character */
|
| - "X\\u0314\\u0300", "X\\u0314\\u0300\\u0315",
|
| - /* contraction prefix */
|
| - "ABDC", "AB\\u0315C","X\\u0300D\\u0315", "X\\u0300\\u0319\\u0315",
|
| - "X\\u0300\\u031A\\u0315",
|
| - /* ends not with a contraction character */
|
| - "X\\u0319\\u0300D", "X\\u0319\\u0300\\u0315D", "X\\u0300D\\u0315D",
|
| - "X\\u0300\\u0319\\u0315D", "X\\u0300\\u031A\\u0315D"
|
| - };
|
| - const char *tgt[] = {
|
| - /* non blocking combining character */
|
| - "A D B", "A D BC", "A \\u0315 B", "A \\u0315 BC",
|
| - /* base character blocked */
|
| - "X D \\u0300", "X D \\u0300\\u0315",
|
| - /* non blocking combining character */
|
| - "X\\u0300 \\u0319", "X\\u0300\\u0315 \\u0319",
|
| - /* blocking combining character */
|
| - "X \\u0314 \\u0300", "X \\u0314 \\u0300\\u0315",
|
| - /* contraction prefix */
|
| - "AB DC", "AB \\u0315 C","X\\u0300 D \\u0315", "X\\u0300\\u0315 \\u0319",
|
| - "X\\u0300 \\u031A \\u0315",
|
| - /* ends not with a contraction character */
|
| - "X\\u0300 \\u0319D", "X\\u0300\\u0315 \\u0319D", "X\\u0300 D\\u0315D",
|
| - "X\\u0300\\u0315 \\u0319D", "X\\u0300 \\u031A\\u0315D"
|
| - };
|
| - int size = 20;
|
| - UCollator *coll;
|
| - UErrorCode status = U_ZERO_ERROR;
|
| - int count = 0;
|
| - UCollationElements *iter;
|
| - UCollationElements *resultiter;
|
| -
|
| - coll = ucol_openRules(rule, rulelen, UCOL_OFF, UCOL_DEFAULT_STRENGTH,NULL, &status);
|
| - iter = ucol_openElements(coll, rule, 1, &status);
|
| - resultiter = ucol_openElements(coll, rule, 1, &status);
|
| -
|
| - if (U_FAILURE(status)) {
|
| - log_err_status(status, "Error opening collation rules -> %s\n", u_errorName(status));
|
| - return;
|
| - }
|
| -
|
| - while (count < size) {
|
| - UChar str[20];
|
| - UChar tstr[20];
|
| - int strLen = u_unescape(src[count], str, 20);
|
| - UChar *s;
|
| -
|
| - ucol_setText(iter, str, strLen, &status);
|
| - if (U_FAILURE(status)) {
|
| - log_err("Error opening collation iterator\n");
|
| - return;
|
| - }
|
| -
|
| - u_unescape(tgt[count], tstr, 20);
|
| - s = tstr;
|
| -
|
| - log_verbose("count %d\n", count);
|
| -
|
| - for (;;) {
|
| - uint32_t ce;
|
| - UChar *e = u_strchr(s, 0x20);
|
| - if (e == 0) {
|
| - e = u_strchr(s, 0);
|
| - }
|
| - ucol_setText(resultiter, s, (int32_t)(e - s), &status);
|
| - ce = ucol_next(resultiter, &status);
|
| - if (U_FAILURE(status)) {
|
| - log_err("Error manipulating collation iterator\n");
|
| - return;
|
| - }
|
| - while (ce != UCOL_NULLORDER) {
|
| - if (ce != (uint32_t)ucol_next(iter, &status) ||
|
| - U_FAILURE(status)) {
|
| - log_err("Discontiguos contraction test mismatch\n");
|
| - return;
|
| - }
|
| - ce = ucol_next(resultiter, &status);
|
| - if (U_FAILURE(status)) {
|
| - log_err("Error getting next collation element\n");
|
| - return;
|
| - }
|
| - }
|
| - s = e + 1;
|
| - if (*e == 0) {
|
| - break;
|
| - }
|
| - }
|
| - ucol_reset(iter);
|
| - backAndForth(iter);
|
| - count ++;
|
| - }
|
| - ucol_closeElements(resultiter);
|
| - ucol_closeElements(iter);
|
| - ucol_close(coll);
|
| -}
|
| -
|
| -/**
|
| -* TestSearchCollatorElements tests iterator behavior (forwards and backwards) with
|
| -* normalization on AND jamo tailoring, among other things.
|
| -*
|
| -* Note: This test is sensitive to changes of the root collator,
|
| -* for example whether the ae-ligature maps to three CEs (as in the DUCET)
|
| -* or to two CEs (as in the CLDR 24 FractionalUCA.txt).
|
| -* It is also sensitive to how those CEs map to the iterator's 32-bit CE encoding.
|
| -* For example, the DUCET's artificial secondary CE in the ae-ligature
|
| -* may map to two 32-bit iterator CEs (as it did until ICU 52).
|
| -*/
|
| -static const UChar tsceText[] = { /* Nothing in here should be ignorable */
|
| - 0x0020, 0xAC00, /* simple LV Hangul */
|
| - 0x0020, 0xAC01, /* simple LVT Hangul */
|
| - 0x0020, 0xAC0F, /* LVTT, last jamo expands for search */
|
| - 0x0020, 0xAFFF, /* LLVVVTT, every jamo expands for search */
|
| - 0x0020, 0x1100, 0x1161, 0x11A8, /* 0xAC01 as conjoining jamo */
|
| - 0x0020, 0x3131, 0x314F, 0x3131, /* 0xAC01 as compatibility jamo */
|
| - 0x0020, 0x1100, 0x1161, 0x11B6, /* 0xAC0F as conjoining jamo; last expands for search */
|
| - 0x0020, 0x1101, 0x1170, 0x11B6, /* 0xAFFF as conjoining jamo; all expand for search */
|
| - 0x0020, 0x00E6, /* small letter ae, expands */
|
| - 0x0020, 0x1E4D, /* small letter o with tilde and acute, decomposes */
|
| - 0x0020
|
| -};
|
| -enum { kLen_tsceText = sizeof(tsceText)/sizeof(tsceText[0]) };
|
| -
|
| -static const int32_t rootStandardOffsets[] = {
|
| - 0, 1,2,
|
| - 2, 3,4,4,
|
| - 4, 5,6,6,
|
| - 6, 7,8,8,
|
| - 8, 9,10,11,
|
| - 12, 13,14,15,
|
| - 16, 17,18,19,
|
| - 20, 21,22,23,
|
| - 24, 25,26, /* plus another 1-2 offset=26 if ae-ligature maps to three CEs */
|
| - 26, 27,28,28,
|
| - 28,
|
| - 29
|
| -};
|
| -enum { kLen_rootStandardOffsets = sizeof(rootStandardOffsets)/sizeof(rootStandardOffsets[0]) };
|
| -
|
| -static const int32_t rootSearchOffsets[] = {
|
| - 0, 1,2,
|
| - 2, 3,4,4,
|
| - 4, 5,6,6,6,
|
| - 6, 7,8,8,8,8,8,8,
|
| - 8, 9,10,11,
|
| - 12, 13,14,15,
|
| - 16, 17,18,19,20,
|
| - 20, 21,22,22,23,23,23,24,
|
| - 24, 25,26, /* plus another 1-2 offset=26 if ae-ligature maps to three CEs */
|
| - 26, 27,28,28,
|
| - 28,
|
| - 29
|
| -};
|
| -enum { kLen_rootSearchOffsets = sizeof(rootSearchOffsets)/sizeof(rootSearchOffsets[0]) };
|
| -
|
| -typedef struct {
|
| - const char * locale;
|
| - const int32_t * offsets;
|
| - int32_t offsetsLen;
|
| -} TSCEItem;
|
| -
|
| -static const TSCEItem tsceItems[] = {
|
| - { "root", rootStandardOffsets, kLen_rootStandardOffsets },
|
| - { "root@collation=search", rootSearchOffsets, kLen_rootSearchOffsets },
|
| - { NULL, NULL, 0 }
|
| -};
|
| -
|
| -static void TestSearchCollatorElements(void)
|
| -{
|
| - const TSCEItem * tsceItemPtr;
|
| - for (tsceItemPtr = tsceItems; tsceItemPtr->locale != NULL; tsceItemPtr++) {
|
| - UErrorCode status = U_ZERO_ERROR;
|
| - UCollator* ucol = ucol_open(tsceItemPtr->locale, &status);
|
| - if ( U_SUCCESS(status) ) {
|
| - UCollationElements * uce = ucol_openElements(ucol, tsceText, kLen_tsceText, &status);
|
| - if ( U_SUCCESS(status) ) {
|
| - int32_t offset, element;
|
| - const int32_t * nextOffsetPtr;
|
| - const int32_t * limitOffsetPtr;
|
| -
|
| - nextOffsetPtr = tsceItemPtr->offsets;
|
| - limitOffsetPtr = tsceItemPtr->offsets + tsceItemPtr->offsetsLen;
|
| - do {
|
| - offset = ucol_getOffset(uce);
|
| - element = ucol_next(uce, &status);
|
| - log_verbose("(%s) offset=%2d ce=%08x\n", tsceItemPtr->locale, offset, element);
|
| - if ( element == 0 ) {
|
| - log_err("error, locale %s, ucol_next returned element 0\n", tsceItemPtr->locale );
|
| - }
|
| - if ( nextOffsetPtr < limitOffsetPtr ) {
|
| - if (offset != *nextOffsetPtr) {
|
| - log_err("error, locale %s, expected ucol_next -> ucol_getOffset %d, got %d\n",
|
| - tsceItemPtr->locale, *nextOffsetPtr, offset );
|
| - nextOffsetPtr = limitOffsetPtr;
|
| - break;
|
| - }
|
| - nextOffsetPtr++;
|
| - } else {
|
| - log_err("error, locale %s, ucol_next returned more elements than expected\n", tsceItemPtr->locale );
|
| - }
|
| - } while ( U_SUCCESS(status) && element != UCOL_NULLORDER );
|
| - if ( nextOffsetPtr < limitOffsetPtr ) {
|
| - log_err("error, locale %s, ucol_next returned fewer elements than expected\n", tsceItemPtr->locale );
|
| - }
|
| -
|
| - ucol_setOffset(uce, kLen_tsceText, &status);
|
| - status = U_ZERO_ERROR;
|
| - nextOffsetPtr = tsceItemPtr->offsets + tsceItemPtr->offsetsLen;
|
| - limitOffsetPtr = tsceItemPtr->offsets;
|
| - do {
|
| - offset = ucol_getOffset(uce);
|
| - element = ucol_previous(uce, &status);
|
| - if ( element == 0 ) {
|
| - log_err("error, locale %s, ucol_previous returned element 0\n", tsceItemPtr->locale );
|
| - }
|
| - if ( nextOffsetPtr > limitOffsetPtr ) {
|
| - nextOffsetPtr--;
|
| - if (offset != *nextOffsetPtr) {
|
| - log_err("error, locale %s, expected ucol_previous -> ucol_getOffset %d, got %d\n",
|
| - tsceItemPtr->locale, *nextOffsetPtr, offset );
|
| - nextOffsetPtr = limitOffsetPtr;
|
| - break;
|
| - }
|
| - } else {
|
| - log_err("error, locale %s, ucol_previous returned more elements than expected\n", tsceItemPtr->locale );
|
| - }
|
| - } while ( U_SUCCESS(status) && element != UCOL_NULLORDER );
|
| - if ( nextOffsetPtr > limitOffsetPtr ) {
|
| - log_err("error, locale %s, ucol_previous returned fewer elements than expected\n", tsceItemPtr->locale );
|
| - }
|
| -
|
| - ucol_closeElements(uce);
|
| - } else {
|
| - log_err("error, locale %s, ucol_openElements failed: %s\n", tsceItemPtr->locale, u_errorName(status) );
|
| - }
|
| - ucol_close(ucol);
|
| - } else {
|
| - log_data_err("error, locale %s, ucol_open failed: %s\n", tsceItemPtr->locale, u_errorName(status) );
|
| - }
|
| - }
|
| -}
|
| -
|
| -#endif /* #if !UCONFIG_NO_COLLATION */
|
|
|