1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * Copyright (c) 1997-2012, International Business Machines Corporation and
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************************
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File CBIAPTS.C
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History:
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*        Name                     Description
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*     Madhu Katragadda              Creation
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*********************************************************************************/
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*C API TEST FOR BREAKITERATOR */
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* This is an API test.  It doesn't test very many cases, and doesn't
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* try to test the full functionality.  It just calls each function in the class and
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* verifies that it works on a basic level.
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru**/
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_BREAK_ITERATION
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h>
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h>
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uloc.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ubrk.h"
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucnv.h"
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utext.h"
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h"
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cbiapts.h"
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TEST_ASSERT_SUCCESS(status) {if (U_FAILURE(status)) { \
366d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Querulog_data_err("Failure at file %s, line %d, error = %s (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status));}}
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TEST_ASSERT(expr) {if ((expr)==FALSE) { \
396d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Querulog_data_err("Test Failure at file %s, line %d (Are you missing data?)\n", __FILE__, __LINE__);}}
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if !UCONFIG_NO_FILE_IO
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBreakIteratorSafeClone(void);
4354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBreakIteratorRules(void);
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBreakIteratorRuleError(void);
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBreakIteratorStatusVec(void);
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBreakIteratorUText(void);
4827f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestBreakIteratorTailoring(void);
494fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughesstatic void TestBreakIteratorRefresh(void);
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addBrkIterAPITest(TestNode** root);
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addBrkIterAPITest(TestNode** root)
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
5550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FILE_IO
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestBreakIteratorCAPI, "tstxtbd/cbiapts/TestBreakIteratorCAPI");
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestBreakIteratorSafeClone, "tstxtbd/cbiapts/TestBreakIteratorSafeClone");
5850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestBreakIteratorUText, "tstxtbd/cbiapts/TestBreakIteratorUText");
5950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestBreakIteratorRules, "tstxtbd/cbiapts/TestBreakIteratorRules");
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestBreakIteratorRuleError, "tstxtbd/cbiapts/TestBreakIteratorRuleError");
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestBreakIteratorStatusVec, "tstxtbd/cbiapts/TestBreakIteratorStatusVec");
6327f654740f2a26ad62a5c155af9199af9e69b889claireho    addTest(root, &TestBreakIteratorTailoring, "tstxtbd/cbiapts/TestBreakIteratorTailoring");
644fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    addTest(root, &TestBreakIteratorRefresh, "tstxtbd/cbiapts/TestBreakIteratorRefresh");
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CLONETEST_ITERATOR_COUNT 2
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   Utility function for converting char * to UChar * strings, to
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *     simplify the test code.   Converted strings are put in heap allocated
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *     storage.   A hook (probably a local in the caller's code) allows all
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *     strings converted with that hook to be freed with a single call.
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef struct StringStruct {
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        struct StringStruct   *link;
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar                 str[1];
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } StringStruct;
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UChar* toUChar(const char *src, void **freeHook) {
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Structure of the memory that we allocate on the heap */
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t    numUChars;
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t    destSize;
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar      stackBuf[2000 + sizeof(void *)/sizeof(UChar)];
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringStruct  *dest;
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter *cnv;
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (src == NULL) {
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NULL;
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv = ucnv_open(NULL, &status);
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status) || cnv == NULL) {
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NULL;
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_reset(cnv);
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    numUChars = ucnv_toUChars(cnv,
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  stackBuf,
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  2000,
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  src, -1,
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  &status);
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destSize = (numUChars+1) * sizeof(UChar) + sizeof(struct StringStruct);
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dest = (StringStruct *)malloc(destSize);
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (dest != NULL) {
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (status == U_BUFFER_OVERFLOW_ERROR || status == U_STRING_NOT_TERMINATED_WARNING) {
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ucnv_toUChars(cnv, dest->str, numUChars+1, src, -1, &status);
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if (status == U_ZERO_ERROR) {
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_strcpy(dest->str, stackBuf);
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            free(dest);
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dest = NULL;
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_reset(cnv); /* be good citizens */
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucnv_close(cnv);
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (dest == NULL) {
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NULL;
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dest->link = (StringStruct*)(*freeHook);
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *freeHook = dest;
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return dest->str;
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void freeToUCharStrings(void **hook) {
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringStruct  *s = *(StringStruct **)hook;
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (s != NULL) {
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        StringStruct *next = s->link;
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(s);
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s = next;
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
14054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if !UCONFIG_NO_FILE_IO
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBreakIteratorCAPI()
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBreakIterator *word, *sentence, *line, *character, *b, *bogus;
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t start,pos,end,to;
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t count = 0;
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar text[50];
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Note:  the adjacent "" are concatenating strings, not adding a \" to the
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       string, which is probably what whoever wrote this intended.  Don't fix,
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       because it would throw off the hard coded break positions in the following
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       tests. */
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(text, "He's from Africa. ""Mr. Livingston, I presume?"" Yeah");
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*test ubrk_open()*/
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting BreakIterator open functions\n");
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Use french for fun */
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    word         = ubrk_open(UBRK_WORD, "en_US", text, u_strlen(text), &status);
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status == U_FILE_ACCESS_ERROR) {
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("Check your data - it doesn't seem to be around\n");
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(U_FAILURE(status)){
1676d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "FAIL: Error in ubrk_open() for word breakiterator: %s\n", myErrorName(status));
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else{
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: Successfully opened  word breakiterator\n");
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sentence     = ubrk_open(UBRK_SENTENCE, "en_US", text, u_strlen(text), &status);
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
1756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "FAIL: Error in ubrk_open() for sentence breakiterator: %s\n", myErrorName(status));
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else{
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: Successfully opened  sentence breakiterator\n");
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    line         = ubrk_open(UBRK_LINE, "en_US", text, u_strlen(text), &status);
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Error in ubrk_open() for line breakiterator: %s\n", myErrorName(status));
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else{
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: Successfully opened  line breakiterator\n");
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    character     = ubrk_open(UBRK_CHARACTER, "en_US", text, u_strlen(text), &status);
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Error in ubrk_open() for character breakiterator: %s\n", myErrorName(status));
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else{
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: Successfully opened  character breakiterator\n");
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*trying to open an illegal iterator*/
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bogus     = ubrk_open((UBreakIteratorType)5, "en_US", text, u_strlen(text), &status);
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)){
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Error in ubrk_open() for BOGUS breakiterator. Expected U_ILLEGAL_ARGUMENT_ERROR\n");
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status != U_ILLEGAL_ARGUMENT_ERROR){
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Error in ubrk_open() for BOGUS breakiterator. Expected U_ILLEGAL_ARGUMENT_ERROR\n Got %s\n", myErrorName(status));
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* ======= Test ubrk_countAvialable() and ubrk_getAvialable() */
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting ubrk_countAvailable() and ubrk_getAvailable()\n");
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count=ubrk_countAvailable();
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* use something sensible w/o hardcoding the count */
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(count < 0){
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Error in ubrk_countAvialable() returned %d\n", count);
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else{
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: ubrk_countAvialable() successful returned %d\n", count);
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;i<count;i++)
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("%s\n", ubrk_getAvailable(i));
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (ubrk_getAvailable(i) == 0)
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("No locale for which breakiterator is applicable\n");
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("A locale %s for which breakiterator is applicable\n",ubrk_getAvailable(i));
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*========Test ubrk_first(), ubrk_last()...... and other functions*/
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting the functions for word\n");
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    start = ubrk_first(word);
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(start!=0)
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error ubrk_start(word) did not return 0\n");
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("first (word = %d\n", (int32_t)start);
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       pos=ubrk_next(word);
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pos!=4)
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error ubrk_next(word) did not return 4\n");
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("next (word = %d\n", (int32_t)pos);
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos=ubrk_following(word, 4);
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pos!=5)
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error ubrl_following(word,4) did not return 6\n");
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("next (word = %d\n", (int32_t)pos);
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    end=ubrk_last(word);
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(end!=49)
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error ubrk_last(word) did not return 49\n");
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("last (word = %d\n", (int32_t)end);
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos=ubrk_previous(word);
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("%d   %d\n", end, pos);
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos=ubrk_previous(word);
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("%d \n", pos);
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ubrk_isBoundary(word, 2) != FALSE) {
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error ubrk_isBoundary(word, 2) did not return FALSE\n");
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos=ubrk_current(word);
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pos != 4) {
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error ubrk_current() != 4 after ubrk_isBoundary(word, 2)\n");
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ubrk_isBoundary(word, 4) != TRUE) {
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error ubrk_isBoundary(word, 4) did not return TRUE\n");
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting the functions for character\n");
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubrk_first(character);
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = ubrk_following(character, 5);
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pos!=6)
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       log_err("error ubrk_following(character,5) did not return 6\n");
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Following (character,5) = %d\n", (int32_t)pos);
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos=ubrk_following(character, 18);
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pos!=19)
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       log_err("error ubrk_following(character,18) did not return 19\n");
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Followingcharacter,18) = %d\n", (int32_t)pos);
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos=ubrk_preceding(character, 22);
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pos!=21)
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       log_err("error ubrk_preceding(character,22) did not return 21\n");
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("preceding(character,22) = %d\n", (int32_t)pos);
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting the functions for line\n");
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos=ubrk_first(line);
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pos != 0)
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error ubrk_first(line) returned %d, expected 0\n", (int32_t)pos);
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = ubrk_next(line);
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos=ubrk_following(line, 18);
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pos!=22)
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error ubrk_following(line) did not return 22\n");
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("following (line) = %d\n", (int32_t)pos);
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting the functions for sentence\n");
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubrk_first(sentence);
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = ubrk_current(sentence);
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Current(sentence) = %d\n", (int32_t)pos);
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       pos = ubrk_last(sentence);
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pos!=49)
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error ubrk_last for sentence did not return 49\n");
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Last (sentence) = %d\n", (int32_t)pos);
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubrk_first(sentence);
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    to = ubrk_following( sentence, 0 );
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (to == 0) log_err("ubrk_following returned 0\n");
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    to = ubrk_preceding( sentence, to );
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (to != 0) log_err("ubrk_preceding didn't return 0\n");
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ubrk_first(sentence)!=ubrk_current(sentence)) {
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in ubrk_first() or ubrk_current()\n");
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*---- */
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing ubrk_open and ubrk_close()*/
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   log_verbose("\nTesting open and close for us locale\n");
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    b = ubrk_open(UBRK_WORD, "fr_FR", text, u_strlen(text), &status);
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ubrk_open for word returned NULL: %s\n", myErrorName(status));
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubrk_close(b);
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Test setText and setUText */
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar s1[] = {0x41, 0x42, 0x20, 0};
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar s2[] = {0x41, 0x42, 0x43, 0x44, 0x45, 0};
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UText *ut = NULL;
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBreakIterator *bb;
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int j;
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\nTesting ubrk_setText() and ubrk_setUText()\n");
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        bb = ubrk_open(UBRK_WORD, "en_US", NULL, 0, &status);
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubrk_setText(bb, s1, -1, &status);
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubrk_first(bb);
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        j = ubrk_next(bb);
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(j == 2);
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ut = utext_openUChars(ut, s2, -1, &status);
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubrk_setUText(bb, ut, &status);
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        j = ubrk_next(bb);
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(j == 5);
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubrk_close(bb);
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        utext_close(ut);
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubrk_close(word);
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubrk_close(sentence);
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubrk_close(line);
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubrk_close(character);
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBreakIteratorSafeClone(void)
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar text[51];     /* Keep this odd to test for 64-bit memory alignment */
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        /*  NOTE:  This doesn't reliably force mis-alignment of following items. */
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t buffer [CLONETEST_ITERATOR_COUNT] [U_BRK_SAFECLONE_BUFFERSIZE];
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t bufferSize = U_BRK_SAFECLONE_BUFFERSIZE;
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBreakIterator * someIterators [CLONETEST_ITERATOR_COUNT];
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBreakIterator * someClonedIterators [CLONETEST_ITERATOR_COUNT];
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBreakIterator * brk;
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t start,pos;
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing ubrk_safeClone */
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Note:  the adjacent "" are concatenating strings, not adding a \" to the
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       string, which is probably what whoever wrote this intended.  Don't fix,
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       because it would throw off the hard coded break positions in the following
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       tests. */
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(text, "He's from Africa. ""Mr. Livingston, I presume?"" Yeah");
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* US & Thai - rule-based & dictionary based */
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    someIterators[0] = ubrk_open(UBRK_WORD, "en_US", text, u_strlen(text), &status);
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!someIterators[0] || U_FAILURE(status)) {
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_data_err("Couldn't open en_US word break iterator - %s\n", u_errorName(status));
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    someIterators[1] = ubrk_open(UBRK_WORD, "th_TH", text, u_strlen(text), &status);
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!someIterators[1] || U_FAILURE(status)) {
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_data_err("Couldn't open th_TH word break iterator - %s\n", u_errorName(status));
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test each type of iterator */
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < CLONETEST_ITERATOR_COUNT; i++)
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Check the various error & informational states */
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Null status - just returns NULL */
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 != ubrk_safeClone(someIterators[i], buffer[i], &bufferSize, 0))
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Cloned Iterator failed to deal correctly with null status\n");
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* error status - should return 0 & keep error the same */
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_MEMORY_ALLOCATION_ERROR;
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 != ubrk_safeClone(someIterators[i], buffer[i], &bufferSize, &status) || status != U_MEMORY_ALLOCATION_ERROR)
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Cloned Iterator failed to deal correctly with incoming error status\n");
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Null buffer size pointer - just returns NULL & set error to U_ILLEGAL_ARGUMENT_ERROR*/
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 != ubrk_safeClone(someIterators[i], buffer[i], 0, &status) || status != U_ILLEGAL_ARGUMENT_ERROR)
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Cloned Iterator failed to deal correctly with null bufferSize pointer\n");
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* buffer size pointer is 0 - fill in pbufferSize with a size */
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        bufferSize = 0;
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 != ubrk_safeClone(someIterators[i], buffer[i], &bufferSize, &status) || U_FAILURE(status) || bufferSize <= 0)
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Cloned Iterator failed a sizing request ('preflighting')\n");
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Verify our define is large enough  */
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_BRK_SAFECLONE_BUFFERSIZE < bufferSize)
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
429b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho          log_err("FAIL: Pre-calculated buffer size is too small - %d but needed %d\n", U_BRK_SAFECLONE_BUFFERSIZE, bufferSize);
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Verify we can use this run-time calculated size */
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 == (brk = ubrk_safeClone(someIterators[i], buffer[i], &bufferSize, &status)) || U_FAILURE(status))
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Iterator can't be cloned with run-time size\n");
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (brk)
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ubrk_close(brk);
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* size one byte too small - should allocate & let us know */
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        --bufferSize;
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 == (brk = ubrk_safeClone(someIterators[i], 0, &bufferSize, &status)) || status != U_SAFECLONE_ALLOCATED_WARNING)
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Cloned Iterator failed to deal correctly with too-small buffer size\n");
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (brk)
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ubrk_close(brk);
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        bufferSize = U_BRK_SAFECLONE_BUFFERSIZE;
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Null buffer pointer - return Iterator & set error to U_SAFECLONE_ALLOCATED_ERROR */
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 == (brk = ubrk_safeClone(someIterators[i], 0, &bufferSize, &status)) || status != U_SAFECLONE_ALLOCATED_WARNING)
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Cloned Iterator failed to deal correctly with null buffer pointer\n");
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (brk)
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ubrk_close(brk);
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Mis-aligned buffer pointer. */
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char  stackBuf[U_BRK_SAFECLONE_BUFFERSIZE+sizeof(void *)];
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            void  *p;
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t offset;
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            brk = ubrk_safeClone(someIterators[i], &stackBuf[1], &bufferSize, &status);
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status) || brk == 0) {
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL: Cloned Iterator failed with misaligned buffer pointer\n");
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (status == U_SAFECLONE_ALLOCATED_WARNING) {
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL: Cloned Iterator allocated when using a mis-aligned buffer.\n");
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            offset = (int32_t)((char *)&p-(char*)brk);
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (offset < 0) {
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                offset = -offset;
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (offset % sizeof(void *) != 0) {
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL: Cloned Iterator failed to align correctly with misaligned buffer pointer\n");
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (brk)
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ubrk_close(brk);
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Null Iterator - return NULL & set U_ILLEGAL_ARGUMENT_ERROR */
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (0 != ubrk_safeClone(0, buffer[i], &bufferSize, &status) || status != U_ILLEGAL_ARGUMENT_ERROR)
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Cloned Iterator failed to deal correctly with null Iterator pointer\n");
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Do these cloned Iterators work at all - make a first & next call */
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        bufferSize = U_BRK_SAFECLONE_BUFFERSIZE;
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        someClonedIterators[i] = ubrk_safeClone(someIterators[i], buffer[i], &bufferSize, &status);
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        start = ubrk_first(someClonedIterators[i]);
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(start!=0)
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error ubrk_start(clone) did not return 0\n");
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pos=ubrk_next(someClonedIterators[i]);
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(pos!=4)
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error ubrk_next(clone) did not return 4\n");
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubrk_close(someClonedIterators[i]);
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubrk_close(someIterators[i]);
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
50554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//  Open a break iterator from char * rules.  Take care of conversion
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//     of the rules and error checking.
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBreakIterator * testOpenRules(char *rules) {
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode      status       = U_ZERO_ERROR;
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          *ruleSourceU  = NULL;
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void           *strCleanUp   = NULL;
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UParseError     parseErr;
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBreakIterator *bi;
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ruleSourceU = toUChar(rules, &strCleanUp);
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi = ubrk_openRules(ruleSourceU,  -1,     /*  The rules  */
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        NULL,  -1,            /*  The text to be iterated over. */
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        &parseErr, &status);
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
5266d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("FAIL: ubrk_openRules: ICU Error \"%s\" (Are you missing data?)\n", u_errorName(status));
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        bi = 0;
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    freeToUCharStrings(&strCleanUp);
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return bi;
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *  TestBreakIteratorRules - Verify that a break iterator can be created from
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                           a set of source rules.
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBreakIteratorRules() {
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*  Rules will keep together any run of letters not including 'a', OR
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *             keep together 'abc', but only when followed by 'def', OTHERWISE
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *             just return one char at a time.
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char         rules[]  = "abc{666}/def;\n   [\\p{L} - [a]]* {2};  . {1};";
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*                        0123456789012345678 */
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char         data[]   =  "abcdex abcdefgh-def";     /* the test data string                     */
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char         breaks[] =  "**    **  *    **  *";    /*  * the expected break positions          */
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char         tags[]   =  "01    21  6    21  2";    /*  expected tag values at break positions  */
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t      tagMap[] = {0, 1, 2, 3, 4, 5, 666};
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar       *uData;
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void        *freeHook = NULL;
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode   status   = U_ZERO_ERROR;
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t      pos;
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int          i;
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBreakIterator *bi = testOpenRules(rules);
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (bi == NULL) {return;}
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uData = toUChar(data, &freeHook);
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubrk_setText(bi,  uData, -1, &status);
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = ubrk_first(bi);
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<sizeof(breaks); i++) {
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (pos == i && breaks[i] != '*') {
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: unexpected break at position %d found\n", pos);
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (pos != i && breaks[i] == '*') {
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: expected break at position %d not found.\n", i);
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (pos == i) {
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t tag, expectedTag;
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            tag = ubrk_getRuleStatus(bi);
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectedTag = tagMap[tags[i]&0xf];
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (tag != expectedTag) {
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL: incorrect tag value.  Position = %d;  expected tag %d, got %d",
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    pos, expectedTag, tag);
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pos = ubrk_next(bi);
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    freeToUCharStrings(&freeHook);
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubrk_close(bi);
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBreakIteratorRuleError() {
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *  TestBreakIteratorRuleError -   Try to create a BI from rules with syntax errors,
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                                 check that the error is reported correctly.
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char            rules[]  = "           #  This is a rule comment on line 1\n"
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               "[:L:];     # this rule is OK.\n"
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               "abcdefg);  # Error, mismatched parens\n";
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          *uRules;
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void           *freeHook = NULL;
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode      status   = U_ZERO_ERROR;
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UParseError     parseErr;
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBreakIterator *bi;
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uRules = toUChar(rules, &freeHook);
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi = ubrk_openRules(uRules,  -1,          /*  The rules  */
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        NULL,  -1,            /*  The text to be iterated over. */
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        &parseErr, &status);
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(status)) {
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: construction of break iterator succeeded when it should have failed.\n");
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ubrk_close(bi);
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (parseErr.line != 3 || parseErr.offset != 8) {
6116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_data_err("FAIL: incorrect error position reported. Got line %d, char %d, expected line 3, char 7 (Are you missing data?)\n",
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                parseErr.line, parseErr.offset);
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    freeToUCharStrings(&freeHook);
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   TestsBreakIteratorStatusVals()   Test the ubrk_getRuleStatusVec() funciton
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBreakIteratorStatusVec() {
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    #define RULE_STRING_LENGTH 200
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar          rules[RULE_STRING_LENGTH];
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    #define TEST_STRING_LENGTH 25
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           testString[TEST_STRING_LENGTH];
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBreakIterator *bi        = NULL;
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t         pos       = 0;
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t         vals[10];
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t         numVals;
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode      status    = U_ZERO_ERROR;
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrncpy(rules,  "[A-N]{100}; \n"
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             "[a-w]{200}; \n"
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             "[\\p{L}]{300}; \n"
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             "[\\p{N}]{400}; \n"
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             "[0-5]{500}; \n"
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              "!.*;\n", RULE_STRING_LENGTH);
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrncpy(testString, "ABC", TEST_STRING_LENGTH);
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi = ubrk_openRules(rules, -1, testString, -1, NULL, &status);
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT_SUCCESS(status);
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(bi != NULL);
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* The TEST_ASSERT above should change too... */
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (bi != NULL) {
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pos = ubrk_next(bi);
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(pos == 1);
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memset(vals, -1, sizeof(vals));
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        numVals = ubrk_getRuleStatusVec(bi, vals, 10, &status);
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(numVals == 2);
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(vals[0] == 100);
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(vals[1] == 300);
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(vals[2] == -1);
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        numVals = ubrk_getRuleStatusVec(bi, vals, 0, &status);
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(numVals == 2);
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubrk_close(bi);
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *  static void TestBreakIteratorUText(void);
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *         Test that ubrk_setUText() is present and works for a simple case.
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBreakIteratorUText(void) {
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    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 */
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      /*   0  1   2 34567890  */
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode      status = U_ZERO_ERROR;
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBreakIterator *bi     = NULL;
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t         pos    = 0;
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UText *ut = utext_openUTF8(NULL, UTF8Str, -1, &status);
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT_SUCCESS(status);
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bi = ubrk_open(UBRK_WORD, "en_US", NULL, 0, &status);
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
6886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Failure at file %s, line %d, error = %s\n", __FILE__, __LINE__, u_errorName(status));
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubrk_setUText(bi, ut, &status);
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Failure at file %s, line %d, error = %s\n", __FILE__, __LINE__, u_errorName(status));
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = ubrk_first(bi);
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(pos == 0);
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = ubrk_next(bi);
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(pos == 4);
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = ubrk_next(bi);
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(pos == 5);
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = ubrk_next(bi);
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(pos == 10);
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = ubrk_next(bi);
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(pos == UBRK_DONE);
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ubrk_close(bi);
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    utext_close(ut);
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
71627f654740f2a26ad62a5c155af9199af9e69b889claireho/*
71727f654740f2a26ad62a5c155af9199af9e69b889claireho *  static void TestBreakIteratorTailoring(void);
71827f654740f2a26ad62a5c155af9199af9e69b889claireho *
71927f654740f2a26ad62a5c155af9199af9e69b889claireho *         Test break iterator tailorings from CLDR data.
72027f654740f2a26ad62a5c155af9199af9e69b889claireho */
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
72227f654740f2a26ad62a5c155af9199af9e69b889claireho/* Thai/Lao grapheme break tailoring */
72327f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const UChar thTest[] = { 0x0020, 0x0E40, 0x0E01, 0x0020,
72427f654740f2a26ad62a5c155af9199af9e69b889claireho                                0x0E01, 0x0E30, 0x0020, 0x0E01, 0x0E33, 0x0020, 0 };
725103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/*in Unicode 6.1 en should behave just like th for this*/
726103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/*static const int32_t thTestOffs_enFwd[] = {  1,      3,  4,      6,  7,      9, 10 };*/
72727f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const int32_t thTestOffs_thFwd[] = {  1,  2,  3,  4,  5,  6,  7,      9, 10 };
728103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/*static const int32_t thTestOffs_enRev[] = {  9,      7,  6,      4,  3,      1,  0 };*/
72927f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const int32_t thTestOffs_thRev[] = {  9,      7,  6,  5,  4,  3,  2,  1,  0 };
73027f654740f2a26ad62a5c155af9199af9e69b889claireho
73127f654740f2a26ad62a5c155af9199af9e69b889claireho/* Hebrew line break tailoring, for cldrbug 3028 */
73227f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const UChar heTest[] = { 0x0020, 0x002D, 0x0031, 0x0032, 0x0020,
73327f654740f2a26ad62a5c155af9199af9e69b889claireho                                0x0061, 0x002D, 0x006B, 0x0020,
73427f654740f2a26ad62a5c155af9199af9e69b889claireho                                0x0061, 0x0300, 0x2010, 0x006B, 0x0020,
73527f654740f2a26ad62a5c155af9199af9e69b889claireho                                0x05DE, 0x05D4, 0x002D, 0x0069, 0x0020,
73627f654740f2a26ad62a5c155af9199af9e69b889claireho                                0x05D1, 0x05BC, 0x2010, 0x0047, 0x0020, 0 };
737103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/*in Unicode 6.1 en should behave just like he for this*/
738103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/*static const int32_t heTestOffs_enFwd[] = {  1,  5,  7,  9, 12, 14, 17, 19, 22, 24 };*/
73927f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const int32_t heTestOffs_heFwd[] = {  1,  5,  7,  9, 12, 14,     19,     24 };
740103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/*static const int32_t heTestOffs_enRev[] = { 22, 19, 17, 14, 12,  9,  7,  5,  1,  0 };*/
74127f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const int32_t heTestOffs_heRev[] = {     19,     14, 12,  9,  7,  5,  1,  0 };
74227f654740f2a26ad62a5c155af9199af9e69b889claireho
74327f654740f2a26ad62a5c155af9199af9e69b889claireho/* Finnish line break tailoring, for cldrbug 3029 */
74427f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const UChar fiTest[] = { /* 00 */ 0x0020, 0x002D, 0x0031, 0x0032, 0x0020,
74527f654740f2a26ad62a5c155af9199af9e69b889claireho                                /* 05 */ 0x0061, 0x002D, 0x006B, 0x0020,
74627f654740f2a26ad62a5c155af9199af9e69b889claireho                                /* 09 */ 0x0061, 0x0300, 0x2010, 0x006B, 0x0020,
74727f654740f2a26ad62a5c155af9199af9e69b889claireho                                /* 14 */ 0x0061, 0x0020, 0x002D, 0x006B, 0x0020,
74827f654740f2a26ad62a5c155af9199af9e69b889claireho                                /* 19 */ 0x0061, 0x0300, 0x0020, 0x2010, 0x006B, 0x0020, 0 };
74927f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const int32_t fiTestOffs_enFwd[] =  {  1,  5,  7,  9, 12, 14, 16, 17, 19, 22, 23, 25 };
75027f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const int32_t fiTestOffs_fiFwd[] =  {  1,  5,  7,  9, 12, 14, 16,     19, 22,     25 };
75127f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const int32_t fiTestOffs_enRev[] =  { 23, 22, 19, 17, 16, 14, 12,  9,  7,  5,  1,  0 };
75227f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const int32_t fiTestOffs_fiRev[] =  {     22, 19,     16, 14, 12,  9,  7,  5,  1,  0 };
75327f654740f2a26ad62a5c155af9199af9e69b889claireho
754b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* Khmer dictionary-based work break, for ICU ticket #8329 */
755b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar kmTest[] = { /* 00 */ 0x179F, 0x17BC, 0x1798, 0x1785, 0x17C6, 0x178E, 0x17B6, 0x1799, 0x1796, 0x17C1,
756b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                /* 10 */ 0x179B, 0x1794, 0x1793, 0x17D2, 0x178F, 0x17B7, 0x1785, 0x178A, 0x17BE, 0x1798,
757b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                /* 20 */ 0x17D2, 0x1794, 0x17B8, 0x17A2, 0x1792, 0x17B7, 0x179F, 0x17D2, 0x178B, 0x17B6,
758b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                /* 30 */ 0x1793, 0x17A2, 0x179A, 0x1796, 0x17D2, 0x179A, 0x17C7, 0x1782, 0x17BB, 0x178E,
759b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                /* 40 */ 0x178A, 0x179B, 0x17CB, 0x1796, 0x17D2, 0x179A, 0x17C7, 0x17A2, 0x1784, 0x17D2,
760b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                /* 50 */ 0x1782, 0 };
761b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const int32_t kmTestOffs_kmFwd[] =  {  3, /*8,*/ 11, 17, 23, 31, /*33,*/  40,  43, 51 }; /* TODO: Investigate failure to break at offset 8 */
762b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const int32_t kmTestOffs_kmRev[] =  { 43,  40,   /*33,*/ 31, 23, 17, 11, /*8,*/ 3,  0 };
763b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
76427f654740f2a26ad62a5c155af9199af9e69b889clairehotypedef struct {
76527f654740f2a26ad62a5c155af9199af9e69b889claireho    const char * locale;
76627f654740f2a26ad62a5c155af9199af9e69b889claireho    UBreakIteratorType type;
76727f654740f2a26ad62a5c155af9199af9e69b889claireho    const UChar * test;
76827f654740f2a26ad62a5c155af9199af9e69b889claireho    const int32_t * offsFwd;
76927f654740f2a26ad62a5c155af9199af9e69b889claireho    const int32_t * offsRev;
77027f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t numOffsets;
77127f654740f2a26ad62a5c155af9199af9e69b889claireho} RBBITailoringTest;
77227f654740f2a26ad62a5c155af9199af9e69b889claireho
77327f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const RBBITailoringTest tailoringTests[] = {
774103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    { "en", UBRK_CHARACTER, thTest, thTestOffs_thFwd, thTestOffs_thRev, sizeof(thTestOffs_thFwd)/sizeof(thTestOffs_thFwd[0]) },
77554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    { "en_US_POSIX", UBRK_CHARACTER, thTest, thTestOffs_thFwd, thTestOffs_thRev, sizeof(thTestOffs_thFwd)/sizeof(thTestOffs_thFwd[0]) },
776103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    { "en", UBRK_LINE,      heTest, heTestOffs_heFwd, heTestOffs_heRev, sizeof(heTestOffs_heFwd)/sizeof(heTestOffs_heFwd[0]) },
77727f654740f2a26ad62a5c155af9199af9e69b889claireho    { "he", UBRK_LINE,      heTest, heTestOffs_heFwd, heTestOffs_heRev, sizeof(heTestOffs_heFwd)/sizeof(heTestOffs_heFwd[0]) },
77827f654740f2a26ad62a5c155af9199af9e69b889claireho    { "en", UBRK_LINE,      fiTest, fiTestOffs_enFwd, fiTestOffs_enRev, sizeof(fiTestOffs_enFwd)/sizeof(fiTestOffs_enFwd[0]) },
77927f654740f2a26ad62a5c155af9199af9e69b889claireho    { "fi", UBRK_LINE,      fiTest, fiTestOffs_fiFwd, fiTestOffs_fiRev, sizeof(fiTestOffs_fiFwd)/sizeof(fiTestOffs_fiFwd[0]) },
780b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "km", UBRK_WORD,      kmTest, kmTestOffs_kmFwd, kmTestOffs_kmRev, sizeof(kmTestOffs_kmFwd)/sizeof(kmTestOffs_kmFwd[0]) },
78127f654740f2a26ad62a5c155af9199af9e69b889claireho    { NULL, 0, NULL, NULL, NULL, 0 },
78227f654740f2a26ad62a5c155af9199af9e69b889claireho};
78327f654740f2a26ad62a5c155af9199af9e69b889claireho
78427f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestBreakIteratorTailoring(void) {
78527f654740f2a26ad62a5c155af9199af9e69b889claireho    const RBBITailoringTest * testPtr;
78627f654740f2a26ad62a5c155af9199af9e69b889claireho    for (testPtr = tailoringTests; testPtr->locale != NULL; ++testPtr) {
78727f654740f2a26ad62a5c155af9199af9e69b889claireho        UErrorCode status = U_ZERO_ERROR;
78827f654740f2a26ad62a5c155af9199af9e69b889claireho        UBreakIterator* ubrkiter = ubrk_open(testPtr->type, testPtr->locale, testPtr->test, -1, &status);
78927f654740f2a26ad62a5c155af9199af9e69b889claireho        if ( U_SUCCESS(status) ) {
79027f654740f2a26ad62a5c155af9199af9e69b889claireho            int32_t offset, offsindx;
79127f654740f2a26ad62a5c155af9199af9e69b889claireho            UBool foundError;
79227f654740f2a26ad62a5c155af9199af9e69b889claireho
79327f654740f2a26ad62a5c155af9199af9e69b889claireho            foundError = FALSE;
79427f654740f2a26ad62a5c155af9199af9e69b889claireho            for (offsindx = 0; (offset = ubrk_next(ubrkiter)) != UBRK_DONE; ++offsindx) {
79527f654740f2a26ad62a5c155af9199af9e69b889claireho                if (!foundError && offsindx >= testPtr->numOffsets) {
79627f654740f2a26ad62a5c155af9199af9e69b889claireho                    log_err("FAIL: locale %s, break type %d, ubrk_next expected UBRK_DONE, got %d\n",
79727f654740f2a26ad62a5c155af9199af9e69b889claireho                            testPtr->locale, testPtr->type, offset);
79827f654740f2a26ad62a5c155af9199af9e69b889claireho                    foundError = TRUE;
79927f654740f2a26ad62a5c155af9199af9e69b889claireho                } else if (!foundError && offset != testPtr->offsFwd[offsindx]) {
80027f654740f2a26ad62a5c155af9199af9e69b889claireho                    log_err("FAIL: locale %s, break type %d, ubrk_next expected %d, got %d\n",
80127f654740f2a26ad62a5c155af9199af9e69b889claireho                            testPtr->locale, testPtr->type, testPtr->offsFwd[offsindx], offset);
80227f654740f2a26ad62a5c155af9199af9e69b889claireho                    foundError = TRUE;
80327f654740f2a26ad62a5c155af9199af9e69b889claireho                }
80427f654740f2a26ad62a5c155af9199af9e69b889claireho            }
80527f654740f2a26ad62a5c155af9199af9e69b889claireho            if (!foundError && offsindx < testPtr->numOffsets) {
80627f654740f2a26ad62a5c155af9199af9e69b889claireho                log_err("FAIL: locale %s, break type %d, ubrk_next expected %d, got UBRK_DONE\n",
80727f654740f2a26ad62a5c155af9199af9e69b889claireho                    	testPtr->locale, testPtr->type, testPtr->offsFwd[offsindx]);
80827f654740f2a26ad62a5c155af9199af9e69b889claireho            }
80927f654740f2a26ad62a5c155af9199af9e69b889claireho
81027f654740f2a26ad62a5c155af9199af9e69b889claireho            foundError = FALSE;
81127f654740f2a26ad62a5c155af9199af9e69b889claireho            for (offsindx = 0; (offset = ubrk_previous(ubrkiter)) != UBRK_DONE; ++offsindx) {
81227f654740f2a26ad62a5c155af9199af9e69b889claireho                if (!foundError && offsindx >= testPtr->numOffsets) {
81327f654740f2a26ad62a5c155af9199af9e69b889claireho                    log_err("FAIL: locale %s, break type %d, ubrk_previous expected UBRK_DONE, got %d\n",
81427f654740f2a26ad62a5c155af9199af9e69b889claireho                            testPtr->locale, testPtr->type, offset);
81527f654740f2a26ad62a5c155af9199af9e69b889claireho                    foundError = TRUE;
81627f654740f2a26ad62a5c155af9199af9e69b889claireho                } else if (!foundError && offset != testPtr->offsRev[offsindx]) {
81727f654740f2a26ad62a5c155af9199af9e69b889claireho                    log_err("FAIL: locale %s, break type %d, ubrk_previous expected %d, got %d\n",
81827f654740f2a26ad62a5c155af9199af9e69b889claireho                            testPtr->locale, testPtr->type, testPtr->offsRev[offsindx], offset);
81927f654740f2a26ad62a5c155af9199af9e69b889claireho                    foundError = TRUE;
82027f654740f2a26ad62a5c155af9199af9e69b889claireho                }
82127f654740f2a26ad62a5c155af9199af9e69b889claireho            }
82227f654740f2a26ad62a5c155af9199af9e69b889claireho            if (!foundError && offsindx < testPtr->numOffsets) {
82327f654740f2a26ad62a5c155af9199af9e69b889claireho                log_err("FAIL: locale %s, break type %d, ubrk_previous expected %d, got UBRK_DONE\n",
82427f654740f2a26ad62a5c155af9199af9e69b889claireho                    	testPtr->locale, testPtr->type, testPtr->offsRev[offsindx]);
82527f654740f2a26ad62a5c155af9199af9e69b889claireho            }
82627f654740f2a26ad62a5c155af9199af9e69b889claireho
82727f654740f2a26ad62a5c155af9199af9e69b889claireho            ubrk_close(ubrkiter);
82827f654740f2a26ad62a5c155af9199af9e69b889claireho        } else {
82927f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err_status(status, "FAIL: locale %s, break type %d, ubrk_open status: %s\n", testPtr->locale, testPtr->type, u_errorName(status));
83027f654740f2a26ad62a5c155af9199af9e69b889claireho        }
83127f654740f2a26ad62a5c155af9199af9e69b889claireho    }
83227f654740f2a26ad62a5c155af9199af9e69b889claireho}
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
8344fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes
8354fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughesstatic void TestBreakIteratorRefresh(void) {
8364fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    /*
8374fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes     *  RefreshInput changes out the input of a Break Iterator without
8384fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes     *    changing anything else in the iterator's state.  Used with Java JNI,
8394fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes     *    when Java moves the underlying string storage.   This test
8404fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes     *    runs a ubrk_next() repeatedly, moving the text in the middle of the sequence.
8414fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes     *    The right set of boundaries should still be found.
8424fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes     */
8434fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    UChar testStr[]  = {0x20, 0x41, 0x20, 0x42, 0x20, 0x43, 0x20, 0x44, 0x0};  /* = " A B C D"  */
8444fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    UChar movedStr[] = {0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,  0};
8454fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    UErrorCode status = U_ZERO_ERROR;
8464fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    UBreakIterator *bi;
8474fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    UText ut1 = UTEXT_INITIALIZER;
8484fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    UText ut2 = UTEXT_INITIALIZER;
8494fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes
8504fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    bi = ubrk_open(UBRK_LINE, "en_US", NULL, 0, &status);
8514fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    TEST_ASSERT_SUCCESS(status);
8524fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes
8534fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    utext_openUChars(&ut1, testStr, -1, &status);
8544fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    TEST_ASSERT_SUCCESS(status);
8554fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    ubrk_setUText(bi, &ut1, &status);
8564fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes    TEST_ASSERT_SUCCESS(status);
8574fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes
858103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (U_SUCCESS(status)) {
859103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        /* Line boundaries will occur before each letter in the original string */
860103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TEST_ASSERT(1 == ubrk_next(bi));
861103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TEST_ASSERT(3 == ubrk_next(bi));
862103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
863103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        /* Move the string, kill the original string.  */
864103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        u_strcpy(movedStr, testStr);
865103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        u_memset(testStr, 0x20, u_strlen(testStr));
866103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        utext_openUChars(&ut2, movedStr, -1, &status);
867103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TEST_ASSERT_SUCCESS(status);
868103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        ubrk_refreshUText(bi, &ut2, &status);
869103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TEST_ASSERT_SUCCESS(status);
870103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
871103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        /* Find the following matches, now working in the moved string. */
872103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TEST_ASSERT(5 == ubrk_next(bi));
873103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TEST_ASSERT(7 == ubrk_next(bi));
874103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TEST_ASSERT(8 == ubrk_next(bi));
875103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TEST_ASSERT(UBRK_DONE == ubrk_next(bi));
876103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TEST_ASSERT_SUCCESS(status);
877103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
878103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        utext_close(&ut1);
879103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        utext_close(&ut2);
880103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
881103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    ubrk_close(bi);
8824fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes}
8834fceb0aeb072e9c6879c37fbcdcef2c4286c4719Elliott Hughes
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_BREAK_ITERATION */
885