• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
ContractionTableTest()15 ContractionTableTest::ContractionTableTest() {
16     testMapping = utrie_open(NULL, NULL, 0, 0, 0, TRUE);
17 }
18 
~ContractionTableTest()19 ContractionTableTest::~ContractionTableTest() {
20     utrie_close(testMapping);
21 }
22 
TestGrowTable()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 
TestSetContraction()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 
TestAddATableElement()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 
TestClone()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 
TestChangeContraction()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 
TestChangeLastCE()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 
TestErrorCodeChecking()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 
runIndexedTest(int32_t index,UBool exec,const char * & name,char *)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