16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/********************************************************************
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT:
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 1997-2013, International Business Machines Corporation and
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/********************************************************************************
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File CBIAPTS.C
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification History:
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*        Name                     Description
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*     Madhu Katragadda              Creation
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*********************************************************************************/
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*C API TEST FOR BREAKITERATOR */
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* This is an API test.  It doesn't test very many cases, and doesn't
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* try to test the full functionality.  It just calls each function in the class and
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* verifies that it works on a basic level.
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org**/
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_BREAK_ITERATION
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdlib.h>
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <string.h>
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uloc.h"
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ubrk.h"
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h"
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ucnv.h"
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utext.h"
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cintltst.h"
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cbiapts.h"
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TEST_ASSERT_SUCCESS(status) {if (U_FAILURE(status)) { \
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orglog_data_err("Failure at file %s, line %d, error = %s (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status));}}
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TEST_ASSERT(expr) {if ((expr)==FALSE) { \
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orglog_data_err("Test Failure at file %s, line %d (Are you missing data?)\n", __FILE__, __LINE__);}}
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FILE_IO
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBreakIteratorSafeClone(void);
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBreakIteratorRules(void);
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBreakIteratorRuleError(void);
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBreakIteratorStatusVec(void);
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBreakIteratorUText(void);
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBreakIteratorTailoring(void);
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBreakIteratorRefresh(void);
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addBrkIterAPITest(TestNode** root);
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addBrkIterAPITest(TestNode** root)
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FILE_IO
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestBreakIteratorCAPI, "tstxtbd/cbiapts/TestBreakIteratorCAPI");
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestBreakIteratorSafeClone, "tstxtbd/cbiapts/TestBreakIteratorSafeClone");
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestBreakIteratorUText, "tstxtbd/cbiapts/TestBreakIteratorUText");
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestBreakIteratorRules, "tstxtbd/cbiapts/TestBreakIteratorRules");
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestBreakIteratorRuleError, "tstxtbd/cbiapts/TestBreakIteratorRuleError");
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestBreakIteratorStatusVec, "tstxtbd/cbiapts/TestBreakIteratorStatusVec");
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestBreakIteratorTailoring, "tstxtbd/cbiapts/TestBreakIteratorTailoring");
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestBreakIteratorRefresh, "tstxtbd/cbiapts/TestBreakIteratorRefresh");
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define CLONETEST_ITERATOR_COUNT 2
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   Utility function for converting char * to UChar * strings, to
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     simplify the test code.   Converted strings are put in heap allocated
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     storage.   A hook (probably a local in the caller's code) allows all
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     strings converted with that hook to be freed with a single call.
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct StringStruct {
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        struct StringStruct   *link;
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar                 str[1];
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } StringStruct;
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UChar* toUChar(const char *src, void **freeHook) {
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Structure of the memory that we allocate on the heap */
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t    numUChars;
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t    destSize;
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar      stackBuf[2000 + sizeof(void *)/sizeof(UChar)];
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    StringStruct  *dest;
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UConverter *cnv;
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (src == NULL) {
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cnv = ucnv_open(NULL, &status);
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status) || cnv == NULL) {
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucnv_reset(cnv);
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    numUChars = ucnv_toUChars(cnv,
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  stackBuf,
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  2000,
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  src, -1,
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  &status);
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    destSize = (numUChars+1) * sizeof(UChar) + sizeof(struct StringStruct);
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dest = (StringStruct *)malloc(destSize);
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (dest != NULL) {
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (status == U_BUFFER_OVERFLOW_ERROR || status == U_STRING_NOT_TERMINATED_WARNING) {
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucnv_toUChars(cnv, dest->str, numUChars+1, src, -1, &status);
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if (status == U_ZERO_ERROR) {
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_strcpy(dest->str, stackBuf);
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            free(dest);
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dest = NULL;
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucnv_reset(cnv); /* be good citizens */
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucnv_close(cnv);
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (dest == NULL) {
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return NULL;
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dest->link = (StringStruct*)(*freeHook);
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *freeHook = dest;
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return dest->str;
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void freeToUCharStrings(void **hook) {
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    StringStruct  *s = *(StringStruct **)hook;
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (s != NULL) {
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        StringStruct *next = s->link;
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        free(s);
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        s = next;
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FILE_IO
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBreakIteratorCAPI()
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBreakIterator *word, *sentence, *line, *character, *b, *bogus;
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t start,pos,end,to;
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t count = 0;
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar text[50];
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Note:  the adjacent "" are concatenating strings, not adding a \" to the
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       string, which is probably what whoever wrote this intended.  Don't fix,
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       because it would throw off the hard coded break positions in the following
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       tests. */
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrcpy(text, "He's from Africa. ""Mr. Livingston, I presume?"" Yeah");
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*test ubrk_open()*/
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting BreakIterator open functions\n");
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Use french for fun */
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    word         = ubrk_open(UBRK_WORD, "en_US", text, u_strlen(text), &status);
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status == U_FILE_ACCESS_ERROR) {
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("Check your data - it doesn't seem to be around\n");
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(U_FAILURE(status)){
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "FAIL: Error in ubrk_open() for word breakiterator: %s\n", myErrorName(status));
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else{
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: Successfully opened  word breakiterator\n");
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sentence     = ubrk_open(UBRK_SENTENCE, "en_US", text, u_strlen(text), &status);
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "FAIL: Error in ubrk_open() for sentence breakiterator: %s\n", myErrorName(status));
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else{
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: Successfully opened  sentence breakiterator\n");
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    line         = ubrk_open(UBRK_LINE, "en_US", text, u_strlen(text), &status);
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Error in ubrk_open() for line breakiterator: %s\n", myErrorName(status));
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else{
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: Successfully opened  line breakiterator\n");
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    character     = ubrk_open(UBRK_CHARACTER, "en_US", text, u_strlen(text), &status);
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Error in ubrk_open() for character breakiterator: %s\n", myErrorName(status));
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else{
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: Successfully opened  character breakiterator\n");
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*trying to open an illegal iterator*/
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bogus     = ubrk_open((UBreakIteratorType)5, "en_US", text, u_strlen(text), &status);
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(bogus != NULL) {
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: expected NULL from opening an invalid break iterator.\n");
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_SUCCESS(status)){
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Error in ubrk_open() for BOGUS breakiterator. Expected U_ILLEGAL_ARGUMENT_ERROR\n");
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(status != U_ILLEGAL_ARGUMENT_ERROR){
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: Error in ubrk_open() for BOGUS breakiterator. Expected U_ILLEGAL_ARGUMENT_ERROR\n Got %s\n", myErrorName(status));
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status=U_ZERO_ERROR;
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* ======= Test ubrk_countAvialable() and ubrk_getAvialable() */
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting ubrk_countAvailable() and ubrk_getAvailable()\n");
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count=ubrk_countAvailable();
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* use something sensible w/o hardcoding the count */
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(count < 0){
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Error in ubrk_countAvialable() returned %d\n", count);
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else{
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: ubrk_countAvialable() successful returned %d\n", count);
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0;i<count;i++)
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("%s\n", ubrk_getAvailable(i));
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (ubrk_getAvailable(i) == 0)
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("No locale for which breakiterator is applicable\n");
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("A locale %s for which breakiterator is applicable\n",ubrk_getAvailable(i));
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*========Test ubrk_first(), ubrk_last()...... and other functions*/
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting the functions for word\n");
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    start = ubrk_first(word);
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(start!=0)
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error ubrk_start(word) did not return 0\n");
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("first (word = %d\n", (int32_t)start);
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       pos=ubrk_next(word);
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pos!=4)
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error ubrk_next(word) did not return 4\n");
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("next (word = %d\n", (int32_t)pos);
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos=ubrk_following(word, 4);
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pos!=5)
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error ubrl_following(word,4) did not return 6\n");
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("next (word = %d\n", (int32_t)pos);
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    end=ubrk_last(word);
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(end!=49)
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error ubrk_last(word) did not return 49\n");
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("last (word = %d\n", (int32_t)end);
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos=ubrk_previous(word);
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("%d   %d\n", end, pos);
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos=ubrk_previous(word);
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("%d \n", pos);
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ubrk_isBoundary(word, 2) != FALSE) {
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error ubrk_isBoundary(word, 2) did not return FALSE\n");
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos=ubrk_current(word);
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (pos != 4) {
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error ubrk_current() != 4 after ubrk_isBoundary(word, 2)\n");
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ubrk_isBoundary(word, 4) != TRUE) {
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error ubrk_isBoundary(word, 4) did not return TRUE\n");
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting the functions for character\n");
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubrk_first(character);
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos = ubrk_following(character, 5);
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pos!=6)
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_err("error ubrk_following(character,5) did not return 6\n");
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Following (character,5) = %d\n", (int32_t)pos);
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos=ubrk_following(character, 18);
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pos!=19)
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_err("error ubrk_following(character,18) did not return 19\n");
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Followingcharacter,18) = %d\n", (int32_t)pos);
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos=ubrk_preceding(character, 22);
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pos!=21)
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_err("error ubrk_preceding(character,22) did not return 21\n");
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("preceding(character,22) = %d\n", (int32_t)pos);
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting the functions for line\n");
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos=ubrk_first(line);
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pos != 0)
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error ubrk_first(line) returned %d, expected 0\n", (int32_t)pos);
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos = ubrk_next(line);
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos=ubrk_following(line, 18);
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pos!=22)
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error ubrk_following(line) did not return 22\n");
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("following (line) = %d\n", (int32_t)pos);
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting the functions for sentence\n");
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubrk_first(sentence);
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos = ubrk_current(sentence);
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Current(sentence) = %d\n", (int32_t)pos);
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       pos = ubrk_last(sentence);
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pos!=49)
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error ubrk_last for sentence did not return 49\n");
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Last (sentence) = %d\n", (int32_t)pos);
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubrk_first(sentence);
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    to = ubrk_following( sentence, 0 );
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (to == 0) log_err("ubrk_following returned 0\n");
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    to = ubrk_preceding( sentence, to );
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (to != 0) log_err("ubrk_preceding didn't return 0\n");
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ubrk_first(sentence)!=ubrk_current(sentence)) {
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error in ubrk_first() or ubrk_current()\n");
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*---- */
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Testing ubrk_open and ubrk_close()*/
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   log_verbose("\nTesting open and close for us locale\n");
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    b = ubrk_open(UBRK_WORD, "fr_FR", text, u_strlen(text), &status);
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ubrk_open for word returned NULL: %s\n", myErrorName(status));
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubrk_close(b);
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Test setText and setUText */
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar s1[] = {0x41, 0x42, 0x20, 0};
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar s2[] = {0x41, 0x42, 0x43, 0x44, 0x45, 0};
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UText *ut = NULL;
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBreakIterator *bb;
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int j;
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("\nTesting ubrk_setText() and ubrk_setUText()\n");
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        bb = ubrk_open(UBRK_WORD, "en_US", NULL, 0, &status);
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubrk_setText(bb, s1, -1, &status);
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubrk_first(bb);
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        j = ubrk_next(bb);
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(j == 2);
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ut = utext_openUChars(ut, s2, -1, &status);
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubrk_setUText(bb, ut, &status);
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        j = ubrk_next(bb);
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(j == 5);
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubrk_close(bb);
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(ut);
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubrk_close(word);
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubrk_close(sentence);
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubrk_close(line);
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubrk_close(character);
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBreakIteratorSafeClone(void)
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar text[51];     /* Keep this odd to test for 64-bit memory alignment */
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        /*  NOTE:  This doesn't reliably force mis-alignment of following items. */
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint8_t buffer [CLONETEST_ITERATOR_COUNT] [U_BRK_SAFECLONE_BUFFERSIZE];
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t bufferSize = U_BRK_SAFECLONE_BUFFERSIZE;
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBreakIterator * someIterators [CLONETEST_ITERATOR_COUNT];
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBreakIterator * someClonedIterators [CLONETEST_ITERATOR_COUNT];
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBreakIterator * brk;
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t start,pos;
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Testing ubrk_safeClone */
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Note:  the adjacent "" are concatenating strings, not adding a \" to the
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       string, which is probably what whoever wrote this intended.  Don't fix,
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       because it would throw off the hard coded break positions in the following
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       tests. */
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrcpy(text, "He's from Africa. ""Mr. Livingston, I presume?"" Yeah");
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* US & Thai - rule-based & dictionary based */
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    someIterators[0] = ubrk_open(UBRK_WORD, "en_US", text, u_strlen(text), &status);
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!someIterators[0] || U_FAILURE(status)) {
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_data_err("Couldn't open en_US word break iterator - %s\n", u_errorName(status));
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    someIterators[1] = ubrk_open(UBRK_WORD, "th_TH", text, u_strlen(text), &status);
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!someIterators[1] || U_FAILURE(status)) {
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_data_err("Couldn't open th_TH word break iterator - %s\n", u_errorName(status));
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* test each type of iterator */
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i = 0; i < CLONETEST_ITERATOR_COUNT; i++)
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Check the various error & informational states */
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Null status - just returns NULL */
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (NULL != ubrk_safeClone(someIterators[i], buffer[i], &bufferSize, NULL))
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: Cloned Iterator failed to deal correctly with null status\n");
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* error status - should return 0 & keep error the same */
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_MEMORY_ALLOCATION_ERROR;
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (NULL != ubrk_safeClone(someIterators[i], buffer[i], &bufferSize, &status) || status != U_MEMORY_ALLOCATION_ERROR)
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: Cloned Iterator failed to deal correctly with incoming error status\n");
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Null buffer size pointer is ok */
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (NULL == (brk = ubrk_safeClone(someIterators[i], buffer[i], NULL, &status)) || U_FAILURE(status))
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: Cloned Iterator failed to deal correctly with null bufferSize pointer\n");
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubrk_close(brk);
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* buffer size pointer is 0 - fill in pbufferSize with a size */
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        bufferSize = 0;
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (NULL != ubrk_safeClone(someIterators[i], buffer[i], &bufferSize, &status) ||
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                U_FAILURE(status) || bufferSize <= 0)
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: Cloned Iterator failed a sizing request ('preflighting')\n");
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Verify our define is large enough  */
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_BRK_SAFECLONE_BUFFERSIZE < bufferSize)
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          log_err("FAIL: Pre-calculated buffer size is too small - %d but needed %d\n", U_BRK_SAFECLONE_BUFFERSIZE, bufferSize);
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Verify we can use this run-time calculated size */
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (NULL == (brk = ubrk_safeClone(someIterators[i], buffer[i], &bufferSize, &status)) || U_FAILURE(status))
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: Iterator can't be cloned with run-time size\n");
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (brk)
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ubrk_close(brk);
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* size one byte too small - should allocate & let us know */
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (bufferSize > 1) {
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            --bufferSize;
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (NULL == (brk = ubrk_safeClone(someIterators[i], NULL, &bufferSize, &status)) || status != U_SAFECLONE_ALLOCATED_WARNING)
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: Cloned Iterator failed to deal correctly with too-small buffer size\n");
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (brk)
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ubrk_close(brk);
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        bufferSize = U_BRK_SAFECLONE_BUFFERSIZE;
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Null buffer pointer - return Iterator & set error to U_SAFECLONE_ALLOCATED_ERROR */
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (NULL == (brk = ubrk_safeClone(someIterators[i], NULL, &bufferSize, &status)) || status != U_SAFECLONE_ALLOCATED_WARNING)
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: Cloned Iterator failed to deal correctly with null buffer pointer\n");
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (brk)
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ubrk_close(brk);
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Mis-aligned buffer pointer. */
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            char  stackBuf[U_BRK_SAFECLONE_BUFFERSIZE+sizeof(void *)];
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            brk = ubrk_safeClone(someIterators[i], &stackBuf[1], &bufferSize, &status);
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (U_FAILURE(status) || brk == NULL) {
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("FAIL: Cloned Iterator failed with misaligned buffer pointer\n");
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (status == U_SAFECLONE_ALLOCATED_WARNING) {
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_verbose("Cloned Iterator allocated when using a mis-aligned buffer.\n");
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (brk)
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ubrk_close(brk);
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Null Iterator - return NULL & set U_ILLEGAL_ARGUMENT_ERROR */
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (NULL != ubrk_safeClone(NULL, buffer[i], &bufferSize, &status) || status != U_ILLEGAL_ARGUMENT_ERROR)
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: Cloned Iterator failed to deal correctly with null Iterator pointer\n");
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Do these cloned Iterators work at all - make a first & next call */
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        bufferSize = U_BRK_SAFECLONE_BUFFERSIZE;
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        someClonedIterators[i] = ubrk_safeClone(someIterators[i], buffer[i], &bufferSize, &status);
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        start = ubrk_first(someClonedIterators[i]);
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(start!=0)
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error ubrk_start(clone) did not return 0\n");
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos=ubrk_next(someClonedIterators[i]);
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(pos!=4)
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("error ubrk_next(clone) did not return 4\n");
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubrk_close(someClonedIterators[i]);
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubrk_close(someIterators[i]);
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//  Open a break iterator from char * rules.  Take care of conversion
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//     of the rules and error checking.
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBreakIterator * testOpenRules(char *rules) {
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode      status       = U_ZERO_ERROR;
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          *ruleSourceU  = NULL;
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void           *strCleanUp   = NULL;
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UParseError     parseErr;
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBreakIterator *bi;
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ruleSourceU = toUChar(rules, &strCleanUp);
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bi = ubrk_openRules(ruleSourceU,  -1,     /*  The rules  */
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        NULL,  -1,            /*  The text to be iterated over. */
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        &parseErr, &status);
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("FAIL: ubrk_openRules: ICU Error \"%s\" (Are you missing data?)\n", u_errorName(status));
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        bi = 0;
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    freeToUCharStrings(&strCleanUp);
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return bi;
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *  TestBreakIteratorRules - Verify that a break iterator can be created from
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *                           a set of source rules.
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBreakIteratorRules() {
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*  Rules will keep together any run of letters not including 'a', OR
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *             keep together 'abc', but only when followed by 'def', OTHERWISE
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *             just return one char at a time.
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char         rules[]  = "abc{666}/def;\n   [\\p{L} - [a]]* {2};  . {1};";
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*                        0123456789012345678 */
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char         data[]   =  "abcdex abcdefgh-def";     /* the test data string                     */
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char         breaks[] =  "**    **  *    **  *";    /*  * the expected break positions          */
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char         tags[]   =  "01    21  6    21  2";    /*  expected tag values at break positions  */
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t      tagMap[] = {0, 1, 2, 3, 4, 5, 666};
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar       *uData;
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void        *freeHook = NULL;
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode   status   = U_ZERO_ERROR;
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t      pos;
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int          i;
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBreakIterator *bi = testOpenRules(rules);
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (bi == NULL) {return;}
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uData = toUChar(data, &freeHook);
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubrk_setText(bi,  uData, -1, &status);
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos = ubrk_first(bi);
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=0; i<sizeof(breaks); i++) {
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (pos == i && breaks[i] != '*') {
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: unexpected break at position %d found\n", pos);
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (pos != i && breaks[i] == '*') {
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: expected break at position %d not found.\n", i);
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (pos == i) {
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t tag, expectedTag;
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            tag = ubrk_getRuleStatus(bi);
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            expectedTag = tagMap[tags[i]&0xf];
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (tag != expectedTag) {
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("FAIL: incorrect tag value.  Position = %d;  expected tag %d, got %d",
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    pos, expectedTag, tag);
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            pos = ubrk_next(bi);
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    freeToUCharStrings(&freeHook);
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubrk_close(bi);
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBreakIteratorRuleError() {
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *  TestBreakIteratorRuleError -   Try to create a BI from rules with syntax errors,
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *                                 check that the error is reported correctly.
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char            rules[]  = "           #  This is a rule comment on line 1\n"
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               "[:L:];     # this rule is OK.\n"
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               "abcdefg);  # Error, mismatched parens\n";
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          *uRules;
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void           *freeHook = NULL;
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode      status   = U_ZERO_ERROR;
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UParseError     parseErr;
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBreakIterator *bi;
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uRules = toUChar(rules, &freeHook);
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bi = ubrk_openRules(uRules,  -1,          /*  The rules  */
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        NULL,  -1,            /*  The text to be iterated over. */
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        &parseErr, &status);
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: construction of break iterator succeeded when it should have failed.\n");
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubrk_close(bi);
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (parseErr.line != 3 || parseErr.offset != 8) {
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("FAIL: incorrect error position reported. Got line %d, char %d, expected line 3, char 7 (Are you missing data?)\n",
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                parseErr.line, parseErr.offset);
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    freeToUCharStrings(&freeHook);
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   TestsBreakIteratorStatusVals()   Test the ubrk_getRuleStatusVec() funciton
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBreakIteratorStatusVec() {
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    #define RULE_STRING_LENGTH 200
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar          rules[RULE_STRING_LENGTH];
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    #define TEST_STRING_LENGTH 25
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar           testString[TEST_STRING_LENGTH];
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBreakIterator *bi        = NULL;
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t         pos       = 0;
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t         vals[10];
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t         numVals;
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode      status    = U_ZERO_ERROR;
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrncpy(rules,  "[A-N]{100}; \n"
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             "[a-w]{200}; \n"
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             "[\\p{L}]{300}; \n"
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             "[\\p{N}]{400}; \n"
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             "[0-5]{500}; \n"
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              "!.*;\n", RULE_STRING_LENGTH);
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrncpy(testString, "ABC", TEST_STRING_LENGTH);
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bi = ubrk_openRules(rules, -1, testString, -1, NULL, &status);
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(status);
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(bi != NULL);
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* The TEST_ASSERT above should change too... */
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (bi != NULL) {
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pos = ubrk_next(bi);
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(pos == 1);
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        memset(vals, -1, sizeof(vals));
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numVals = ubrk_getRuleStatusVec(bi, vals, 10, &status);
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(numVals == 2);
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(vals[0] == 100);
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(vals[1] == 300);
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(vals[2] == -1);
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numVals = ubrk_getRuleStatusVec(bi, vals, 0, &status);
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(numVals == 2);
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubrk_close(bi);
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *  static void TestBreakIteratorUText(void);
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *         Test that ubrk_setUText() is present and works for a simple case.
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBreakIteratorUText(void) {
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *UTF8Str = "\x41\xc3\x85\x5A\x20\x41\x52\x69\x6E\x67";  /* c3 85 is utf-8 for A with a ring on top */
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      /*   0  1   2 34567890  */
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode      status = U_ZERO_ERROR;
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBreakIterator *bi     = NULL;
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t         pos    = 0;
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UText *ut = utext_openUTF8(NULL, UTF8Str, -1, &status);
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(status);
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bi = ubrk_open(UBRK_WORD, "en_US", NULL, 0, &status);
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Failure at file %s, line %d, error = %s\n", __FILE__, __LINE__, u_errorName(status));
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubrk_setUText(bi, ut, &status);
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Failure at file %s, line %d, error = %s\n", __FILE__, __LINE__, u_errorName(status));
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos = ubrk_first(bi);
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(pos == 0);
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos = ubrk_next(bi);
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(pos == 4);
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos = ubrk_next(bi);
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(pos == 5);
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos = ubrk_next(bi);
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(pos == 10);
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pos = ubrk_next(bi);
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(pos == UBRK_DONE);
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubrk_close(bi);
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    utext_close(ut);
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *  static void TestBreakIteratorTailoring(void);
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *         Test break iterator tailorings from CLDR data.
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Thai/Lao grapheme break tailoring */
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar thTest[] = { 0x0020, 0x0E40, 0x0E01, 0x0020,
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                0x0E01, 0x0E30, 0x0020, 0x0E01, 0x0E33, 0x0020, 0 };
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*in Unicode 6.1 en should behave just like th for this*/
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*static const int32_t thTestOffs_enFwd[] = {  1,      3,  4,      6,  7,      9, 10 };*/
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t thTestOffs_thFwd[] = {  1,  2,  3,  4,  5,  6,  7,      9, 10 };
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*static const int32_t thTestOffs_enRev[] = {  9,      7,  6,      4,  3,      1,  0 };*/
7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t thTestOffs_thRev[] = {  9,      7,  6,  5,  4,  3,  2,  1,  0 };
7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Hebrew line break tailoring, for cldrbug 3028 */
7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar heTest[] = { 0x0020, 0x002D, 0x0031, 0x0032, 0x0020,
7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                0x0061, 0x002D, 0x006B, 0x0020,
7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                0x0061, 0x0300, 0x2010, 0x006B, 0x0020,
7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                0x05DE, 0x05D4, 0x002D, 0x0069, 0x0020,
7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                0x05D1, 0x05BC, 0x2010, 0x0047, 0x0020, 0 };
7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*in Unicode 6.1 en should behave just like he for this*/
7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*static const int32_t heTestOffs_enFwd[] = {  1,  5,  7,  9, 12, 14, 17, 19, 22, 24 };*/
7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t heTestOffs_heFwd[] = {  1,  5,  7,  9, 12, 14,     19,     24 };
7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*static const int32_t heTestOffs_enRev[] = { 22, 19, 17, 14, 12,  9,  7,  5,  1,  0 };*/
7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t heTestOffs_heRev[] = {     19,     14, 12,  9,  7,  5,  1,  0 };
7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Finnish line break tailoring, for cldrbug 3029 */
7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar fiTest[] = { /* 00 */ 0x0020, 0x002D, 0x0031, 0x0032, 0x0020,
7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                /* 05 */ 0x0061, 0x002D, 0x006B, 0x0020,
7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                /* 09 */ 0x0061, 0x0300, 0x2010, 0x006B, 0x0020,
7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                /* 14 */ 0x0061, 0x0020, 0x002D, 0x006B, 0x0020,
7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                /* 19 */ 0x0061, 0x0300, 0x0020, 0x2010, 0x006B, 0x0020, 0 };
7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t fiTestOffs_enFwd[] =  {  1,  5,  7,  9, 12, 14, 16, 17, 19, 22, 23, 25 };
7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t fiTestOffs_fiFwd[] =  {  1,  5,  7,  9, 12, 14, 16,     19, 22,     25 };
7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t fiTestOffs_enRev[] =  { 23, 22, 19, 17, 16, 14, 12,  9,  7,  5,  1,  0 };
7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t fiTestOffs_fiRev[] =  {     22, 19,     16, 14, 12,  9,  7,  5,  1,  0 };
7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Khmer dictionary-based work break, for ICU ticket #8329 */
7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar kmTest[] = { /* 00 */ 0x179F, 0x17BC, 0x1798, 0x1785, 0x17C6, 0x178E, 0x17B6, 0x1799, 0x1796, 0x17C1,
7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                /* 10 */ 0x179B, 0x1794, 0x1793, 0x17D2, 0x178F, 0x17B7, 0x1785, 0x178A, 0x17BE, 0x1798,
7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                /* 20 */ 0x17D2, 0x1794, 0x17B8, 0x17A2, 0x1792, 0x17B7, 0x179F, 0x17D2, 0x178B, 0x17B6,
7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                /* 30 */ 0x1793, 0x17A2, 0x179A, 0x1796, 0x17D2, 0x179A, 0x17C7, 0x1782, 0x17BB, 0x178E,
7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                /* 40 */ 0x178A, 0x179B, 0x17CB, 0x1796, 0x17D2, 0x179A, 0x17C7, 0x17A2, 0x1784, 0x17D2,
7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                /* 50 */ 0x1782, 0 };
7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t kmTestOffs_kmFwd[] =  {  3, /*8,*/ 11, 17, 23, 31, /*33,*/  40,  43, 51 }; /* TODO: Investigate failure to break at offset 8 */
7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t kmTestOffs_kmRev[] =  { 43,  40,   /*33,*/ 31, 23, 17, 11, /*8,*/ 3,  0 };
7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct {
7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char * locale;
7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBreakIteratorType type;
7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar * test;
7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const int32_t * offsFwd;
7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const int32_t * offsRev;
7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t numOffsets;
7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} RBBITailoringTest;
7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const RBBITailoringTest tailoringTests[] = {
7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en", UBRK_CHARACTER, thTest, thTestOffs_thFwd, thTestOffs_thRev, sizeof(thTestOffs_thFwd)/sizeof(thTestOffs_thFwd[0]) },
7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en_US_POSIX", UBRK_CHARACTER, thTest, thTestOffs_thFwd, thTestOffs_thRev, sizeof(thTestOffs_thFwd)/sizeof(thTestOffs_thFwd[0]) },
7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en", UBRK_LINE,      heTest, heTestOffs_heFwd, heTestOffs_heRev, sizeof(heTestOffs_heFwd)/sizeof(heTestOffs_heFwd[0]) },
7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "he", UBRK_LINE,      heTest, heTestOffs_heFwd, heTestOffs_heRev, sizeof(heTestOffs_heFwd)/sizeof(heTestOffs_heFwd[0]) },
7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en", UBRK_LINE,      fiTest, fiTestOffs_enFwd, fiTestOffs_enRev, sizeof(fiTestOffs_enFwd)/sizeof(fiTestOffs_enFwd[0]) },
7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "fi", UBRK_LINE,      fiTest, fiTestOffs_fiFwd, fiTestOffs_fiRev, sizeof(fiTestOffs_fiFwd)/sizeof(fiTestOffs_fiFwd[0]) },
7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "km", UBRK_WORD,      kmTest, kmTestOffs_kmFwd, kmTestOffs_kmRev, sizeof(kmTestOffs_kmFwd)/sizeof(kmTestOffs_kmFwd[0]) },
7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { NULL, 0, NULL, NULL, NULL, 0 },
7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBreakIteratorTailoring(void) {
7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const RBBITailoringTest * testPtr;
7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (testPtr = tailoringTests; testPtr->locale != NULL; ++testPtr) {
7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode status = U_ZERO_ERROR;
7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBreakIterator* ubrkiter = ubrk_open(testPtr->type, testPtr->locale, testPtr->test, -1, &status);
7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if ( U_SUCCESS(status) ) {
7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t offset, offsindx;
7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UBool foundError;
7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            foundError = FALSE;
7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for (offsindx = 0; (offset = ubrk_next(ubrkiter)) != UBRK_DONE; ++offsindx) {
7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (!foundError && offsindx >= testPtr->numOffsets) {
7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: locale %s, break type %d, ubrk_next expected UBRK_DONE, got %d\n",
7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            testPtr->locale, testPtr->type, offset);
7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    foundError = TRUE;
7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else if (!foundError && offset != testPtr->offsFwd[offsindx]) {
7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: locale %s, break type %d, ubrk_next expected %d, got %d\n",
7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            testPtr->locale, testPtr->type, testPtr->offsFwd[offsindx], offset);
8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    foundError = TRUE;
8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (!foundError && offsindx < testPtr->numOffsets) {
8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("FAIL: locale %s, break type %d, ubrk_next expected %d, got UBRK_DONE\n",
8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    	testPtr->locale, testPtr->type, testPtr->offsFwd[offsindx]);
8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            foundError = FALSE;
8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for (offsindx = 0; (offset = ubrk_previous(ubrkiter)) != UBRK_DONE; ++offsindx) {
8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (!foundError && offsindx >= testPtr->numOffsets) {
8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: locale %s, break type %d, ubrk_previous expected UBRK_DONE, got %d\n",
8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            testPtr->locale, testPtr->type, offset);
8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    foundError = TRUE;
8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else if (!foundError && offset != testPtr->offsRev[offsindx]) {
8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: locale %s, break type %d, ubrk_previous expected %d, got %d\n",
8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            testPtr->locale, testPtr->type, testPtr->offsRev[offsindx], offset);
8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    foundError = TRUE;
8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (!foundError && offsindx < testPtr->numOffsets) {
8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("FAIL: locale %s, break type %d, ubrk_previous expected %d, got UBRK_DONE\n",
8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    	testPtr->locale, testPtr->type, testPtr->offsRev[offsindx]);
8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ubrk_close(ubrkiter);
8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err_status(status, "FAIL: locale %s, break type %d, ubrk_open status: %s\n", testPtr->locale, testPtr->type, u_errorName(status));
8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBreakIteratorRefresh(void) {
8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  RefreshInput changes out the input of a Break Iterator without
8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *    changing anything else in the iterator's state.  Used with Java JNI,
8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *    when Java moves the underlying string storage.   This test
8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *    runs a ubrk_next() repeatedly, moving the text in the middle of the sequence.
8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *    The right set of boundaries should still be found.
8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar testStr[]  = {0x20, 0x41, 0x20, 0x42, 0x20, 0x43, 0x20, 0x44, 0x0};  /* = " A B C D"  */
8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar movedStr[] = {0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,  0};
8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBreakIterator *bi;
8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UText ut1 = UTEXT_INITIALIZER;
8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UText ut2 = UTEXT_INITIALIZER;
8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    bi = ubrk_open(UBRK_LINE, "en_US", NULL, 0, &status);
8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(status);
8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    utext_openUChars(&ut1, testStr, -1, &status);
8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(status);
8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubrk_setUText(bi, &ut1, &status);
8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(status);
8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Line boundaries will occur before each letter in the original string */
8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(1 == ubrk_next(bi));
8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(3 == ubrk_next(bi));
8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Move the string, kill the original string.  */
8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_strcpy(movedStr, testStr);
8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_memset(testStr, 0x20, u_strlen(testStr));
8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_openUChars(&ut2, movedStr, -1, &status);
8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ubrk_refreshUText(bi, &ut2, &status);
8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Find the following matches, now working in the moved string. */
8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(5 == ubrk_next(bi));
8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(7 == ubrk_next(bi));
8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(8 == ubrk_next(bi));
8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(UBRK_DONE == ubrk_next(bi));
8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(&ut1);
8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(&ut2);
8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ubrk_close(bi);
8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
883