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