OLD | NEW |
| (Empty) |
1 /******************************************************************** | |
2 * COPYRIGHT: | |
3 * Copyright (c) 1997-2015, International Business Machines Corporation and | |
4 * others. All Rights Reserved. | |
5 ********************************************************************/ | |
6 | |
7 | |
8 /** | |
9 * IntlTest is a base class for tests. */ | |
10 | |
11 #ifndef _INTLTEST | |
12 #define _INTLTEST | |
13 | |
14 // The following includes utypes.h, uobject.h and unistr.h | |
15 #include "unicode/fmtable.h" | |
16 #include "unicode/testlog.h" | |
17 | |
18 | |
19 #if U_NO_DEFAULT_INCLUDE_UTF_HEADERS | |
20 /* deprecated - make tests pass with U_NO_DEFAULT_INCLUDE_UTF_HEADERS */ | |
21 #include "unicode/utf_old.h" | |
22 #endif | |
23 | |
24 U_NAMESPACE_USE | |
25 | |
26 #if U_PLATFORM == U_PF_OS390 | |
27 // avoid collision with math.h/log() | |
28 // this must be after including utypes.h so that U_PLATFORM is actually defined | |
29 #pragma map(IntlTest::log( const UnicodeString &message ),"logos390") | |
30 #endif | |
31 | |
32 //----------------------------------------------------------------------------- | |
33 //convenience classes to ease porting code that uses the Java | |
34 //string-concatenation operator (moved from findword test by rtg) | |
35 UnicodeString UCharToUnicodeString(UChar c); | |
36 UnicodeString Int64ToUnicodeString(int64_t num); | |
37 //UnicodeString operator+(const UnicodeString& left, int64_t num); // Some compi
lers don't allow this because of the long type. | |
38 UnicodeString operator+(const UnicodeString& left, long num); | |
39 UnicodeString operator+(const UnicodeString& left, unsigned long num); | |
40 UnicodeString operator+(const UnicodeString& left, double num); | |
41 UnicodeString operator+(const UnicodeString& left, char num); | |
42 UnicodeString operator+(const UnicodeString& left, short num); | |
43 UnicodeString operator+(const UnicodeString& left, int num); | |
44 UnicodeString operator+(const UnicodeString& left, unsigned char num); | |
45 UnicodeString operator+(const UnicodeString& left, unsigned short num); | |
46 UnicodeString operator+(const UnicodeString& left, unsigned int num); | |
47 UnicodeString operator+(const UnicodeString& left, float num); | |
48 #if !UCONFIG_NO_FORMATTING | |
49 UnicodeString toString(const Formattable& f); // liu | |
50 UnicodeString toString(int32_t n); | |
51 #endif | |
52 UnicodeString toString(UBool b); | |
53 | |
54 //----------------------------------------------------------------------------- | |
55 | |
56 // Use the TESTCASE macro in subclasses of IntlTest. Define the | |
57 // runIndexedTest method in this fashion: | |
58 // | |
59 //| void MyTest::runIndexedTest(int32_t index, UBool exec, | |
60 //| const char* &name, char* /*par*/) { | |
61 //| switch (index) { | |
62 //| TESTCASE(0,TestSomething); | |
63 //| TESTCASE(1,TestSomethingElse); | |
64 //| TESTCASE(2,TestAnotherThing); | |
65 //| default: name = ""; break; | |
66 //| } | |
67 //| } | |
68 #define TESTCASE(id,test) \ | |
69 case id: \ | |
70 name = #test; \ | |
71 if (exec) { \ | |
72 logln(#test "---"); \ | |
73 logln(); \ | |
74 test(); \ | |
75 } \ | |
76 break | |
77 | |
78 // More convenient macros. These allow easy reordering of the test cases. | |
79 // | |
80 //| void MyTest::runIndexedTest(int32_t index, UBool exec, | |
81 //| const char* &name, char* /*par*/) { | |
82 //| TESTCASE_AUTO_BEGIN; | |
83 //| TESTCASE_AUTO(TestSomething); | |
84 //| TESTCASE_AUTO(TestSomethingElse); | |
85 //| TESTCASE_AUTO(TestAnotherThing); | |
86 //| TESTCASE_AUTO_END; | |
87 //| } | |
88 #define TESTCASE_AUTO_BEGIN \ | |
89 for(;;) { \ | |
90 int32_t testCaseAutoNumber = 0 | |
91 | |
92 #define TESTCASE_AUTO(test) \ | |
93 if (index == testCaseAutoNumber++) { \ | |
94 name = #test; \ | |
95 if (exec) { \ | |
96 logln(#test "---"); \ | |
97 logln(); \ | |
98 test(); \ | |
99 } \ | |
100 break; \ | |
101 } | |
102 | |
103 #define TESTCASE_AUTO_CLASS(TestClass) \ | |
104 if (index == testCaseAutoNumber++) { \ | |
105 name = #TestClass; \ | |
106 if (exec) { \ | |
107 logln(#TestClass "---"); \ | |
108 logln(); \ | |
109 TestClass test; \ | |
110 callTest(test, par); \ | |
111 } \ | |
112 break; \ | |
113 } | |
114 | |
115 #define TESTCASE_AUTO_CREATE_CLASS(TestClass) \ | |
116 if (index == testCaseAutoNumber++) { \ | |
117 name = #TestClass; \ | |
118 if (exec) { \ | |
119 logln(#TestClass "---"); \ | |
120 logln(); \ | |
121 LocalPointer<IntlTest> test(create##TestClass()); \ | |
122 callTest(*test, par); \ | |
123 } \ | |
124 break; \ | |
125 } | |
126 | |
127 #define TESTCASE_AUTO_END \ | |
128 name = ""; \ | |
129 break; \ | |
130 } | |
131 | |
132 #define TEST_ASSERT_TRUE(x) \ | |
133 assertTrue(#x, (x), FALSE, FALSE, __FILE__, __LINE__) | |
134 | |
135 #define TEST_ASSERT_STATUS(x) \ | |
136 assertSuccess(#x, (x), FALSE, __FILE__, __LINE__) | |
137 | |
138 class IntlTest : public TestLog { | |
139 public: | |
140 | |
141 IntlTest(); | |
142 // TestLog has a virtual destructor. | |
143 | |
144 virtual UBool runTest( char* name = NULL, char* par = NULL, char *baseName =
NULL); // not to be overidden | |
145 | |
146 virtual UBool setVerbose( UBool verbose = TRUE ); | |
147 virtual UBool setNoErrMsg( UBool no_err_msg = TRUE ); | |
148 virtual UBool setQuick( UBool quick = TRUE ); | |
149 virtual UBool setLeaks( UBool leaks = TRUE ); | |
150 virtual UBool setNotime( UBool no_time = TRUE ); | |
151 virtual UBool setWarnOnMissingData( UBool warn_on_missing_data = TRUE ); | |
152 virtual int32_t setThreadCount( int32_t count = 1); | |
153 | |
154 virtual int32_t getErrors( void ); | |
155 virtual int32_t getDataErrors (void ); | |
156 | |
157 virtual void setCaller( IntlTest* callingTest ); // for internal use only | |
158 virtual void setPath( char* path ); // for internal use only | |
159 | |
160 virtual void log( const UnicodeString &message ); | |
161 | |
162 virtual void logln( const UnicodeString &message ); | |
163 | |
164 virtual void logln( void ); | |
165 | |
166 /** | |
167 * Replaces isICUVersionAtLeast and isICUVersionBefore | |
168 * log that an issue is known. | |
169 * Usually used this way: | |
170 * <code>if( ... && logKnownIssue("12345", "some bug")) continue; </code> | |
171 * @param ticket ticket string, "12345" or "cldrbug:1234" | |
172 * @param message optional message string | |
173 * @return true if test should be skipped | |
174 */ | |
175 UBool logKnownIssue( const char *ticket, const UnicodeString &message ); | |
176 /** | |
177 * Replaces isICUVersionAtLeast and isICUVersionBefore | |
178 * log that an issue is known. | |
179 * Usually used this way: | |
180 * <code>if( ... && logKnownIssue("12345", "some bug")) continue; </code> | |
181 * @param ticket ticket string, "12345" or "cldrbug:1234" | |
182 * @return true if test should be skipped | |
183 */ | |
184 UBool logKnownIssue( const char *ticket ); | |
185 /** | |
186 * Replaces isICUVersionAtLeast and isICUVersionBefore | |
187 * log that an issue is known. | |
188 * Usually used this way: | |
189 * <code>if( ... && logKnownIssue("12345", "some bug")) continue; </code> | |
190 * @param ticket ticket string, "12345" or "cldrbug:1234" | |
191 * @param message optional message string | |
192 * @return true if test should be skipped | |
193 */ | |
194 UBool logKnownIssue( const char *ticket, const char *fmt, ...); | |
195 | |
196 virtual void info( const UnicodeString &message ); | |
197 | |
198 virtual void infoln( const UnicodeString &message ); | |
199 | |
200 virtual void infoln( void ); | |
201 | |
202 virtual void err(void); | |
203 | |
204 virtual void err( const UnicodeString &message ); | |
205 | |
206 virtual void errln( const UnicodeString &message ); | |
207 | |
208 virtual void dataerr( const UnicodeString &message ); | |
209 | |
210 virtual void dataerrln( const UnicodeString &message ); | |
211 | |
212 void errcheckln(UErrorCode status, const UnicodeString &message ); | |
213 | |
214 // convenience functions: sprintf() + errln() etc. | |
215 void log(const char *fmt, ...); | |
216 void logln(const char *fmt, ...); | |
217 void info(const char *fmt, ...); | |
218 void infoln(const char *fmt, ...); | |
219 void err(const char *fmt, ...); | |
220 void errln(const char *fmt, ...); | |
221 void dataerr(const char *fmt, ...); | |
222 void dataerrln(const char *fmt, ...); | |
223 | |
224 /** | |
225 * logs an error (even if status==U_ZERO_ERROR), but | |
226 * calls dataerrln() or errln() depending on the type of error. | |
227 * Does not report the status code. | |
228 * @param status parameter for selecting whether errln or dataerrln is calle
d. | |
229 */ | |
230 void errcheckln(UErrorCode status, const char *fmt, ...); | |
231 | |
232 // Print ALL named errors encountered so far | |
233 void printErrors(); | |
234 | |
235 // print known issues. return TRUE if there were any. | |
236 UBool printKnownIssues(); | |
237 | |
238 virtual void usage( void ) ; | |
239 | |
240 /** | |
241 * Returns a uniform random value x, with 0.0 <= x < 1.0. Use | |
242 * with care: Does not return all possible values; returns one of | |
243 * 714,025 values, uniformly spaced. However, the period is | |
244 * effectively infinite. See: Numerical Recipes, section 7.1. | |
245 * | |
246 * @param seedp pointer to seed. Set *seedp to any negative value | |
247 * to restart the sequence. | |
248 */ | |
249 static float random(int32_t* seedp); | |
250 | |
251 /** | |
252 * Convenience method using a global seed. | |
253 */ | |
254 static float random(); | |
255 | |
256 enum { kMaxProps = 16 }; | |
257 | |
258 virtual void setProperty(const char* propline); | |
259 virtual const char* getProperty(const char* prop); | |
260 | |
261 protected: | |
262 /* JUnit-like assertions. Each returns TRUE if it succeeds. */ | |
263 UBool assertTrue(const char* message, UBool condition, UBool quiet=FALSE, UB
ool possibleDataError=FALSE, const char *file=NULL, int line=0); | |
264 UBool assertFalse(const char* message, UBool condition, UBool quiet=FALSE); | |
265 /** | |
266 * @param possibleDataError - if TRUE, use dataerrln instead of errcheckln o
n failure | |
267 * @return TRUE on success, FALSE on failure. | |
268 */ | |
269 UBool assertSuccess(const char* message, UErrorCode ec, UBool possibleDataEr
ror=FALSE, const char *file=NULL, int line=0); | |
270 UBool assertEquals(const char* message, const UnicodeString& expected, | |
271 const UnicodeString& actual, UBool possibleDataError=FALS
E); | |
272 UBool assertEquals(const char* message, const char* expected, | |
273 const char* actual); | |
274 UBool assertEquals(const char* message, UBool expected, | |
275 UBool actual); | |
276 UBool assertEquals(const char* message, int32_t expected, int32_t actual); | |
277 UBool assertEquals(const char* message, int64_t expected, int64_t actual); | |
278 UBool assertEquals(const char* message, double expected, double actual); | |
279 #if !UCONFIG_NO_FORMATTING | |
280 UBool assertEquals(const char* message, const Formattable& expected, | |
281 const Formattable& actual, UBool possibleDataError=FALSE)
; | |
282 UBool assertEquals(const UnicodeString& message, const Formattable& expected
, | |
283 const Formattable& actual); | |
284 #endif | |
285 UBool assertTrue(const UnicodeString& message, UBool condition, UBool quiet=
FALSE); | |
286 UBool assertFalse(const UnicodeString& message, UBool condition, UBool quiet
=FALSE); | |
287 UBool assertSuccess(const UnicodeString& message, UErrorCode ec); | |
288 UBool assertEquals(const UnicodeString& message, const UnicodeString& expect
ed, | |
289 const UnicodeString& actual, UBool possibleDataError=FALS
E); | |
290 UBool assertEquals(const UnicodeString& message, const char* expected, | |
291 const char* actual); | |
292 UBool assertEquals(const UnicodeString& message, UBool expected, UBool actua
l); | |
293 UBool assertEquals(const UnicodeString& message, int32_t expected, int32_t a
ctual); | |
294 UBool assertEquals(const UnicodeString& message, int64_t expected, int64_t a
ctual); | |
295 | |
296 virtual void runIndexedTest( int32_t index, UBool exec, const char* &name, c
har* par = NULL ); // overide ! | |
297 | |
298 virtual UBool runTestLoop( char* testname, char* par, char *baseName ); | |
299 | |
300 virtual int32_t IncErrorCount( void ); | |
301 | |
302 virtual int32_t IncDataErrorCount( void ); | |
303 | |
304 virtual UBool callTest( IntlTest& testToBeCalled, char* par ); | |
305 | |
306 | |
307 UBool verbose; | |
308 UBool no_err_msg; | |
309 UBool quick; | |
310 UBool leaks; | |
311 UBool warn_on_missing_data; | |
312 UBool no_time; | |
313 int32_t threadCount; | |
314 | |
315 private: | |
316 UBool LL_linestart; | |
317 int32_t LL_indentlevel; | |
318 | |
319 int32_t errorCount; | |
320 int32_t dataErrorCount; | |
321 IntlTest* caller; | |
322 char* testPath; // specifies subtests | |
323 | |
324 char basePath[1024]; | |
325 char currName[1024]; // current test name | |
326 | |
327 //FILE *testoutfp; | |
328 void *testoutfp; | |
329 | |
330 const char* proplines[kMaxProps]; | |
331 int32_t numProps; | |
332 | |
333 protected: | |
334 | |
335 virtual void LL_message( UnicodeString message, UBool newline ); | |
336 | |
337 // used for collation result reporting, defined here for convenience | |
338 | |
339 static UnicodeString &prettify(const UnicodeString &source, UnicodeString &t
arget); | |
340 static UnicodeString prettify(const UnicodeString &source, UBool parseBacksl
ash=FALSE); | |
341 // digits=-1 determines the number of digits automatically | |
342 static UnicodeString &appendHex(uint32_t number, int32_t digits, UnicodeStri
ng &target); | |
343 static UnicodeString toHex(uint32_t number, int32_t digits=-1); | |
344 static inline UnicodeString toHex(int32_t number, int32_t digits=-1) { | |
345 return toHex((uint32_t)number, digits); | |
346 } | |
347 | |
348 public: | |
349 static void setICU_DATA(); // Set up ICU_DATA if necessary. | |
350 | |
351 static const char* pathToDataDirectory(); | |
352 | |
353 public: | |
354 UBool run_phase2( char* name, char* par ); // internally, supports reporting
memory leaks | |
355 static const char* loadTestData(UErrorCode& err); | |
356 virtual const char* getTestDataPath(UErrorCode& err); | |
357 static const char* getSourceTestData(UErrorCode& err); | |
358 static char *getUnidataPath(char path[]); | |
359 | |
360 // static members | |
361 public: | |
362 static IntlTest* gTest; | |
363 static const char* fgDataDir; | |
364 | |
365 }; | |
366 | |
367 void it_log( UnicodeString message ); | |
368 void it_logln( UnicodeString message ); | |
369 void it_logln( void ); | |
370 void it_info( UnicodeString message ); | |
371 void it_infoln( UnicodeString message ); | |
372 void it_infoln( void ); | |
373 void it_err(void); | |
374 void it_err( UnicodeString message ); | |
375 void it_errln( UnicodeString message ); | |
376 void it_dataerr( UnicodeString message ); | |
377 void it_dataerrln( UnicodeString message ); | |
378 | |
379 /** | |
380 * This is a variant of cintltst/ccolltst.c:CharsToUChars(). | |
381 * It converts a character string into a UnicodeString, with | |
382 * unescaping \u sequences. | |
383 */ | |
384 extern UnicodeString CharsToUnicodeString(const char* chars); | |
385 | |
386 /* alias for CharsToUnicodeString */ | |
387 extern UnicodeString ctou(const char* chars); | |
388 | |
389 #endif // _INTLTEST | |
OLD | NEW |