OLD | NEW |
| (Empty) |
1 /******************************************************************** | |
2 * COPYRIGHT: | |
3 * Copyright (c) 1997-2010, International Business Machines Corporation and | |
4 * others. All Rights Reserved. | |
5 ********************************************************************/ | |
6 | |
7 /** | |
8 * IntlTestCollator is the medium level test class for everything in the directo
ry "collate". | |
9 */ | |
10 | |
11 /*********************************************************************** | |
12 * Modification history | |
13 * Date Name Description | |
14 * 02/14/2001 synwee Compare with cintltst and commented away tests | |
15 * that are not run. | |
16 ***********************************************************************/ | |
17 | |
18 #include "unicode/utypes.h" | |
19 | |
20 #if !UCONFIG_NO_COLLATION && !UCONFIG_NO_FILE_IO | |
21 | |
22 #include "unicode/uchar.h" | |
23 #include "unicode/tstdtmod.h" | |
24 #include "cstring.h" | |
25 #include "ucol_tok.h" | |
26 #include "tscoll.h" | |
27 #include "dadrcoll.h" | |
28 | |
29 U_CDECL_BEGIN | |
30 static void U_CALLCONV deleteSeqElement(void *elem) { | |
31 delete((SeqElement *)elem); | |
32 } | |
33 U_CDECL_END | |
34 | |
35 DataDrivenCollatorTest::DataDrivenCollatorTest() | |
36 : seq(StringCharacterIterator("")), | |
37 status(U_ZERO_ERROR), | |
38 sequences(status) | |
39 { | |
40 driver = TestDataModule::getTestDataModule("DataDrivenCollationTest", *this, s
tatus); | |
41 sequences.setDeleter(deleteSeqElement); | |
42 UCA = (RuleBasedCollator*)Collator::createInstance("root", status); | |
43 } | |
44 | |
45 DataDrivenCollatorTest::~DataDrivenCollatorTest() | |
46 { | |
47 delete driver; | |
48 delete UCA; | |
49 } | |
50 | |
51 void DataDrivenCollatorTest::runIndexedTest( int32_t index, UBool exec, const ch
ar* &name, char* /*par */) | |
52 { | |
53 if(driver != NULL) { | |
54 if (exec) | |
55 { | |
56 logln("TestSuite Collator: "); | |
57 } | |
58 const DataMap *info = NULL; | |
59 TestData *testData = driver->createTestData(index, status); | |
60 if(U_SUCCESS(status)) { | |
61 name = testData->getName(); | |
62 if(testData->getInfo(info, status)) { | |
63 log(info->getString("Description", status)); | |
64 } | |
65 if(exec) { | |
66 log(name); | |
67 logln("---"); | |
68 logln(""); | |
69 processTest(testData); | |
70 } | |
71 delete testData; | |
72 } else { | |
73 name = ""; | |
74 } | |
75 } else { | |
76 dataerrln("collate/DataDrivenTest data not initialized!"); | |
77 name = ""; | |
78 } | |
79 | |
80 | |
81 } | |
82 | |
83 UBool | |
84 DataDrivenCollatorTest::setTestSequence(const UnicodeString &setSequence, SeqEle
ment &el) { | |
85 seq.setText(setSequence); | |
86 return getNextInSequence(el); | |
87 } | |
88 | |
89 // Parses the sequence to be tested | |
90 UBool | |
91 DataDrivenCollatorTest::getNextInSequence(SeqElement &el) { | |
92 el.source.truncate(0); | |
93 UBool quoted = FALSE; | |
94 UBool quotedsingle = FALSE; | |
95 UChar32 currChar = 0; | |
96 | |
97 while(currChar != CharacterIterator::DONE) { | |
98 currChar= seq.next32PostInc(); | |
99 if(!quoted) { | |
100 if(u_isWhitespace(currChar)) { | |
101 continue; | |
102 } | |
103 switch(currChar) { | |
104 case CharacterIterator::DONE: | |
105 break; | |
106 case 0x003C /* < */: | |
107 el.relation = Collator::LESS; | |
108 currChar = CharacterIterator::DONE; | |
109 break; | |
110 case 0x003D /* = */: | |
111 el.relation = Collator::EQUAL; | |
112 currChar = CharacterIterator::DONE; | |
113 break; | |
114 case 0x003E /* > */: | |
115 el.relation = Collator::GREATER; | |
116 currChar = CharacterIterator::DONE; | |
117 break; | |
118 case 0x0027 /* ' */: /* very basic quoting */ | |
119 quoted = TRUE; | |
120 quotedsingle = FALSE; | |
121 break; | |
122 case 0x005c /* \ */: /* single quote */ | |
123 quoted = TRUE; | |
124 quotedsingle = TRUE; | |
125 break; | |
126 default: | |
127 el.source.append(currChar); | |
128 } | |
129 } else { | |
130 if(currChar == CharacterIterator::DONE) { | |
131 status = U_ILLEGAL_ARGUMENT_ERROR; | |
132 errln("Quote in sequence not closed!"); | |
133 return FALSE; | |
134 } else if(currChar == 0x0027) { | |
135 quoted = FALSE; | |
136 } else { | |
137 el.source.append(currChar); | |
138 } | |
139 if(quotedsingle) { | |
140 quoted = FALSE; | |
141 } | |
142 } | |
143 } | |
144 return seq.hasNext(); | |
145 } | |
146 | |
147 // Reads the options string and sets appropriate attributes in collator | |
148 void | |
149 DataDrivenCollatorTest::processArguments(Collator *col, const UChar *start, int3
2_t optLen) { | |
150 const UChar *end = start+optLen; | |
151 UColAttribute attrib; | |
152 UColAttributeValue value; | |
153 | |
154 if(optLen == 0) { | |
155 return; | |
156 } | |
157 | |
158 start = ucol_tok_getNextArgument(start, end, &attrib, &value, &status); | |
159 while(start != NULL) { | |
160 if(U_SUCCESS(status)) { | |
161 col->setAttribute(attrib, value, status); | |
162 } | |
163 start = ucol_tok_getNextArgument(start, end, &attrib, &value, &status); | |
164 } | |
165 } | |
166 | |
167 void | |
168 DataDrivenCollatorTest::processTest(TestData *testData) { | |
169 Collator *col = NULL; | |
170 const UChar *arguments = NULL; | |
171 int32_t argLen = 0; | |
172 const DataMap *settings = NULL; | |
173 const DataMap *currentCase = NULL; | |
174 UErrorCode intStatus = U_ZERO_ERROR; | |
175 UnicodeString testSetting; | |
176 while(testData->nextSettings(settings, status)) { | |
177 intStatus = U_ZERO_ERROR; | |
178 // try to get a locale | |
179 testSetting = settings->getString("TestLocale", intStatus); | |
180 if(U_SUCCESS(intStatus)) { | |
181 char localeName[256]; | |
182 testSetting.extract(0, testSetting.length(), localeName, ""); | |
183 col = Collator::createInstance(localeName, status); | |
184 if(U_SUCCESS(status)) { | |
185 logln("Testing collator for locale "+testSetting); | |
186 } else { | |
187 errln("Unable to instantiate collator for locale "+testSetting); | |
188 return; | |
189 } | |
190 } else { | |
191 // if no locale, try from rules | |
192 intStatus = U_ZERO_ERROR; | |
193 testSetting = settings->getString("Rules", intStatus); | |
194 if(U_SUCCESS(intStatus)) { | |
195 col = new RuleBasedCollator(testSetting, status); | |
196 if(U_SUCCESS(status)) { | |
197 logln("Testing collator for rules "+testSetting); | |
198 } else { | |
199 errln("Unable to instantiate collator for rules "+testSetting+" - "+u_
errorName(status)); | |
200 return; | |
201 } | |
202 } else { | |
203 errln("No collator definition!"); | |
204 return; | |
205 } | |
206 } | |
207 | |
208 int32_t cloneSize = 0; | |
209 uint8_t* cloneBuf = NULL; | |
210 RuleBasedCollator* clone = NULL; | |
211 if(col != NULL){ | |
212 RuleBasedCollator* rbc = (RuleBasedCollator*)col; | |
213 cloneSize = rbc->cloneBinary(NULL, 0, intStatus); | |
214 intStatus = U_ZERO_ERROR; | |
215 cloneBuf = (uint8_t*) malloc(cloneSize); | |
216 cloneSize = rbc->cloneBinary(cloneBuf, cloneSize, intStatus); | |
217 clone = new RuleBasedCollator(cloneBuf, cloneSize, UCA, intStatus); | |
218 if(U_FAILURE(intStatus)){ | |
219 errln("Could not clone the RuleBasedCollator. Error: %s", u_errorName(
intStatus)); | |
220 intStatus= U_ZERO_ERROR; | |
221 } | |
222 // get attributes | |
223 testSetting = settings->getString("Arguments", intStatus); | |
224 if(U_SUCCESS(intStatus)) { | |
225 logln("Arguments: "+testSetting); | |
226 argLen = testSetting.length(); | |
227 arguments = testSetting.getBuffer(); | |
228 processArguments(col, arguments, argLen); | |
229 if(clone != NULL){ | |
230 processArguments(clone, arguments, argLen); | |
231 } | |
232 if(U_FAILURE(status)) { | |
233 errln("Couldn't process arguments"); | |
234 break; | |
235 } | |
236 } else { | |
237 intStatus = U_ZERO_ERROR; | |
238 } | |
239 // Start the processing | |
240 while(testData->nextCase(currentCase, status)) { | |
241 UnicodeString sequence = currentCase->getString("sequence", status); | |
242 if(U_SUCCESS(status)) { | |
243 processSequence(col, sequence); | |
244 if(clone != NULL){ | |
245 processSequence(clone, sequence); | |
246 } | |
247 } | |
248 } | |
249 } else { | |
250 errln("Couldn't instantiate a collator!"); | |
251 } | |
252 delete clone; | |
253 free(cloneBuf); | |
254 delete col; | |
255 col = NULL; | |
256 } | |
257 } | |
258 | |
259 | |
260 void | |
261 DataDrivenCollatorTest::processSequence(Collator* col, const UnicodeString &sequ
ence) { | |
262 Collator::EComparisonResult relation = Collator::EQUAL; | |
263 UBool hasNext; | |
264 SeqElement *source = NULL; | |
265 SeqElement *target = NULL; | |
266 int32_t j = 0; | |
267 | |
268 sequences.removeAllElements(); | |
269 | |
270 target = new SeqElement(); | |
271 | |
272 setTestSequence(sequence, *target); | |
273 sequences.addElement(target, status); | |
274 | |
275 do { | |
276 relation = Collator::EQUAL; | |
277 target = new SeqElement(); | |
278 hasNext = getNextInSequence(*target); | |
279 for(j = sequences.size(); j > 0; j--) { | |
280 source = (SeqElement *)sequences.elementAt(j-1); | |
281 if(relation == Collator::EQUAL && source->relation != Collator::EQUAL) { | |
282 relation = source->relation; | |
283 } | |
284 doTest(col, source->source, target->source, relation); | |
285 } | |
286 sequences.addElement(target, status); | |
287 source = target; | |
288 } while(hasNext); | |
289 } | |
290 | |
291 #endif /* #if !UCONFIG_NO_COLLATION */ | |
OLD | NEW |