1 /********************************************************************
3 * Copyright (c) 1997-2011, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 ********************************************************************/
9 * IntlTest is a base class for tests. */
14 // The following includes utypes.h, uobject.h and unistr.h
15 #include "unicode/fmtable.h"
16 #include "unicode/testlog.h"
20 #if U_PLATFORM == U_PF_OS390
21 // avoid collision with math.h/log()
22 // this must be after including utypes.h so that U_PLATFORM is actually defined
23 #pragma map(IntlTest::log( const UnicodeString &message ),"logos390")
26 //-----------------------------------------------------------------------------
27 //convenience classes to ease porting code that uses the Java
28 //string-concatenation operator (moved from findword test by rtg)
29 UnicodeString
UCharToUnicodeString(UChar c
);
30 UnicodeString
Int64ToUnicodeString(int64_t num
);
31 //UnicodeString operator+(const UnicodeString& left, int64_t num); // Some compilers don't allow this because of the long type.
32 UnicodeString
operator+(const UnicodeString
& left
, long num
);
33 UnicodeString
operator+(const UnicodeString
& left
, unsigned long num
);
34 UnicodeString
operator+(const UnicodeString
& left
, double num
);
35 UnicodeString
operator+(const UnicodeString
& left
, char num
);
36 UnicodeString
operator+(const UnicodeString
& left
, short num
);
37 UnicodeString
operator+(const UnicodeString
& left
, int num
);
38 UnicodeString
operator+(const UnicodeString
& left
, unsigned char num
);
39 UnicodeString
operator+(const UnicodeString
& left
, unsigned short num
);
40 UnicodeString
operator+(const UnicodeString
& left
, unsigned int num
);
41 UnicodeString
operator+(const UnicodeString
& left
, float num
);
42 #if !UCONFIG_NO_FORMATTING
43 UnicodeString
toString(const Formattable
& f
); // liu
44 UnicodeString
toString(int32_t n
);
46 //-----------------------------------------------------------------------------
48 // Use the TESTCASE macro in subclasses of IntlTest. Define the
49 // runIndexedTest method in this fashion:
51 //| void MyTest::runIndexedTest(int32_t index, UBool exec,
52 //| const char* &name, char* /*par*/) {
54 //| TESTCASE(0,TestSomething);
55 //| TESTCASE(1,TestSomethingElse);
56 //| TESTCASE(2,TestAnotherThing);
57 //| default: name = ""; break;
60 #define TESTCASE(id,test) \
70 // More convenient macros. These allow easy reordering of the test cases.
72 //| void MyTest::runIndexedTest(int32_t index, UBool exec,
73 //| const char* &name, char* /*par*/) {
74 //| TESTCASE_AUTO_BEGIN;
75 //| TESTCASE_AUTO(TestSomething);
76 //| TESTCASE_AUTO(TestSomethingElse);
77 //| TESTCASE_AUTO(TestAnotherThing);
78 //| TESTCASE_AUTO_END;
80 #define TESTCASE_AUTO_BEGIN \
82 int32_t testCaseAutoNumber = 0
84 #define TESTCASE_AUTO(test) \
85 if (index == testCaseAutoNumber++) { \
95 #define TESTCASE_AUTO_END \
100 class IntlTest
: public TestLog
{
104 // TestLog has a virtual destructor.
106 virtual UBool
runTest( char* name
= NULL
, char* par
= NULL
, char *baseName
= NULL
); // not to be overidden
108 virtual UBool
setVerbose( UBool verbose
= TRUE
);
109 virtual UBool
setNoErrMsg( UBool no_err_msg
= TRUE
);
110 virtual UBool
setQuick( UBool quick
= TRUE
);
111 virtual UBool
setLeaks( UBool leaks
= TRUE
);
112 virtual UBool
setWarnOnMissingData( UBool warn_on_missing_data
= TRUE
);
113 virtual int32_t setThreadCount( int32_t count
= 1);
115 virtual int32_t getErrors( void );
116 virtual int32_t getDataErrors (void );
118 virtual void setCaller( IntlTest
* callingTest
); // for internal use only
119 virtual void setPath( char* path
); // for internal use only
121 virtual void log( const UnicodeString
&message
);
123 virtual void logln( const UnicodeString
&message
);
125 virtual void logln( void );
127 virtual void info( const UnicodeString
&message
);
129 virtual void infoln( const UnicodeString
&message
);
131 virtual void infoln( void );
133 virtual void err(void);
135 virtual void err( const UnicodeString
&message
);
137 virtual void errln( const UnicodeString
&message
);
139 virtual void dataerr( const UnicodeString
&message
);
141 virtual void dataerrln( const UnicodeString
&message
);
143 void errcheckln(UErrorCode status
, const UnicodeString
&message
);
145 // convenience functions: sprintf() + errln() etc.
146 void log(const char *fmt
, ...);
147 void logln(const char *fmt
, ...);
148 void info(const char *fmt
, ...);
149 void infoln(const char *fmt
, ...);
150 void err(const char *fmt
, ...);
151 void errln(const char *fmt
, ...);
152 void dataerr(const char *fmt
, ...);
153 void dataerrln(const char *fmt
, ...);
154 void errcheckln(UErrorCode status
, const char *fmt
, ...);
156 // Print ALL named errors encountered so far
159 virtual void usage( void ) ;
162 * Returns a uniform random value x, with 0.0 <= x < 1.0. Use
163 * with care: Does not return all possible values; returns one of
164 * 714,025 values, uniformly spaced. However, the period is
165 * effectively infinite. See: Numerical Recipes, section 7.1.
167 * @param seedp pointer to seed. Set *seedp to any negative value
168 * to restart the sequence.
170 static float random(int32_t* seedp
);
173 * Convenience method using a global seed.
175 static float random();
178 * Returns true if u_getVersion() < major.minor.
180 static UBool
isICUVersionBefore(int major
, int minor
) {
181 return isICUVersionBefore(major
, minor
, 0);
185 * Returns true if u_getVersion() < major.minor.milli.
187 static UBool
isICUVersionBefore(int major
, int minor
, int milli
);
190 * Returns true if u_getVersion() >= major.minor.
192 static UBool
isICUVersionAtLeast(int major
, int minor
) {
193 return isICUVersionAtLeast(major
, minor
, 0);
197 * Returns true if u_getVersion() >= major.minor.milli.
199 static UBool
isICUVersionAtLeast(int major
, int minor
, int milli
) {
200 return !isICUVersionBefore(major
, minor
, milli
);
203 enum { kMaxProps
= 16 };
205 virtual void setProperty(const char* propline
);
206 virtual const char* getProperty(const char* prop
);
209 /* JUnit-like assertions. Each returns TRUE if it succeeds. */
210 UBool
assertTrue(const char* message
, UBool condition
, UBool quiet
=FALSE
, UBool possibleDataError
=FALSE
);
211 UBool
assertFalse(const char* message
, UBool condition
, UBool quiet
=FALSE
);
212 UBool
assertSuccess(const char* message
, UErrorCode ec
, UBool possibleDataError
=FALSE
);
213 UBool
assertEquals(const char* message
, const UnicodeString
& expected
,
214 const UnicodeString
& actual
, UBool possibleDataError
=FALSE
);
215 UBool
assertEquals(const char* message
, const char* expected
,
217 #if !UCONFIG_NO_FORMATTING
218 UBool
assertEquals(const char* message
, const Formattable
& expected
,
219 const Formattable
& actual
);
220 UBool
assertEquals(const UnicodeString
& message
, const Formattable
& expected
,
221 const Formattable
& actual
);
223 UBool
assertTrue(const UnicodeString
& message
, UBool condition
, UBool quiet
=FALSE
);
224 UBool
assertFalse(const UnicodeString
& message
, UBool condition
, UBool quiet
=FALSE
);
225 UBool
assertSuccess(const UnicodeString
& message
, UErrorCode ec
);
226 UBool
assertEquals(const UnicodeString
& message
, const UnicodeString
& expected
,
227 const UnicodeString
& actual
);
228 UBool
assertEquals(const UnicodeString
& message
, const char* expected
,
231 virtual void runIndexedTest( int32_t index
, UBool exec
, const char* &name
, char* par
= NULL
); // overide !
233 virtual UBool
runTestLoop( char* testname
, char* par
, char *baseName
);
235 virtual int32_t IncErrorCount( void );
237 virtual int32_t IncDataErrorCount( void );
239 virtual UBool
callTest( IntlTest
& testToBeCalled
, char* par
);
246 UBool warn_on_missing_data
;
251 int32_t LL_indentlevel
;
254 int32_t dataErrorCount
;
256 char* testPath
; // specifies subtests
263 const char* proplines
[kMaxProps
];
268 virtual void LL_message( UnicodeString message
, UBool newline
);
270 // used for collation result reporting, defined here for convenience
272 static UnicodeString
&prettify(const UnicodeString
&source
, UnicodeString
&target
);
273 static UnicodeString
prettify(const UnicodeString
&source
, UBool parseBackslash
=FALSE
);
274 static UnicodeString
&appendHex(uint32_t number
, int32_t digits
, UnicodeString
&target
);
277 static void setICU_DATA(); // Set up ICU_DATA if necessary.
279 static const char* pathToDataDirectory();
282 UBool
run_phase2( char* name
, char* par
); // internally, supports reporting memory leaks
283 static const char* loadTestData(UErrorCode
& err
);
284 virtual const char* getTestDataPath(UErrorCode
& err
);
285 static const char* getSourceTestData(UErrorCode
& err
);
289 static IntlTest
* gTest
;
290 static const char* fgDataDir
;
294 void it_log( UnicodeString message
);
295 void it_logln( UnicodeString message
);
296 void it_logln( void );
297 void it_info( UnicodeString message
);
298 void it_infoln( UnicodeString message
);
299 void it_infoln( void );
301 void it_err( UnicodeString message
);
302 void it_errln( UnicodeString message
);
303 void it_dataerr( UnicodeString message
);
304 void it_dataerrln( UnicodeString message
);
307 * This is a variant of cintltst/ccolltst.c:CharsToUChars().
308 * It converts a character string into a UnicodeString, with
309 * unescaping \u sequences.
311 extern UnicodeString
CharsToUnicodeString(const char* chars
);
313 /* alias for CharsToUnicodeString */
314 extern UnicodeString
ctou(const char* chars
);