10596faeddefbf198de137d5e893708495ab1584cFredrik Roubert// © 2016 and later: Unicode, Inc. and others. 264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html 3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************** 48de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * COPYRIGHT: 58de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * Copyright (c) 1997-2016, International Business Machines Corporation and 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved. 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/ 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * IntlTest is a base class for tests. */ 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifndef _INTLTEST 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define _INTLTEST 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// The following includes utypes.h, uobject.h and unistr.h 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/fmtable.h" 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/testlog.h" 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_USE 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 22103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_OS390 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// avoid collision with math.h/log() 24103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius// this must be after including utypes.h so that U_PLATFORM is actually defined 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#pragma map(IntlTest::log( const UnicodeString &message ),"logos390") 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------------- 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//convenience classes to ease porting code that uses the Java 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//string-concatenation operator (moved from findword test by rtg) 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString UCharToUnicodeString(UChar c); 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString Int64ToUnicodeString(int64_t num); 33ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertUnicodeString DoubleToUnicodeString(double num); 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//UnicodeString operator+(const UnicodeString& left, int64_t num); // Some compilers don't allow this because of the long type. 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, long num); 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, unsigned long num); 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, double num); 3859d709d503bab6e2b61931737e662dd293b40578ccorneliusUnicodeString operator+(const UnicodeString& left, char num); 3959d709d503bab6e2b61931737e662dd293b40578ccorneliusUnicodeString operator+(const UnicodeString& left, short num); 4059d709d503bab6e2b61931737e662dd293b40578ccorneliusUnicodeString operator+(const UnicodeString& left, int num); 4159d709d503bab6e2b61931737e662dd293b40578ccorneliusUnicodeString operator+(const UnicodeString& left, unsigned char num); 4259d709d503bab6e2b61931737e662dd293b40578ccorneliusUnicodeString operator+(const UnicodeString& left, unsigned short num); 4359d709d503bab6e2b61931737e662dd293b40578ccorneliusUnicodeString operator+(const UnicodeString& left, unsigned int num); 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, float num); 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString toString(const Formattable& f); // liu 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString toString(int32_t n); 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 4959d709d503bab6e2b61931737e662dd293b40578ccorneliusUnicodeString toString(UBool b); 5059d709d503bab6e2b61931737e662dd293b40578ccornelius 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------------- 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Use the TESTCASE macro in subclasses of IntlTest. Define the 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// runIndexedTest method in this fashion: 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//| void MyTest::runIndexedTest(int32_t index, UBool exec, 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//| const char* &name, char* /*par*/) { 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//| switch (index) { 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//| TESTCASE(0,TestSomething); 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//| TESTCASE(1,TestSomethingElse); 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//| TESTCASE(2,TestAnotherThing); 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//| default: name = ""; break; 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//| } 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//| } 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TESTCASE(id,test) \ 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case id: \ 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = #test; \ 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (exec) { \ 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(#test "---"); \ 7050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho logln(); \ 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test(); \ 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } \ 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 7527f654740f2a26ad62a5c155af9199af9e69b889claireho// More convenient macros. These allow easy reordering of the test cases. 7627f654740f2a26ad62a5c155af9199af9e69b889claireho// 7727f654740f2a26ad62a5c155af9199af9e69b889claireho//| void MyTest::runIndexedTest(int32_t index, UBool exec, 7827f654740f2a26ad62a5c155af9199af9e69b889claireho//| const char* &name, char* /*par*/) { 7927f654740f2a26ad62a5c155af9199af9e69b889claireho//| TESTCASE_AUTO_BEGIN; 8027f654740f2a26ad62a5c155af9199af9e69b889claireho//| TESTCASE_AUTO(TestSomething); 8127f654740f2a26ad62a5c155af9199af9e69b889claireho//| TESTCASE_AUTO(TestSomethingElse); 8227f654740f2a26ad62a5c155af9199af9e69b889claireho//| TESTCASE_AUTO(TestAnotherThing); 8327f654740f2a26ad62a5c155af9199af9e69b889claireho//| TESTCASE_AUTO_END; 8427f654740f2a26ad62a5c155af9199af9e69b889claireho//| } 8527f654740f2a26ad62a5c155af9199af9e69b889claireho#define TESTCASE_AUTO_BEGIN \ 8627f654740f2a26ad62a5c155af9199af9e69b889claireho for(;;) { \ 8727f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t testCaseAutoNumber = 0 8827f654740f2a26ad62a5c155af9199af9e69b889claireho 8927f654740f2a26ad62a5c155af9199af9e69b889claireho#define TESTCASE_AUTO(test) \ 9027f654740f2a26ad62a5c155af9199af9e69b889claireho if (index == testCaseAutoNumber++) { \ 9127f654740f2a26ad62a5c155af9199af9e69b889claireho name = #test; \ 9227f654740f2a26ad62a5c155af9199af9e69b889claireho if (exec) { \ 9327f654740f2a26ad62a5c155af9199af9e69b889claireho logln(#test "---"); \ 9427f654740f2a26ad62a5c155af9199af9e69b889claireho logln(); \ 9527f654740f2a26ad62a5c155af9199af9e69b889claireho test(); \ 9627f654740f2a26ad62a5c155af9199af9e69b889claireho } \ 9727f654740f2a26ad62a5c155af9199af9e69b889claireho break; \ 9827f654740f2a26ad62a5c155af9199af9e69b889claireho } 9927f654740f2a26ad62a5c155af9199af9e69b889claireho 100fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#define TESTCASE_AUTO_CLASS(TestClass) \ 101fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (index == testCaseAutoNumber++) { \ 102fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius name = #TestClass; \ 103fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (exec) { \ 104fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius logln(#TestClass "---"); \ 105fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius logln(); \ 106fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius TestClass test; \ 107fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius callTest(test, par); \ 108fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } \ 109fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius break; \ 110fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 111fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 112fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#define TESTCASE_AUTO_CREATE_CLASS(TestClass) \ 113fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (index == testCaseAutoNumber++) { \ 114fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius name = #TestClass; \ 115fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (exec) { \ 116fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius logln(#TestClass "---"); \ 117fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius logln(); \ 118fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius LocalPointer<IntlTest> test(create##TestClass()); \ 119fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius callTest(*test, par); \ 120fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } \ 121fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius break; \ 122fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 123fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 12427f654740f2a26ad62a5c155af9199af9e69b889claireho#define TESTCASE_AUTO_END \ 12527f654740f2a26ad62a5c155af9199af9e69b889claireho name = ""; \ 12627f654740f2a26ad62a5c155af9199af9e69b889claireho break; \ 12727f654740f2a26ad62a5c155af9199af9e69b889claireho } 12827f654740f2a26ad62a5c155af9199af9e69b889claireho 1298393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#define TEST_ASSERT_TRUE(x) \ 1308393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius assertTrue(#x, (x), FALSE, FALSE, __FILE__, __LINE__) 1318393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 13259d709d503bab6e2b61931737e662dd293b40578ccornelius#define TEST_ASSERT_STATUS(x) \ 13359d709d503bab6e2b61931737e662dd293b40578ccornelius assertSuccess(#x, (x), FALSE, __FILE__, __LINE__) 13459d709d503bab6e2b61931737e662dd293b40578ccornelius 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass IntlTest : public TestLog { 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest(); 13950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // TestLog has a virtual destructor. 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 14127f654740f2a26ad62a5c155af9199af9e69b889claireho virtual UBool runTest( char* name = NULL, char* par = NULL, char *baseName = NULL); // not to be overidden 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UBool setVerbose( UBool verbose = TRUE ); 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UBool setNoErrMsg( UBool no_err_msg = TRUE ); 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UBool setQuick( UBool quick = TRUE ); 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UBool setLeaks( UBool leaks = TRUE ); 14754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius virtual UBool setNotime( UBool no_time = TRUE ); 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UBool setWarnOnMissingData( UBool warn_on_missing_data = TRUE ); 14950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual int32_t setThreadCount( int32_t count = 1); 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual int32_t getErrors( void ); 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual int32_t getDataErrors (void ); 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void setCaller( IntlTest* callingTest ); // for internal use only 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void setPath( char* path ); // for internal use only 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void log( const UnicodeString &message ); 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void logln( const UnicodeString &message ); 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void logln( void ); 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 16359d709d503bab6e2b61931737e662dd293b40578ccornelius /** 16459d709d503bab6e2b61931737e662dd293b40578ccornelius * Replaces isICUVersionAtLeast and isICUVersionBefore 16559d709d503bab6e2b61931737e662dd293b40578ccornelius * log that an issue is known. 1668de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * Usually used this way: 16759d709d503bab6e2b61931737e662dd293b40578ccornelius * <code>if( ... && logKnownIssue("12345", "some bug")) continue; </code> 16859d709d503bab6e2b61931737e662dd293b40578ccornelius * @param ticket ticket string, "12345" or "cldrbug:1234" 16959d709d503bab6e2b61931737e662dd293b40578ccornelius * @param message optional message string 17059d709d503bab6e2b61931737e662dd293b40578ccornelius * @return true if test should be skipped 17159d709d503bab6e2b61931737e662dd293b40578ccornelius */ 17259d709d503bab6e2b61931737e662dd293b40578ccornelius UBool logKnownIssue( const char *ticket, const UnicodeString &message ); 17359d709d503bab6e2b61931737e662dd293b40578ccornelius /** 17459d709d503bab6e2b61931737e662dd293b40578ccornelius * Replaces isICUVersionAtLeast and isICUVersionBefore 17559d709d503bab6e2b61931737e662dd293b40578ccornelius * log that an issue is known. 17659d709d503bab6e2b61931737e662dd293b40578ccornelius * Usually used this way: 17759d709d503bab6e2b61931737e662dd293b40578ccornelius * <code>if( ... && logKnownIssue("12345", "some bug")) continue; </code> 17859d709d503bab6e2b61931737e662dd293b40578ccornelius * @param ticket ticket string, "12345" or "cldrbug:1234" 17959d709d503bab6e2b61931737e662dd293b40578ccornelius * @return true if test should be skipped 18059d709d503bab6e2b61931737e662dd293b40578ccornelius */ 18159d709d503bab6e2b61931737e662dd293b40578ccornelius UBool logKnownIssue( const char *ticket ); 18259d709d503bab6e2b61931737e662dd293b40578ccornelius /** 18359d709d503bab6e2b61931737e662dd293b40578ccornelius * Replaces isICUVersionAtLeast and isICUVersionBefore 18459d709d503bab6e2b61931737e662dd293b40578ccornelius * log that an issue is known. 18559d709d503bab6e2b61931737e662dd293b40578ccornelius * Usually used this way: 18659d709d503bab6e2b61931737e662dd293b40578ccornelius * <code>if( ... && logKnownIssue("12345", "some bug")) continue; </code> 18759d709d503bab6e2b61931737e662dd293b40578ccornelius * @param ticket ticket string, "12345" or "cldrbug:1234" 18859d709d503bab6e2b61931737e662dd293b40578ccornelius * @param message optional message string 18959d709d503bab6e2b61931737e662dd293b40578ccornelius * @return true if test should be skipped 19059d709d503bab6e2b61931737e662dd293b40578ccornelius */ 19159d709d503bab6e2b61931737e662dd293b40578ccornelius UBool logKnownIssue( const char *ticket, const char *fmt, ...); 19259d709d503bab6e2b61931737e662dd293b40578ccornelius 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void info( const UnicodeString &message ); 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void infoln( const UnicodeString &message ); 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void infoln( void ); 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void err(void); 20059d709d503bab6e2b61931737e662dd293b40578ccornelius 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void err( const UnicodeString &message ); 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void errln( const UnicodeString &message ); 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void dataerr( const UnicodeString &message ); 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void dataerrln( const UnicodeString &message ); 20859d709d503bab6e2b61931737e662dd293b40578ccornelius 2096d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru void errcheckln(UErrorCode status, const UnicodeString &message ); 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // convenience functions: sprintf() + errln() etc. 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void log(const char *fmt, ...); 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void logln(const char *fmt, ...); 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void info(const char *fmt, ...); 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void infoln(const char *fmt, ...); 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void err(const char *fmt, ...); 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void errln(const char *fmt, ...); 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void dataerr(const char *fmt, ...); 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void dataerrln(const char *fmt, ...); 22059d709d503bab6e2b61931737e662dd293b40578ccornelius 22159d709d503bab6e2b61931737e662dd293b40578ccornelius /** 22259d709d503bab6e2b61931737e662dd293b40578ccornelius * logs an error (even if status==U_ZERO_ERROR), but 22359d709d503bab6e2b61931737e662dd293b40578ccornelius * calls dataerrln() or errln() depending on the type of error. 22459d709d503bab6e2b61931737e662dd293b40578ccornelius * Does not report the status code. 22559d709d503bab6e2b61931737e662dd293b40578ccornelius * @param status parameter for selecting whether errln or dataerrln is called. 22659d709d503bab6e2b61931737e662dd293b40578ccornelius */ 2276d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru void errcheckln(UErrorCode status, const char *fmt, ...); 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Print ALL named errors encountered so far 2308de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert void printErrors(); 23159d709d503bab6e2b61931737e662dd293b40578ccornelius 23259d709d503bab6e2b61931737e662dd293b40578ccornelius // print known issues. return TRUE if there were any. 23359d709d503bab6e2b61931737e662dd293b40578ccornelius UBool printKnownIssues(); 2348de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void usage( void ) ; 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /** 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Returns a uniform random value x, with 0.0 <= x < 1.0. Use 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * with care: Does not return all possible values; returns one of 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 714,025 values, uniformly spaced. However, the period is 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * effectively infinite. See: Numerical Recipes, section 7.1. 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param seedp pointer to seed. Set *seedp to any negative value 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * to restart the sequence. 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static float random(int32_t* seedp); 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /** 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Convenience method using a global seed. 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static float random(); 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2538de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert 2548de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert /** 2558de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * Integer random numbers, similar to C++ std::minstd_rand, with the same algorithm 2568de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * and constants. Allow additional access to internal state, for use by monkey tests, 2578de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * which need to recreate previous random sequences beginning near a failure point. 2588de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert */ 2598de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert class icu_rand { 2608de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert public: 2618de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert icu_rand(uint32_t seed = 1); 2628de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert ~icu_rand(); 2638de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert void seed(uint32_t seed); 2648de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert uint32_t operator()(); 2658de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert /** 2668de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * Get a seed corresponding to the current state of the generator. 2678de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * Seeding any generator with this value will cause it to produce the 2688de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * same sequence as this one will from this point forward. 2698de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert */ 2708de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert uint32_t getSeed(); 2718de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert private: 2728de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert uint32_t fLast; 2738de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert }; 2748de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert 2758de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert 2768de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert 277b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru enum { kMaxProps = 16 }; 278b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 279b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru virtual void setProperty(const char* propline); 280b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru virtual const char* getProperty(const char* prop); 281b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* JUnit-like assertions. Each returns TRUE if it succeeds. */ 2838393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius UBool assertTrue(const char* message, UBool condition, UBool quiet=FALSE, UBool possibleDataError=FALSE, const char *file=NULL, int line=0); 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool assertFalse(const char* message, UBool condition, UBool quiet=FALSE); 28559d709d503bab6e2b61931737e662dd293b40578ccornelius /** 28659d709d503bab6e2b61931737e662dd293b40578ccornelius * @param possibleDataError - if TRUE, use dataerrln instead of errcheckln on failure 28759d709d503bab6e2b61931737e662dd293b40578ccornelius * @return TRUE on success, FALSE on failure. 28859d709d503bab6e2b61931737e662dd293b40578ccornelius */ 28959d709d503bab6e2b61931737e662dd293b40578ccornelius UBool assertSuccess(const char* message, UErrorCode ec, UBool possibleDataError=FALSE, const char *file=NULL, int line=0); 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool assertEquals(const char* message, const UnicodeString& expected, 2916d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru const UnicodeString& actual, UBool possibleDataError=FALSE); 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool assertEquals(const char* message, const char* expected, 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* actual); 29459d709d503bab6e2b61931737e662dd293b40578ccornelius UBool assertEquals(const char* message, UBool expected, 29559d709d503bab6e2b61931737e662dd293b40578ccornelius UBool actual); 296f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius UBool assertEquals(const char* message, int32_t expected, int32_t actual); 29759d709d503bab6e2b61931737e662dd293b40578ccornelius UBool assertEquals(const char* message, int64_t expected, int64_t actual); 298c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UBool assertEquals(const char* message, double expected, double actual); 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool assertEquals(const char* message, const Formattable& expected, 30159d709d503bab6e2b61931737e662dd293b40578ccornelius const Formattable& actual, UBool possibleDataError=FALSE); 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool assertEquals(const UnicodeString& message, const Formattable& expected, 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const Formattable& actual); 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool assertTrue(const UnicodeString& message, UBool condition, UBool quiet=FALSE); 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool assertFalse(const UnicodeString& message, UBool condition, UBool quiet=FALSE); 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool assertSuccess(const UnicodeString& message, UErrorCode ec); 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool assertEquals(const UnicodeString& message, const UnicodeString& expected, 30959d709d503bab6e2b61931737e662dd293b40578ccornelius const UnicodeString& actual, UBool possibleDataError=FALSE); 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool assertEquals(const UnicodeString& message, const char* expected, 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* actual); 31259d709d503bab6e2b61931737e662dd293b40578ccornelius UBool assertEquals(const UnicodeString& message, UBool expected, UBool actual); 31359d709d503bab6e2b61931737e662dd293b40578ccornelius UBool assertEquals(const UnicodeString& message, int32_t expected, int32_t actual); 31459d709d503bab6e2b61931737e662dd293b40578ccornelius UBool assertEquals(const UnicodeString& message, int64_t expected, int64_t actual); 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par = NULL ); // overide ! 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 31827f654740f2a26ad62a5c155af9199af9e69b889claireho virtual UBool runTestLoop( char* testname, char* par, char *baseName ); 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual int32_t IncErrorCount( void ); 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual int32_t IncDataErrorCount( void ); 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UBool callTest( IntlTest& testToBeCalled, char* par ); 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool verbose; 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool no_err_msg; 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool quick; 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool leaks; 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool warn_on_missing_data; 33254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UBool no_time; 33350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t threadCount; 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate: 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool LL_linestart; 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t LL_indentlevel; 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t errorCount; 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t dataErrorCount; 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest* caller; 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char* testPath; // specifies subtests 3438de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert 34427f654740f2a26ad62a5c155af9199af9e69b889claireho char basePath[1024]; 34559d709d503bab6e2b61931737e662dd293b40578ccornelius char currName[1024]; // current test name 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //FILE *testoutfp; 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void *testoutfp; 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 350b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const char* proplines[kMaxProps]; 351b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t numProps; 352b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprotected: 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void LL_message( UnicodeString message, UBool newline ); 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // used for collation result reporting, defined here for convenience 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static UnicodeString &prettify(const UnicodeString &source, UnicodeString &target); 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static UnicodeString prettify(const UnicodeString &source, UBool parseBackslash=FALSE); 361f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius // digits=-1 determines the number of digits automatically 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static UnicodeString &appendHex(uint32_t number, int32_t digits, UnicodeString &target); 363f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius static UnicodeString toHex(uint32_t number, int32_t digits=-1); 364f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius static inline UnicodeString toHex(int32_t number, int32_t digits=-1) { 365f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius return toHex((uint32_t)number, digits); 366f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius } 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static void setICU_DATA(); // Set up ICU_DATA if necessary. 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* pathToDataDirectory(); 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool run_phase2( char* name, char* par ); // internally, supports reporting memory leaks 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* loadTestData(UErrorCode& err); 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual const char* getTestDataPath(UErrorCode& err); 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* getSourceTestData(UErrorCode& err); 378f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius static char *getUnidataPath(char path[]); 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// static members 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static IntlTest* gTest; 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* fgDataDir; 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_log( UnicodeString message ); 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_logln( UnicodeString message ); 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_logln( void ); 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_info( UnicodeString message ); 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_infoln( UnicodeString message ); 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_infoln( void ); 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_err(void); 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_err( UnicodeString message ); 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_errln( UnicodeString message ); 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_dataerr( UnicodeString message ); 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_dataerrln( UnicodeString message ); 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This is a variant of cintltst/ccolltst.c:CharsToUChars(). 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * It converts a character string into a UnicodeString, with 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * unescaping \u sequences. 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruextern UnicodeString CharsToUnicodeString(const char* chars); 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* alias for CharsToUnicodeString */ 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruextern UnicodeString ctou(const char* chars); 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif // _INTLTEST 410