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