Home | History | Annotate | Download | only in intltest
      1 /********************************************************************
      2 * COPYRIGHT:
      3 * Copyright (c) 1997-2006, International Business Machines Corporation and
      4 * others. All Rights Reserved.
      5 ********************************************************************/
      6 
      7 #include "unicode/utypes.h"
      8 
      9 #if !UCONFIG_NO_COLLATION
     10 
     11 #include "cntabcol.h"
     12 
     13 U_NAMESPACE_USE
     14 
     15 ContractionTableTest::ContractionTableTest() {
     16     testMapping = utrie_open(NULL, NULL, 0, 0, 0, TRUE);
     17 }
     18 
     19 ContractionTableTest::~ContractionTableTest() {
     20     utrie_close(testMapping);
     21 }
     22 
     23 void ContractionTableTest::TestGrowTable(/* char* par */) {
     24     UErrorCode status = U_ZERO_ERROR;
     25     uint32_t i = 0, res = 0;
     26     testTable = uprv_cnttab_open(testMapping, &status);
     27 
     28     // fill up one contraction so that it has to expand
     29     for(i = 0; i<65536; i++) {
     30         uprv_cnttab_addContraction(testTable, 0, (UChar)i, i, &status);
     31         if(U_FAILURE(status)) {
     32             errln("Error occurred at position %i, error = %i (%s)\n", i, status, u_errorName(status));
     33             break;
     34         }
     35     }
     36     // test whether the filled up contraction really contains the data we input
     37     if(U_SUCCESS(status)) {
     38         for(i = 0; i<65536; i++) {
     39             res = uprv_cnttab_getCE(testTable, 0, i, &status);
     40             if(U_FAILURE(status)) {
     41                 errln("Error occurred at position %i, error = %i (%s)\n", i, status, u_errorName(status));
     42                 break;
     43             }
     44             if(res != i) {
     45                 errln("Error: expected %i, got %i\n", i, res);
     46                 break;
     47             }
     48         }
     49     }
     50     uprv_cnttab_close(testTable);
     51 }
     52 
     53 void ContractionTableTest::TestSetContraction(){
     54     UErrorCode status = U_ZERO_ERROR;
     55     testTable = uprv_cnttab_open(testMapping, &status);
     56     // This should make a new contraction
     57     uprv_cnttab_setContraction(testTable, 1, 0, 0x41, 0x41, &status);
     58     if(U_FAILURE(status)) {
     59         errln("Error setting a non existing contraction error = %i (%s)\n", status, u_errorName(status));
     60     }
     61     // if we try to change the non existing offset, we should get an error
     62     status = U_ZERO_ERROR;
     63     // currently this tests whether there is enough space, maybe it should test whether the element is actually in
     64     // range. Also, maybe a silent growing should take place....
     65     uprv_cnttab_setContraction(testTable, 1, 0x401, 0x41, 0x41, &status);
     66     if(status != U_INDEX_OUTOFBOUNDS_ERROR) {
     67         errln("changing a non-existing offset should have resulted in an error\n");
     68     }
     69     status = U_ZERO_ERROR;
     70     uprv_cnttab_close(testTable);
     71 }
     72 
     73 void ContractionTableTest::TestAddATableElement(){
     74     UErrorCode status = U_ZERO_ERROR;
     75     testTable = uprv_cnttab_open(testMapping, &status);
     76     uint32_t i = 0, res = 0;
     77 
     78     // fill up one contraction so that it has to expand
     79     for(i = 0; i<0x1000; i++) {
     80         uprv_cnttab_addContraction(testTable, i, (UChar)i, i, &status);
     81         if(U_FAILURE(status)) {
     82             errln("Error occurred at position %i, error = %i (%s)\n", i, status, u_errorName(status));
     83             break;
     84         }
     85     }
     86     // test whether the filled up contraction really contains the data we input
     87     if(U_SUCCESS(status)) {
     88         for(i = 0; i<0x1000; i++) {
     89             res = uprv_cnttab_getCE(testTable, i, 0, &status);
     90             if(U_FAILURE(status)) {
     91                 errln("Error occurred at position %i, error = %i (%s)\n", i, status, u_errorName(status));
     92                 break;
     93             }
     94             if(res != i) {
     95                 errln("Error: expected %i, got %i\n", i, res);
     96                 break;
     97             }
     98         }
     99     }
    100     uprv_cnttab_close(testTable);
    101 }
    102 
    103 void ContractionTableTest::TestClone(){
    104     UErrorCode status = U_ZERO_ERROR;
    105     testTable = uprv_cnttab_open(testMapping, &status);
    106     int32_t i = 0, res = 0;
    107     // we must construct table in order to copy codepoints and CEs
    108     // fill up one contraction so that it has to expand
    109     for(i = 0; i<0x500; i++) {
    110         uprv_cnttab_addContraction(testTable, i, (UChar)i, i, &status);
    111         if(U_FAILURE(status)) {
    112             errln("Error occurred at position %i, error = %i (%s)\n", i, status, u_errorName(status));
    113             break;
    114         }
    115     }
    116     uprv_cnttab_constructTable(testTable, 0, &status);
    117     if(U_FAILURE(status)) {
    118         errln("Error constructing table error = %i (%s)\n", status, u_errorName(status));
    119     } else {
    120         testClone = uprv_cnttab_clone(testTable, &status);
    121         if(U_SUCCESS(status)) {
    122             for(i = 0; i<0x500; i++) {
    123                 res = uprv_cnttab_getCE(testTable, i, 0, &status);
    124                 if(U_FAILURE(status)) {
    125                     errln("Error occurred at position %i, error = %i (%s)\n", i, status, u_errorName(status));
    126                     break;
    127                 }
    128                 if(res != i) {
    129                     errln("Error: expected %i, got %i\n", i, res);
    130                     break;
    131                 }
    132             }
    133         }
    134         uprv_cnttab_close(testClone);
    135     }
    136     uprv_cnttab_close(testTable);
    137     testTable = uprv_cnttab_open(testMapping, &status);
    138     if(U_FAILURE(status)) {
    139         errln("Error opening table error = %i (%s)\n", status, u_errorName(status));
    140     }
    141     uprv_cnttab_close(testTable);
    142 }
    143 
    144 void ContractionTableTest::TestChangeContraction(){
    145     UErrorCode status = U_ZERO_ERROR;
    146     testTable = uprv_cnttab_open(testMapping, &status);
    147     uint32_t i = 0, res = 0;
    148     res = uprv_cnttab_changeContraction(testTable, 0, 0x41, 0xAB, &status);
    149     if(res != 0) {
    150         errln("found a non existing contraction!\n");
    151     }
    152 
    153     for(i = 0; i < 0x20; i+=2) {
    154         uprv_cnttab_addContraction(testTable, 0, (UChar)i, i, &status);
    155     }
    156 
    157     res = uprv_cnttab_changeContraction(testTable, 0, 0x41, 0xAB, &status);
    158     if(res != UCOL_NOT_FOUND) {
    159         errln("managed to change a non existing contraction!\n");
    160     }
    161 
    162     for(i = 1; i < 0x20; i+=2) {
    163         res = uprv_cnttab_changeContraction(testTable, 0, (UChar)i, 0xAB, &status);
    164         if(res != UCOL_NOT_FOUND) {
    165             errln("managed to change a non existing contraction!\n");
    166         }
    167     }
    168     uprv_cnttab_close(testTable);
    169 }
    170 
    171 void ContractionTableTest::TestChangeLastCE(){
    172     UErrorCode status = U_ZERO_ERROR;
    173     testTable = uprv_cnttab_open(testMapping, &status);
    174     uint32_t res = uprv_cnttab_changeLastCE(testTable, 1, 0xABCD, &status);
    175     if(res!=0) {
    176         errln("managed to change the last CE in an non-existing contraction!\n");
    177     }
    178     uprv_cnttab_close(testTable);
    179 }
    180 
    181 void ContractionTableTest::TestErrorCodeChecking(){
    182     UErrorCode status = U_REGEX_SET_CONTAINS_STRING;
    183 
    184     uprv_cnttab_open(NULL, &status);
    185     if (status != U_REGEX_SET_CONTAINS_STRING) {
    186         errln("Status was incorrectly modified to %s\n", u_errorName(status));
    187     }
    188     uprv_cnttab_clone(NULL, &status);
    189     if (status != U_REGEX_SET_CONTAINS_STRING) {
    190         errln("Status was incorrectly modified to %s\n", u_errorName(status));
    191     }
    192     uprv_cnttab_changeLastCE(NULL, 0, 0, &status);
    193     if (status != U_REGEX_SET_CONTAINS_STRING) {
    194         errln("Status was incorrectly modified to %s\n", u_errorName(status));
    195     }
    196     uprv_cnttab_insertContraction(NULL, 0, 0, 0, &status);
    197     if (status != U_REGEX_SET_CONTAINS_STRING) {
    198         errln("Status was incorrectly modified to %s\n", u_errorName(status));
    199     }
    200     uprv_cnttab_addContraction(NULL, 0, 0, 0, &status);
    201     if (status != U_REGEX_SET_CONTAINS_STRING) {
    202         errln("Status was incorrectly modified to %s\n", u_errorName(status));
    203     }
    204     uprv_cnttab_setContraction(NULL, 0, 0, 0, 0, &status);
    205     if (status != U_REGEX_SET_CONTAINS_STRING) {
    206         errln("Status was incorrectly modified to %s\n", u_errorName(status));
    207     }
    208     uprv_cnttab_findCP(NULL, 0, 0, &status);
    209     if (status != U_REGEX_SET_CONTAINS_STRING) {
    210         errln("Status was incorrectly modified to %s\n", u_errorName(status));
    211     }
    212     if (uprv_cnttab_getCE(NULL, 0, 0, &status) != UCOL_NOT_FOUND) {
    213         errln("uprv_cnttab_getCE didn't return UCOL_NOT_FOUND\n");
    214     }
    215     if (status != U_REGEX_SET_CONTAINS_STRING) {
    216         errln("Status was incorrectly modified to %s\n", u_errorName(status));
    217     }
    218     if (uprv_cnttab_findCE(NULL, 0, 0, &status) != UCOL_NOT_FOUND) {
    219         errln("uprv_cnttab_findCE didn't return UCOL_NOT_FOUND\n");
    220     }
    221     if (status != U_REGEX_SET_CONTAINS_STRING) {
    222         errln("Status was incorrectly modified to %s\n", u_errorName(status));
    223     }
    224     uprv_cnttab_isTailored(NULL, 0, NULL, &status);
    225     if (status != U_REGEX_SET_CONTAINS_STRING) {
    226         errln("Status was incorrectly modified to %s\n", u_errorName(status));
    227     }
    228     uprv_cnttab_changeContraction(NULL, 0, 0, 0, &status);
    229     if (status != U_REGEX_SET_CONTAINS_STRING) {
    230         errln("Status was incorrectly modified to %s\n", u_errorName(status));
    231     }
    232 }
    233 
    234 void ContractionTableTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
    235 {
    236     if (exec) logln("TestSuite ContractionTableTest: ");
    237     switch (index) {
    238         case 0: name = "TestGrowTable";         if (exec)   TestGrowTable(/* par */); break;
    239         case 1: name = "TestSetContraction";    if (exec)   TestSetContraction(/* par */); break;
    240         case 2: name = "TestAddATableElement";  if (exec)   TestAddATableElement(/* par */); break;
    241         case 3: name = "TestClone";             if (exec)   TestClone(/* par */); break;
    242         case 4: name = "TestChangeContraction"; if (exec)   TestChangeContraction(/* par */); break;
    243         case 5: name = "TestChangeLastCE";      if (exec)   TestChangeLastCE(/* par */); break;
    244         case 6: name = "TestErrorCodeChecking"; if (exec)   TestErrorCodeChecking(/* par */); break;
    245         default: name = ""; break;
    246     }
    247 }
    248 
    249 #endif /* #if !UCONFIG_NO_COLLATION */
    250