1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
359d709d503bab6e2b61931737e662dd293b40578ccornelius * Copyright (c) 2004-2013, 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 reapits.c
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*********************************************************************************/
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*C API TEST FOR Regular Expressions */
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   This is an API test for ICU regular expressions in C.  It doesn't test very many cases, and doesn't
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   try to test the full functionality.  It just calls each function and verifies that it
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   works on a basic level.
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   More complete testing of regular expression functionality is done with the C++ tests.
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru**/
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_REGULAR_EXPRESSIONS
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h>
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h>
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uloc.h"
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uregex.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
2950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/utext.h"
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h"
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TEST_ASSERT_SUCCESS(status) {if (U_FAILURE(status)) { \
336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Querulog_data_err("Failure at file %s, line %d, error = %s (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status));}}
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TEST_ASSERT(expr) {if ((expr)==FALSE) { \
366d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Querulog_data_err("Test Failure at file %s, line %d (Are you missing data?)\n", __FILE__, __LINE__);}}
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
38c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/*
39c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *   TEST_SETUP and TEST_TEARDOWN
40c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *         macros to handle the boilerplate around setting up regex test cases.
41c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *         parameteres to setup:
42c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *              pattern:     The regex pattern, a (char *) null terminated C string.
43c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *              testString:  The string data, also a (char *) C string.
44c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *              flags:       Regex flags to set when compiling the pattern
45c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *
46c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *         Put arbitrary test code between SETUP and TEARDOWN.
47c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *         're" is the compiled, ready-to-go  regular expression.
48c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */
49c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define TEST_SETUP(pattern, testString, flags) {  \
50c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UChar   *srcString = NULL;  \
51c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    status = U_ZERO_ERROR; \
52c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    re = uregex_openC(pattern, flags, NULL, &status);  \
53c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    TEST_ASSERT_SUCCESS(status);   \
54c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    srcString = (UChar *)malloc((strlen(testString)+2)*sizeof(UChar)); \
55c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    u_uastrncpy(srcString, testString,  strlen(testString)+1); \
56c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    uregex_setText(re, srcString, -1, &status); \
57c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    TEST_ASSERT_SUCCESS(status);  \
58c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (U_SUCCESS(status)) {
59c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
60c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define TEST_TEARDOWN  \
61c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }  \
62c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    TEST_ASSERT_SUCCESS(status);  \
63c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    uregex_close(re);  \
64c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    free(srcString);   \
65c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
66c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
67c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
6850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/**
6950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * @param expected utf-8 array of bytes to be expected
7050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void test_assert_string(const char *expected, const UChar *actual, UBool nulTerm, const char *file, int line) {
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     char     buf_inside_macro[120];
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     int32_t  len = (int32_t)strlen(expected);
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     UBool    success;
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     if (nulTerm) {
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         u_austrncpy(buf_inside_macro, (actual), len+1);
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         buf_inside_macro[len+2] = 0;
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         success = (strcmp((expected), buf_inside_macro) == 0);
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     } else {
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         u_austrncpy(buf_inside_macro, (actual), len);
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         buf_inside_macro[len+1] = 0;
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         success = (strncmp((expected), buf_inside_macro, len) == 0);
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     }
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     if (success == FALSE) {
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         log_err("Failure at file %s, line %d, expected \"%s\", got \"%s\"\n",
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             file, line, (expected), buf_inside_macro);
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     }
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TEST_ASSERT_STRING(expected, actual, nulTerm) test_assert_string(expected, actual, nulTerm, __FILE__, __LINE__)
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
9383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusstatic UBool equals_utf8_utext(const char *utf8, UText *utext) {
9483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    int32_t u8i = 0;
9583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    UChar32 u8c = 0;
9683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    UChar32 utc = 0;
9783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    UBool   stringsEqual = TRUE;
9883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    utext_setNativeIndex(utext, 0);
9983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    for (;;) {
10083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        U8_NEXT_UNSAFE(utf8, u8i, u8c);
10183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        utc = utext_next32(utext);
10283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        if (u8c == 0 && utc == U_SENTINEL) {
10383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius            break;
10483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        }
10583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        if (u8c != utc || u8c == 0) {
10683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius            stringsEqual = FALSE;
10783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius            break;
10883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        }
10983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    }
11083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    return stringsEqual;
11183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius}
11283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
11383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
11450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void test_assert_utext(const char *expected, UText *actual, const char *file, int line) {
11550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    utext_setNativeIndex(actual, 0);
11683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    if (!equals_utf8_utext(expected, actual)) {
11750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar32 c;
11850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_err("Failure at file %s, line %d, expected \"%s\", got \"", file, line, expected);
11950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        c = utext_next32From(actual, 0);
12050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        while (c != U_SENTINEL) {
12150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (0x20<c && c <0x7e) {
12250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                log_err("%c", c);
12350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            } else {
12450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                log_err("%#x", c);
12550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
12650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            c = UTEXT_NEXT32(actual);
12750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
12850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_err("\"\n");
12950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
13050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
13150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
13283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius/*
13383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius * TEST_ASSERT_UTEXT(const char *expected, const UText *actual)
13483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius *     Note:  Expected is a UTF-8 encoded string, _not_ the system code page.
13583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius */
13650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#define TEST_ASSERT_UTEXT(expected, actual) test_assert_utext(expected, actual, __FILE__, __LINE__)
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
13883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusstatic UBool testUTextEqual(UText *uta, UText *utb) {
13983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    UChar32 ca = 0;
14083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    UChar32 cb = 0;
14183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    utext_setNativeIndex(uta, 0);
14283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    utext_setNativeIndex(utb, 0);
14383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    do {
14483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        ca = utext_next32(uta);
14583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        cb = utext_next32(utb);
14683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        if (ca != cb) {
14783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius            break;
14883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        }
14983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    } while (ca != U_SENTINEL);
15083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    return ca == cb;
15183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius}
15283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
15383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestRegexCAPI(void);
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBug4315(void);
15850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestUTextAPI(void);
1592e615e9896b12236afe0ff2695e8afc2ee73f961clairehostatic void TestRefreshInput(void);
160b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestBug8421(void);
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addURegexTest(TestNode** root);
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addURegexTest(TestNode** root)
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestRegexCAPI, "regex/TestRegexCAPI");
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    addTest(root, &TestBug4315,   "regex/TestBug4315");
16850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestUTextAPI,  "regex/TestUTextAPI");
1692e615e9896b12236afe0ff2695e8afc2ee73f961claireho    addTest(root, &TestRefreshInput, "regex/TestRefreshInput");
170b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    addTest(root, &TestBug8421,   "regex/TestBug8421");
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
173c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/*
174c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * Call back function and context struct used for testing
175c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *    regular expression user callbacks.  This test is mostly the same as
176c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *   the corresponding C++ test in intltest.
177c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */
178c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querutypedef struct callBackContext {
179c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t          maxCalls;
180c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t          numCalls;
181c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t          lastSteps;
182c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} callBackContext;
183c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
184c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic UBool U_EXPORT2 U_CALLCONV
185c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruTestCallbackFn(const void *context, int32_t steps) {
186c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  callBackContext  *info = (callBackContext *)context;
187c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  if (info->lastSteps+1 != steps) {
188c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      log_err("incorrect steps in callback.  Expected %d, got %d\n", info->lastSteps+1, steps);
189c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  }
190c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  info->lastSteps = steps;
191c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  info->numCalls++;
192c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru  return (info->numCalls < info->maxCalls);
193c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
195c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/*
196c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *   Regular Expression C API Tests
197c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestRegexCAPI(void) {
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode           status = U_ZERO_ERROR;
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    URegularExpression  *re;
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar                pat[200];
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar               *minus1;
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    memset(&minus1, -1, sizeof(minus1));
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Mimimalist open/close */
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrncpy(pat, "abc*", sizeof(pat)/2);
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    re = uregex_open(pat, -1, 0, 0, &status);
209c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (U_FAILURE(status)) {
21050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         log_data_err("Failed to open regular expression, %s:%d, error is \"%s\" (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status));
211c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru         return;
212c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uregex_close(re);
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Open with all flag values set */
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    re = uregex_open(pat, -1,
21883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        UREGEX_CASE_INSENSITIVE | UREGEX_COMMENTS | UREGEX_DOTALL | UREGEX_MULTILINE | UREGEX_UWORD | UREGEX_LITERAL,
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0, &status);
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT_SUCCESS(status);
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uregex_close(re);
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Open with an invalid flag */
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    re = uregex_open(pat, -1, 0x40000000, 0, &status);
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(status == U_REGEX_INVALID_FLAG);
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uregex_close(re);
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
22950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* Open with an unimplemented flag */
23050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    status = U_ZERO_ERROR;
23183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    re = uregex_open(pat, -1, UREGEX_CANON_EQ, 0, &status);
23250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    TEST_ASSERT(status == U_REGEX_UNIMPLEMENTED);
23350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    uregex_close(re);
23450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* openC with an invalid parameter */
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    re = uregex_openC(NULL,
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UREGEX_CASE_INSENSITIVE | UREGEX_COMMENTS | UREGEX_DOTALL | UREGEX_MULTILINE | UREGEX_UWORD, 0, &status);
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(status == U_ILLEGAL_ARGUMENT_ERROR && re == NULL);
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* openC with an invalid parameter */
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_USELESS_COLLATOR_ERROR;
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    re = uregex_openC(NULL,
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UREGEX_CASE_INSENSITIVE | UREGEX_COMMENTS | UREGEX_DOTALL | UREGEX_MULTILINE | UREGEX_UWORD, 0, &status);
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(status == U_USELESS_COLLATOR_ERROR && re == NULL);
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* openC   open from a C string */
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UChar   *p;
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t  len;
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        re = uregex_openC("abc*", 0, 0, &status);
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        p = uregex_pattern(re, &len, &status);
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* The TEST_ASSERT_SUCCESS above should change too... */
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_SUCCESS(status)) {
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_uastrncpy(pat, "abc*", sizeof(pat)/2);
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT(u_strcmp(pat, p) == 0);
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT(len==(int32_t)strlen("abc*"));
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*  TODO:  Open with ParseError parameter */
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  clone
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        URegularExpression *clone1;
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        URegularExpression *clone2;
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        URegularExpression *clone3;
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar  testString1[30];
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar  testString2[30];
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool  result;
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        re = uregex_openC("abc*", 0, 0, &status);
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        clone1 = uregex_clone(re, &status);
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(clone1 != NULL);
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        clone2 = uregex_clone(re, &status);
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(clone2 != NULL);
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        clone3 = uregex_clone(clone2, &status);
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(clone3 != NULL);
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(testString1, "abcccd", sizeof(pat)/2);
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(testString2, "xxxabcccd", sizeof(pat)/2);
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(clone1, testString1, -1, &status);
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_lookingAt(clone1, 0, &status);
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result==TRUE);
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(clone2, testString2, -1, &status);
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_lookingAt(clone2, 0, &status);
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result==FALSE);
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_find(clone2, 0, &status);
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result==TRUE);
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(clone1);
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(clone2);
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(clone3);
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  pattern()
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UChar  *resultPat;
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t       resultLen;
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(pat, "hello", sizeof(pat)/2);
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        re = uregex_open(pat, -1, 0, NULL, &status);
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultPat = uregex_pattern(re, &resultLen, &status);
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* The TEST_ASSERT_SUCCESS above should change too... */
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status)) {
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT(resultLen == -1);
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT(u_strcmp(resultPat, pat) == 0);
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        re = uregex_open(pat, 3, 0, NULL, &status);
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultPat = uregex_pattern(re, &resultLen, &status);
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* The TEST_ASSERT_SUCCESS above should change too... */
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status)) {
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT(resultLen == 3);
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT(u_strncmp(resultPat, pat, 3) == 0);
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT(u_strlen(resultPat) == 3);
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  flags()
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t  t;
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        re = uregex_open(pat, -1, 0, NULL, &status);
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        t  = uregex_flags(re, &status);
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(t == 0);
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        re = uregex_open(pat, -1, 0, NULL, &status);
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        t  = uregex_flags(re, &status);
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(t == 0);
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        re = uregex_open(pat, -1, UREGEX_CASE_INSENSITIVE | UREGEX_DOTALL, NULL, &status);
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        t  = uregex_flags(re, &status);
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(t == (UREGEX_CASE_INSENSITIVE | UREGEX_DOTALL));
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  setText() and lookingAt()
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar  text1[50];
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar  text2[50];
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool  result;
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(text1, "abcccd",  sizeof(text1)/2);
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(text2, "abcccxd", sizeof(text2)/2);
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(pat, "abc*d", sizeof(pat)/2);
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        re = uregex_open(pat, -1, 0, NULL, &status);
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Operation before doing a setText should fail... */
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_lookingAt(re, 0, &status);
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT( status== U_REGEX_INVALID_STATE);
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text1, -1, &status);
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_lookingAt(re, 0, &status);
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == TRUE);
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text2, -1, &status);
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_lookingAt(re, 0, &status);
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == FALSE);
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text1, -1, &status);
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_lookingAt(re, 0, &status);
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == TRUE);
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text1, 5, &status);
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_lookingAt(re, 0, &status);
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == FALSE);
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text1, 6, &status);
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_lookingAt(re, 0, &status);
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == TRUE);
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  getText()
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar    text1[50];
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar    text2[50];
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UChar   *result;
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t  textLength;
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(text1, "abcccd",  sizeof(text1)/2);
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(text2, "abcccxd", sizeof(text2)/2);
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(pat, "abc*d", sizeof(pat)/2);
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        re = uregex_open(pat, -1, 0, NULL, &status);
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text1, -1, &status);
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_getText(re, &textLength, &status);
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == text1);
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(textLength == -1);
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text2, 7, &status);
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_getText(re, &textLength, &status);
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == text2);
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(textLength == 7);
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text2, 4, &status);
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_getText(re, &textLength, &status);
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == text2);
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(textLength == 4);
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  matches()
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar   text1[50];
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool   result;
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int     len;
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar   nullString[] = {0,0,0};
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(text1, "abcccde",  sizeof(text1)/2);
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(pat, "abc*d", sizeof(pat)/2);
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        re = uregex_open(pat, -1, 0, NULL, &status);
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text1, -1, &status);
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_matches(re, 0, &status);
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == FALSE);
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text1, 6, &status);
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_matches(re, 0, &status);
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == TRUE);
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text1, 6, &status);
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_matches(re, 1, &status);
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == FALSE);
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        re = uregex_openC(".?", 0, NULL, &status);
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text1, -1, &status);
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        len = u_strlen(text1);
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_matches(re, len, &status);
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == TRUE);
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, nullString, -1, &status);
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_matches(re, 0, &status);
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == TRUE);
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  lookingAt()    Used in setText test.
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  find(), findNext, start, end, reset
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar    text1[50];
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool    result;
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(text1, "012rx5rx890rxrx...",  sizeof(text1)/2);
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        re = uregex_openC("rx", 0, NULL, &status);
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text1, -1, &status);
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_find(re, 0, &status);
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == TRUE);
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(uregex_start(re, 0, &status) == 3);
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(uregex_end(re, 0, &status) == 5);
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_find(re, 9, &status);
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == TRUE);
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(uregex_start(re, 0, &status) == 11);
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(uregex_end(re, 0, &status) == 13);
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_find(re, 14, &status);
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == FALSE);
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_reset(re, 0, &status);
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_findNext(re, &status);
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == TRUE);
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(uregex_start(re, 0, &status) == 3);
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(uregex_end(re, 0, &status) == 5);
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_findNext(re, &status);
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == TRUE);
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(uregex_start(re, 0, &status) == 6);
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(uregex_end(re, 0, &status) == 8);
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_reset(re, 12, &status);
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_findNext(re, &status);
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == TRUE);
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(uregex_start(re, 0, &status) == 13);
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(uregex_end(re, 0, &status) == 15);
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_findNext(re, &status);
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == FALSE);
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  groupCount
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t result;
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        re = uregex_openC("abc", 0, NULL, &status);
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_groupCount(re, &status);
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == 0);
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        re = uregex_openC("abc(def)(ghi(j))", 0, NULL, &status);
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_groupCount(re, &status);
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result == 3);
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  group()
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar    text1[80];
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar    buf[80];
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool    result;
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t  resultSz;
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(text1, "noise abc interior def, and this is off the end",  sizeof(text1)/2);
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        re = uregex_openC("abc(.*?)def", 0, NULL, &status);
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text1, -1, &status);
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = uregex_find(re, 0, &status);
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(result==TRUE);
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*  Capture Group 0, the full match.  Should succeed.  */
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultSz = uregex_group(re, 0, buf, sizeof(buf)/2, &status);
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_STRING("abc interior def", buf, TRUE);
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(resultSz == (int32_t)strlen("abc interior def"));
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*  Capture group #1.  Should succeed. */
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultSz = uregex_group(re, 1, buf, sizeof(buf)/2, &status);
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_STRING(" interior ", buf, TRUE);
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(resultSz == (int32_t)strlen(" interior "));
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*  Capture group out of range.  Error. */
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_group(re, 2, buf, sizeof(buf)/2, &status);
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(status == U_INDEX_OUTOFBOUNDS_ERROR);
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* NULL buffer, pure pre-flight */
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultSz = uregex_group(re, 0, NULL, 0, &status);
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(resultSz == (int32_t)strlen("abc interior def"));
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Too small buffer, truncated string */
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memset(buf, -1, sizeof(buf));
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultSz = uregex_group(re, 0, buf, 5, &status);
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_STRING("abc i", buf, FALSE);
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(buf[5] == (UChar)0xffff);
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(resultSz == (int32_t)strlen("abc interior def"));
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Output string just fits buffer, no NUL term. */
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultSz = uregex_group(re, 0, buf, (int32_t)strlen("abc interior def"), &status);
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING);
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_STRING("abc interior def", buf, FALSE);
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(resultSz == (int32_t)strlen("abc interior def"));
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(buf[strlen("abc interior def")] == (UChar)0xffff);
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
680c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
681c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    /*
682c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     *  Regions
683c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     */
684c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
685c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
686c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        /* SetRegion(), getRegion() do something  */
687c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_SETUP(".*", "0123456789ABCDEF", 0)
688c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UChar resultString[40];
689c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_regionStart(re, &status) == 0);
690c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_regionEnd(re, &status) == 16);
691c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        uregex_setRegion(re, 3, 6, &status);
692c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_regionStart(re, &status) == 3);
693c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_regionEnd(re, &status) == 6);
694c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_findNext(re, &status));
695c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_group(re, 0, resultString, sizeof(resultString)/2, &status) == 3)
696c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT_STRING("345", resultString, TRUE);
697c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_TEARDOWN;
698c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
699c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        /* find(start=-1) uses regions   */
700c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_SETUP(".*", "0123456789ABCDEF", 0);
701c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        uregex_setRegion(re, 4, 6, &status);
702c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_find(re, -1, &status) == TRUE);
703c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_start(re, 0, &status) == 4);
704c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_end(re, 0, &status) == 6);
705c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_TEARDOWN;
706c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
707c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        /* find (start >=0) does not use regions   */
708c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_SETUP(".*", "0123456789ABCDEF", 0);
709c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        uregex_setRegion(re, 4, 6, &status);
710c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_find(re, 0, &status) == TRUE);
711c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_start(re, 0, &status) == 0);
712c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_end(re, 0, &status) == 16);
713c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_TEARDOWN;
714c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
715c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        /* findNext() obeys regions    */
716c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_SETUP(".", "0123456789ABCDEF", 0);
717c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        uregex_setRegion(re, 4, 6, &status);
718c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_findNext(re,&status) == TRUE);
719c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_start(re, 0, &status) == 4);
720c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_findNext(re, &status) == TRUE);
721c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_start(re, 0, &status) == 5);
722c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_findNext(re, &status) == FALSE);
723c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_TEARDOWN;
724c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
725c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        /* matches(start=-1) uses regions                                           */
726c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        /*    Also, verify that non-greedy *? succeeds in finding the full match.   */
727c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_SETUP(".*?", "0123456789ABCDEF", 0);
728c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        uregex_setRegion(re, 4, 6, &status);
729c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_matches(re, -1, &status) == TRUE);
730c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_start(re, 0, &status) == 4);
731c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_end(re, 0, &status) == 6);
732c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_TEARDOWN;
733c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
734c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        /* matches (start >=0) does not use regions       */
735c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_SETUP(".*?", "0123456789ABCDEF", 0);
736c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        uregex_setRegion(re, 4, 6, &status);
737c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_matches(re, 0, &status) == TRUE);
738c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_start(re, 0, &status) == 0);
739c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_end(re, 0, &status) == 16);
740c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_TEARDOWN;
741c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
742c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        /* lookingAt(start=-1) uses regions                                         */
743c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        /*    Also, verify that non-greedy *? finds the first (shortest) match.     */
744c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_SETUP(".*?", "0123456789ABCDEF", 0);
745c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        uregex_setRegion(re, 4, 6, &status);
746c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_lookingAt(re, -1, &status) == TRUE);
747c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_start(re, 0, &status) == 4);
748c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_end(re, 0, &status) == 4);
749c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_TEARDOWN;
750c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
751c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        /* lookingAt (start >=0) does not use regions  */
752c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_SETUP(".*?", "0123456789ABCDEF", 0);
753c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        uregex_setRegion(re, 4, 6, &status);
754c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_lookingAt(re, 0, &status) == TRUE);
755c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_start(re, 0, &status) == 0);
756c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_end(re, 0, &status) == 0);
757c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_TEARDOWN;
758c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
759c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        /* hitEnd()       */
760c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_SETUP("[a-f]*", "abcdefghij", 0);
761c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_find(re, 0, &status) == TRUE);
762c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_hitEnd(re, &status) == FALSE);
763c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_TEARDOWN;
764c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
765c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_SETUP("[a-f]*", "abcdef", 0);
766c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_find(re, 0, &status) == TRUE);
767c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_hitEnd(re, &status) == TRUE);
768c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_TEARDOWN;
769c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
770c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        /* requireEnd   */
771c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_SETUP("abcd", "abcd", 0);
772c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_find(re, 0, &status) == TRUE);
773c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_requireEnd(re, &status) == FALSE);
774c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_TEARDOWN;
775c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
776c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_SETUP("abcd$", "abcd", 0);
777c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_find(re, 0, &status) == TRUE);
778c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_requireEnd(re, &status) == TRUE);
779c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_TEARDOWN;
780c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
781c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        /* anchoringBounds        */
782c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_SETUP("abc$", "abcdef", 0);
783c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_hasAnchoringBounds(re, &status) == TRUE);
784c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        uregex_useAnchoringBounds(re, FALSE, &status);
785c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_hasAnchoringBounds(re, &status) == FALSE);
786c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
787c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_find(re, -1, &status) == FALSE);
788c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        uregex_useAnchoringBounds(re, TRUE, &status);
789c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        uregex_setRegion(re, 0, 3, &status);
790c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_find(re, -1, &status) == TRUE);
791c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_end(re, 0, &status) == 3);
792c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_TEARDOWN;
793c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
794c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        /* Transparent Bounds      */
795c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_SETUP("abc(?=def)", "abcdef", 0);
796c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_hasTransparentBounds(re, &status) == FALSE);
797c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        uregex_useTransparentBounds(re, TRUE, &status);
798c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_hasTransparentBounds(re, &status) == TRUE);
799c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
800c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        uregex_useTransparentBounds(re, FALSE, &status);
801c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_find(re, -1, &status) == TRUE);    /* No Region */
802c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        uregex_setRegion(re, 0, 3, &status);
803c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_find(re, -1, &status) == FALSE);   /* with region, opaque bounds */
804c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        uregex_useTransparentBounds(re, TRUE, &status);
805c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_find(re, -1, &status) == TRUE);    /* with region, transparent bounds */
806c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_ASSERT(uregex_end(re, 0, &status) == 3);
807c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TEST_TEARDOWN;
808c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  replaceFirst()
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar    text1[80];
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar    text2[80];
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar    replText[80];
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar    buf[80];
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t  resultSz;
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(text1, "Replace xaax x1x x...x.",  sizeof(text1)/2);
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(text2, "No match here.",  sizeof(text2)/2);
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(replText, "<$1>", sizeof(replText)/2);
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        re = uregex_openC("x(.*?)x", 0, NULL, &status);
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*  Normal case, with match */
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text1, -1, &status);
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultSz = uregex_replaceFirst(re, replText, -1, buf, sizeof(buf)/2, &status);
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_STRING("Replace <aa> x1x x...x.", buf, TRUE);
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x."));
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* No match.  Text should copy to output with no changes.  */
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text2, -1, &status);
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultSz = uregex_replaceFirst(re, replText, -1, buf, sizeof(buf)/2, &status);
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_STRING("No match here.", buf, TRUE);
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(resultSz == (int32_t)strlen("No match here."));
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*  Match, output just fills buffer, no termination warning. */
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text1, -1, &status);
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memset(buf, -1, sizeof(buf));
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultSz = uregex_replaceFirst(re, replText, -1, buf, strlen("Replace <aa> x1x x...x."), &status);
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING);
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_STRING("Replace <aa> x1x x...x.", buf, FALSE);
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x."));
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(buf[resultSz] == (UChar)0xffff);
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Do the replaceFirst again, without first resetting anything.
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *  Should give the same results.
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memset(buf, -1, sizeof(buf));
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultSz = uregex_replaceFirst(re, replText, -1, buf, strlen("Replace <aa> x1x x...x."), &status);
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING);
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_STRING("Replace <aa> x1x x...x.", buf, FALSE);
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x."));
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(buf[resultSz] == (UChar)0xffff);
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* NULL buffer, zero buffer length */
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultSz = uregex_replaceFirst(re, replText, -1, NULL, 0, &status);
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x."));
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Buffer too small by one */
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memset(buf, -1, sizeof(buf));
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultSz = uregex_replaceFirst(re, replText, -1, buf, strlen("Replace <aa> x1x x...x.")-1, &status);
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_STRING("Replace <aa> x1x x...x", buf, FALSE);
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x."));
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(buf[resultSz] == (UChar)0xffff);
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  replaceAll()
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
886b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UChar    text1[80];          /*  "Replace xaax x1x x...x." */
887b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UChar    text2[80];          /*  "No match Here"           */
888b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UChar    replText[80];       /*  "<$1>"                    */
889b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UChar    replText2[80];      /*  "<<$1>>"                  */
890b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        const char * pattern = "x(.*?)x";
891b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        const char * expectedResult = "Replace <aa> <1> <...>.";
892b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        const char * expectedResult2 = "Replace <<aa>> <<1>> <<...>>.";
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar    buf[80];
894b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t  resultSize;
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t  expectedResultSize;
896b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t  expectedResultSize2;
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t  i;
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(text1, "Replace xaax x1x x...x.",  sizeof(text1)/2);
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(text2, "No match here.",  sizeof(text2)/2);
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(replText, "<$1>", sizeof(replText)/2);
902b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        u_uastrncpy(replText2, "<<$1>>", sizeof(replText2)/2);
903b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        expectedResultSize = strlen(expectedResult);
904b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        expectedResultSize2 = strlen(expectedResult2);
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
907b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        re = uregex_openC(pattern, 0, NULL, &status);
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*  Normal case, with match */
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text1, -1, &status);
912b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        resultSize = uregex_replaceAll(re, replText, -1, buf, sizeof(buf)/2, &status);
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
914b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        TEST_ASSERT_STRING(expectedResult, buf, TRUE);
915b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        TEST_ASSERT(resultSize == expectedResultSize);
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* No match.  Text should copy to output with no changes.  */
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text2, -1, &status);
920b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        resultSize = uregex_replaceAll(re, replText, -1, buf, sizeof(buf)/2, &status);
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_STRING("No match here.", buf, TRUE);
923b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        TEST_ASSERT(resultSize == u_strlen(text2));
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*  Match, output just fills buffer, no termination warning. */
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text1, -1, &status);
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memset(buf, -1, sizeof(buf));
929b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        resultSize = uregex_replaceAll(re, replText, -1, buf, expectedResultSize, &status);
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING);
931b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        TEST_ASSERT_STRING(expectedResult, buf, FALSE);
932b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        TEST_ASSERT(resultSize == expectedResultSize);
933b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        TEST_ASSERT(buf[resultSize] == (UChar)0xffff);
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Do the replaceFirst again, without first resetting anything.
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *  Should give the same results.
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memset(buf, -1, sizeof(buf));
940b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        resultSize = uregex_replaceAll(re, replText, -1, buf, strlen("Replace xaax x1x x...x."), &status);
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING);
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_STRING("Replace <aa> <1> <...>.", buf, FALSE);
943b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        TEST_ASSERT(resultSize == (int32_t)strlen("Replace <aa> <1> <...>."));
944b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        TEST_ASSERT(buf[resultSize] == (UChar)0xffff);
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* NULL buffer, zero buffer length */
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
948b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        resultSize = uregex_replaceAll(re, replText, -1, NULL, 0, &status);
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
950b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        TEST_ASSERT(resultSize == (int32_t)strlen("Replace <aa> <1> <...>."));
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Buffer too small.  Try every size, which will tickle edge cases
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * in uregex_appendReplacement (used by replaceAll)   */
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i=0; i<expectedResultSize; i++) {
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char  expected[80];
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            memset(buf, -1, sizeof(buf));
958b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            resultSize = uregex_replaceAll(re, replText, -1, buf, i, &status);
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
960b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            strcpy(expected, expectedResult);
961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expected[i] = 0;
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT_STRING(expected, buf, FALSE);
963b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            TEST_ASSERT(resultSize == expectedResultSize);
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT(buf[i] == (UChar)0xffff);
965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
967b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        /* Buffer too small.  Same as previous test, except this time the replacement
968b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru         * text is longer than the match capture group, making the length of the complete
969b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru         * replacement longer than the original string.
970b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru         */
971b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        for (i=0; i<expectedResultSize2; i++) {
972b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            char  expected[80];
973b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            status = U_ZERO_ERROR;
974b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            memset(buf, -1, sizeof(buf));
975b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            resultSize = uregex_replaceAll(re, replText2, -1, buf, i, &status);
976b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
977b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            strcpy(expected, expectedResult2);
978b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            expected[i] = 0;
979b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            TEST_ASSERT_STRING(expected, buf, FALSE);
980b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            TEST_ASSERT(resultSize == expectedResultSize2);
981b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            TEST_ASSERT(buf[i] == (UChar)0xffff);
982b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
983b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
984b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  appendReplacement()
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar    text[100];
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar    repl[100];
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar    buf[100];
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar   *bufPtr;
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t  bufCap;
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        re = uregex_openC(".*", 0, 0, &status);
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(text, "whatever",  sizeof(text)/2);
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(repl, "some other", sizeof(repl)/2);
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, text, -1, &status);
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* match covers whole target string */
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_find(re, 0, &status);
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        bufPtr = buf;
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        bufCap = sizeof(buf) / 2;
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_appendReplacement(re, repl, -1, &bufPtr, &bufCap, &status);
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_STRING("some other", buf, TRUE);
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Match has \u \U escapes */
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_find(re, 0, &status);
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        bufPtr = buf;
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        bufCap = sizeof(buf) / 2;
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(repl, "abc\\u0041\\U00000042 \\\\ $ \\abc", sizeof(repl)/2);
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_appendReplacement(re, repl, -1, &bufPtr, &bufCap, &status);
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_STRING("abcAB \\ $ abc", buf, TRUE);
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1027b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        /* Bug 6813, parameter check of NULL destCapacity; crashed before fix. */
1028b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        status = U_ZERO_ERROR;
1029b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        uregex_find(re, 0, &status);
1030b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
1031b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        bufPtr = buf;
1032b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        status = U_BUFFER_OVERFLOW_ERROR;
1033b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        uregex_appendReplacement(re, repl, -1, &bufPtr, NULL, &status);
1034b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
1035b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  appendTail().   Checked in ReplaceFirst(), replaceAll().
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  split()
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar    textToSplit[80];
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar    text2[80];
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar    buf[200];
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar    *fields[10];
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t  numFields;
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t  requiredCapacity;
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t  spaceNeeded;
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t  sz;
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(textToSplit, "first : second:  third",  sizeof(textToSplit)/2);
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(text2, "No match here.",  sizeof(text2)/2);
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        re = uregex_openC(":", 0, NULL, &status);
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*  Simple split */
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, textToSplit, -1, &status);
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* The TEST_ASSERT_SUCCESS call above should change too... */
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status)) {
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            memset(fields, -1, sizeof(fields));
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            numFields =
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 10, &status);
1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT_SUCCESS(status);
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* The TEST_ASSERT_SUCCESS call above should change too... */
1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_SUCCESS(status)) {
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT(numFields == 3);
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT_STRING("first ",  fields[0], TRUE);
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT_STRING(" second", fields[1], TRUE);
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT_STRING("  third", fields[2], TRUE);
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT(fields[3] == NULL);
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                spaceNeeded = u_strlen(textToSplit) -
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            (numFields - 1)  +  /* Field delimiters do not appear in output */
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            numFields;          /* Each field gets a NUL terminator */
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT(spaceNeeded == requiredCapacity);
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*  Split with too few output strings available */
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        re = uregex_openC(":", 0, NULL, &status);
1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, textToSplit, -1, &status);
1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* The TEST_ASSERT_SUCCESS call above should change too... */
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_SUCCESS(status)) {
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            memset(fields, -1, sizeof(fields));
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            numFields =
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 2, &status);
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT_SUCCESS(status);
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* The TEST_ASSERT_SUCCESS call above should change too... */
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_SUCCESS(status)) {
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT(numFields == 2);
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT_STRING("first ",  fields[0], TRUE);
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT_STRING(" second:  third", fields[1], TRUE);
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT(!memcmp(&fields[2],&minus1,sizeof(UChar*)));
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                spaceNeeded = u_strlen(textToSplit) -
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            (numFields - 1)  +  /* Field delimiters do not appear in output */
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            numFields;          /* Each field gets a NUL terminator */
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT(spaceNeeded == requiredCapacity);
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                /* Split with a range of output buffer sizes.  */
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                spaceNeeded = u_strlen(textToSplit) -
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    (numFields - 1)  +  /* Field delimiters do not appear in output */
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    numFields;          /* Each field gets a NUL terminator */
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                for (sz=0; sz < spaceNeeded+1; sz++) {
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    memset(fields, -1, sizeof(fields));
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    status = U_ZERO_ERROR;
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    numFields =
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        uregex_split(re, buf, sz, &requiredCapacity, fields, 10, &status);
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (sz >= spaceNeeded) {
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        TEST_ASSERT_SUCCESS(status);
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        TEST_ASSERT_STRING("first ",  fields[0], TRUE);
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        TEST_ASSERT_STRING(" second", fields[1], TRUE);
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        TEST_ASSERT_STRING("  third", fields[2], TRUE);
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    } else {
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    TEST_ASSERT(numFields == 3);
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    TEST_ASSERT(fields[3] == NULL);
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    TEST_ASSERT(spaceNeeded == requiredCapacity);
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Split(), part 2.  Patterns with capture groups.  The capture group text
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *                   comes out as additional fields.  */
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar    textToSplit[80];
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar    buf[200];
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar    *fields[10];
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t  numFields;
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t  requiredCapacity;
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t  spaceNeeded;
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t  sz;
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrncpy(textToSplit, "first <tag-a> second<tag-b>  third",  sizeof(textToSplit)/2);
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        re = uregex_openC("<(.*?)>", 0, NULL, &status);
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, textToSplit, -1, &status);
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* The TEST_ASSERT_SUCCESS call above should change too... */
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_SUCCESS(status)) {
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            memset(fields, -1, sizeof(fields));
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            numFields =
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 10, &status);
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT_SUCCESS(status);
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* The TEST_ASSERT_SUCCESS call above should change too... */
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_SUCCESS(status)) {
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT(numFields == 5);
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT_STRING("first ",  fields[0], TRUE);
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT_STRING("tag-a",   fields[1], TRUE);
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT_STRING(" second", fields[2], TRUE);
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT_STRING("tag-b",   fields[3], TRUE);
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT_STRING("  third", fields[4], TRUE);
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT(fields[5] == NULL);
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                spaceNeeded = strlen("first .tag-a. second.tag-b.  third.");  /* "." at NUL positions */
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT(spaceNeeded == requiredCapacity);
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*  Split with too few output strings available (2) */
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memset(fields, -1, sizeof(fields));
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        numFields =
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 2, &status);
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* The TEST_ASSERT_SUCCESS call above should change too... */
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_SUCCESS(status)) {
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT(numFields == 2);
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT_STRING("first ",  fields[0], TRUE);
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT_STRING(" second<tag-b>  third", fields[1], TRUE);
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT(!memcmp(&fields[2],&minus1,sizeof(UChar*)));
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            spaceNeeded = strlen("first . second<tag-b>  third.");  /* "." at NUL positions */
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT(spaceNeeded == requiredCapacity);
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*  Split with too few output strings available (3) */
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memset(fields, -1, sizeof(fields));
1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        numFields =
1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 3, &status);
1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* The TEST_ASSERT_SUCCESS call above should change too... */
1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_SUCCESS(status)) {
1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT(numFields == 3);
1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT_STRING("first ",  fields[0], TRUE);
1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT_STRING("tag-a",   fields[1], TRUE);
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT_STRING(" second<tag-b>  third", fields[2], TRUE);
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT(!memcmp(&fields[3],&minus1,sizeof(UChar*)));
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            spaceNeeded = strlen("first .tag-a. second<tag-b>  third.");  /* "." at NUL positions */
1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT(spaceNeeded == requiredCapacity);
1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*  Split with just enough output strings available (5) */
1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        memset(fields, -1, sizeof(fields));
1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        numFields =
1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 5, &status);
1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* The TEST_ASSERT_SUCCESS call above should change too... */
1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_SUCCESS(status)) {
1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT(numFields == 5);
1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT_STRING("first ",  fields[0], TRUE);
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT_STRING("tag-a",   fields[1], TRUE);
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT_STRING(" second", fields[2], TRUE);
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT_STRING("tag-b",   fields[3], TRUE);
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT_STRING("  third", fields[4], TRUE);
1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT(!memcmp(&fields[5],&minus1,sizeof(UChar*)));
1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            spaceNeeded = strlen("first .tag-a. second.tag-b.  third.");  /* "." at NUL positions */
1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT(spaceNeeded == requiredCapacity);
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Split, end of text is a field delimiter.   */
1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        sz = strlen("first <tag-a> second<tag-b>");
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_setText(re, textToSplit, sz, &status);
1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(status);
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* The TEST_ASSERT_SUCCESS call above should change too... */
1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_SUCCESS(status)) {
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            memset(fields, -1, sizeof(fields));
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            numFields =
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 9, &status);
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TEST_ASSERT_SUCCESS(status);
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* The TEST_ASSERT_SUCCESS call above should change too... */
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_SUCCESS(status)) {
1265b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                TEST_ASSERT(numFields == 5);
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT_STRING("first ",  fields[0], TRUE);
1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT_STRING("tag-a",   fields[1], TRUE);
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT_STRING(" second", fields[2], TRUE);
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT_STRING("tag-b",   fields[3], TRUE);
1270b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                TEST_ASSERT_STRING("",        fields[4], TRUE);
1271b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                TEST_ASSERT(fields[5] == NULL);
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT(fields[8] == NULL);
1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT(!memcmp(&fields[9],&minus1,sizeof(UChar*)));
1274b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                spaceNeeded = strlen("first .tag-a. second.tag-b..");  /* "." at NUL positions */
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TEST_ASSERT(spaceNeeded == requiredCapacity);
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uregex_close(re);
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1282c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    /*
1283c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     * set/getTimeLimit
1284c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     */
1285c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_SETUP("abc$", "abcdef", 0);
1286c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_ASSERT(uregex_getTimeLimit(re, &status) == 0);
1287c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     uregex_setTimeLimit(re, 1000, &status);
1288c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_ASSERT(uregex_getTimeLimit(re, &status) == 1000);
1289c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_ASSERT_SUCCESS(status);
1290c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     uregex_setTimeLimit(re, -1, &status);
1291c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_ASSERT(status == U_ILLEGAL_ARGUMENT_ERROR);
1292c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     status = U_ZERO_ERROR;
1293c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_ASSERT(uregex_getTimeLimit(re, &status) == 1000);
1294c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_TEARDOWN;
1295c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1296c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     /*
1297c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      * set/get Stack Limit
1298c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      */
1299c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_SETUP("abc$", "abcdef", 0);
1300c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_ASSERT(uregex_getStackLimit(re, &status) == 8000000);
1301c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     uregex_setStackLimit(re, 40000, &status);
1302c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_ASSERT(uregex_getStackLimit(re, &status) == 40000);
1303c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_ASSERT_SUCCESS(status);
1304c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     uregex_setStackLimit(re, -1, &status);
1305c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_ASSERT(status == U_ILLEGAL_ARGUMENT_ERROR);
1306c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     status = U_ZERO_ERROR;
1307c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_ASSERT(uregex_getStackLimit(re, &status) == 40000);
1308c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_TEARDOWN;
1309c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1310c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1311c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     /*
1312c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      * Get/Set callback functions
1313c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      *     This test is copied from intltest regex/Callbacks
1314c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      *     The pattern and test data will run long enough to cause the callback
1315c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      *       to be invoked.  The nested '+' operators give exponential time
1316c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      *       behavior with increasing string length.
1317c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      */
1318c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_SETUP("((.)+\\2)+x", "aaaaaaaaaaaaaaaaaaab", 0)
1319c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     callBackContext cbInfo = {4, 0, 0};
1320c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     const void     *pContext   = &cbInfo;
1321c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     URegexMatchCallback    *returnedFn = &TestCallbackFn;
1322c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1323c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     /*  Getting the callback fn when it hasn't been set must return NULL  */
1324c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     uregex_getMatchCallback(re, &returnedFn, &pContext, &status);
1325c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_ASSERT_SUCCESS(status);
1326c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_ASSERT(returnedFn == NULL);
1327c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_ASSERT(pContext == NULL);
1328c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1329c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     /* Set thecallback and do a match.                                   */
1330c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     /* The callback function should record that it has been called.      */
1331c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     uregex_setMatchCallback(re, &TestCallbackFn, &cbInfo, &status);
1332c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_ASSERT_SUCCESS(status);
1333c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_ASSERT(cbInfo.numCalls == 0);
1334c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_ASSERT(uregex_matches(re, -1, &status) == FALSE);
1335c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_ASSERT_SUCCESS(status);
1336c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_ASSERT(cbInfo.numCalls > 0);
1337c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1338c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     /* Getting the callback should return the values that were set above.  */
1339c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     uregex_getMatchCallback(re, &returnedFn, &pContext, &status);
1340c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_ASSERT(returnedFn == &TestCallbackFn);
1341c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_ASSERT(pContext == &cbInfo);
1342c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1343c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     TEST_TEARDOWN;
1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1346c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1347c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBug4315(void) {
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode      theICUError = U_ZERO_ERROR;
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    URegularExpression *theRegEx;
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           *textBuff;
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char      *thePattern;
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar            theString[100];
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar           *destFields[24];
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t         neededLength1;
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t         neededLength2;
1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t         wordCount = 0;
1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t         destFieldsSize = 24;
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    thePattern  = "ck ";
1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(theString, "The quick brown fox jumped over the slow black turtle.");
1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* open a regex */
1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    theRegEx = uregex_openC(thePattern, 0, NULL, &theICUError);
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT_SUCCESS(theICUError);
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* set the input string */
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uregex_setText(theRegEx, theString, u_strlen(theString), &theICUError);
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT_SUCCESS(theICUError);
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* split */
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*explicitly pass NULL and 0 to force the overflow error -> this is where the
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  error occurs! */
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    wordCount = uregex_split(theRegEx, NULL, 0, &neededLength1, destFields,
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        destFieldsSize, &theICUError);
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(theICUError == U_BUFFER_OVERFLOW_ERROR);
1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TEST_ASSERT(wordCount==3);
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(theICUError == U_BUFFER_OVERFLOW_ERROR)
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        theICUError = U_ZERO_ERROR;
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        textBuff = (UChar *) malloc(sizeof(UChar) * (neededLength1 + 1));
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        wordCount = uregex_split(theRegEx, textBuff, neededLength1+1, &neededLength2,
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            destFields, destFieldsSize, &theICUError);
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(wordCount==3);
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_SUCCESS(theICUError);
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(neededLength1 == neededLength2);
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_STRING("The qui", destFields[0], TRUE);
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_STRING("brown fox jumped over the slow bla", destFields[1], TRUE);
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT_STRING("turtle.", destFields[2], TRUE);
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TEST_ASSERT(destFields[3] == NULL);
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(textBuff);
1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uregex_close(theRegEx);
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
139950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* Based on TestRegexCAPI() */
140050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestUTextAPI(void) {
140150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UErrorCode           status = U_ZERO_ERROR;
140250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    URegularExpression  *re;
140350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UText                patternText = UTEXT_INITIALIZER;
140450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UChar                pat[200];
140550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    const char           patternTextUTF8[5] = { 0x61, 0x62, 0x63, 0x2a, 0x00 };
140650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
140750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* Mimimalist open/close */
140850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    utext_openUTF8(&patternText, patternTextUTF8, -1, &status);
140950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    re = uregex_openUText(&patternText, 0, 0, &status);
141050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (U_FAILURE(status)) {
141150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         log_data_err("Failed to open regular expression, %s:%d, error is \"%s\" (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status));
141250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         utext_close(&patternText);
141350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         return;
141450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
141550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    uregex_close(re);
141650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
141750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* Open with all flag values set */
141850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    status = U_ZERO_ERROR;
141950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    re = uregex_openUText(&patternText,
142050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UREGEX_CASE_INSENSITIVE | UREGEX_COMMENTS | UREGEX_DOTALL | UREGEX_MULTILINE | UREGEX_UWORD,
142150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        0, &status);
142250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    TEST_ASSERT_SUCCESS(status);
142350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    uregex_close(re);
142450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
142550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* Open with an invalid flag */
142650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    status = U_ZERO_ERROR;
142750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    re = uregex_openUText(&patternText, 0x40000000, 0, &status);
142850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    TEST_ASSERT(status == U_REGEX_INVALID_FLAG);
142950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    uregex_close(re);
143050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
143150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* open with an invalid parameter */
143250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    status = U_ZERO_ERROR;
143350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    re = uregex_openUText(NULL,
143450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UREGEX_CASE_INSENSITIVE | UREGEX_COMMENTS | UREGEX_DOTALL | UREGEX_MULTILINE | UREGEX_UWORD, 0, &status);
143550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    TEST_ASSERT(status == U_ILLEGAL_ARGUMENT_ERROR && re == NULL);
143650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
143750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /*
143850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *  clone
143950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
144050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
144150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        URegularExpression *clone1;
144250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        URegularExpression *clone2;
144350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        URegularExpression *clone3;
144450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar  testString1[30];
144550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar  testString2[30];
144650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UBool  result;
144750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
144850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
144950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
145050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        re = uregex_openUText(&patternText, 0, 0, &status);
145150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
145250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        clone1 = uregex_clone(re, &status);
145350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
145450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(clone1 != NULL);
145550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
145650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
145750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        clone2 = uregex_clone(re, &status);
145850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
145950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(clone2 != NULL);
146050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_close(re);
146150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
146250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
146350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        clone3 = uregex_clone(clone2, &status);
146450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
146550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(clone3 != NULL);
146650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
146750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        u_uastrncpy(testString1, "abcccd", sizeof(pat)/2);
146850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        u_uastrncpy(testString2, "xxxabcccd", sizeof(pat)/2);
146950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
147050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
147150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setText(clone1, testString1, -1, &status);
147250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
147350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_lookingAt(clone1, 0, &status);
147450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
147550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(result==TRUE);
147650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
147750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
147850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setText(clone2, testString2, -1, &status);
147950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
148050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_lookingAt(clone2, 0, &status);
148150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
148250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(result==FALSE);
148350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_find(clone2, 0, &status);
148450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
148550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(result==TRUE);
148650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
148750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_close(clone1);
148850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_close(clone2);
148950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_close(clone3);
149050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
149150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
149250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
149350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /*
149450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *  pattern() and patternText()
149550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
149650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
149750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const UChar  *resultPat;
149850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        int32_t       resultLen;
149950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UText        *resultText;
150050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char str_hello[] = { 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00 }; /* hello */
150150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char str_hel[] = { 0x68, 0x65, 0x6c, 0x00 }; /* hel */
150250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        u_uastrncpy(pat, "hello", sizeof(pat)/2); /* for comparison */
150350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
150450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
150550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_openUTF8(&patternText, str_hello, -1, &status);
150650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        re = uregex_open(pat, -1, 0, NULL, &status);
150750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        resultPat = uregex_pattern(re, &resultLen, &status);
150850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
150950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
151050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* The TEST_ASSERT_SUCCESS above should change too... */
151150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (U_SUCCESS(status)) {
151250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT(resultLen == -1);
151350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT(u_strcmp(resultPat, pat) == 0);
151450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
151550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
151650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        resultText = uregex_patternUText(re, &status);
151750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
151850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_UTEXT(str_hello, resultText);
151950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
152050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_close(re);
152150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
152250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
152350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        re = uregex_open(pat, 3, 0, NULL, &status);
152450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        resultPat = uregex_pattern(re, &resultLen, &status);
152550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
152650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
152750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* The TEST_ASSERT_SUCCESS above should change too... */
152850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (U_SUCCESS(status)) {
152950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT(resultLen == 3);
153050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT(u_strncmp(resultPat, pat, 3) == 0);
153150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT(u_strlen(resultPat) == 3);
153250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
153350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
153450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        resultText = uregex_patternUText(re, &status);
153550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
153650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_UTEXT(str_hel, resultText);
153750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
153850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_close(re);
153950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
154050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
154150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /*
154250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *  setUText() and lookingAt()
154350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
154450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
154550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UText  text1 = UTEXT_INITIALIZER;
154650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UText  text2 = UTEXT_INITIALIZER;
154750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UBool  result;
154850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char str_abcccd[] = { 0x62, 0x63, 0x64, 0x64, 0x64, 0x65, 0x00 }; /* abcccd */
154950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char str_abcccxd[] = { 0x62, 0x63, 0x64, 0x64, 0x64, 0x79, 0x65, 0x00 }; /* abcccxd */
155050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char str_abcd[] = { 0x62, 0x63, 0x64, 0x2b, 0x65, 0x00 }; /* abc*d */
155150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
155250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_openUTF8(&text1, str_abcccd, -1, &status);
155350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_openUTF8(&text2, str_abcccxd, -1, &status);
155450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
155550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_openUTF8(&patternText, str_abcd, -1, &status);
155650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        re = uregex_openUText(&patternText, 0, NULL, &status);
155750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
155850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
155950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* Operation before doing a setText should fail... */
156050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
156150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_lookingAt(re, 0, &status);
156250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT( status== U_REGEX_INVALID_STATE);
156350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
156450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
156550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setUText(re, &text1, &status);
156650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_lookingAt(re, 0, &status);
156750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(result == TRUE);
156850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
156950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
157050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
157150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setUText(re, &text2, &status);
157250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_lookingAt(re, 0, &status);
157350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(result == FALSE);
157450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
157550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
157650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
157750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setUText(re, &text1, &status);
157850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_lookingAt(re, 0, &status);
157950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(result == TRUE);
158050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
158150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
158250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_close(re);
158350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_close(&text1);
158450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_close(&text2);
158550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
158650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
158750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
158850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /*
158950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *  getText() and getUText()
159050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
159150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
159250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UText  text1 = UTEXT_INITIALIZER;
159350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UText  text2 = UTEXT_INITIALIZER;
159450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar  text2Chars[20];
159550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UText  *resultText;
159650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const UChar   *result;
159750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        int32_t  textLength;
159850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char str_abcccd[] = { 0x62, 0x63, 0x64, 0x64, 0x64, 0x65, 0x00 }; /* abcccd */
159950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char str_abcccxd[] = { 0x62, 0x63, 0x64, 0x64, 0x64, 0x79, 0x65, 0x00 }; /* abcccxd */
160050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char str_abcd[] = { 0x62, 0x63, 0x64, 0x2b, 0x65, 0x00 }; /* abc*d */
160150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
160250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
160350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
160450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_openUTF8(&text1, str_abcccd, -1, &status);
160550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        u_uastrncpy(text2Chars, str_abcccxd, sizeof(text2)/2);
160650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_openUChars(&text2, text2Chars, -1, &status);
160750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
160850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_openUTF8(&patternText, str_abcd, -1, &status);
160950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        re = uregex_openUText(&patternText, 0, NULL, &status);
161050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
161150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* First set a UText */
161250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setUText(re, &text1, &status);
161350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        resultText = uregex_getUText(re, NULL, &status);
161450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
161550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(resultText != &text1);
161650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_setNativeIndex(resultText, 0);
161750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_setNativeIndex(&text1, 0);
161883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        TEST_ASSERT(testUTextEqual(resultText, &text1));
161950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_close(resultText);
162050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
162150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_getText(re, &textLength, &status); /* flattens UText into buffer */
162259d709d503bab6e2b61931737e662dd293b40578ccornelius        (void)result;    /* Suppress set but not used warning. */
162350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(textLength == -1 || textLength == 6);
162450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        resultText = uregex_getUText(re, NULL, &status);
162550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
162650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(resultText != &text1);
162750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_setNativeIndex(resultText, 0);
162850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_setNativeIndex(&text1, 0);
162983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        TEST_ASSERT(testUTextEqual(resultText, &text1));
163050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_close(resultText);
163150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
163250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* Then set a UChar * */
163350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setText(re, text2Chars, 7, &status);
163450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        resultText = uregex_getUText(re, NULL, &status);
163550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
163650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_setNativeIndex(resultText, 0);
163750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_setNativeIndex(&text2, 0);
163883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        TEST_ASSERT(testUTextEqual(resultText, &text2));
163950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_close(resultText);
164050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_getText(re, &textLength, &status);
164150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(textLength == 7);
164250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
164350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_close(re);
164450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_close(&text1);
164550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_close(&text2);
164650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
164750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
164850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /*
164950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *  matches()
165050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
165150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
165250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UText   text1 = UTEXT_INITIALIZER;
165350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UBool   result;
165450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UText   nullText = UTEXT_INITIALIZER;
165550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char str_abcccde[] = { 0x61, 0x62, 0x63, 0x63, 0x63, 0x64, 0x65, 0x00 }; /* abcccde */
165650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char str_abcd[] = { 0x61, 0x62, 0x63, 0x2a, 0x64, 0x00 }; /* abc*d */
165750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
165850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
165950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_openUTF8(&text1, str_abcccde, -1, &status);
166050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_openUTF8(&patternText, str_abcd, -1, &status);
166150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        re = uregex_openUText(&patternText, 0, NULL, &status);
166250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
166350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setUText(re, &text1, &status);
166450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_matches(re, 0, &status);
166550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(result == FALSE);
166650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
166750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_close(re);
166850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
166950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
167050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        re = uregex_openC(".?", 0, NULL, &status);
167150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setUText(re, &text1, &status);
167250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_matches(re, 7, &status);
167350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(result == TRUE);
167450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
167550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
167650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
167750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_openUTF8(&nullText, "", -1, &status);
167850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setUText(re, &nullText, &status);
167950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
168050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_matches(re, 0, &status);
168150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(result == TRUE);
168250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
168350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
168450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_close(re);
168550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_close(&text1);
168650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_close(&nullText);
168750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
168850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
168950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
169050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /*
169150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *  lookingAt()    Used in setText test.
169250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
169350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
169450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
169550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /*
169650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *  find(), findNext, start, end, reset
169750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
169850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
169950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar    text1[50];
170050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UBool    result;
170150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        u_uastrncpy(text1, "012rx5rx890rxrx...",  sizeof(text1)/2);
170250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
170350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        re = uregex_openC("rx", 0, NULL, &status);
170450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
170550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setText(re, text1, -1, &status);
170650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_find(re, 0, &status);
170750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(result == TRUE);
170850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(uregex_start(re, 0, &status) == 3);
170950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(uregex_end(re, 0, &status) == 5);
171050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
171150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
171250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_find(re, 9, &status);
171350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(result == TRUE);
171450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(uregex_start(re, 0, &status) == 11);
171550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(uregex_end(re, 0, &status) == 13);
171650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
171750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
171850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_find(re, 14, &status);
171950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(result == FALSE);
172050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
172150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
172250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
172350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_reset(re, 0, &status);
172450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
172550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_findNext(re, &status);
172650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(result == TRUE);
172750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(uregex_start(re, 0, &status) == 3);
172850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(uregex_end(re, 0, &status) == 5);
172950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
173050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
173150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_findNext(re, &status);
173250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(result == TRUE);
173350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(uregex_start(re, 0, &status) == 6);
173450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(uregex_end(re, 0, &status) == 8);
173550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
173650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
173750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
173850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_reset(re, 12, &status);
173950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
174050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_findNext(re, &status);
174150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(result == TRUE);
174250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(uregex_start(re, 0, &status) == 13);
174350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(uregex_end(re, 0, &status) == 15);
174450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
174550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
174650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_findNext(re, &status);
174750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(result == FALSE);
174850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
174950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
175050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_close(re);
175150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
175250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
175350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /*
175450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *  group()
175550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
175650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
175750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar    text1[80];
175850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UText   *actual;
175950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UBool    result;
176050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
176150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char str_abcinteriordef[] = { 0x61, 0x62, 0x63, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x66, 0x00 }; /* abc interior def */
176250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char str_interior[] = { 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x00 }; /* ' interior ' */
176350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
176450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
176550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        u_uastrncpy(text1, "noise abc interior def, and this is off the end",  sizeof(text1)/2);
176650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
176750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
176850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        re = uregex_openC("abc(.*?)def", 0, NULL, &status);
176950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
177050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
177150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setText(re, text1, -1, &status);
177250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_find(re, 0, &status);
177350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(result==TRUE);
177450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
177550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /*  Capture Group 0, the full match.  Should succeed.  */
177650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
177727f654740f2a26ad62a5c155af9199af9e69b889claireho        actual = uregex_groupUTextDeep(re, 0, NULL, &status);
177850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
177950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_UTEXT(str_abcinteriordef, actual);
178050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_close(actual);
178150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
178227f654740f2a26ad62a5c155af9199af9e69b889claireho        /*  Capture Group 0 with shallow clone API.  Should succeed.  */
178327f654740f2a26ad62a5c155af9199af9e69b889claireho        status = U_ZERO_ERROR;
178427f654740f2a26ad62a5c155af9199af9e69b889claireho        {
178527f654740f2a26ad62a5c155af9199af9e69b889claireho            int64_t      group_len;
178627f654740f2a26ad62a5c155af9199af9e69b889claireho            int32_t      len16;
178727f654740f2a26ad62a5c155af9199af9e69b889claireho            UErrorCode   shallowStatus = U_ZERO_ERROR;
178827f654740f2a26ad62a5c155af9199af9e69b889claireho            int64_t      nativeIndex;
178927f654740f2a26ad62a5c155af9199af9e69b889claireho            UChar *groupChars;
179027f654740f2a26ad62a5c155af9199af9e69b889claireho            UText groupText = UTEXT_INITIALIZER;
179127f654740f2a26ad62a5c155af9199af9e69b889claireho
179227f654740f2a26ad62a5c155af9199af9e69b889claireho            actual = uregex_groupUText(re, 0, NULL, &group_len, &status);
179327f654740f2a26ad62a5c155af9199af9e69b889claireho            TEST_ASSERT_SUCCESS(status);
179427f654740f2a26ad62a5c155af9199af9e69b889claireho
179527f654740f2a26ad62a5c155af9199af9e69b889claireho            nativeIndex = utext_getNativeIndex(actual);
179627f654740f2a26ad62a5c155af9199af9e69b889claireho            /*  Following returns U_INDEX_OUTOFBOUNDS_ERROR... looks like a bug in ucstrFuncs UTextFuncs [utext.cpp]  */
179727f654740f2a26ad62a5c155af9199af9e69b889claireho            /*  len16 = utext_extract(actual, nativeIndex, nativeIndex + group_len, NULL, 0, &shallowStatus);  */
1798b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            len16 = (int32_t)group_len;
179927f654740f2a26ad62a5c155af9199af9e69b889claireho
180027f654740f2a26ad62a5c155af9199af9e69b889claireho            groupChars = (UChar *)malloc(sizeof(UChar)*(len16+1));
180127f654740f2a26ad62a5c155af9199af9e69b889claireho            utext_extract(actual, nativeIndex, nativeIndex + group_len, groupChars, len16+1, &shallowStatus);
180227f654740f2a26ad62a5c155af9199af9e69b889claireho
180327f654740f2a26ad62a5c155af9199af9e69b889claireho            utext_openUChars(&groupText, groupChars, len16, &shallowStatus);
180427f654740f2a26ad62a5c155af9199af9e69b889claireho
180527f654740f2a26ad62a5c155af9199af9e69b889claireho            TEST_ASSERT_UTEXT(str_abcinteriordef, &groupText);
180627f654740f2a26ad62a5c155af9199af9e69b889claireho            utext_close(&groupText);
180727f654740f2a26ad62a5c155af9199af9e69b889claireho            free(groupChars);
180827f654740f2a26ad62a5c155af9199af9e69b889claireho        }
180927f654740f2a26ad62a5c155af9199af9e69b889claireho        utext_close(actual);
181027f654740f2a26ad62a5c155af9199af9e69b889claireho
181150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /*  Capture group #1.  Should succeed. */
181250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
181327f654740f2a26ad62a5c155af9199af9e69b889claireho        actual = uregex_groupUTextDeep(re, 1, NULL, &status);
181450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
181550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_UTEXT(str_interior, actual);
181650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_close(actual);
181750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
181850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /*  Capture group out of range.  Error. */
181950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
182027f654740f2a26ad62a5c155af9199af9e69b889claireho        actual = uregex_groupUTextDeep(re, 2, NULL, &status);
182150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(status == U_INDEX_OUTOFBOUNDS_ERROR);
182250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT(utext_nativeLength(actual) == 0);
182350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_close(actual);
182450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
182550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_close(re);
182650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
182750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
182850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
182950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /*
183050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *  replaceFirst()
183150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
183250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
183350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar    text1[80];
183450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar    text2[80];
183550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UText    replText = UTEXT_INITIALIZER;
183650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UText   *result;
183750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char str_Replxxx[] = { 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x3c, 0x61, 0x61, 0x3e, 0x20, 0x78, 0x31, 0x78, 0x20, 0x78, 0x2e, 0x2e, 0x2e, 0x78, 0x2e, 0x00 }; /* Replace <aa> x1x x...x. */
183850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char str_Nomatchhere[] = { 0x4e, 0x6f, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x68, 0x65, 0x72, 0x65, 0x2e, 0x00 }; /* No match here. */
183950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char str_u00411U00000042a[] =  { 0x5c, 0x5c, 0x5c, 0x75, 0x30, 0x30, 0x34, 0x31, 0x24, 0x31, 0x5c, 0x55, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x32, 0x24, 0x5c, 0x61, 0x00 }; /* \\\u0041$1\U00000042$\a */
184050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char str_1x[] = { 0x3c, 0x24, 0x31, 0x3e, 0x00 }; /* <$1> */
184150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char str_ReplaceAaaBax1xxx[] = { 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x5c, 0x41, 0x61, 0x61, 0x42, 0x24, 0x61, 0x20, 0x78, 0x31, 0x78, 0x20, 0x78, 0x2e, 0x2e, 0x2e, 0x78, 0x2e, 0x00 }; /* Replace \AaaB$a x1x x...x. */
184250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
184350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        u_uastrncpy(text1, "Replace xaax x1x x...x.",  sizeof(text1)/2);
184450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        u_uastrncpy(text2, "No match here.",  sizeof(text2)/2);
184550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_openUTF8(&replText, str_1x, -1, &status);
184650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
184750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        re = uregex_openC("x(.*?)x", 0, NULL, &status);
184850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
184950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
185050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /*  Normal case, with match */
185150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setText(re, text1, -1, &status);
185250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_replaceFirstUText(re, &replText, NULL, &status);
185350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
185450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_UTEXT(str_Replxxx, result);
185550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_close(result);
185650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
185750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* No match.  Text should copy to output with no changes.  */
185850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setText(re, text2, -1, &status);
185950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_replaceFirstUText(re, &replText, NULL, &status);
186050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
186150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_UTEXT(str_Nomatchhere, result);
186250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_close(result);
186350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
186450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* Unicode escapes */
186550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setText(re, text1, -1, &status);
186650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_openUTF8(&replText, str_u00411U00000042a, -1, &status);
186750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_replaceFirstUText(re, &replText, NULL, &status);
186850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
186950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_UTEXT(str_ReplaceAaaBax1xxx, result);
187050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_close(result);
187150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
187250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_close(re);
187350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_close(&replText);
187450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
187550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
187650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
187750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /*
187850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *  replaceAll()
187950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
188050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
188150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar    text1[80];
188250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar    text2[80];
188350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UText    replText = UTEXT_INITIALIZER;
188450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UText   *result;
188550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char str_1[] = { 0x3c, 0x24, 0x31, 0x3e, 0x00 }; /* <$1> */
188650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char str_Replaceaa1[] = { 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x3c, 0x61, 0x61, 0x3e, 0x20, 0x3c, 0x31, 0x3e, 0x20, 0x3c, 0x2e, 0x2e, 0x2e, 0x3e, 0x2e, 0x00 }; /* Replace <aa> <1> <...>. */
188750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        const char str_Nomatchhere[] = { 0x4e, 0x6f, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x68, 0x65, 0x72, 0x65, 0x2e, 0x00 }; /* No match here. */
188850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
188950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        u_uastrncpy(text1, "Replace xaax x1x x...x.",  sizeof(text1)/2);
189050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        u_uastrncpy(text2, "No match here.",  sizeof(text2)/2);
189150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_openUTF8(&replText, str_1, -1, &status);
189250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
189350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        re = uregex_openC("x(.*?)x", 0, NULL, &status);
189450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
189550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
189650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /*  Normal case, with match */
189750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setText(re, text1, -1, &status);
189850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_replaceAllUText(re, &replText, NULL, &status);
189950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
190050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_UTEXT(str_Replaceaa1, result);
190150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_close(result);
190250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
190350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* No match.  Text should copy to output with no changes.  */
190450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setText(re, text2, -1, &status);
190550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        result = uregex_replaceAllUText(re, &replText, NULL, &status);
190650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
190750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_UTEXT(str_Nomatchhere, result);
190850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_close(result);
190950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
191050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_close(re);
191150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        utext_close(&replText);
191250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
191350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
191450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
191550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /*
191650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *  appendReplacement()
191750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
191850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
191950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar    text[100];
192050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar    repl[100];
192150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar    buf[100];
192250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar   *bufPtr;
192350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        int32_t  bufCap;
192450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
192550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
192650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        re = uregex_openC(".*", 0, 0, &status);
192750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
192850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
192950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        u_uastrncpy(text, "whatever",  sizeof(text)/2);
193050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        u_uastrncpy(repl, "some other", sizeof(repl)/2);
193150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setText(re, text, -1, &status);
193250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
193350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* match covers whole target string */
193450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_find(re, 0, &status);
193550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
193650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        bufPtr = buf;
193750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        bufCap = sizeof(buf) / 2;
193850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_appendReplacement(re, repl, -1, &bufPtr, &bufCap, &status);
193950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
194050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_STRING("some other", buf, TRUE);
194150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
194250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* Match has \u \U escapes */
194350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_find(re, 0, &status);
194450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
194550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        bufPtr = buf;
194650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        bufCap = sizeof(buf) / 2;
194750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        u_uastrncpy(repl, "abc\\u0041\\U00000042 \\\\ $ \\abc", sizeof(repl)/2);
194850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_appendReplacement(re, repl, -1, &bufPtr, &bufCap, &status);
194950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
195050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_STRING("abcAB \\ $ abc", buf, TRUE);
195150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
195250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_close(re);
195350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
195450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
195550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
195650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /*
195750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *  appendReplacement(), appendTail() checked in replaceFirst(), replaceAll().
195850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
195950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
196050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /*
196150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *  splitUText()
196250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
196350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
196450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar    textToSplit[80];
196550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar    text2[80];
196650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UText    *fields[10];
196750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        int32_t  numFields;
196850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        int32_t i;
196950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
197050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        u_uastrncpy(textToSplit, "first : second:  third",  sizeof(textToSplit)/2);
197150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        u_uastrncpy(text2, "No match here.",  sizeof(text2)/2);
197250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
197350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
197450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        re = uregex_openC(":", 0, NULL, &status);
197550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
197650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
197750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /*  Simple split */
197850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
197950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setText(re, textToSplit, -1, &status);
198050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
198150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
198250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* The TEST_ASSERT_SUCCESS call above should change too... */
198350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (U_SUCCESS(status)) {
198450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            memset(fields, 0, sizeof(fields));
198550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            numFields = uregex_splitUText(re, fields, 10, &status);
198650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT_SUCCESS(status);
198750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
198850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            /* The TEST_ASSERT_SUCCESS call above should change too... */
198950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if(U_SUCCESS(status)) {
199050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho              const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* 'first ' */
199150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho              const char str_second[] = { 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x00 }; /* '  second' */
199250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho              const char str_third[] = { 0x20, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x00 }; /* '  third' */
199350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT(numFields == 3);
199450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT_UTEXT(str_first,  fields[0]);
199550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT_UTEXT(str_second, fields[1]);
199650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT_UTEXT(str_third, fields[2]);
199750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT(fields[3] == NULL);
199850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
199950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            for(i = 0; i < numFields; i++) {
200050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                utext_close(fields[i]);
200150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
200250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
200350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
200450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_close(re);
200550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
200650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
200750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /*  Split with too few output strings available */
200850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
200950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        re = uregex_openC(":", 0, NULL, &status);
201050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setText(re, textToSplit, -1, &status);
201150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
201250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
201350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* The TEST_ASSERT_SUCCESS call above should change too... */
201450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(U_SUCCESS(status)) {
201550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            fields[0] = NULL;
201650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            fields[1] = NULL;
201750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            fields[2] = &patternText;
201850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            numFields = uregex_splitUText(re, fields, 2, &status);
201950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT_SUCCESS(status);
202050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
202150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            /* The TEST_ASSERT_SUCCESS call above should change too... */
202250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if(U_SUCCESS(status)) {
202350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* first  */
202450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                const char str_secondthird[] = { 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x3a, 0x20, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x00 }; /*  second:  third */
202550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT(numFields == 2);
202650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT_UTEXT(str_first,  fields[0]);
202750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT_UTEXT(str_secondthird, fields[1]);
202850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT(fields[2] == &patternText);
202950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
203050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            for(i = 0; i < numFields; i++) {
203150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                utext_close(fields[i]);
203250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
203350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
203450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
203550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_close(re);
203650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
203750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
203850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* splitUText(), part 2.  Patterns with capture groups.  The capture group text
203950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *                   comes out as additional fields.  */
204050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {
204150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar    textToSplit[80];
204250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UText    *fields[10];
204350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        int32_t  numFields;
204450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        int32_t i;
204550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
204650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        u_uastrncpy(textToSplit, "first <tag-a> second<tag-b>  third",  sizeof(textToSplit)/2);
204750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
204850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
204950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        re = uregex_openC("<(.*?)>", 0, NULL, &status);
205050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
205150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setText(re, textToSplit, -1, &status);
205250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
205350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
205450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* The TEST_ASSERT_SUCCESS call above should change too... */
205550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(U_SUCCESS(status)) {
205650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            memset(fields, 0, sizeof(fields));
205750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            numFields = uregex_splitUText(re, fields, 10, &status);
205850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT_SUCCESS(status);
205950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
206050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            /* The TEST_ASSERT_SUCCESS call above should change too... */
206150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if(U_SUCCESS(status)) {
206250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* first  */
206350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                const char str_taga[] = { 0x74, 0x61, 0x67, 0x2d, 0x61, 0x00 }; /* tag-a */
206450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                const char str_second[] = { 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x00 }; /*  second */
206550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                const char str_tagb[] = { 0x74, 0x61, 0x67, 0x2d, 0x62, 0x00 }; /* tag-b */
206650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                const char str_third[] = { 0x20, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x00 }; /*   third */
206750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
206850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT(numFields == 5);
206950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT_UTEXT(str_first,  fields[0]);
207050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT_UTEXT(str_taga,   fields[1]);
207150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT_UTEXT(str_second, fields[2]);
207250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT_UTEXT(str_tagb,   fields[3]);
207350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT_UTEXT(str_third, fields[4]);
207450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT(fields[5] == NULL);
207550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
207650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            for(i = 0; i < numFields; i++) {
207750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                utext_close(fields[i]);
207850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
207950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
208050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
208150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /*  Split with too few output strings available (2) */
208250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
208350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fields[0] = NULL;
208450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fields[1] = NULL;
208550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fields[2] = &patternText;
208650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        numFields = uregex_splitUText(re, fields, 2, &status);
208750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
208850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
208950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* The TEST_ASSERT_SUCCESS call above should change too... */
209050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(U_SUCCESS(status)) {
209150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* first  */
209250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            const char str_secondtagbthird[] = { 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x3c, 0x74, 0x61, 0x67, 0x2d, 0x62, 0x3e, 0x20, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x00 }; /*  second<tag-b>  third */
209350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT(numFields == 2);
209450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT_UTEXT(str_first,  fields[0]);
209550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT_UTEXT(str_secondtagbthird, fields[1]);
209650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT(fields[2] == &patternText);
209750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
209850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        for(i = 0; i < numFields; i++) {
209950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            utext_close(fields[i]);
210050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
210150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
210250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
210350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /*  Split with too few output strings available (3) */
210450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
210550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fields[0] = NULL;
210650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fields[1] = NULL;
210750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fields[2] = NULL;
210850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fields[3] = &patternText;
210950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        numFields = uregex_splitUText(re, fields, 3, &status);
211050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
211150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
211250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* The TEST_ASSERT_SUCCESS call above should change too... */
211350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(U_SUCCESS(status)) {
211450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* first  */
211550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            const char str_taga[] = { 0x74, 0x61, 0x67, 0x2d, 0x61, 0x00 }; /* tag-a */
211650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            const char str_secondtagbthird[] = { 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x3c, 0x74, 0x61, 0x67, 0x2d, 0x62, 0x3e, 0x20, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x00 }; /*  second<tag-b>  third */
211750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT(numFields == 3);
211850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT_UTEXT(str_first,  fields[0]);
211950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT_UTEXT(str_taga,   fields[1]);
212050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT_UTEXT(str_secondtagbthird, fields[2]);
212150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT(fields[3] == &patternText);
212250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
212350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        for(i = 0; i < numFields; i++) {
212450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            utext_close(fields[i]);
212550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
212650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
212750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /*  Split with just enough output strings available (5) */
212850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
212950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fields[0] = NULL;
213050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fields[1] = NULL;
213150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fields[2] = NULL;
213250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fields[3] = NULL;
213350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fields[4] = NULL;
213450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fields[5] = &patternText;
213550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        numFields = uregex_splitUText(re, fields, 5, &status);
213650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
213750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
213850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* The TEST_ASSERT_SUCCESS call above should change too... */
213950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(U_SUCCESS(status)) {
214050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* first  */
214150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            const char str_taga[] = { 0x74, 0x61, 0x67, 0x2d, 0x61, 0x00 }; /* tag-a */
214250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            const char str_second[] = { 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x00 }; /*  second */
214350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            const char str_tagb[] = { 0x74, 0x61, 0x67, 0x2d, 0x62, 0x00 }; /* tag-b */
214450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            const char str_third[] = { 0x20, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x00 }; /*   third */
214550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
214650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT(numFields == 5);
214750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT_UTEXT(str_first,  fields[0]);
214850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT_UTEXT(str_taga,   fields[1]);
214950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT_UTEXT(str_second, fields[2]);
215050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT_UTEXT(str_tagb,   fields[3]);
215150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT_UTEXT(str_third, fields[4]);
215250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT(fields[5] == &patternText);
215350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
215450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        for(i = 0; i < numFields; i++) {
215550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            utext_close(fields[i]);
215650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
215750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
215850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* Split, end of text is a field delimiter.   */
215950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_ZERO_ERROR;
216050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_setText(re, textToSplit, strlen("first <tag-a> second<tag-b>"), &status);
216150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        TEST_ASSERT_SUCCESS(status);
216250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
216350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* The TEST_ASSERT_SUCCESS call above should change too... */
216450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(U_SUCCESS(status)) {
216550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            memset(fields, 0, sizeof(fields));
216650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            fields[9] = &patternText;
216750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            numFields = uregex_splitUText(re, fields, 9, &status);
216850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            TEST_ASSERT_SUCCESS(status);
216950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
217050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            /* The TEST_ASSERT_SUCCESS call above should change too... */
217150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if(U_SUCCESS(status)) {
217250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* first  */
217350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                const char str_taga[] = { 0x74, 0x61, 0x67, 0x2d, 0x61, 0x00 }; /* tag-a */
217450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                const char str_second[] = { 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x00 }; /*  second */
217550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                const char str_tagb[] = { 0x74, 0x61, 0x67, 0x2d, 0x62, 0x00 }; /* tag-b */
2176b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                const char str_empty[] = { 0x00 };
217750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2178b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                TEST_ASSERT(numFields == 5);
217950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT_UTEXT(str_first,  fields[0]);
218050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT_UTEXT(str_taga,   fields[1]);
218150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT_UTEXT(str_second, fields[2]);
218250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT_UTEXT(str_tagb,   fields[3]);
2183b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                TEST_ASSERT_UTEXT(str_empty,  fields[4]);
2184b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                TEST_ASSERT(fields[5] == NULL);
218550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT(fields[8] == NULL);
218650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                TEST_ASSERT(fields[9] == &patternText);
218750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
218850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            for(i = 0; i < numFields; i++) {
218950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                utext_close(fields[i]);
219050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
219150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
219250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
219350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        uregex_close(re);
219450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
219550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    utext_close(&patternText);
219650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
219750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2198b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
21992e615e9896b12236afe0ff2695e8afc2ee73f961clairehostatic void TestRefreshInput(void) {
22002e615e9896b12236afe0ff2695e8afc2ee73f961claireho    /*
22012e615e9896b12236afe0ff2695e8afc2ee73f961claireho     *  RefreshInput changes out the input of a URegularExpression without
22022e615e9896b12236afe0ff2695e8afc2ee73f961claireho     *    changing anything else in the match state.  Used with Java JNI,
22032e615e9896b12236afe0ff2695e8afc2ee73f961claireho     *    when Java moves the underlying string storage.   This test
22042e615e9896b12236afe0ff2695e8afc2ee73f961claireho     *    runs a find() loop, moving the text after the first match.
22052e615e9896b12236afe0ff2695e8afc2ee73f961claireho     *    The right number of matches should still be found.
22062e615e9896b12236afe0ff2695e8afc2ee73f961claireho     */
22072e615e9896b12236afe0ff2695e8afc2ee73f961claireho    UChar testStr[]  = {0x41, 0x20, 0x42, 0x20, 0x43, 0x0};  /* = "A B C"  */
22082e615e9896b12236afe0ff2695e8afc2ee73f961claireho    UChar movedStr[] = {   0,    0,    0,    0,    0,   0};
22092e615e9896b12236afe0ff2695e8afc2ee73f961claireho    UErrorCode status = U_ZERO_ERROR;
22102e615e9896b12236afe0ff2695e8afc2ee73f961claireho    URegularExpression *re;
22112e615e9896b12236afe0ff2695e8afc2ee73f961claireho    UText ut1 = UTEXT_INITIALIZER;
22122e615e9896b12236afe0ff2695e8afc2ee73f961claireho    UText ut2 = UTEXT_INITIALIZER;
2213b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
22142e615e9896b12236afe0ff2695e8afc2ee73f961claireho    re = uregex_openC("[ABC]", 0, 0, &status);
22152e615e9896b12236afe0ff2695e8afc2ee73f961claireho    TEST_ASSERT_SUCCESS(status);
22162e615e9896b12236afe0ff2695e8afc2ee73f961claireho
22172e615e9896b12236afe0ff2695e8afc2ee73f961claireho    utext_openUChars(&ut1, testStr, -1, &status);
22182e615e9896b12236afe0ff2695e8afc2ee73f961claireho    TEST_ASSERT_SUCCESS(status);
22192e615e9896b12236afe0ff2695e8afc2ee73f961claireho    uregex_setUText(re, &ut1, &status);
22202e615e9896b12236afe0ff2695e8afc2ee73f961claireho    TEST_ASSERT_SUCCESS(status);
22212e615e9896b12236afe0ff2695e8afc2ee73f961claireho
22222e615e9896b12236afe0ff2695e8afc2ee73f961claireho    /* Find the first match "A" in the original string */
22232e615e9896b12236afe0ff2695e8afc2ee73f961claireho    TEST_ASSERT(uregex_findNext(re, &status));
22242e615e9896b12236afe0ff2695e8afc2ee73f961claireho    TEST_ASSERT(uregex_start(re, 0, &status) == 0);
2225b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
22262e615e9896b12236afe0ff2695e8afc2ee73f961claireho    /* Move the string, kill the original string.  */
22272e615e9896b12236afe0ff2695e8afc2ee73f961claireho    u_strcpy(movedStr, testStr);
22282e615e9896b12236afe0ff2695e8afc2ee73f961claireho    u_memset(testStr, 0, u_strlen(testStr));
22292e615e9896b12236afe0ff2695e8afc2ee73f961claireho    utext_openUChars(&ut2, movedStr, -1, &status);
22302e615e9896b12236afe0ff2695e8afc2ee73f961claireho    TEST_ASSERT_SUCCESS(status);
22312e615e9896b12236afe0ff2695e8afc2ee73f961claireho    uregex_refreshUText(re, &ut2, &status);
22322e615e9896b12236afe0ff2695e8afc2ee73f961claireho    TEST_ASSERT_SUCCESS(status);
22332e615e9896b12236afe0ff2695e8afc2ee73f961claireho
22342e615e9896b12236afe0ff2695e8afc2ee73f961claireho    /* Find the following two matches, now working in the moved string. */
22352e615e9896b12236afe0ff2695e8afc2ee73f961claireho    TEST_ASSERT(uregex_findNext(re, &status));
22362e615e9896b12236afe0ff2695e8afc2ee73f961claireho    TEST_ASSERT(uregex_start(re, 0, &status) == 2);
22372e615e9896b12236afe0ff2695e8afc2ee73f961claireho    TEST_ASSERT(uregex_findNext(re, &status));
22382e615e9896b12236afe0ff2695e8afc2ee73f961claireho    TEST_ASSERT(uregex_start(re, 0, &status) == 4);
22392e615e9896b12236afe0ff2695e8afc2ee73f961claireho    TEST_ASSERT(FALSE == uregex_findNext(re, &status));
22402e615e9896b12236afe0ff2695e8afc2ee73f961claireho
22412e615e9896b12236afe0ff2695e8afc2ee73f961claireho    uregex_close(re);
22422e615e9896b12236afe0ff2695e8afc2ee73f961claireho}
22432e615e9896b12236afe0ff2695e8afc2ee73f961claireho
2244b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2245b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestBug8421(void) {
2246b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* Bug 8421:  setTimeLimit on a regular expresssion before setting text to be matched
2247b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     *             was failing.
2248b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
2249b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    URegularExpression *re;
2250b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode status = U_ZERO_ERROR;
2251b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t  limit = -1;
2252b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2253b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    re = uregex_openC("abc", 0, 0, &status);
2254b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT_SUCCESS(status);
2255b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2256b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    limit = uregex_getTimeLimit(re, &status);
2257b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT_SUCCESS(status);
2258b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(limit == 0);
2259b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2260b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    uregex_setTimeLimit(re, 100, &status);
2261b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT_SUCCESS(status);
2262b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    limit = uregex_getTimeLimit(re, &status);
2263b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT_SUCCESS(status);
2264b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(limit == 100);
2265b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2266b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    uregex_close(re);
2267b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
2268b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2269b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif   /*  !UCONFIG_NO_REGULAR_EXPRESSIONS */
2271