1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/********************************************************************
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * COPYRIGHT:
359d709d503bab6e2b61931737e662dd293b40578ccornelius * Copyright (c) 2005-2013, International Business Machines Corporation and
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * others. All Rights Reserved.
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* File utexttst.c
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Modification History:
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   Date          Name               Description
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   06/13/2005    Andy Heninger      Creation
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*******************************************************************************
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utext.h"
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustring.h"
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cintltst.h"
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "memory.h"
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "string.h"
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestAPI(void);
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid addUTextTest(TestNode** root);
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruaddUTextTest(TestNode** root)
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  addTest(root, &TestAPI           ,    "tsutil/UTextTest/TestAPI");
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define TEST_ASSERT(x) \
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   {if ((x)==FALSE) {log_err("Test failure in file %s at line %d\n", __FILE__, __LINE__);\
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     gFailed = TRUE;\
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   }}
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define TEST_SUCCESS(status) \
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   {if (U_FAILURE(status)) {log_err("Test failure in file %s at line %d. Error = \"%s\"\n", \
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       __FILE__, __LINE__, u_errorName(status)); \
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       gFailed = TRUE;\
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   }}
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *  TestAPI   verify that the UText API is accessible from C programs.
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *            This is not intended to be a complete test of the API functionality.  That is
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *            in the C++ intltest program.
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *            This test is intended to check that everything can be accessed and built in
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *            a pure C enviornment.
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void TestAPI(void) {
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode      status = U_ZERO_ERROR;
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool           gFailed = FALSE;
6159d709d503bab6e2b61931737e662dd293b40578ccornelius    (void)gFailed;   /* Suppress set but not used warning. */
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Open    */
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UText           utLoc = UTEXT_INITIALIZER;
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char *    cString = "\x61\x62\x63\x64";
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar           uString[]  = {0x41, 0x42, 0x43, 0};
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UText          *uta;
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UText          *utb;
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar           c;
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uta = utext_openUChars(NULL, uString, -1, &status);
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_SUCCESS(status);
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_next32(uta);
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c == 0x41);
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utb = utext_close(uta);
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(utb == NULL);
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uta = utext_openUTF8(&utLoc, cString, -1, &status);
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_SUCCESS(status);
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(uta == &utLoc);
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uta = utext_close(&utLoc);
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(uta == &utLoc);
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* utext_clone()  */
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar   uString[]  = {0x41, 0x42, 0x43, 0};
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int64_t len;
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UText   *uta;
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UText   *utb;
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = U_ZERO_ERROR;
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uta = utext_openUChars(NULL, uString, -1, &status);
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_SUCCESS(status);
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utb = utext_clone(NULL, uta, FALSE, FALSE, &status);
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_SUCCESS(status);
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(utb != NULL);
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(utb != uta);
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        len = utext_nativeLength(uta);
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(len == u_strlen(uString));
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utext_close(uta);
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utext_close(utb);
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* basic access functions  */
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar     uString[]  = {0x41, 0x42, 0x43, 0};
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UText     *uta;
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar32   c;
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int64_t   len;
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UBool     b;
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int64_t   i;
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = U_ZERO_ERROR;
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uta = utext_openUChars(NULL, uString, -1, &status);
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(uta!=NULL);
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_SUCCESS(status);
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        b = utext_isLengthExpensive(uta);
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(b==TRUE);
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        len = utext_nativeLength(uta);
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(len == u_strlen(uString));
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        b = utext_isLengthExpensive(uta);
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(b==FALSE);
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_char32At(uta, 0);
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[0]);
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_current32(uta);
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[0]);
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_next32(uta);
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[0]);
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_current32(uta);
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[1]);
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_previous32(uta);
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[0]);
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_current32(uta);
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[0]);
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_next32From(uta, 1);
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[1]);
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_next32From(uta, u_strlen(uString));
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==U_SENTINEL);
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_previous32From(uta, 2);
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[1]);
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        i = utext_getNativeIndex(uta);
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(i == 1);
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utext_setNativeIndex(uta, 0);
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        b = utext_moveIndex32(uta, 1);
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(b==TRUE);
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        i = utext_getNativeIndex(uta);
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(i==1);
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        b = utext_moveIndex32(uta, u_strlen(uString)-1);
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(b==TRUE);
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        i = utext_getNativeIndex(uta);
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(i==u_strlen(uString));
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        b = utext_moveIndex32(uta, 1);
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(b==FALSE);
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        i = utext_getNativeIndex(uta);
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(i==u_strlen(uString));
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utext_setNativeIndex(uta, 0);
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = UTEXT_NEXT32(uta);
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[0]);
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_current32(uta);
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[1]);
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = UTEXT_PREVIOUS32(uta);
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[0]);
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = UTEXT_PREVIOUS32(uta);
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==U_SENTINEL);
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utext_close(uta);
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /*
18685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho         * UText opened on a NULL string with zero length
18785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho         */
18885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UText    *uta;
18985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UChar32   c;
19085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
19185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        status = U_ZERO_ERROR;
19285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        uta = utext_openUChars(NULL, NULL, 0, &status);
19385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        TEST_SUCCESS(status);
19485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        c = UTEXT_NEXT32(uta);
19585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        TEST_ASSERT(c == U_SENTINEL);
19685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        utext_close(uta);
19785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
19885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        uta = utext_openUTF8(NULL, NULL, 0, &status);
19985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        TEST_SUCCESS(status);
20085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        c = UTEXT_NEXT32(uta);
20185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        TEST_ASSERT(c == U_SENTINEL);
20285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        utext_close(uta);
20385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
20485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
20585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
20685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {
20785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /*
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         * extract
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         */
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UText     *uta;
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar     uString[]  = {0x41, 0x42, 0x43, 0};
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar     buf[100];
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int32_t   i;
214b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /* Test pinning of input bounds */
215b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UChar     uString2[]  = {0x41, 0x42, 0x43, 0x44, 0x45,
216b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                 0x46, 0x47, 0x48, 0x49, 0x4A, 0};
217b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UChar *   uString2Ptr = uString2 + 5;
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = U_ZERO_ERROR;
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uta = utext_openUChars(NULL, uString, -1, &status);
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_SUCCESS(status);
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = U_ZERO_ERROR;
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        i = utext_extract(uta, 0, 100, NULL, 0, &status);
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(status==U_BUFFER_OVERFLOW_ERROR);
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(i == u_strlen(uString));
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = U_ZERO_ERROR;
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        memset(buf, 0, sizeof(buf));
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        i = utext_extract(uta, 0, 100, buf, 100, &status);
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_SUCCESS(status);
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(i == u_strlen(uString));
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        i = u_strcmp(uString, buf);
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(i == 0);
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utext_close(uta);
236b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
237b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /* Test pinning of input bounds */
238b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        status = U_ZERO_ERROR;
239b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        uta = utext_openUChars(NULL, uString2Ptr, -1, &status);
240b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_SUCCESS(status);
241b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
242b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        status = U_ZERO_ERROR;
243b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        memset(buf, 0, sizeof(buf));
244b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        i = utext_extract(uta, -3, 20, buf, 100, &status);
245b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_SUCCESS(status);
246b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_ASSERT(i == u_strlen(uString2Ptr));
247b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        i = u_strcmp(uString2Ptr, buf);
248b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_ASSERT(i == 0);
249b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        utext_close(uta);
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /*
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         *  Copy, Replace, isWritable
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         *    Can't create an editable UText from plain C, so all we
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         *    can easily do is check that errors returned.
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         */
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UText     *uta;
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar     uString[]  = {0x41, 0x42, 0x43, 0};
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UBool     b;
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = U_ZERO_ERROR;
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uta = utext_openUChars(NULL, uString, -1, &status);
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_SUCCESS(status);
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        b = utext_isWritable(uta);
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(b == FALSE);
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        b = utext_hasMetaData(uta);
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(b == FALSE);
271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utext_replace(uta,
273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                      0, 1,     /* start, limit */
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                      uString, -1,  /* replacement, replacement length */
275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                      &status);
276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(status == U_NO_WRITE_PERMISSION);
277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utext_copy(uta,
280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   0, 1,         /* start, limit      */
281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   2,            /* destination index */
282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   FALSE,        /* move flag         */
283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   &status);
284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(status == U_NO_WRITE_PERMISSION);
285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utext_close(uta);
287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
292