1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/********************************************************************
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * COPYRIGHT:
3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Copyright (c) 2005-2011, 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;
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Open    */
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UText           utLoc = UTEXT_INITIALIZER;
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char *    cString = "\x61\x62\x63\x64";
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar           uString[]  = {0x41, 0x42, 0x43, 0};
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UText          *uta;
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UText          *utb;
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar           c;
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uta = utext_openUChars(NULL, uString, -1, &status);
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_SUCCESS(status);
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_next32(uta);
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c == 0x41);
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utb = utext_close(uta);
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(utb == NULL);
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uta = utext_openUTF8(&utLoc, cString, -1, &status);
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_SUCCESS(status);
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(uta == &utLoc);
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uta = utext_close(&utLoc);
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(uta == &utLoc);
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* utext_clone()  */
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar   uString[]  = {0x41, 0x42, 0x43, 0};
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int64_t len;
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UText   *uta;
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UText   *utb;
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = U_ZERO_ERROR;
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uta = utext_openUChars(NULL, uString, -1, &status);
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_SUCCESS(status);
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utb = utext_clone(NULL, uta, FALSE, FALSE, &status);
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_SUCCESS(status);
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(utb != NULL);
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(utb != uta);
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        len = utext_nativeLength(uta);
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(len == u_strlen(uString));
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utext_close(uta);
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utext_close(utb);
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* basic access functions  */
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar     uString[]  = {0x41, 0x42, 0x43, 0};
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UText     *uta;
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar32   c;
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int64_t   len;
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UBool     b;
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int64_t   i;
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = U_ZERO_ERROR;
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uta = utext_openUChars(NULL, uString, -1, &status);
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(uta!=NULL);
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_SUCCESS(status);
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        b = utext_isLengthExpensive(uta);
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(b==TRUE);
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        len = utext_nativeLength(uta);
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(len == u_strlen(uString));
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        b = utext_isLengthExpensive(uta);
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(b==FALSE);
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_char32At(uta, 0);
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[0]);
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_current32(uta);
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[0]);
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_next32(uta);
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[0]);
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_current32(uta);
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[1]);
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_previous32(uta);
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[0]);
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_current32(uta);
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[0]);
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_next32From(uta, 1);
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[1]);
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_next32From(uta, u_strlen(uString));
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==U_SENTINEL);
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_previous32From(uta, 2);
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[1]);
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        i = utext_getNativeIndex(uta);
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(i == 1);
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utext_setNativeIndex(uta, 0);
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        b = utext_moveIndex32(uta, 1);
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(b==TRUE);
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        i = utext_getNativeIndex(uta);
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(i==1);
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        b = utext_moveIndex32(uta, u_strlen(uString)-1);
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(b==TRUE);
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        i = utext_getNativeIndex(uta);
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(i==u_strlen(uString));
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        b = utext_moveIndex32(uta, 1);
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(b==FALSE);
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        i = utext_getNativeIndex(uta);
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(i==u_strlen(uString));
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utext_setNativeIndex(uta, 0);
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = UTEXT_NEXT32(uta);
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[0]);
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = utext_current32(uta);
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[1]);
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = UTEXT_PREVIOUS32(uta);
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==uString[0]);
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        c = UTEXT_PREVIOUS32(uta);
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(c==U_SENTINEL);
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utext_close(uta);
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /*
18585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho         * UText opened on a NULL string with zero length
18685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho         */
18785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UText    *uta;
18885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        UChar32   c;
18985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
19085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        status = U_ZERO_ERROR;
19185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        uta = utext_openUChars(NULL, NULL, 0, &status);
19285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        TEST_SUCCESS(status);
19385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        c = UTEXT_NEXT32(uta);
19485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        TEST_ASSERT(c == U_SENTINEL);
19585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        utext_close(uta);
19685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
19785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        uta = utext_openUTF8(NULL, NULL, 0, &status);
19885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        TEST_SUCCESS(status);
19985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        c = UTEXT_NEXT32(uta);
20085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        TEST_ASSERT(c == U_SENTINEL);
20185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        utext_close(uta);
20285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    }
20385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
20485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho
20585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    {
20685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho        /*
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         * extract
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         */
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UText     *uta;
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar     uString[]  = {0x41, 0x42, 0x43, 0};
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar     buf[100];
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int32_t   i;
213b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /* Test pinning of input bounds */
214b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UChar     uString2[]  = {0x41, 0x42, 0x43, 0x44, 0x45,
215b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                 0x46, 0x47, 0x48, 0x49, 0x4A, 0};
216b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UChar *   uString2Ptr = uString2 + 5;
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = U_ZERO_ERROR;
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uta = utext_openUChars(NULL, uString, -1, &status);
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_SUCCESS(status);
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = U_ZERO_ERROR;
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        i = utext_extract(uta, 0, 100, NULL, 0, &status);
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(status==U_BUFFER_OVERFLOW_ERROR);
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(i == u_strlen(uString));
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = U_ZERO_ERROR;
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        memset(buf, 0, sizeof(buf));
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        i = utext_extract(uta, 0, 100, buf, 100, &status);
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_SUCCESS(status);
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(i == u_strlen(uString));
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        i = u_strcmp(uString, buf);
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(i == 0);
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utext_close(uta);
235b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
236b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /* Test pinning of input bounds */
237b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        status = U_ZERO_ERROR;
238b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        uta = utext_openUChars(NULL, uString2Ptr, -1, &status);
239b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_SUCCESS(status);
240b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
241b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        status = U_ZERO_ERROR;
242b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        memset(buf, 0, sizeof(buf));
243b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        i = utext_extract(uta, -3, 20, buf, 100, &status);
244b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_SUCCESS(status);
245b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_ASSERT(i == u_strlen(uString2Ptr));
246b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        i = u_strcmp(uString2Ptr, buf);
247b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        TEST_ASSERT(i == 0);
248b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        utext_close(uta);
249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /*
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         *  Copy, Replace, isWritable
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         *    Can't create an editable UText from plain C, so all we
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         *    can easily do is check that errors returned.
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         */
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UText     *uta;
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar     uString[]  = {0x41, 0x42, 0x43, 0};
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UBool     b;
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        status = U_ZERO_ERROR;
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uta = utext_openUChars(NULL, uString, -1, &status);
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_SUCCESS(status);
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        b = utext_isWritable(uta);
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(b == FALSE);
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        b = utext_hasMetaData(uta);
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(b == FALSE);
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utext_replace(uta,
272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                      0, 1,     /* start, limit */
273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                      uString, -1,  /* replacement, replacement length */
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                      &status);
275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(status == U_NO_WRITE_PERMISSION);
276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utext_copy(uta,
279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   0, 1,         /* start, limit      */
280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   2,            /* destination index */
281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   FALSE,        /* move flag         */
282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                   &status);
283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        TEST_ASSERT(status == U_NO_WRITE_PERMISSION);
284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        utext_close(uta);
286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
291