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