1 /******************************************************************** 2 * COPYRIGHT: 3 * Copyright (c) 1997-2010, 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 U_NAMESPACE_USE 19 20 #ifdef OS390 21 // avoid collision with math.h/log() 22 // this must be after including utypes.h so that OS390 is actually defined 23 #pragma map(IntlTest::log( const UnicodeString &message ),"logos390") 24 #endif 25 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); 45 #endif 46 //----------------------------------------------------------------------------- 47 48 // Use the TESTCASE macro in subclasses of IntlTest. Define the 49 // runIndexedTest method in this fashion: 50 // 51 //| void MyTest::runIndexedTest(int32_t index, UBool exec, 52 //| const char* &name, char* /*par*/) { 53 //| switch (index) { 54 //| TESTCASE(0,TestSomething); 55 //| TESTCASE(1,TestSomethingElse); 56 //| TESTCASE(2,TestAnotherThing); 57 //| default: name = ""; break; 58 //| } 59 //| } 60 #define TESTCASE(id,test) \ 61 case id: \ 62 name = #test; \ 63 if (exec) { \ 64 logln(#test "---"); \ 65 logln(); \ 66 test(); \ 67 } \ 68 break 69 70 // More convenient macros. These allow easy reordering of the test cases. 71 // 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; 79 //| } 80 #define TESTCASE_AUTO_BEGIN \ 81 for(;;) { \ 82 int32_t testCaseAutoNumber = 0 83 84 #define TESTCASE_AUTO(test) \ 85 if (index == testCaseAutoNumber++) { \ 86 name = #test; \ 87 if (exec) { \ 88 logln(#test "---"); \ 89 logln(); \ 90 test(); \ 91 } \ 92 break; \ 93 } 94 95 #define TESTCASE_AUTO_END \ 96 name = ""; \ 97 break; \ 98 } 99 100 class IntlTest : public TestLog { 101 public: 102 103 IntlTest(); 104 // TestLog has a virtual destructor. 105 106 virtual UBool runTest( char* name = NULL, char* par = NULL, char *baseName = NULL); // not to be overidden 107 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); 114 115 virtual int32_t getErrors( void ); 116 virtual int32_t getDataErrors (void ); 117 118 virtual void setCaller( IntlTest* callingTest ); // for internal use only 119 virtual void setPath( char* path ); // for internal use only 120 121 virtual void log( const UnicodeString &message ); 122 123 virtual void logln( const UnicodeString &message ); 124 125 virtual void logln( void ); 126 127 virtual void info( const UnicodeString &message ); 128 129 virtual void infoln( const UnicodeString &message ); 130 131 virtual void infoln( void ); 132 133 virtual void err(void); 134 135 virtual void err( const UnicodeString &message ); 136 137 virtual void errln( const UnicodeString &message ); 138 139 virtual void dataerr( const UnicodeString &message ); 140 141 virtual void dataerrln( const UnicodeString &message ); 142 143 void errcheckln(UErrorCode status, const UnicodeString &message ); 144 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, ...); 155 156 // Print ALL named errors encountered so far 157 void printErrors(); 158 159 virtual void usage( void ) ; 160 161 /** 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. 166 * 167 * @param seedp pointer to seed. Set *seedp to any negative value 168 * to restart the sequence. 169 */ 170 static float random(int32_t* seedp); 171 172 /** 173 * Convenience method using a global seed. 174 */ 175 static float random(); 176 177 /** 178 * Ascertain the version of ICU. Useful for 179 * time bomb testing 180 */ 181 UBool isICUVersionAtLeast(const UVersionInfo x); 182 183 enum { kMaxProps = 16 }; 184 185 virtual void setProperty(const char* propline); 186 virtual const char* getProperty(const char* prop); 187 188 protected: 189 /* JUnit-like assertions. Each returns TRUE if it succeeds. */ 190 UBool assertTrue(const char* message, UBool condition, UBool quiet=FALSE, UBool possibleDataError=FALSE); 191 UBool assertFalse(const char* message, UBool condition, UBool quiet=FALSE); 192 UBool assertSuccess(const char* message, UErrorCode ec, UBool possibleDataError=FALSE); 193 UBool assertEquals(const char* message, const UnicodeString& expected, 194 const UnicodeString& actual, UBool possibleDataError=FALSE); 195 UBool assertEquals(const char* message, const char* expected, 196 const char* actual); 197 #if !UCONFIG_NO_FORMATTING 198 UBool assertEquals(const char* message, const Formattable& expected, 199 const Formattable& actual); 200 UBool assertEquals(const UnicodeString& message, const Formattable& expected, 201 const Formattable& actual); 202 #endif 203 UBool assertTrue(const UnicodeString& message, UBool condition, UBool quiet=FALSE); 204 UBool assertFalse(const UnicodeString& message, UBool condition, UBool quiet=FALSE); 205 UBool assertSuccess(const UnicodeString& message, UErrorCode ec); 206 UBool assertEquals(const UnicodeString& message, const UnicodeString& expected, 207 const UnicodeString& actual); 208 UBool assertEquals(const UnicodeString& message, const char* expected, 209 const char* actual); 210 211 virtual void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par = NULL ); // overide ! 212 213 virtual UBool runTestLoop( char* testname, char* par, char *baseName ); 214 215 virtual int32_t IncErrorCount( void ); 216 217 virtual int32_t IncDataErrorCount( void ); 218 219 virtual UBool callTest( IntlTest& testToBeCalled, char* par ); 220 221 222 UBool verbose; 223 UBool no_err_msg; 224 UBool quick; 225 UBool leaks; 226 UBool warn_on_missing_data; 227 int32_t threadCount; 228 229 private: 230 UBool LL_linestart; 231 int32_t LL_indentlevel; 232 233 int32_t errorCount; 234 int32_t dataErrorCount; 235 IntlTest* caller; 236 char* testPath; // specifies subtests 237 238 char basePath[1024]; 239 240 //FILE *testoutfp; 241 void *testoutfp; 242 243 const char* proplines[kMaxProps]; 244 int32_t numProps; 245 246 protected: 247 248 virtual void LL_message( UnicodeString message, UBool newline ); 249 250 // used for collation result reporting, defined here for convenience 251 252 static UnicodeString &prettify(const UnicodeString &source, UnicodeString &target); 253 static UnicodeString prettify(const UnicodeString &source, UBool parseBackslash=FALSE); 254 static UnicodeString &appendHex(uint32_t number, int32_t digits, UnicodeString &target); 255 256 public: 257 static void setICU_DATA(); // Set up ICU_DATA if necessary. 258 259 static const char* pathToDataDirectory(); 260 261 public: 262 UBool run_phase2( char* name, char* par ); // internally, supports reporting memory leaks 263 static const char* loadTestData(UErrorCode& err); 264 virtual const char* getTestDataPath(UErrorCode& err); 265 static const char* getSourceTestData(UErrorCode& err); 266 267 // static members 268 public: 269 static IntlTest* gTest; 270 static const char* fgDataDir; 271 272 }; 273 274 void it_log( UnicodeString message ); 275 void it_logln( UnicodeString message ); 276 void it_logln( void ); 277 void it_info( UnicodeString message ); 278 void it_infoln( UnicodeString message ); 279 void it_infoln( void ); 280 void it_err(void); 281 void it_err( UnicodeString message ); 282 void it_errln( UnicodeString message ); 283 void it_dataerr( UnicodeString message ); 284 void it_dataerrln( UnicodeString message ); 285 286 /** 287 * This is a variant of cintltst/ccolltst.c:CharsToUChars(). 288 * It converts a character string into a UnicodeString, with 289 * unescaping \u sequences. 290 */ 291 extern UnicodeString CharsToUnicodeString(const char* chars); 292 293 /* alias for CharsToUnicodeString */ 294 extern UnicodeString ctou(const char* chars); 295 296 #endif // _INTLTEST 297