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