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