16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/********************************************************************
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT:
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 2004-2013, International Business Machines Corporation and
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/********************************************************************************
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File reapits.c
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*********************************************************************************/
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*C API TEST FOR Regular Expressions */
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   This is an API test for ICU regular expressions in C.  It doesn't test very many cases, and doesn't
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   try to test the full functionality.  It just calls each function and verifies that it
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   works on a basic level.
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   More complete testing of regular expression functionality is done with the C++ tests.
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org**/
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_REGULAR_EXPRESSIONS
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdlib.h>
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <string.h>
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uloc.h"
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uregex.h"
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h"
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utext.h"
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cintltst.h"
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TEST_ASSERT_SUCCESS(status) {if (U_FAILURE(status)) { \
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orglog_data_err("Failure at file %s, line %d, error = %s (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status));}}
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TEST_ASSERT(expr) {if ((expr)==FALSE) { \
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orglog_data_err("Test Failure at file %s, line %d (Are you missing data?)\n", __FILE__, __LINE__);}}
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   TEST_SETUP and TEST_TEARDOWN
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *         macros to handle the boilerplate around setting up regex test cases.
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *         parameteres to setup:
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *              pattern:     The regex pattern, a (char *) null terminated C string.
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *              testString:  The string data, also a (char *) C string.
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *              flags:       Regex flags to set when compiling the pattern
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *         Put arbitrary test code between SETUP and TEARDOWN.
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *         're" is the compiled, ready-to-go  regular expression.
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TEST_SETUP(pattern, testString, flags) {  \
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar   *srcString = NULL;  \
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR; \
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    re = uregex_openC(pattern, flags, NULL, &status);  \
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(status);   \
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcString = (UChar *)malloc((strlen(testString)+2)*sizeof(UChar)); \
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrncpy(srcString, testString,  strlen(testString)+1); \
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uregex_setText(re, srcString, -1, &status); \
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(status);  \
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TEST_TEARDOWN  \
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }  \
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(status);  \
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uregex_close(re);  \
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    free(srcString);   \
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param expected utf-8 array of bytes to be expected
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void test_assert_string(const char *expected, const UChar *actual, UBool nulTerm, const char *file, int line) {
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     char     buf_inside_macro[120];
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     int32_t  len = (int32_t)strlen(expected);
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     UBool    success;
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     if (nulTerm) {
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         u_austrncpy(buf_inside_macro, (actual), len+1);
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         buf_inside_macro[len+2] = 0;
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         success = (strcmp((expected), buf_inside_macro) == 0);
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     } else {
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         u_austrncpy(buf_inside_macro, (actual), len);
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         buf_inside_macro[len+1] = 0;
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         success = (strncmp((expected), buf_inside_macro, len) == 0);
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     }
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     if (success == FALSE) {
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         log_err("Failure at file %s, line %d, expected \"%s\", got \"%s\"\n",
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             file, line, (expected), buf_inside_macro);
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     }
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TEST_ASSERT_STRING(expected, actual, nulTerm) test_assert_string(expected, actual, nulTerm, __FILE__, __LINE__)
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool equals_utf8_utext(const char *utf8, UText *utext) {
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t u8i = 0;
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 u8c = 0;
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 utc = 0;
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool   stringsEqual = TRUE;
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    utext_setNativeIndex(utext, 0);
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (;;) {
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        U8_NEXT_UNSAFE(utf8, u8i, u8c);
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utc = utext_next32(utext);
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (u8c == 0 && utc == U_SENTINEL) {
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (u8c != utc || u8c == 0) {
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            stringsEqual = FALSE;
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return stringsEqual;
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void test_assert_utext(const char *expected, UText *actual, const char *file, int line) {
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    utext_setNativeIndex(actual, 0);
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!equals_utf8_utext(expected, actual)) {
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar32 c;
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Failure at file %s, line %d, expected \"%s\", got \"", file, line, expected);
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        c = utext_next32From(actual, 0);
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        while (c != U_SENTINEL) {
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (0x20<c && c <0x7e) {
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("%c", c);
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("%#x", c);
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            c = UTEXT_NEXT32(actual);
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("\"\n");
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * TEST_ASSERT_UTEXT(const char *expected, const UText *actual)
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     Note:  Expected is a UTF-8 encoded string, _not_ the system code page.
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TEST_ASSERT_UTEXT(expected, actual) test_assert_utext(expected, actual, __FILE__, __LINE__)
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool testUTextEqual(UText *uta, UText *utb) {
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 ca = 0;
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 cb = 0;
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    utext_setNativeIndex(uta, 0);
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    utext_setNativeIndex(utb, 0);
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    do {
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ca = utext_next32(uta);
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cb = utext_next32(utb);
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (ca != cb) {
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } while (ca != U_SENTINEL);
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return ca == cb;
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestRegexCAPI(void);
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBug4315(void);
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestUTextAPI(void);
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestRefreshInput(void);
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBug8421(void);
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addURegexTest(TestNode** root);
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addURegexTest(TestNode** root)
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestRegexCAPI, "regex/TestRegexCAPI");
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestBug4315,   "regex/TestBug4315");
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestUTextAPI,  "regex/TestUTextAPI");
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestRefreshInput, "regex/TestRefreshInput");
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestBug8421,   "regex/TestBug8421");
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Call back function and context struct used for testing
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *    regular expression user callbacks.  This test is mostly the same as
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   the corresponding C++ test in intltest.
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct callBackContext {
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t          maxCalls;
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t          numCalls;
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t          lastSteps;
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} callBackContext;
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool U_EXPORT2 U_CALLCONV
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTestCallbackFn(const void *context, int32_t steps) {
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  callBackContext  *info = (callBackContext *)context;
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if (info->lastSteps+1 != steps) {
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      log_err("incorrect steps in callback.  Expected %d, got %d\n", info->lastSteps+1, steps);
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  info->lastSteps = steps;
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  info->numCalls++;
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return (info->numCalls < info->maxCalls);
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   Regular Expression C API Tests
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestRegexCAPI(void) {
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode           status = U_ZERO_ERROR;
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    URegularExpression  *re;
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar                pat[200];
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar               *minus1;
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(&minus1, -1, sizeof(minus1));
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Mimimalist open/close */
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrncpy(pat, "abc*", sizeof(pat)/2);
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    re = uregex_open(pat, -1, 0, 0, &status);
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         log_data_err("Failed to open regular expression, %s:%d, error is \"%s\" (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status));
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         return;
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uregex_close(re);
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Open with all flag values set */
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    re = uregex_open(pat, -1,
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UREGEX_CASE_INSENSITIVE | UREGEX_COMMENTS | UREGEX_DOTALL | UREGEX_MULTILINE | UREGEX_UWORD | UREGEX_LITERAL,
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0, &status);
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(status);
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uregex_close(re);
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Open with an invalid flag */
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    re = uregex_open(pat, -1, 0x40000000, 0, &status);
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(status == U_REGEX_INVALID_FLAG);
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uregex_close(re);
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Open with an unimplemented flag */
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    re = uregex_open(pat, -1, UREGEX_CANON_EQ, 0, &status);
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(status == U_REGEX_UNIMPLEMENTED);
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uregex_close(re);
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* openC with an invalid parameter */
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    re = uregex_openC(NULL,
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UREGEX_CASE_INSENSITIVE | UREGEX_COMMENTS | UREGEX_DOTALL | UREGEX_MULTILINE | UREGEX_UWORD, 0, &status);
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(status == U_ILLEGAL_ARGUMENT_ERROR && re == NULL);
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* openC with an invalid parameter */
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_USELESS_COLLATOR_ERROR;
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    re = uregex_openC(NULL,
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UREGEX_CASE_INSENSITIVE | UREGEX_COMMENTS | UREGEX_DOTALL | UREGEX_MULTILINE | UREGEX_UWORD, 0, &status);
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(status == U_USELESS_COLLATOR_ERROR && re == NULL);
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* openC   open from a C string */
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar   *p;
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  len;
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC("abc*", 0, 0, &status);
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        p = uregex_pattern(re, &len, &status);
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The TEST_ASSERT_SUCCESS above should change too... */
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_SUCCESS(status)) {
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_uastrncpy(pat, "abc*", sizeof(pat)/2);
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(u_strcmp(pat, p) == 0);
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(len==(int32_t)strlen("abc*"));
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  TODO:  Open with ParseError parameter */
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  clone
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        URegularExpression *clone1;
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        URegularExpression *clone2;
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        URegularExpression *clone3;
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar  testString1[30];
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar  testString2[30];
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBool  result;
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC("abc*", 0, 0, &status);
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        clone1 = uregex_clone(re, &status);
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(clone1 != NULL);
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        clone2 = uregex_clone(re, &status);
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(clone2 != NULL);
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        clone3 = uregex_clone(clone2, &status);
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(clone3 != NULL);
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(testString1, "abcccd", sizeof(pat)/2);
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(testString2, "xxxabcccd", sizeof(pat)/2);
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(clone1, testString1, -1, &status);
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_lookingAt(clone1, 0, &status);
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result==TRUE);
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(clone2, testString2, -1, &status);
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_lookingAt(clone2, 0, &status);
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result==FALSE);
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_find(clone2, 0, &status);
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result==TRUE);
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(clone1);
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(clone2);
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(clone3);
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  pattern()
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    */
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar  *resultPat;
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t       resultLen;
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(pat, "hello", sizeof(pat)/2);
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_open(pat, -1, 0, NULL, &status);
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultPat = uregex_pattern(re, &resultLen, &status);
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The TEST_ASSERT_SUCCESS above should change too... */
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_SUCCESS(status)) {
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(resultLen == -1);
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(u_strcmp(resultPat, pat) == 0);
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_open(pat, 3, 0, NULL, &status);
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultPat = uregex_pattern(re, &resultLen, &status);
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The TEST_ASSERT_SUCCESS above should change too... */
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_SUCCESS(status)) {
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(resultLen == 3);
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(u_strncmp(resultPat, pat, 3) == 0);
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(u_strlen(resultPat) == 3);
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  flags()
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  t;
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_open(pat, -1, 0, NULL, &status);
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        t  = uregex_flags(re, &status);
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(t == 0);
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_open(pat, -1, 0, NULL, &status);
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        t  = uregex_flags(re, &status);
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(t == 0);
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_open(pat, -1, UREGEX_CASE_INSENSITIVE | UREGEX_DOTALL, NULL, &status);
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        t  = uregex_flags(re, &status);
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(t == (UREGEX_CASE_INSENSITIVE | UREGEX_DOTALL));
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  setText() and lookingAt()
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar  text1[50];
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar  text2[50];
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBool  result;
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text1, "abcccd",  sizeof(text1)/2);
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text2, "abcccxd", sizeof(text2)/2);
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(pat, "abc*d", sizeof(pat)/2);
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_open(pat, -1, 0, NULL, &status);
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Operation before doing a setText should fail... */
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_lookingAt(re, 0, &status);
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT( status== U_REGEX_INVALID_STATE);
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text1, -1, &status);
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_lookingAt(re, 0, &status);
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == TRUE);
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text2, -1, &status);
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_lookingAt(re, 0, &status);
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == FALSE);
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text1, -1, &status);
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_lookingAt(re, 0, &status);
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == TRUE);
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text1, 5, &status);
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_lookingAt(re, 0, &status);
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == FALSE);
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text1, 6, &status);
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_lookingAt(re, 0, &status);
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == TRUE);
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  getText()
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    text1[50];
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    text2[50];
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar   *result;
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  textLength;
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text1, "abcccd",  sizeof(text1)/2);
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text2, "abcccxd", sizeof(text2)/2);
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(pat, "abc*d", sizeof(pat)/2);
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_open(pat, -1, 0, NULL, &status);
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text1, -1, &status);
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_getText(re, &textLength, &status);
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == text1);
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(textLength == -1);
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text2, 7, &status);
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_getText(re, &textLength, &status);
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == text2);
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(textLength == 7);
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text2, 4, &status);
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_getText(re, &textLength, &status);
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == text2);
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(textLength == 4);
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  matches()
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar   text1[50];
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBool   result;
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int     len;
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar   nullString[] = {0,0,0};
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text1, "abcccde",  sizeof(text1)/2);
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(pat, "abc*d", sizeof(pat)/2);
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_open(pat, -1, 0, NULL, &status);
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text1, -1, &status);
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_matches(re, 0, &status);
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == FALSE);
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text1, 6, &status);
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_matches(re, 0, &status);
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == TRUE);
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text1, 6, &status);
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_matches(re, 1, &status);
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == FALSE);
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC(".?", 0, NULL, &status);
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text1, -1, &status);
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        len = u_strlen(text1);
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_matches(re, len, &status);
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == TRUE);
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, nullString, -1, &status);
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_matches(re, 0, &status);
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == TRUE);
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  lookingAt()    Used in setText test.
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  find(), findNext, start, end, reset
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    text1[50];
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBool    result;
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text1, "012rx5rx890rxrx...",  sizeof(text1)/2);
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC("rx", 0, NULL, &status);
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text1, -1, &status);
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_find(re, 0, &status);
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == TRUE);
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_start(re, 0, &status) == 3);
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_end(re, 0, &status) == 5);
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_find(re, 9, &status);
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == TRUE);
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_start(re, 0, &status) == 11);
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_end(re, 0, &status) == 13);
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_find(re, 14, &status);
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == FALSE);
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_reset(re, 0, &status);
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_findNext(re, &status);
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == TRUE);
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_start(re, 0, &status) == 3);
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_end(re, 0, &status) == 5);
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_findNext(re, &status);
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == TRUE);
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_start(re, 0, &status) == 6);
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_end(re, 0, &status) == 8);
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_reset(re, 12, &status);
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_findNext(re, &status);
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == TRUE);
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_start(re, 0, &status) == 13);
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_end(re, 0, &status) == 15);
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_findNext(re, &status);
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == FALSE);
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  groupCount
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t result;
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC("abc", 0, NULL, &status);
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_groupCount(re, &status);
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == 0);
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC("abc(def)(ghi(j))", 0, NULL, &status);
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_groupCount(re, &status);
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == 3);
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  group()
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    text1[80];
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    buf[80];
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBool    result;
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  resultSz;
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text1, "noise abc interior def, and this is off the end",  sizeof(text1)/2);
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC("abc(.*?)def", 0, NULL, &status);
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text1, -1, &status);
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_find(re, 0, &status);
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result==TRUE);
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Capture Group 0, the full match.  Should succeed.  */
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultSz = uregex_group(re, 0, buf, sizeof(buf)/2, &status);
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING("abc interior def", buf, TRUE);
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(resultSz == (int32_t)strlen("abc interior def"));
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Capture group #1.  Should succeed. */
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultSz = uregex_group(re, 1, buf, sizeof(buf)/2, &status);
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING(" interior ", buf, TRUE);
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(resultSz == (int32_t)strlen(" interior "));
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Capture group out of range.  Error. */
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_group(re, 2, buf, sizeof(buf)/2, &status);
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(status == U_INDEX_OUTOFBOUNDS_ERROR);
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* NULL buffer, pure pre-flight */
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultSz = uregex_group(re, 0, NULL, 0, &status);
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(resultSz == (int32_t)strlen("abc interior def"));
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Too small buffer, truncated string */
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        memset(buf, -1, sizeof(buf));
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultSz = uregex_group(re, 0, buf, 5, &status);
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING("abc i", buf, FALSE);
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(buf[5] == (UChar)0xffff);
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(resultSz == (int32_t)strlen("abc interior def"));
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Output string just fits buffer, no NUL term. */
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultSz = uregex_group(re, 0, buf, (int32_t)strlen("abc interior def"), &status);
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING);
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING("abc interior def", buf, FALSE);
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(resultSz == (int32_t)strlen("abc interior def"));
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(buf[strlen("abc interior def")] == (UChar)0xffff);
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  Regions
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* SetRegion(), getRegion() do something  */
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_SETUP(".*", "0123456789ABCDEF", 0)
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar resultString[40];
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_regionStart(re, &status) == 0);
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_regionEnd(re, &status) == 16);
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setRegion(re, 3, 6, &status);
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_regionStart(re, &status) == 3);
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_regionEnd(re, &status) == 6);
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_findNext(re, &status));
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_group(re, 0, resultString, sizeof(resultString)/2, &status) == 3)
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING("345", resultString, TRUE);
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_TEARDOWN;
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* find(start=-1) uses regions   */
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_SETUP(".*", "0123456789ABCDEF", 0);
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setRegion(re, 4, 6, &status);
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_find(re, -1, &status) == TRUE);
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_start(re, 0, &status) == 4);
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_end(re, 0, &status) == 6);
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_TEARDOWN;
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* find (start >=0) does not use regions   */
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_SETUP(".*", "0123456789ABCDEF", 0);
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setRegion(re, 4, 6, &status);
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_find(re, 0, &status) == TRUE);
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_start(re, 0, &status) == 0);
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_end(re, 0, &status) == 16);
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_TEARDOWN;
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* findNext() obeys regions    */
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_SETUP(".", "0123456789ABCDEF", 0);
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setRegion(re, 4, 6, &status);
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_findNext(re,&status) == TRUE);
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_start(re, 0, &status) == 4);
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_findNext(re, &status) == TRUE);
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_start(re, 0, &status) == 5);
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_findNext(re, &status) == FALSE);
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_TEARDOWN;
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* matches(start=-1) uses regions                                           */
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*    Also, verify that non-greedy *? succeeds in finding the full match.   */
7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_SETUP(".*?", "0123456789ABCDEF", 0);
7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setRegion(re, 4, 6, &status);
7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_matches(re, -1, &status) == TRUE);
7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_start(re, 0, &status) == 4);
7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_end(re, 0, &status) == 6);
7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_TEARDOWN;
7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* matches (start >=0) does not use regions       */
7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_SETUP(".*?", "0123456789ABCDEF", 0);
7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setRegion(re, 4, 6, &status);
7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_matches(re, 0, &status) == TRUE);
7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_start(re, 0, &status) == 0);
7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_end(re, 0, &status) == 16);
7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_TEARDOWN;
7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* lookingAt(start=-1) uses regions                                         */
7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*    Also, verify that non-greedy *? finds the first (shortest) match.     */
7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_SETUP(".*?", "0123456789ABCDEF", 0);
7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setRegion(re, 4, 6, &status);
7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_lookingAt(re, -1, &status) == TRUE);
7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_start(re, 0, &status) == 4);
7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_end(re, 0, &status) == 4);
7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_TEARDOWN;
7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* lookingAt (start >=0) does not use regions  */
7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_SETUP(".*?", "0123456789ABCDEF", 0);
7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setRegion(re, 4, 6, &status);
7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_lookingAt(re, 0, &status) == TRUE);
7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_start(re, 0, &status) == 0);
7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_end(re, 0, &status) == 0);
7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_TEARDOWN;
7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* hitEnd()       */
7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_SETUP("[a-f]*", "abcdefghij", 0);
7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_find(re, 0, &status) == TRUE);
7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_hitEnd(re, &status) == FALSE);
7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_TEARDOWN;
7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_SETUP("[a-f]*", "abcdef", 0);
7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_find(re, 0, &status) == TRUE);
7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_hitEnd(re, &status) == TRUE);
7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_TEARDOWN;
7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* requireEnd   */
7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_SETUP("abcd", "abcd", 0);
7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_find(re, 0, &status) == TRUE);
7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_requireEnd(re, &status) == FALSE);
7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_TEARDOWN;
7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_SETUP("abcd$", "abcd", 0);
7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_find(re, 0, &status) == TRUE);
7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_requireEnd(re, &status) == TRUE);
7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_TEARDOWN;
7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* anchoringBounds        */
7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_SETUP("abc$", "abcdef", 0);
7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_hasAnchoringBounds(re, &status) == TRUE);
7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_useAnchoringBounds(re, FALSE, &status);
7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_hasAnchoringBounds(re, &status) == FALSE);
7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_find(re, -1, &status) == FALSE);
7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_useAnchoringBounds(re, TRUE, &status);
7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setRegion(re, 0, 3, &status);
7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_find(re, -1, &status) == TRUE);
7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_end(re, 0, &status) == 3);
7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_TEARDOWN;
7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Transparent Bounds      */
7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_SETUP("abc(?=def)", "abcdef", 0);
7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_hasTransparentBounds(re, &status) == FALSE);
7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_useTransparentBounds(re, TRUE, &status);
7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_hasTransparentBounds(re, &status) == TRUE);
7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_useTransparentBounds(re, FALSE, &status);
8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_find(re, -1, &status) == TRUE);    /* No Region */
8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setRegion(re, 0, 3, &status);
8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_find(re, -1, &status) == FALSE);   /* with region, opaque bounds */
8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_useTransparentBounds(re, TRUE, &status);
8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_find(re, -1, &status) == TRUE);    /* with region, transparent bounds */
8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_end(re, 0, &status) == 3);
8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_TEARDOWN;
8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  replaceFirst()
8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    text1[80];
8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    text2[80];
8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    replText[80];
8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    buf[80];
8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  resultSz;
8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text1, "Replace xaax x1x x...x.",  sizeof(text1)/2);
8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text2, "No match here.",  sizeof(text2)/2);
8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(replText, "<$1>", sizeof(replText)/2);
8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC("x(.*?)x", 0, NULL, &status);
8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Normal case, with match */
8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text1, -1, &status);
8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultSz = uregex_replaceFirst(re, replText, -1, buf, sizeof(buf)/2, &status);
8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING("Replace <aa> x1x x...x.", buf, TRUE);
8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x."));
8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* No match.  Text should copy to output with no changes.  */
8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text2, -1, &status);
8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultSz = uregex_replaceFirst(re, replText, -1, buf, sizeof(buf)/2, &status);
8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING("No match here.", buf, TRUE);
8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(resultSz == (int32_t)strlen("No match here."));
8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Match, output just fills buffer, no termination warning. */
8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text1, -1, &status);
8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        memset(buf, -1, sizeof(buf));
8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultSz = uregex_replaceFirst(re, replText, -1, buf, strlen("Replace <aa> x1x x...x."), &status);
8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING);
8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING("Replace <aa> x1x x...x.", buf, FALSE);
8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x."));
8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(buf[resultSz] == (UChar)0xffff);
8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Do the replaceFirst again, without first resetting anything.
8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         *  Should give the same results.
8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        memset(buf, -1, sizeof(buf));
8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultSz = uregex_replaceFirst(re, replText, -1, buf, strlen("Replace <aa> x1x x...x."), &status);
8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING);
8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING("Replace <aa> x1x x...x.", buf, FALSE);
8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x."));
8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(buf[resultSz] == (UChar)0xffff);
8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* NULL buffer, zero buffer length */
8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultSz = uregex_replaceFirst(re, replText, -1, NULL, 0, &status);
8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x."));
8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Buffer too small by one */
8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        memset(buf, -1, sizeof(buf));
8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultSz = uregex_replaceFirst(re, replText, -1, buf, strlen("Replace <aa> x1x x...x.")-1, &status);
8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING("Replace <aa> x1x x...x", buf, FALSE);
8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x."));
8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(buf[resultSz] == (UChar)0xffff);
8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  replaceAll()
8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    text1[80];          /*  "Replace xaax x1x x...x." */
8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    text2[80];          /*  "No match Here"           */
8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    replText[80];       /*  "<$1>"                    */
8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    replText2[80];      /*  "<<$1>>"                  */
8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char * pattern = "x(.*?)x";
8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char * expectedResult = "Replace <aa> <1> <...>.";
8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char * expectedResult2 = "Replace <<aa>> <<1>> <<...>>.";
8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    buf[80];
8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  resultSize;
8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  expectedResultSize;
8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  expectedResultSize2;
8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  i;
8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text1, "Replace xaax x1x x...x.",  sizeof(text1)/2);
9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text2, "No match here.",  sizeof(text2)/2);
9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(replText, "<$1>", sizeof(replText)/2);
9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(replText2, "<<$1>>", sizeof(replText2)/2);
9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        expectedResultSize = strlen(expectedResult);
9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        expectedResultSize2 = strlen(expectedResult2);
9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC(pattern, 0, NULL, &status);
9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Normal case, with match */
9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text1, -1, &status);
9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultSize = uregex_replaceAll(re, replText, -1, buf, sizeof(buf)/2, &status);
9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING(expectedResult, buf, TRUE);
9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(resultSize == expectedResultSize);
9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* No match.  Text should copy to output with no changes.  */
9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text2, -1, &status);
9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultSize = uregex_replaceAll(re, replText, -1, buf, sizeof(buf)/2, &status);
9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING("No match here.", buf, TRUE);
9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(resultSize == u_strlen(text2));
9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Match, output just fills buffer, no termination warning. */
9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text1, -1, &status);
9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        memset(buf, -1, sizeof(buf));
9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultSize = uregex_replaceAll(re, replText, -1, buf, expectedResultSize, &status);
9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING);
9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING(expectedResult, buf, FALSE);
9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(resultSize == expectedResultSize);
9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(buf[resultSize] == (UChar)0xffff);
9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Do the replaceFirst again, without first resetting anything.
9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         *  Should give the same results.
9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        memset(buf, -1, sizeof(buf));
9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultSize = uregex_replaceAll(re, replText, -1, buf, strlen("Replace xaax x1x x...x."), &status);
9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING);
9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING("Replace <aa> <1> <...>.", buf, FALSE);
9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(resultSize == (int32_t)strlen("Replace <aa> <1> <...>."));
9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(buf[resultSize] == (UChar)0xffff);
9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* NULL buffer, zero buffer length */
9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultSize = uregex_replaceAll(re, replText, -1, NULL, 0, &status);
9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(resultSize == (int32_t)strlen("Replace <aa> <1> <...>."));
9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Buffer too small.  Try every size, which will tickle edge cases
9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * in uregex_appendReplacement (used by replaceAll)   */
9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i=0; i<expectedResultSize; i++) {
9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            char  expected[80];
9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            status = U_ZERO_ERROR;
9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            memset(buf, -1, sizeof(buf));
9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            resultSize = uregex_replaceAll(re, replText, -1, buf, i, &status);
9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            strcpy(expected, expectedResult);
9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            expected[i] = 0;
9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_STRING(expected, buf, FALSE);
9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(resultSize == expectedResultSize);
9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(buf[i] == (UChar)0xffff);
9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Buffer too small.  Same as previous test, except this time the replacement
9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * text is longer than the match capture group, making the length of the complete
9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * replacement longer than the original string.
9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i=0; i<expectedResultSize2; i++) {
9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            char  expected[80];
9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            status = U_ZERO_ERROR;
9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            memset(buf, -1, sizeof(buf));
9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            resultSize = uregex_replaceAll(re, replText2, -1, buf, i, &status);
9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            strcpy(expected, expectedResult2);
9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            expected[i] = 0;
9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_STRING(expected, buf, FALSE);
9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(resultSize == expectedResultSize2);
9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(buf[i] == (UChar)0xffff);
9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  appendReplacement()
9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    text[100];
9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    repl[100];
9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    buf[100];
9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar   *bufPtr;
9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  bufCap;
9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC(".*", 0, 0, &status);
10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text, "whatever",  sizeof(text)/2);
10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(repl, "some other", sizeof(repl)/2);
10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text, -1, &status);
10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* match covers whole target string */
10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_find(re, 0, &status);
10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        bufPtr = buf;
10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        bufCap = sizeof(buf) / 2;
10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_appendReplacement(re, repl, -1, &bufPtr, &bufCap, &status);
10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING("some other", buf, TRUE);
10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Match has \u \U escapes */
10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_find(re, 0, &status);
10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        bufPtr = buf;
10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        bufCap = sizeof(buf) / 2;
10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(repl, "abc\\u0041\\U00000042 \\\\ $ \\abc", sizeof(repl)/2);
10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_appendReplacement(re, repl, -1, &bufPtr, &bufCap, &status);
10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING("abcAB \\ $ abc", buf, TRUE);
10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Bug 6813, parameter check of NULL destCapacity; crashed before fix. */
10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_find(re, 0, &status);
10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        bufPtr = buf;
10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_BUFFER_OVERFLOW_ERROR;
10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_appendReplacement(re, repl, -1, &bufPtr, NULL, &status);
10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  appendTail().   Checked in ReplaceFirst(), replaceAll().
10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  split()
10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    textToSplit[80];
10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    text2[80];
10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    buf[200];
10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    *fields[10];
10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  numFields;
10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  requiredCapacity;
10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  spaceNeeded;
10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  sz;
10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(textToSplit, "first : second:  third",  sizeof(textToSplit)/2);
10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text2, "No match here.",  sizeof(text2)/2);
10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC(":", 0, NULL, &status);
10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Simple split */
10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, textToSplit, -1, &status);
10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The TEST_ASSERT_SUCCESS call above should change too... */
10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_SUCCESS(status)) {
10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            memset(fields, -1, sizeof(fields));
10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            numFields =
10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 10, &status);
10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_SUCCESS(status);
10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* The TEST_ASSERT_SUCCESS call above should change too... */
10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_SUCCESS(status)) {
10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(numFields == 3);
10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_STRING("first ",  fields[0], TRUE);
10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_STRING(" second", fields[1], TRUE);
10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_STRING("  third", fields[2], TRUE);
10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(fields[3] == NULL);
10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                spaceNeeded = u_strlen(textToSplit) -
10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            (numFields - 1)  +  /* Field delimiters do not appear in output */
10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            numFields;          /* Each field gets a NUL terminator */
10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(spaceNeeded == requiredCapacity);
10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Split with too few output strings available */
10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC(":", 0, NULL, &status);
10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, textToSplit, -1, &status);
10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The TEST_ASSERT_SUCCESS call above should change too... */
11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_SUCCESS(status)) {
11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            memset(fields, -1, sizeof(fields));
11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            numFields =
11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 2, &status);
11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_SUCCESS(status);
11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* The TEST_ASSERT_SUCCESS call above should change too... */
11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_SUCCESS(status)) {
11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(numFields == 2);
11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_STRING("first ",  fields[0], TRUE);
11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_STRING(" second:  third", fields[1], TRUE);
11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(!memcmp(&fields[2],&minus1,sizeof(UChar*)));
11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                spaceNeeded = u_strlen(textToSplit) -
11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            (numFields - 1)  +  /* Field delimiters do not appear in output */
11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            numFields;          /* Each field gets a NUL terminator */
11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(spaceNeeded == requiredCapacity);
11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* Split with a range of output buffer sizes.  */
11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                spaceNeeded = u_strlen(textToSplit) -
11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    (numFields - 1)  +  /* Field delimiters do not appear in output */
11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    numFields;          /* Each field gets a NUL terminator */
11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                for (sz=0; sz < spaceNeeded+1; sz++) {
11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    memset(fields, -1, sizeof(fields));
11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    status = U_ZERO_ERROR;
11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    numFields =
11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        uregex_split(re, buf, sz, &requiredCapacity, fields, 10, &status);
11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (sz >= spaceNeeded) {
11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        TEST_ASSERT_SUCCESS(status);
11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        TEST_ASSERT_STRING("first ",  fields[0], TRUE);
11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        TEST_ASSERT_STRING(" second", fields[1], TRUE);
11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        TEST_ASSERT_STRING("  third", fields[2], TRUE);
11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    } else {
11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR);
11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    TEST_ASSERT(numFields == 3);
11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    TEST_ASSERT(fields[3] == NULL);
11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    TEST_ASSERT(spaceNeeded == requiredCapacity);
11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Split(), part 2.  Patterns with capture groups.  The capture group text
11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                   comes out as additional fields.  */
11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    textToSplit[80];
11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    buf[200];
11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    *fields[10];
11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  numFields;
11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  requiredCapacity;
11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  spaceNeeded;
11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  sz;
11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(textToSplit, "first <tag-a> second<tag-b>  third",  sizeof(textToSplit)/2);
11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC("<(.*?)>", 0, NULL, &status);
11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, textToSplit, -1, &status);
11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The TEST_ASSERT_SUCCESS call above should change too... */
11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_SUCCESS(status)) {
11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            memset(fields, -1, sizeof(fields));
11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            numFields =
11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 10, &status);
11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_SUCCESS(status);
11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* The TEST_ASSERT_SUCCESS call above should change too... */
11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_SUCCESS(status)) {
11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(numFields == 5);
11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_STRING("first ",  fields[0], TRUE);
11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_STRING("tag-a",   fields[1], TRUE);
11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_STRING(" second", fields[2], TRUE);
11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_STRING("tag-b",   fields[3], TRUE);
11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_STRING("  third", fields[4], TRUE);
11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(fields[5] == NULL);
11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                spaceNeeded = strlen("first .tag-a. second.tag-b.  third.");  /* "." at NUL positions */
11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(spaceNeeded == requiredCapacity);
11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Split with too few output strings available (2) */
11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        memset(fields, -1, sizeof(fields));
11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numFields =
11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 2, &status);
11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The TEST_ASSERT_SUCCESS call above should change too... */
12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_SUCCESS(status)) {
12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(numFields == 2);
12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_STRING("first ",  fields[0], TRUE);
12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_STRING(" second<tag-b>  third", fields[1], TRUE);
12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(!memcmp(&fields[2],&minus1,sizeof(UChar*)));
12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            spaceNeeded = strlen("first . second<tag-b>  third.");  /* "." at NUL positions */
12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(spaceNeeded == requiredCapacity);
12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Split with too few output strings available (3) */
12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        memset(fields, -1, sizeof(fields));
12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numFields =
12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 3, &status);
12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The TEST_ASSERT_SUCCESS call above should change too... */
12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_SUCCESS(status)) {
12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(numFields == 3);
12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_STRING("first ",  fields[0], TRUE);
12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_STRING("tag-a",   fields[1], TRUE);
12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_STRING(" second<tag-b>  third", fields[2], TRUE);
12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(!memcmp(&fields[3],&minus1,sizeof(UChar*)));
12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            spaceNeeded = strlen("first .tag-a. second<tag-b>  third.");  /* "." at NUL positions */
12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(spaceNeeded == requiredCapacity);
12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Split with just enough output strings available (5) */
12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        memset(fields, -1, sizeof(fields));
12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numFields =
12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 5, &status);
12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The TEST_ASSERT_SUCCESS call above should change too... */
12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_SUCCESS(status)) {
12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(numFields == 5);
12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_STRING("first ",  fields[0], TRUE);
12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_STRING("tag-a",   fields[1], TRUE);
12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_STRING(" second", fields[2], TRUE);
12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_STRING("tag-b",   fields[3], TRUE);
12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_STRING("  third", fields[4], TRUE);
12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(!memcmp(&fields[5],&minus1,sizeof(UChar*)));
12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            spaceNeeded = strlen("first .tag-a. second.tag-b.  third.");  /* "." at NUL positions */
12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(spaceNeeded == requiredCapacity);
12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Split, end of text is a field delimiter.   */
12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        sz = strlen("first <tag-a> second<tag-b>");
12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, textToSplit, sz, &status);
12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The TEST_ASSERT_SUCCESS call above should change too... */
12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_SUCCESS(status)) {
12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            memset(fields, -1, sizeof(fields));
12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            numFields =
12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 9, &status);
12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_SUCCESS(status);
12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* The TEST_ASSERT_SUCCESS call above should change too... */
12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_SUCCESS(status)) {
12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(numFields == 5);
12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_STRING("first ",  fields[0], TRUE);
12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_STRING("tag-a",   fields[1], TRUE);
12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_STRING(" second", fields[2], TRUE);
12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_STRING("tag-b",   fields[3], TRUE);
12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_STRING("",        fields[4], TRUE);
12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(fields[5] == NULL);
12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(fields[8] == NULL);
12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(!memcmp(&fields[9],&minus1,sizeof(UChar*)));
12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                spaceNeeded = strlen("first .tag-a. second.tag-b..");  /* "." at NUL positions */
12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(spaceNeeded == requiredCapacity);
12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * set/getTimeLimit
12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_SETUP("abc$", "abcdef", 0);
12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT(uregex_getTimeLimit(re, &status) == 0);
12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     uregex_setTimeLimit(re, 1000, &status);
12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT(uregex_getTimeLimit(re, &status) == 1000);
12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT_SUCCESS(status);
12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     uregex_setTimeLimit(re, -1, &status);
12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT(status == U_ILLEGAL_ARGUMENT_ERROR);
12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     status = U_ZERO_ERROR;
12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT(uregex_getTimeLimit(re, &status) == 1000);
12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_TEARDOWN;
12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     /*
12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      * set/get Stack Limit
12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      */
12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_SETUP("abc$", "abcdef", 0);
13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT(uregex_getStackLimit(re, &status) == 8000000);
13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     uregex_setStackLimit(re, 40000, &status);
13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT(uregex_getStackLimit(re, &status) == 40000);
13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT_SUCCESS(status);
13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     uregex_setStackLimit(re, -1, &status);
13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT(status == U_ILLEGAL_ARGUMENT_ERROR);
13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     status = U_ZERO_ERROR;
13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT(uregex_getStackLimit(re, &status) == 40000);
13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_TEARDOWN;
13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     /*
13126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      * Get/Set callback functions
13136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      *     This test is copied from intltest regex/Callbacks
13146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      *     The pattern and test data will run long enough to cause the callback
13156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      *       to be invoked.  The nested '+' operators give exponential time
13166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      *       behavior with increasing string length.
13176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      */
13186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_SETUP("((.)+\\2)+x", "aaaaaaaaaaaaaaaaaaab", 0)
13196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     callBackContext cbInfo = {4, 0, 0};
13206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     const void     *pContext   = &cbInfo;
13216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     URegexMatchCallback    *returnedFn = &TestCallbackFn;
13226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     /*  Getting the callback fn when it hasn't been set must return NULL  */
13246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     uregex_getMatchCallback(re, &returnedFn, &pContext, &status);
13256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT_SUCCESS(status);
13266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT(returnedFn == NULL);
13276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT(pContext == NULL);
13286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     /* Set thecallback and do a match.                                   */
13306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     /* The callback function should record that it has been called.      */
13316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     uregex_setMatchCallback(re, &TestCallbackFn, &cbInfo, &status);
13326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT_SUCCESS(status);
13336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT(cbInfo.numCalls == 0);
13346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT(uregex_matches(re, -1, &status) == FALSE);
13356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT_SUCCESS(status);
13366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT(cbInfo.numCalls > 0);
13376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     /* Getting the callback should return the values that were set above.  */
13396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     uregex_getMatchCallback(re, &returnedFn, &pContext, &status);
13406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT(returnedFn == &TestCallbackFn);
13416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_ASSERT(pContext == &cbInfo);
13426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     TEST_TEARDOWN;
13446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBug4315(void) {
13496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode      theICUError = U_ZERO_ERROR;
13506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    URegularExpression *theRegEx;
13516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar           *textBuff;
13526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char      *thePattern;
13536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar            theString[100];
13546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar           *destFields[24];
13556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t         neededLength1;
13566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t         neededLength2;
13576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t         wordCount = 0;
13596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t         destFieldsSize = 24;
13606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    thePattern  = "ck ";
13626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrcpy(theString, "The quick brown fox jumped over the slow black turtle.");
13636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* open a regex */
13656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    theRegEx = uregex_openC(thePattern, 0, NULL, &theICUError);
13666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(theICUError);
13676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* set the input string */
13696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uregex_setText(theRegEx, theString, u_strlen(theString), &theICUError);
13706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(theICUError);
13716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* split */
13736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*explicitly pass NULL and 0 to force the overflow error -> this is where the
13746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  error occurs! */
13756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    wordCount = uregex_split(theRegEx, NULL, 0, &neededLength1, destFields,
13766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        destFieldsSize, &theICUError);
13776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(theICUError == U_BUFFER_OVERFLOW_ERROR);
13796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(wordCount==3);
13806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(theICUError == U_BUFFER_OVERFLOW_ERROR)
13826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
13836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        theICUError = U_ZERO_ERROR;
13846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        textBuff = (UChar *) malloc(sizeof(UChar) * (neededLength1 + 1));
13856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        wordCount = uregex_split(theRegEx, textBuff, neededLength1+1, &neededLength2,
13866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            destFields, destFieldsSize, &theICUError);
13876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(wordCount==3);
13886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(theICUError);
13896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(neededLength1 == neededLength2);
13906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING("The qui", destFields[0], TRUE);
13916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING("brown fox jumped over the slow bla", destFields[1], TRUE);
13926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING("turtle.", destFields[2], TRUE);
13936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(destFields[3] == NULL);
13946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        free(textBuff);
13956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uregex_close(theRegEx);
13976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Based on TestRegexCAPI() */
14006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestUTextAPI(void) {
14016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode           status = U_ZERO_ERROR;
14026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    URegularExpression  *re;
14036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UText                patternText = UTEXT_INITIALIZER;
14046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar                pat[200];
14056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char           patternTextUTF8[5] = { 0x61, 0x62, 0x63, 0x2a, 0x00 };
14066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Mimimalist open/close */
14086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    utext_openUTF8(&patternText, patternTextUTF8, -1, &status);
14096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    re = uregex_openUText(&patternText, 0, 0, &status);
14106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
14116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         log_data_err("Failed to open regular expression, %s:%d, error is \"%s\" (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status));
14126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         utext_close(&patternText);
14136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         return;
14146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uregex_close(re);
14166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Open with all flag values set */
14186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
14196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    re = uregex_openUText(&patternText,
14206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UREGEX_CASE_INSENSITIVE | UREGEX_COMMENTS | UREGEX_DOTALL | UREGEX_MULTILINE | UREGEX_UWORD,
14216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        0, &status);
14226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(status);
14236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uregex_close(re);
14246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Open with an invalid flag */
14266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
14276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    re = uregex_openUText(&patternText, 0x40000000, 0, &status);
14286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(status == U_REGEX_INVALID_FLAG);
14296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uregex_close(re);
14306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* open with an invalid parameter */
14326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
14336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    re = uregex_openUText(NULL,
14346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UREGEX_CASE_INSENSITIVE | UREGEX_COMMENTS | UREGEX_DOTALL | UREGEX_MULTILINE | UREGEX_UWORD, 0, &status);
14356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(status == U_ILLEGAL_ARGUMENT_ERROR && re == NULL);
14366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
14386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  clone
14396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
14406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
14416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        URegularExpression *clone1;
14426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        URegularExpression *clone2;
14436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        URegularExpression *clone3;
14446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar  testString1[30];
14456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar  testString2[30];
14466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBool  result;
14476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
14506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openUText(&patternText, 0, 0, &status);
14516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
14526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        clone1 = uregex_clone(re, &status);
14536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
14546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(clone1 != NULL);
14556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
14576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        clone2 = uregex_clone(re, &status);
14586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
14596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(clone2 != NULL);
14606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
14616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
14636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        clone3 = uregex_clone(clone2, &status);
14646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
14656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(clone3 != NULL);
14666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(testString1, "abcccd", sizeof(pat)/2);
14686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(testString2, "xxxabcccd", sizeof(pat)/2);
14696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
14716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(clone1, testString1, -1, &status);
14726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
14736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_lookingAt(clone1, 0, &status);
14746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
14756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result==TRUE);
14766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
14786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(clone2, testString2, -1, &status);
14796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
14806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_lookingAt(clone2, 0, &status);
14816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
14826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result==FALSE);
14836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_find(clone2, 0, &status);
14846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
14856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result==TRUE);
14866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(clone1);
14886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(clone2);
14896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(clone3);
14906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
14946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  pattern() and patternText()
14956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
14966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
14976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar  *resultPat;
14986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t       resultLen;
14996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UText        *resultText;
15006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char str_hello[] = { 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00 }; /* hello */
15016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char str_hel[] = { 0x68, 0x65, 0x6c, 0x00 }; /* hel */
15026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(pat, "hello", sizeof(pat)/2); /* for comparison */
15036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
15046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_openUTF8(&patternText, str_hello, -1, &status);
15066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_open(pat, -1, 0, NULL, &status);
15076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultPat = uregex_pattern(re, &resultLen, &status);
15086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
15096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The TEST_ASSERT_SUCCESS above should change too... */
15116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_SUCCESS(status)) {
15126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(resultLen == -1);
15136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(u_strcmp(resultPat, pat) == 0);
15146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
15156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultText = uregex_patternUText(re, &status);
15176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
15186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_UTEXT(str_hello, resultText);
15196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
15216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
15236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_open(pat, 3, 0, NULL, &status);
15246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultPat = uregex_pattern(re, &resultLen, &status);
15256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
15266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The TEST_ASSERT_SUCCESS above should change too... */
15286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_SUCCESS(status)) {
15296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(resultLen == 3);
15306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(u_strncmp(resultPat, pat, 3) == 0);
15316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(u_strlen(resultPat) == 3);
15326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
15336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultText = uregex_patternUText(re, &status);
15356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
15366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_UTEXT(str_hel, resultText);
15376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
15396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
15426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  setUText() and lookingAt()
15436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
15446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
15456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UText  text1 = UTEXT_INITIALIZER;
15466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UText  text2 = UTEXT_INITIALIZER;
15476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBool  result;
15486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char str_abcccd[] = { 0x62, 0x63, 0x64, 0x64, 0x64, 0x65, 0x00 }; /* abcccd */
15496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char str_abcccxd[] = { 0x62, 0x63, 0x64, 0x64, 0x64, 0x79, 0x65, 0x00 }; /* abcccxd */
15506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char str_abcd[] = { 0x62, 0x63, 0x64, 0x2b, 0x65, 0x00 }; /* abc*d */
15516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
15526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_openUTF8(&text1, str_abcccd, -1, &status);
15536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_openUTF8(&text2, str_abcccxd, -1, &status);
15546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_openUTF8(&patternText, str_abcd, -1, &status);
15566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openUText(&patternText, 0, NULL, &status);
15576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
15586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Operation before doing a setText should fail... */
15606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
15616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_lookingAt(re, 0, &status);
15626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT( status== U_REGEX_INVALID_STATE);
15636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
15656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setUText(re, &text1, &status);
15666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_lookingAt(re, 0, &status);
15676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == TRUE);
15686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
15696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
15716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setUText(re, &text2, &status);
15726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_lookingAt(re, 0, &status);
15736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == FALSE);
15746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
15756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
15776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setUText(re, &text1, &status);
15786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_lookingAt(re, 0, &status);
15796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == TRUE);
15806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
15816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
15836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(&text1);
15846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(&text2);
15856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
15896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  getText() and getUText()
15906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
15916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
15926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UText  text1 = UTEXT_INITIALIZER;
15936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UText  text2 = UTEXT_INITIALIZER;
15946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar  text2Chars[20];
15956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UText  *resultText;
15966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const UChar   *result;
15976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  textLength;
15986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char str_abcccd[] = { 0x62, 0x63, 0x64, 0x64, 0x64, 0x65, 0x00 }; /* abcccd */
15996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char str_abcccxd[] = { 0x62, 0x63, 0x64, 0x64, 0x64, 0x79, 0x65, 0x00 }; /* abcccxd */
16006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char str_abcd[] = { 0x62, 0x63, 0x64, 0x2b, 0x65, 0x00 }; /* abc*d */
16016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
16046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_openUTF8(&text1, str_abcccd, -1, &status);
16056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text2Chars, str_abcccxd, sizeof(text2)/2);
16066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_openUChars(&text2, text2Chars, -1, &status);
16076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_openUTF8(&patternText, str_abcd, -1, &status);
16096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openUText(&patternText, 0, NULL, &status);
16106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* First set a UText */
16126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setUText(re, &text1, &status);
16136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultText = uregex_getUText(re, NULL, &status);
16146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
16156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(resultText != &text1);
16166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_setNativeIndex(resultText, 0);
16176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_setNativeIndex(&text1, 0);
16186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(testUTextEqual(resultText, &text1));
16196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(resultText);
16206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_getText(re, &textLength, &status); /* flattens UText into buffer */
16226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (void)result;    /* Suppress set but not used warning. */
16236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(textLength == -1 || textLength == 6);
16246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultText = uregex_getUText(re, NULL, &status);
16256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
16266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(resultText != &text1);
16276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_setNativeIndex(resultText, 0);
16286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_setNativeIndex(&text1, 0);
16296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(testUTextEqual(resultText, &text1));
16306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(resultText);
16316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Then set a UChar * */
16336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text2Chars, 7, &status);
16346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultText = uregex_getUText(re, NULL, &status);
16356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
16366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_setNativeIndex(resultText, 0);
16376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_setNativeIndex(&text2, 0);
16386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(testUTextEqual(resultText, &text2));
16396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(resultText);
16406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_getText(re, &textLength, &status);
16416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(textLength == 7);
16426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
16446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(&text1);
16456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(&text2);
16466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
16496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  matches()
16506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
16516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
16526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UText   text1 = UTEXT_INITIALIZER;
16536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBool   result;
16546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UText   nullText = UTEXT_INITIALIZER;
16556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char str_abcccde[] = { 0x61, 0x62, 0x63, 0x63, 0x63, 0x64, 0x65, 0x00 }; /* abcccde */
16566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char str_abcd[] = { 0x61, 0x62, 0x63, 0x2a, 0x64, 0x00 }; /* abc*d */
16576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
16596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_openUTF8(&text1, str_abcccde, -1, &status);
16606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_openUTF8(&patternText, str_abcd, -1, &status);
16616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openUText(&patternText, 0, NULL, &status);
16626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setUText(re, &text1, &status);
16646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_matches(re, 0, &status);
16656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == FALSE);
16666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
16676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
16686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
16706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC(".?", 0, NULL, &status);
16716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setUText(re, &text1, &status);
16726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_matches(re, 7, &status);
16736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == TRUE);
16746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
16756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
16776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_openUTF8(&nullText, "", -1, &status);
16786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setUText(re, &nullText, &status);
16796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
16806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_matches(re, 0, &status);
16816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == TRUE);
16826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
16836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
16856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(&text1);
16866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(&nullText);
16876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
16916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  lookingAt()    Used in setText test.
16926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
16936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
16966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  find(), findNext, start, end, reset
16976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
16986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
16996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    text1[50];
17006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBool    result;
17016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text1, "012rx5rx890rxrx...",  sizeof(text1)/2);
17026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
17036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC("rx", 0, NULL, &status);
17046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text1, -1, &status);
17066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_find(re, 0, &status);
17076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == TRUE);
17086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_start(re, 0, &status) == 3);
17096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_end(re, 0, &status) == 5);
17106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
17116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_find(re, 9, &status);
17136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == TRUE);
17146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_start(re, 0, &status) == 11);
17156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_end(re, 0, &status) == 13);
17166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
17176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_find(re, 14, &status);
17196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == FALSE);
17206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
17216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
17236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_reset(re, 0, &status);
17246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_findNext(re, &status);
17266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == TRUE);
17276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_start(re, 0, &status) == 3);
17286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_end(re, 0, &status) == 5);
17296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
17306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_findNext(re, &status);
17326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == TRUE);
17336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_start(re, 0, &status) == 6);
17346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_end(re, 0, &status) == 8);
17356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
17366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
17386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_reset(re, 12, &status);
17396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_findNext(re, &status);
17416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == TRUE);
17426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_start(re, 0, &status) == 13);
17436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(uregex_end(re, 0, &status) == 15);
17446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
17456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_findNext(re, &status);
17476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result == FALSE);
17486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
17496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
17516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
17546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  group()
17556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
17566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
17576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    text1[80];
17586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UText   *actual;
17596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBool    result;
17606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char str_abcinteriordef[] = { 0x61, 0x62, 0x63, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x66, 0x00 }; /* abc interior def */
17626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char str_interior[] = { 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x00 }; /* ' interior ' */
17636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text1, "noise abc interior def, and this is off the end",  sizeof(text1)/2);
17666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
17686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC("abc(.*?)def", 0, NULL, &status);
17696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
17706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text1, -1, &status);
17726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_find(re, 0, &status);
17736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(result==TRUE);
17746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Capture Group 0, the full match.  Should succeed.  */
17766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
17776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        actual = uregex_groupUTextDeep(re, 0, NULL, &status);
17786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
17796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_UTEXT(str_abcinteriordef, actual);
17806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(actual);
17816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Capture Group 0 with shallow clone API.  Should succeed.  */
17836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
17846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
17856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int64_t      group_len;
17866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t      len16;
17876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UErrorCode   shallowStatus = U_ZERO_ERROR;
17886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int64_t      nativeIndex;
17896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UChar *groupChars;
17906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UText groupText = UTEXT_INITIALIZER;
17916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            actual = uregex_groupUText(re, 0, NULL, &group_len, &status);
17936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_SUCCESS(status);
17946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            nativeIndex = utext_getNativeIndex(actual);
17966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /*  Following returns U_INDEX_OUTOFBOUNDS_ERROR... looks like a bug in ucstrFuncs UTextFuncs [utext.cpp]  */
17976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /*  len16 = utext_extract(actual, nativeIndex, nativeIndex + group_len, NULL, 0, &shallowStatus);  */
17986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            len16 = (int32_t)group_len;
17996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            groupChars = (UChar *)malloc(sizeof(UChar)*(len16+1));
18016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            utext_extract(actual, nativeIndex, nativeIndex + group_len, groupChars, len16+1, &shallowStatus);
18026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            utext_openUChars(&groupText, groupChars, len16, &shallowStatus);
18046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_UTEXT(str_abcinteriordef, &groupText);
18066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            utext_close(&groupText);
18076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            free(groupChars);
18086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
18096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(actual);
18106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Capture group #1.  Should succeed. */
18126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
18136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        actual = uregex_groupUTextDeep(re, 1, NULL, &status);
18146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
18156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_UTEXT(str_interior, actual);
18166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(actual);
18176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Capture group out of range.  Error. */
18196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
18206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        actual = uregex_groupUTextDeep(re, 2, NULL, &status);
18216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(status == U_INDEX_OUTOFBOUNDS_ERROR);
18226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT(utext_nativeLength(actual) == 0);
18236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(actual);
18246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
18266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
18306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  replaceFirst()
18316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
18326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
18336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    text1[80];
18346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    text2[80];
18356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UText    replText = UTEXT_INITIALIZER;
18366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UText   *result;
18376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        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. */
18386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char str_Nomatchhere[] = { 0x4e, 0x6f, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x68, 0x65, 0x72, 0x65, 0x2e, 0x00 }; /* No match here. */
18396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        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 */
18406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char str_1x[] = { 0x3c, 0x24, 0x31, 0x3e, 0x00 }; /* <$1> */
18416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        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. */
18426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
18436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text1, "Replace xaax x1x x...x.",  sizeof(text1)/2);
18446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text2, "No match here.",  sizeof(text2)/2);
18456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_openUTF8(&replText, str_1x, -1, &status);
18466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC("x(.*?)x", 0, NULL, &status);
18486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
18496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Normal case, with match */
18516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text1, -1, &status);
18526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_replaceFirstUText(re, &replText, NULL, &status);
18536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
18546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_UTEXT(str_Replxxx, result);
18556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(result);
18566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* No match.  Text should copy to output with no changes.  */
18586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text2, -1, &status);
18596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_replaceFirstUText(re, &replText, NULL, &status);
18606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
18616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_UTEXT(str_Nomatchhere, result);
18626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(result);
18636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Unicode escapes */
18656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text1, -1, &status);
18666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_openUTF8(&replText, str_u00411U00000042a, -1, &status);
18676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_replaceFirstUText(re, &replText, NULL, &status);
18686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
18696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_UTEXT(str_ReplaceAaaBax1xxx, result);
18706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(result);
18716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
18736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(&replText);
18746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
18786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  replaceAll()
18796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
18806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
18816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    text1[80];
18826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    text2[80];
18836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UText    replText = UTEXT_INITIALIZER;
18846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UText   *result;
18856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char str_1[] = { 0x3c, 0x24, 0x31, 0x3e, 0x00 }; /* <$1> */
18866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        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> <...>. */
18876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char str_Nomatchhere[] = { 0x4e, 0x6f, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x68, 0x65, 0x72, 0x65, 0x2e, 0x00 }; /* No match here. */
18886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
18896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text1, "Replace xaax x1x x...x.",  sizeof(text1)/2);
18906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text2, "No match here.",  sizeof(text2)/2);
18916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_openUTF8(&replText, str_1, -1, &status);
18926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC("x(.*?)x", 0, NULL, &status);
18946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
18956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Normal case, with match */
18976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text1, -1, &status);
18986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_replaceAllUText(re, &replText, NULL, &status);
18996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
19006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_UTEXT(str_Replaceaa1, result);
19016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(result);
19026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* No match.  Text should copy to output with no changes.  */
19046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text2, -1, &status);
19056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result = uregex_replaceAllUText(re, &replText, NULL, &status);
19066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
19076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_UTEXT(str_Nomatchhere, result);
19086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(result);
19096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
19116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        utext_close(&replText);
19126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
19166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  appendReplacement()
19176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
19186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
19196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    text[100];
19206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    repl[100];
19216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    buf[100];
19226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar   *bufPtr;
19236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  bufCap;
19246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
19266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC(".*", 0, 0, &status);
19276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
19286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text, "whatever",  sizeof(text)/2);
19306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(repl, "some other", sizeof(repl)/2);
19316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, text, -1, &status);
19326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* match covers whole target string */
19346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_find(re, 0, &status);
19356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
19366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        bufPtr = buf;
19376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        bufCap = sizeof(buf) / 2;
19386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_appendReplacement(re, repl, -1, &bufPtr, &bufCap, &status);
19396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
19406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING("some other", buf, TRUE);
19416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Match has \u \U escapes */
19436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_find(re, 0, &status);
19446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
19456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        bufPtr = buf;
19466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        bufCap = sizeof(buf) / 2;
19476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(repl, "abc\\u0041\\U00000042 \\\\ $ \\abc", sizeof(repl)/2);
19486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_appendReplacement(re, repl, -1, &bufPtr, &bufCap, &status);
19496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
19506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_STRING("abcAB \\ $ abc", buf, TRUE);
19516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
19536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
19576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  appendReplacement(), appendTail() checked in replaceFirst(), replaceAll().
19586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
19596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
19616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  splitUText()
19626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
19636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
19646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    textToSplit[80];
19656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    text2[80];
19666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UText    *fields[10];
19676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  numFields;
19686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t i;
19696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(textToSplit, "first : second:  third",  sizeof(textToSplit)/2);
19716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(text2, "No match here.",  sizeof(text2)/2);
19726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
19746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC(":", 0, NULL, &status);
19756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Simple split */
19786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, textToSplit, -1, &status);
19806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
19816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The TEST_ASSERT_SUCCESS call above should change too... */
19836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_SUCCESS(status)) {
19846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            memset(fields, 0, sizeof(fields));
19856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            numFields = uregex_splitUText(re, fields, 10, &status);
19866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_SUCCESS(status);
19876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* The TEST_ASSERT_SUCCESS call above should change too... */
19896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_SUCCESS(status)) {
19906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* 'first ' */
19916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              const char str_second[] = { 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x00 }; /* '  second' */
19926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              const char str_third[] = { 0x20, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x00 }; /* '  third' */
19936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(numFields == 3);
19946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_UTEXT(str_first,  fields[0]);
19956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_UTEXT(str_second, fields[1]);
19966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_UTEXT(str_third, fields[2]);
19976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(fields[3] == NULL);
19986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
19996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for(i = 0; i < numFields; i++) {
20006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                utext_close(fields[i]);
20016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
20026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
20036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
20056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Split with too few output strings available */
20086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
20096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC(":", 0, NULL, &status);
20106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, textToSplit, -1, &status);
20116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
20126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The TEST_ASSERT_SUCCESS call above should change too... */
20146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_SUCCESS(status)) {
20156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fields[0] = NULL;
20166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fields[1] = NULL;
20176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fields[2] = &patternText;
20186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            numFields = uregex_splitUText(re, fields, 2, &status);
20196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_SUCCESS(status);
20206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* The TEST_ASSERT_SUCCESS call above should change too... */
20226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_SUCCESS(status)) {
20236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* first  */
20246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const char str_secondthird[] = { 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x3a, 0x20, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x00 }; /*  second:  third */
20256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(numFields == 2);
20266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_UTEXT(str_first,  fields[0]);
20276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_UTEXT(str_secondthird, fields[1]);
20286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(fields[2] == &patternText);
20296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
20306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for(i = 0; i < numFields; i++) {
20316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                utext_close(fields[i]);
20326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
20336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
20346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
20366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* splitUText(), part 2.  Patterns with capture groups.  The capture group text
20396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                   comes out as additional fields.  */
20406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
20416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UChar    textToSplit[80];
20426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UText    *fields[10];
20436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t  numFields;
20446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t i;
20456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrncpy(textToSplit, "first <tag-a> second<tag-b>  third",  sizeof(textToSplit)/2);
20476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
20496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        re = uregex_openC("<(.*?)>", 0, NULL, &status);
20506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, textToSplit, -1, &status);
20526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
20536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The TEST_ASSERT_SUCCESS call above should change too... */
20556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_SUCCESS(status)) {
20566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            memset(fields, 0, sizeof(fields));
20576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            numFields = uregex_splitUText(re, fields, 10, &status);
20586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_SUCCESS(status);
20596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* The TEST_ASSERT_SUCCESS call above should change too... */
20616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_SUCCESS(status)) {
20626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* first  */
20636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const char str_taga[] = { 0x74, 0x61, 0x67, 0x2d, 0x61, 0x00 }; /* tag-a */
20646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const char str_second[] = { 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x00 }; /*  second */
20656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const char str_tagb[] = { 0x74, 0x61, 0x67, 0x2d, 0x62, 0x00 }; /* tag-b */
20666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const char str_third[] = { 0x20, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x00 }; /*   third */
20676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(numFields == 5);
20696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_UTEXT(str_first,  fields[0]);
20706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_UTEXT(str_taga,   fields[1]);
20716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_UTEXT(str_second, fields[2]);
20726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_UTEXT(str_tagb,   fields[3]);
20736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_UTEXT(str_third, fields[4]);
20746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(fields[5] == NULL);
20756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
20766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for(i = 0; i < numFields; i++) {
20776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                utext_close(fields[i]);
20786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
20796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
20806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Split with too few output strings available (2) */
20826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
20836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fields[0] = NULL;
20846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fields[1] = NULL;
20856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fields[2] = &patternText;
20866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numFields = uregex_splitUText(re, fields, 2, &status);
20876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
20886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The TEST_ASSERT_SUCCESS call above should change too... */
20906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_SUCCESS(status)) {
20916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* first  */
20926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            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 */
20936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(numFields == 2);
20946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_UTEXT(str_first,  fields[0]);
20956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_UTEXT(str_secondtagbthird, fields[1]);
20966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(fields[2] == &patternText);
20976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
20986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(i = 0; i < numFields; i++) {
20996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            utext_close(fields[i]);
21006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Split with too few output strings available (3) */
21046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
21056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fields[0] = NULL;
21066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fields[1] = NULL;
21076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fields[2] = NULL;
21086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fields[3] = &patternText;
21096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numFields = uregex_splitUText(re, fields, 3, &status);
21106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
21116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The TEST_ASSERT_SUCCESS call above should change too... */
21136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_SUCCESS(status)) {
21146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* first  */
21156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const char str_taga[] = { 0x74, 0x61, 0x67, 0x2d, 0x61, 0x00 }; /* tag-a */
21166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            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 */
21176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(numFields == 3);
21186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_UTEXT(str_first,  fields[0]);
21196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_UTEXT(str_taga,   fields[1]);
21206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_UTEXT(str_secondtagbthird, fields[2]);
21216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(fields[3] == &patternText);
21226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(i = 0; i < numFields; i++) {
21246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            utext_close(fields[i]);
21256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*  Split with just enough output strings available (5) */
21286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
21296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fields[0] = NULL;
21306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fields[1] = NULL;
21316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fields[2] = NULL;
21326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fields[3] = NULL;
21336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fields[4] = NULL;
21346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fields[5] = &patternText;
21356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        numFields = uregex_splitUText(re, fields, 5, &status);
21366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
21376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The TEST_ASSERT_SUCCESS call above should change too... */
21396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_SUCCESS(status)) {
21406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* first  */
21416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const char str_taga[] = { 0x74, 0x61, 0x67, 0x2d, 0x61, 0x00 }; /* tag-a */
21426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const char str_second[] = { 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x00 }; /*  second */
21436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const char str_tagb[] = { 0x74, 0x61, 0x67, 0x2d, 0x62, 0x00 }; /* tag-b */
21446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const char str_third[] = { 0x20, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x00 }; /*   third */
21456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(numFields == 5);
21476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_UTEXT(str_first,  fields[0]);
21486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_UTEXT(str_taga,   fields[1]);
21496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_UTEXT(str_second, fields[2]);
21506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_UTEXT(str_tagb,   fields[3]);
21516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_UTEXT(str_third, fields[4]);
21526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT(fields[5] == &patternText);
21536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for(i = 0; i < numFields; i++) {
21556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            utext_close(fields[i]);
21566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* Split, end of text is a field delimiter.   */
21596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
21606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_setText(re, textToSplit, strlen("first <tag-a> second<tag-b>"), &status);
21616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TEST_ASSERT_SUCCESS(status);
21626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* The TEST_ASSERT_SUCCESS call above should change too... */
21646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_SUCCESS(status)) {
21656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            memset(fields, 0, sizeof(fields));
21666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fields[9] = &patternText;
21676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            numFields = uregex_splitUText(re, fields, 9, &status);
21686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            TEST_ASSERT_SUCCESS(status);
21696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* The TEST_ASSERT_SUCCESS call above should change too... */
21716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_SUCCESS(status)) {
21726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* first  */
21736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const char str_taga[] = { 0x74, 0x61, 0x67, 0x2d, 0x61, 0x00 }; /* tag-a */
21746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const char str_second[] = { 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x00 }; /*  second */
21756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const char str_tagb[] = { 0x74, 0x61, 0x67, 0x2d, 0x62, 0x00 }; /* tag-b */
21766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const char str_empty[] = { 0x00 };
21776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(numFields == 5);
21796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_UTEXT(str_first,  fields[0]);
21806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_UTEXT(str_taga,   fields[1]);
21816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_UTEXT(str_second, fields[2]);
21826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_UTEXT(str_tagb,   fields[3]);
21836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT_UTEXT(str_empty,  fields[4]);
21846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(fields[5] == NULL);
21856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(fields[8] == NULL);
21866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                TEST_ASSERT(fields[9] == &patternText);
21876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
21886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for(i = 0; i < numFields; i++) {
21896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                utext_close(fields[i]);
21906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
21916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uregex_close(re);
21946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    utext_close(&patternText);
21966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
21976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestRefreshInput(void) {
22006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
22016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  RefreshInput changes out the input of a URegularExpression without
22026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *    changing anything else in the match state.  Used with Java JNI,
22036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *    when Java moves the underlying string storage.   This test
22046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *    runs a find() loop, moving the text after the first match.
22056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *    The right number of matches should still be found.
22066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
22076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar testStr[]  = {0x41, 0x20, 0x42, 0x20, 0x43, 0x0};  /* = "A B C"  */
22086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar movedStr[] = {   0,    0,    0,    0,    0,   0};
22096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
22106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    URegularExpression *re;
22116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UText ut1 = UTEXT_INITIALIZER;
22126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UText ut2 = UTEXT_INITIALIZER;
22136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    re = uregex_openC("[ABC]", 0, 0, &status);
22156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(status);
22166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    utext_openUChars(&ut1, testStr, -1, &status);
22186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(status);
22196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uregex_setUText(re, &ut1, &status);
22206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(status);
22216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Find the first match "A" in the original string */
22236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(uregex_findNext(re, &status));
22246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(uregex_start(re, 0, &status) == 0);
22256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Move the string, kill the original string.  */
22276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strcpy(movedStr, testStr);
22286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_memset(testStr, 0, u_strlen(testStr));
22296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    utext_openUChars(&ut2, movedStr, -1, &status);
22306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(status);
22316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uregex_refreshUText(re, &ut2, &status);
22326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(status);
22336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Find the following two matches, now working in the moved string. */
22356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(uregex_findNext(re, &status));
22366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(uregex_start(re, 0, &status) == 2);
22376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(uregex_findNext(re, &status));
22386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(uregex_start(re, 0, &status) == 4);
22396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(FALSE == uregex_findNext(re, &status));
22406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uregex_close(re);
22426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
22436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestBug8421(void) {
22466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Bug 8421:  setTimeLimit on a regular expresssion before setting text to be matched
22476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *             was failing.
22486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
22496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    URegularExpression *re;
22506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
22516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t  limit = -1;
22526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    re = uregex_openC("abc", 0, 0, &status);
22546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(status);
22556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    limit = uregex_getTimeLimit(re, &status);
22576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(status);
22586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(limit == 0);
22596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uregex_setTimeLimit(re, 100, &status);
22616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(status);
22626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    limit = uregex_getTimeLimit(re, &status);
22636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT_SUCCESS(status);
22646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TEST_ASSERT(limit == 100);
22656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uregex_close(re);
22676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
22686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif   /*  !UCONFIG_NO_REGULAR_EXPRESSIONS */
2271