1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
38393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * Copyright (c) 1997-2013, International Business Machines Corporation and
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * IntlTest is a base class for tests.
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h>
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h>
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <assert.h>
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdarg.h>
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h>
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/unistr.h"
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ures.h"
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/smpdtfmt.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucnv.h"
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uclean.h"
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/timezone.h"
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/curramt.h"
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/putil.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "intltest.h"
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "caltztst.h"
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "itmajor.h"
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h"
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "umutex.h"
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uassert.h"
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uoptions.h"
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3827f654740f2a26ad62a5c155af9199af9e69b889claireho#include "putilimp.h" // for uprv_getRawUTCtime()
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/locid.h"
4027f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/ctest.h" // for str_timeDelta
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef XP_MAC_CONSOLE
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <console.h>
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "Files.h"
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char* _testDataPath=NULL;
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Static list of errors found
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UnicodeString errorList;
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//-----------------------------------------------------------------------------
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//convenience classes to ease porting code that uses the Java
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//string-concatenation operator (moved from findword test by rtg)
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// [LIU] Just to get things working
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUCharToUnicodeString(UChar c)
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return UnicodeString(c); }
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// [rtg] Just to get things working
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruoperator+(const UnicodeString& left,
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      long num)
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[64];    // nos changed from 10 to 64
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char danger = 'p';  // guard against overrunning the buffer (rtg)
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sprintf(buffer, "%ld", num);
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assert(danger == 'p');
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return left + buffer;
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruoperator+(const UnicodeString& left,
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      unsigned long num)
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[64];    // nos changed from 10 to 64
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char danger = 'p';  // guard against overrunning the buffer (rtg)
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sprintf(buffer, "%lu", num);
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assert(danger == 'p');
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return left + buffer;
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruInt64ToUnicodeString(int64_t num)
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[64];    // nos changed from 10 to 64
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char danger = 'p';  // guard against overrunning the buffer (rtg)
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
95103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if defined(_MSC_VER)
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sprintf(buffer, "%I64d", num);
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sprintf(buffer, "%lld", (long long)num);
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assert(danger == 'p');
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return buffer;
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// [LIU] Just to get things working
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruoperator+(const UnicodeString& left,
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      double num)
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[64];   // was 32, made it arbitrarily bigger (rtg)
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char danger = 'p'; // guard against overrunning the buffer (rtg)
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // IEEE floating point has 52 bits of mantissa, plus one assumed bit
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //  53*log(2)/log(10) = 15.95
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // so there is no need to show more than 16 digits. [alan]
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sprintf(buffer, "%.17g", num);
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assert(danger == 'p');
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return left + buffer;
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
12627f654740f2a26ad62a5c155af9199af9e69b889claireho * Return a string display for this, without surrounding braces.
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString _toString(const Formattable& f) {
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s;
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (f.getType()) {
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kDate:
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UErrorCode status = U_ZERO_ERROR;
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            SimpleDateFormat fmt(status);
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_SUCCESS(status)) {
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                FieldPosition pos;
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fmt.format(f.getDate(), s, pos);
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                s.insert(0, "Date:");
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                s = UnicodeString("Error creating date format]");
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kDouble:
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s = UnicodeString("double:") + f.getDouble();
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kLong:
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s = UnicodeString("long:") + f.getLong();
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kInt64:
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s = UnicodeString("int64:") + Int64ToUnicodeString(f.getInt64());
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kString:
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        f.getString(s);
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s.insert(0, "String:");
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kArray:
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t i, n;
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const Formattable* array = f.getArray(n);
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            s.insert(0, UnicodeString("Array:"));
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString delim(", ");
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (i=0; i<n; ++i) {
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (i > 0) {
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    s.append(delim);
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                s = s + _toString(array[i]);
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
17327f654740f2a26ad62a5c155af9199af9e69b889claireho    case Formattable::kObject: {
17427f654740f2a26ad62a5c155af9199af9e69b889claireho        const CurrencyAmount* c = dynamic_cast<const CurrencyAmount*>(f.getObject());
17527f654740f2a26ad62a5c155af9199af9e69b889claireho        if (c != NULL) {
17627f654740f2a26ad62a5c155af9199af9e69b889claireho            s = _toString(c->getNumber()) + " " + UnicodeString(c->getISOCurrency());
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            s = UnicodeString("Unknown UObject");
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
18127f654740f2a26ad62a5c155af9199af9e69b889claireho    }
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s = UnicodeString("Unknown Formattable type=") + (int32_t)f.getType();
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return s;
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Originally coded this as operator+, but that makes the expression
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * + char* ambiguous. - liu
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString toString(const Formattable& f) {
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s((UChar)91/*[*/);
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.append(_toString(f));
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.append((UChar)0x5d/*]*/);
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return s;
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// useful when operator+ won't cooperate
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString toString(int32_t n) {
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return UnicodeString() + (long)n;
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// stephen - cleaned up 05/05/99
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, char num)
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (long)num; }
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, short num)
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (long)num; }
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, int num)
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (long)num; }
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, unsigned char num)
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (unsigned long)num; }
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, unsigned short num)
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (unsigned long)num; }
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, unsigned int num)
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (unsigned long)num; }
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, float num)
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (double)num; }
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Append a hex string to the target
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString&
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::appendHex(uint32_t number,
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t digits,
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString& target)
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar digitString[] = {
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }; /* "0123456789ABCDEF" */
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
236f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    if (digits < 0) {  // auto-digits
237f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        digits = 2;
238f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        uint32_t max = 0xff;
239f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        while (number > max) {
240f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius            digits += 2;
241f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius            max = (max << 8) | 0xff;
242f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        }
243f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    }
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (digits)
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 8:
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >> 28) & 0xF];
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 7:
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >> 24) & 0xF];
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 6:
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >> 20) & 0xF];
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 5:
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >> 16) & 0xF];
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 4:
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >> 12) & 0xF];
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 3:
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >>  8) & 0xF];
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 2:
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >>  4) & 0xF];
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 1:
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >>  0) & 0xF];
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += "**";
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return target;
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
269f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig CorneliusUnicodeString
270f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig CorneliusIntlTest::toHex(uint32_t number, int32_t digits) {
271f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    UnicodeString result;
272f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    appendHex(number, digits, result);
273f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    return result;
274f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius}
275f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius
27627f654740f2a26ad62a5c155af9199af9e69b889clairehostatic inline UBool isPrintable(UChar32 c) {
27727f654740f2a26ad62a5c155af9199af9e69b889claireho    return c <= 0x7E && (c >= 0x20 || c == 9 || c == 0xA || c == 0xD);
27827f654740f2a26ad62a5c155af9199af9e69b889claireho}
27927f654740f2a26ad62a5c155af9199af9e69b889claireho
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Replace nonprintable characters with unicode escapes
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString&
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::prettify(const UnicodeString &source,
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           UnicodeString &target)
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target.remove();
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target += "\"";
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < source.length(); )
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar32 ch = source.char32At(i);
29327f654740f2a26ad62a5c155af9199af9e69b889claireho        i += U16_LENGTH(ch);
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
29527f654740f2a26ad62a5c155af9199af9e69b889claireho        if (!isPrintable(ch))
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (ch <= 0xFFFF) {
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                target += "\\u";
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                appendHex(ch, 4, target);
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                target += "\\U";
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                appendHex(ch, 8, target);
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            target += ch;
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target += "\"";
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return target;
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Replace nonprintable characters with unicode escapes
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::prettify(const UnicodeString &source, UBool parseBackslash)
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString target;
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target.remove();
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target += "\"";
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < source.length();)
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar32 ch = source.char32At(i);
32827f654740f2a26ad62a5c155af9199af9e69b889claireho        i += U16_LENGTH(ch);
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
33027f654740f2a26ad62a5c155af9199af9e69b889claireho        if (!isPrintable(ch))
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (parseBackslash) {
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // If we are preceded by an odd number of backslashes,
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // then this character has already been backslash escaped.
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // Delete a backslash.
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                int32_t backslashCount = 0;
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                for (int32_t j=target.length()-1; j>=0; --j) {
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (target.charAt(j) == (UChar)92) {
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        ++backslashCount;
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    } else {
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        break;
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if ((backslashCount % 2) == 1) {
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    target.truncate(target.length() - 1);
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (ch <= 0xFFFF) {
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                target += "\\u";
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                appendHex(ch, 4, target);
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                target += "\\U";
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                appendHex(ch, 8, target);
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            target += ch;
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target += "\"";
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return target;
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*  IntlTest::setICU_DATA  - if the ICU_DATA environment variable is not already
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       set, try to deduce the directory in which ICU was built,
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       and set ICU_DATA to "icu/source/data" in that location.
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       The intent is to allow the tests to have a good chance
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       of running without requiring that the user manually set
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       ICU_DATA.  Common data isn't a problem, since it is
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       picked up via a static (build time) reference, but the
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       tests dynamically load some data.
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::setICU_DATA() {
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *original_ICU_DATA = getenv("ICU_DATA");
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (original_ICU_DATA != NULL && *original_ICU_DATA != 0) {
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*  If the user set ICU_DATA, don't second-guess the person. */
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // U_TOPBUILDDIR is set by the makefiles on UNIXes when building cintltst and intltst
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              to point to the top of the build hierarchy, which may or
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              may not be the same as the source directory, depending on
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              the configure options used.  At any rate,
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              set the data path to the built data from this directory.
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              The value is complete with quotes, so it can be used
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              as-is as a string constant.
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined (U_TOPBUILDDIR)
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static char env_string[] = U_TOPBUILDDIR "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING;
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_setDataDirectory(env_string);
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Use #else so we don't get compiler warnings due to the return above.
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* On Windows, the file name obtained from __FILE__ includes a full path.
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *             This file is "wherever\icu\source\test\cintltst\cintltst.c"
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *             Change to    "wherever\icu\source\data"
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char p[sizeof(__FILE__) + 10];
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char *pBackSlash;
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int i;
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(p, __FILE__);
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* We want to back over three '\' chars.                            */
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*   Only Windows should end up here, so looking for '\' is safe.   */
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i=1; i<=3; i++) {
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pBackSlash = strrchr(p, U_FILE_SEP_CHAR);
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (pBackSlash != NULL) {
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                *pBackSlash = 0;        /* Truncate the string at the '\'   */
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (pBackSlash != NULL) {
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* We found and truncated three names from the path.
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             *  Now append "source\data" and set the environment
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             */
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strcpy(pBackSlash, U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING);
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_setDataDirectory(p);     /*  p is "ICU_DATA=wherever\icu\source\data"    */
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* __FILE__ on MSVC7 does not contain the directory */
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_setDataDirectory(".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING);
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* No location for the data dir was identifiable.
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *   Add other fallbacks for the test data location here if the need arises
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//--------------------------------------------------------------------------------------
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const int32_t indentLevel_offset = 3;
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char delim = '/';
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest* IntlTest::gTest = NULL;
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t execCount = 0;
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_log( UnicodeString message )
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->log( message );
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_logln( UnicodeString message )
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->logln( message );
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_logln( void )
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->logln();
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_info( UnicodeString message )
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->info( message );
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_infoln( UnicodeString message )
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->infoln( message );
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_infoln( void )
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->infoln();
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_err()
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->err();
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_err( UnicodeString message )
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->err( message );
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_errln( UnicodeString message )
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->errln( message );
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_dataerr( UnicodeString message )
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->dataerr( message );
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_dataerrln( UnicodeString message )
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->dataerrln( message );
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::IntlTest()
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    caller = NULL;
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testPath = NULL;
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LL_linestart = TRUE;
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCount = 0;
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dataErrorCount = 0;
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    verbose = FALSE;
52654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    no_time = FALSE;
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    no_err_msg = FALSE;
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    warn_on_missing_data = FALSE;
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    quick = FALSE;
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    leaks = FALSE;
53150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    threadCount = 1;
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testoutfp = stdout;
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LL_indentlevel = indentLevel_offset;
534b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    numProps = 0;
53527f654740f2a26ad62a5c155af9199af9e69b889claireho    strcpy(basePath, "/");
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::setCaller( IntlTest* callingTest )
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    caller = callingTest;
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (caller) {
542c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        warn_on_missing_data = caller->warn_on_missing_data;
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        verbose = caller->verbose;
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        no_err_msg = caller->no_err_msg;
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        quick = caller->quick;
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testoutfp = caller->testoutfp;
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LL_indentlevel = caller->LL_indentlevel + indentLevel_offset;
548b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        numProps = caller->numProps;
549b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        for (int32_t i = 0; i < numProps; i++) {
550b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            proplines[i] = caller->proplines[i];
551b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::callTest( IntlTest& testToBeCalled, char* par )
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    execCount--; // correct a previously assumed test-exec, as this only calls a subtest
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testToBeCalled.setCaller( this );
55927f654740f2a26ad62a5c155af9199af9e69b889claireho    strcpy(testToBeCalled.basePath, this->basePath );
56027f654740f2a26ad62a5c155af9199af9e69b889claireho    UBool result = testToBeCalled.runTest( testPath, par, testToBeCalled.basePath );
56127f654740f2a26ad62a5c155af9199af9e69b889claireho    strcpy(testToBeCalled.basePath, this->basePath ); // reset it.
56227f654740f2a26ad62a5c155af9199af9e69b889claireho    return result;
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::setPath( char* pathVal )
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->testPath = pathVal;
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setVerbose( UBool verboseVal )
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval = this->verbose;
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->verbose = verboseVal;
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
57754dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusUBool IntlTest::setNotime( UBool no_time )
57854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius{
57954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UBool rval = this->no_time;
58054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    this->no_time = no_time;
58154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return rval;
58254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
58354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setWarnOnMissingData( UBool warn_on_missing_dataVal )
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval = this->warn_on_missing_data;
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->warn_on_missing_data = warn_on_missing_dataVal;
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setNoErrMsg( UBool no_err_msgVal )
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval = this->no_err_msg;
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->no_err_msg = no_err_msgVal;
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setQuick( UBool quickVal )
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval = this->quick;
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->quick = quickVal;
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setLeaks( UBool leaksVal )
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval = this->leaks;
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->leaks = leaksVal;
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
61250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoint32_t IntlTest::setThreadCount( int32_t count )
61350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
61450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t rval = this->threadCount;
61550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    this->threadCount = count;
61650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return rval;
61750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
61850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t IntlTest::getErrors( void )
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return errorCount;
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t IntlTest::getDataErrors( void )
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return dataErrorCount;
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
62927f654740f2a26ad62a5c155af9199af9e69b889clairehoUBool IntlTest::runTest( char* name, char* par, char *baseName )
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval;
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char* pos = NULL;
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
63427f654740f2a26ad62a5c155af9199af9e69b889claireho    char* baseNameBuffer = NULL;
63527f654740f2a26ad62a5c155af9199af9e69b889claireho
63627f654740f2a26ad62a5c155af9199af9e69b889claireho    if(baseName == NULL) {
63727f654740f2a26ad62a5c155af9199af9e69b889claireho      baseNameBuffer = (char*)malloc(1024);
63827f654740f2a26ad62a5c155af9199af9e69b889claireho      baseName=baseNameBuffer;
63927f654740f2a26ad62a5c155af9199af9e69b889claireho      strcpy(baseName, "/");
64027f654740f2a26ad62a5c155af9199af9e69b889claireho    }
64127f654740f2a26ad62a5c155af9199af9e69b889claireho
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (name)
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pos = strchr( name, delim ); // check if name contains path (by looking for '/')
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pos) {
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testPath = pos+1;   // store subpath for calling subtest
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *pos = 0;       // split into two strings
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testPath = NULL;
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!name || (name[0] == 0) || (strcmp(name, "*") == 0)) {
65227f654740f2a26ad62a5c155af9199af9e69b889claireho      rval = runTestLoop( NULL, par, baseName );
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else if (strcmp( name, "LIST" ) == 0) {
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        this->usage();
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rval = TRUE;
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
65927f654740f2a26ad62a5c155af9199af9e69b889claireho      rval = runTestLoop( name, par, baseName );
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pos)
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *pos = delim;  // restore original value at pos
66427f654740f2a26ad62a5c155af9199af9e69b889claireho    if(baseNameBuffer!=NULL) {
66527f654740f2a26ad62a5c155af9199af9e69b889claireho      free(baseNameBuffer);
66627f654740f2a26ad62a5c155af9199af9e69b889claireho    }
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// call individual tests, to be overriden to call implementations
67154dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusvoid IntlTest::runIndexedTest( int32_t /*index*/, UBool /*exec*/, const char* & /*name*/, char* /*par*/ )
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // to be overriden by a method like:
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (index) {
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 0: name = "First Test"; if (exec) FirstTest( par ); break;
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 1: name = "Second Test"; if (exec) SecondTest( par ); break;
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        default: name = ""; break;
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->errln("*** runIndexedTest needs to be overriden! ***");
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
68527f654740f2a26ad62a5c155af9199af9e69b889clairehoUBool IntlTest::runTestLoop( char* testname, char* par, char *baseName )
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t    index = 0;
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char*   name;
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool  run_this_test;
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t    lastErrorCount;
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool  rval = FALSE;
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool   lastTestFailed;
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
69427f654740f2a26ad62a5c155af9199af9e69b889claireho    if(baseName == NULL) {
69527f654740f2a26ad62a5c155af9199af9e69b889claireho      printf("ERROR: baseName can't be null.\n");
69627f654740f2a26ad62a5c155af9199af9e69b889claireho      return FALSE;
69727f654740f2a26ad62a5c155af9199af9e69b889claireho    } else {
69827f654740f2a26ad62a5c155af9199af9e69b889claireho      if ((char *)this->basePath != baseName) {
69927f654740f2a26ad62a5c155af9199af9e69b889claireho        strcpy(this->basePath, baseName);
70027f654740f2a26ad62a5c155af9199af9e69b889claireho      }
70127f654740f2a26ad62a5c155af9199af9e69b889claireho    }
70227f654740f2a26ad62a5c155af9199af9e69b889claireho
70327f654740f2a26ad62a5c155af9199af9e69b889claireho    char * saveBaseLoc = baseName+strlen(baseName);
70427f654740f2a26ad62a5c155af9199af9e69b889claireho
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IntlTest* saveTest = gTest;
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gTest = this;
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    do {
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        this->runIndexedTest( index, FALSE, name, par );
70950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (strcmp(name,"skip") == 0) {
71050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            run_this_test = FALSE;
71150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        } else {
71250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (!name || (name[0] == 0))
71350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                break;
71450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (!testname) {
71550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                run_this_test = TRUE;
71650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }else{
71750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                run_this_test = (UBool) (strcmp( name, testname ) == 0);
71850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (run_this_test) {
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            lastErrorCount = errorCount;
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            execCount++;
72327f654740f2a26ad62a5c155af9199af9e69b889claireho            char msg[256];
72427f654740f2a26ad62a5c155af9199af9e69b889claireho            sprintf(msg, "%s {", name);
72527f654740f2a26ad62a5c155af9199af9e69b889claireho            LL_message(msg, TRUE);
72627f654740f2a26ad62a5c155af9199af9e69b889claireho            UDate timeStart = uprv_getRawUTCtime();
72727f654740f2a26ad62a5c155af9199af9e69b889claireho            strcpy(saveBaseLoc,name);
72827f654740f2a26ad62a5c155af9199af9e69b889claireho            strcat(saveBaseLoc,"/");
72927f654740f2a26ad62a5c155af9199af9e69b889claireho
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            this->runIndexedTest( index, TRUE, name, par );
73127f654740f2a26ad62a5c155af9199af9e69b889claireho
73227f654740f2a26ad62a5c155af9199af9e69b889claireho            UDate timeStop = uprv_getRawUTCtime();
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            rval = TRUE; // at least one test has been called
73427f654740f2a26ad62a5c155af9199af9e69b889claireho            char secs[256];
73554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            if(!no_time) {
73654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius              sprintf(secs, "%f", (timeStop-timeStart)/1000.0);
73754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            } else {
73854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius              secs[0]=0;
73954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            }
74027f654740f2a26ad62a5c155af9199af9e69b889claireho
74127f654740f2a26ad62a5c155af9199af9e69b889claireho
74227f654740f2a26ad62a5c155af9199af9e69b889claireho            strcpy(saveBaseLoc,name);
74327f654740f2a26ad62a5c155af9199af9e69b889claireho
74427f654740f2a26ad62a5c155af9199af9e69b889claireho
74527f654740f2a26ad62a5c155af9199af9e69b889claireho            ctest_xml_testcase(baseName, name, secs, (lastErrorCount!=errorCount)?"err":NULL);
74627f654740f2a26ad62a5c155af9199af9e69b889claireho
74727f654740f2a26ad62a5c155af9199af9e69b889claireho
74827f654740f2a26ad62a5c155af9199af9e69b889claireho            saveBaseLoc[0]=0; /* reset path */
74927f654740f2a26ad62a5c155af9199af9e69b889claireho
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (lastErrorCount == errorCount) {
75127f654740f2a26ad62a5c155af9199af9e69b889claireho                sprintf( msg, "   } OK:   %s ", name );
75254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                if(!no_time) str_timeDelta(msg+strlen(msg),timeStop-timeStart);
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                lastTestFailed = FALSE;
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }else{
75527f654740f2a26ad62a5c155af9199af9e69b889claireho                sprintf(msg,  "   } ERRORS (%li) in %s", (long)(errorCount-lastErrorCount), name);
75654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                if(!no_time) str_timeDelta(msg+strlen(msg),timeStop-timeStart);
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                for(int i=0;i<LL_indentlevel;i++) {
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errorList += " ";
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errorList += name;
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errorList += "\n";
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                lastTestFailed = TRUE;
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            LL_indentlevel -= 3;
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (lastTestFailed) {
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                LL_message( "", TRUE);
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            LL_message( msg, TRUE);
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (lastTestFailed) {
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                LL_message( "", TRUE);
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            LL_indentlevel += 3;
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        index++;
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }while(name);
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
77827f654740f2a26ad62a5c155af9199af9e69b889claireho    *saveBaseLoc = 0;
77927f654740f2a26ad62a5c155af9199af9e69b889claireho
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gTest = saveTest;
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Adds given string to the log if we are in verbose mode.
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::log( const UnicodeString &message )
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( verbose ) {
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LL_message( message, FALSE );
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Adds given string to the log if we are in verbose mode. Adds a new line to
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* the given message.
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::logln( const UnicodeString &message )
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( verbose ) {
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LL_message( message, TRUE );
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::logln( void )
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( verbose ) {
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LL_message( "", TRUE );
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Unconditionally adds given string to the log.
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::info( const UnicodeString &message )
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  LL_message( message, FALSE );
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Unconditionally adds given string to the log. Adds a new line to
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* the given message.
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::infoln( const UnicodeString &message )
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  LL_message( message, TRUE );
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::infoln( void )
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  LL_message( "", TRUE );
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t IntlTest::IncErrorCount( void )
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCount++;
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (caller) caller->IncErrorCount();
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return errorCount;
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t IntlTest::IncDataErrorCount( void )
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dataErrorCount++;
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (caller) caller->IncDataErrorCount();
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return dataErrorCount;
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::err()
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IncErrorCount();
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::err( const UnicodeString &message )
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IncErrorCount();
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!no_err_msg) LL_message( message, FALSE );
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::errln( const UnicodeString &message )
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IncErrorCount();
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!no_err_msg) LL_message( message, TRUE );
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::dataerr( const UnicodeString &message )
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IncDataErrorCount();
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!warn_on_missing_data) {
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IncErrorCount();
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!no_err_msg) LL_message( message, FALSE );
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::dataerrln( const UnicodeString &message )
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IncDataErrorCount();
8806d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UnicodeString msg;
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!warn_on_missing_data) {
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IncErrorCount();
8836d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        msg = message;
8846d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    } else {
8856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        msg = UnicodeString("[DATA] " + message);
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
8886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (!no_err_msg) LL_message( msg + " - (Are you missing data?)", TRUE );
8896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru}
8906d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
8916d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queruvoid IntlTest::errcheckln(UErrorCode status, const UnicodeString &message ) {
8926d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (status == U_FILE_ACCESS_ERROR || status == U_MISSING_RESOURCE_ERROR) {
8936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln(message);
8946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    } else {
8956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errln(message);
8966d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* convenience functions that include sprintf formatting */
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::log(const char *fmt, ...)
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* sprintf it just to make sure that the information is valid */
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( verbose ) {
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log(UnicodeString(buffer, ""));
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::logln(const char *fmt, ...)
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* sprintf it just to make sure that the information is valid */
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( verbose ) {
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString(buffer, ""));
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* convenience functions that include sprintf formatting */
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::info(const char *fmt, ...)
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* sprintf it just to make sure that the information is valid */
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    info(UnicodeString(buffer, ""));
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::infoln(const char *fmt, ...)
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* sprintf it just to make sure that the information is valid */
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    infoln(UnicodeString(buffer, ""));
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::err(const char *fmt, ...)
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err(UnicodeString(buffer, ""));
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::errln(const char *fmt, ...)
965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errln(UnicodeString(buffer, ""));
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::dataerrln(const char *fmt, ...)
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dataerrln(UnicodeString(buffer, ""));
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
9866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queruvoid IntlTest::errcheckln(UErrorCode status, const char *fmt, ...)
9876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru{
9886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    char buffer[4000];
9896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    va_list ap;
9906d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
9916d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    va_start(ap, fmt);
9926d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    vsprintf(buffer, fmt, ap);
9936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    va_end(ap);
9946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
9956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (status == U_FILE_ACCESS_ERROR || status == U_MISSING_RESOURCE_ERROR) {
9966d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln(UnicodeString(buffer, ""));
9976d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    } else {
9986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errln(UnicodeString(buffer, ""));
9996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
10006d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru}
10016d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::printErrors()
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     IntlTest::LL_message(errorList, TRUE);
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::LL_message( UnicodeString message, UBool newline )
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // string that starts with a LineFeed character and continues
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // with spaces according to the current indentation
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar indentUChars[] = {
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        '\n',
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString indent(FALSE, indentUChars, 1 + LL_indentlevel);
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[10000];
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // stream out the indentation string first if necessary
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length = indent.extract(1, indent.length(), buffer, sizeof(buffer));
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (length > 0) {
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fwrite(buffer, sizeof(*buffer), length, (FILE *)testoutfp);
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // replace each LineFeed by the indentation string
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    message.findAndReplace(UnicodeString((UChar)'\n'), indent);
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // stream out the message
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length = message.extract(0, message.length(), buffer, sizeof(buffer));
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (length > 0) {
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length = length > 10000 ? 10000 : length;
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fwrite(buffer, sizeof(*buffer), length, (FILE *)testoutfp);
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (newline) {
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char newLine = '\n';
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fwrite(&newLine, sizeof(newLine), 1, (FILE *)testoutfp);
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // A newline usually flushes the buffer, but
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // flush the message just in case of a core dump.
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fflush((FILE *)testoutfp);
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Print a usage message for this test class.
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::usage( void )
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool save_verbose = setVerbose( TRUE );
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Test names:");
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("-----------");
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t index = 0;
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* name = NULL;
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    do{
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        this->runIndexedTest( index, FALSE, name );
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!name) break;
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(name);
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        index++;
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }while (name && (name[0] != 0));
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setVerbose( save_verbose );
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// memory leak reporting software will be able to take advantage of the testsuite
1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// being run a second time local to a specific method in order to report only actual leaks
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::run_phase2( char* name, char* par ) // supports reporting memory leaks
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString* strLeak = new UnicodeString("forced leak"); // for verifying purify filter
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strLeak->append(" for verifying purify filter");
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return this->runTest( name, par );
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if UCONFIG_NO_LEGACY_CONVERSION
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define TRY_CNV_1 "iso-8859-1"
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define TRY_CNV_2 "ibm-1208"
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define TRY_CNV_1 "iso-8859-7"
1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define TRY_CNV_2 "sjis"
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querumain(int argc, char* argv[])
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool syntax = FALSE;
1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool all = FALSE;
1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool verbose = FALSE;
1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool no_err_msg = FALSE;
110254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UBool no_time = FALSE;
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool quick = TRUE;
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool name = FALSE;
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool leaks = FALSE;
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool warnOnMissingData = FALSE;
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool defaultDataFound = FALSE;
110850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t threadCount = 1;
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode = U_ZERO_ERROR;
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter *cnv = NULL;
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *warnOrErr = "Failure";
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate startTime, endTime;
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t diffTime;
1114b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char *props[IntlTest::kMaxProps];
1115b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t nProps = 0;
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U_MAIN_INIT_ARGS(argc, argv);
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
111927f654740f2a26ad62a5c155af9199af9e69b889claireho    startTime = uprv_getRawUTCtime();
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int i = 1; i < argc; ++i) {
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (argv[i][0] == '-') {
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const char* str = argv[i] + 1;
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (strcmp("verbose", str) == 0 ||
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                strcmp("v", str) == 0)
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                verbose = TRUE;
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else if (strcmp("noerrormsg", str) == 0 ||
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     strcmp("n", str) == 0)
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                no_err_msg = TRUE;
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else if (strcmp("exhaustive", str) == 0 ||
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     strcmp("e", str) == 0)
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                quick = FALSE;
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else if (strcmp("all", str) == 0 ||
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     strcmp("a", str) == 0)
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                all = TRUE;
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else if (strcmp("leaks", str) == 0 ||
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     strcmp("l", str) == 0)
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                leaks = TRUE;
113954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            else if (strcmp("notime", str) == 0 ||
114054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                     strcmp("T", str) == 0)
114154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                no_time = TRUE;
114227f654740f2a26ad62a5c155af9199af9e69b889claireho            else if (strcmp("x", str)==0) {
114327f654740f2a26ad62a5c155af9199af9e69b889claireho              if(++i>=argc) {
114427f654740f2a26ad62a5c155af9199af9e69b889claireho                printf("* Error: '-x' option requires an argument. usage: '-x outfile.xml'.\n");
114527f654740f2a26ad62a5c155af9199af9e69b889claireho                syntax = TRUE;
114627f654740f2a26ad62a5c155af9199af9e69b889claireho              }
114727f654740f2a26ad62a5c155af9199af9e69b889claireho              if(ctest_xml_setFileName(argv[i])) { /* set the name */
114827f654740f2a26ad62a5c155af9199af9e69b889claireho                return 1; /* error */
114927f654740f2a26ad62a5c155af9199af9e69b889claireho              }
115027f654740f2a26ad62a5c155af9199af9e69b889claireho            } else if (strcmp("w", str) == 0) {
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              warnOnMissingData = TRUE;
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              warnOrErr = "WARNING";
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
115450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            else if (strncmp("threads:", str, 8) == 0) {
115550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                threadCount = atoi(str + 8);
115650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
1157b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            else if (strncmp("prop:", str, 5) == 0) {
1158b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                if (nProps < IntlTest::kMaxProps) {
1159b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    props[nProps] = str + 5;
1160b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                }
1161b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                nProps++;
1162b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else {
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                syntax = TRUE;
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else{
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = TRUE;
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!all && !name) {
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        all = TRUE;
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if (all && name) {
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        syntax = TRUE;
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (syntax) {
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout,
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### Syntax:\n"
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### IntlTest [-option1 -option2 ...] [testname1 testname2 ...] \n"
118150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                "### \n"
118250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                "### Options are: verbose (v), all (a), noerrormsg (n), \n"
118327f654740f2a26ad62a5c155af9199af9e69b889claireho                "### exhaustive (e), leaks (l), -x xmlfile.xml, prop:<propery>=<value>, \n"
118454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                "### notime (T), \n"
118550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                "### threads:<threadCount> (Mulithreading must first be \n"
118650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                "###     enabled otherwise this will be ignored. \n"
118750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                "###     The default thread count is 1.),\n"
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### (Specify either -all (shortcut -a) or a test name). \n"
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### -all will run all of the tests.\n"
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### \n"
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### To get a list of the test names type: intltest LIST \n"
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### To run just the utility tests type: intltest utility \n"
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### \n"
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### Test names can be nested using slashes (\"testA/subtest1\") \n"
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### For example to list the utility tests type: intltest utility/LIST \n"
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### To run just the Locale test type: intltest utility/LocaleTest \n"
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### \n"
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### A parameter can be specified for a test by appending '@' and the value \n"
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### to the testname. \n\n");
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 1;
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1203b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (nProps > IntlTest::kMaxProps) {
1204b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        fprintf(stdout, "### Too many properties.  Exiting.\n");
1205b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
1206b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool all_tests_exist = TRUE;
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MajorTestLevel major;
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    major.setVerbose( verbose );
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    major.setNoErrMsg( no_err_msg );
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    major.setQuick( quick );
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    major.setLeaks( leaks );
121350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    major.setThreadCount( threadCount );
1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    major.setWarnOnMissingData( warnOnMissingData );
121554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    major.setNotime (no_time);
1216b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (int32_t i = 0; i < nProps; i++) {
1217b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        major.setProperty(props[i]);
1218b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
121927f654740f2a26ad62a5c155af9199af9e69b889claireho
122027f654740f2a26ad62a5c155af9199af9e69b889claireho
1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "-----------------------------------------------\n");
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, " IntlTest (C++) Test Suite for                 \n");
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   International Components for Unicode %s\n", U_ICU_VERSION);
122427f654740f2a26ad62a5c155af9199af9e69b889claireho
122527f654740f2a26ad62a5c155af9199af9e69b889claireho
1226b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {
1227b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	const char *charsetFamily = "Unknown";
1228b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t voidSize = (int32_t)sizeof(void*);
1229b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t bits = voidSize * 8;
1230b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(U_CHARSET_FAMILY==U_ASCII_FAMILY) {
1231b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru           charsetFamily="ASCII";
1232b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        } else if(U_CHARSET_FAMILY==U_EBCDIC_FAMILY) {
1233b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru           charsetFamily="EBCDIC";
1234b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
1235b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        fprintf(stdout,
1236b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    "   Bits: %d, Byte order: %s, Chars: %s\n",
1237b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                     bits, U_IS_BIG_ENDIAN?"Big endian":"Little endian",
1238b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                     charsetFamily);
1239b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "-----------------------------------------------\n");
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, " Options:                                       \n");
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   all (a)                  : %s\n", (all?               "On" : "Off"));
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   Verbose (v)              : %s\n", (verbose?           "On" : "Off"));
1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   No error messages (n)    : %s\n", (no_err_msg?        "On" : "Off"));
1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   Exhaustive (e)           : %s\n", (!quick?            "On" : "Off"));
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   Leaks (l)                : %s\n", (leaks?             "On" : "Off"));
124754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    fprintf(stdout, "   notime (T)               : %s\n", (no_time?             "On" : "Off"));
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   Warn on missing data (w) : %s\n", (warnOnMissingData? "On" : "Off"));
124950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if (ICU_USE_THREADS==0)
125050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fprintf(stdout, "   Threads                  : Disabled\n");
125150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#else
125250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fprintf(stdout, "   Threads                  : %d\n", threadCount);
125350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
1254b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (int32_t i = 0; i < nProps; i++) {
1255b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        fprintf(stdout, "   Custom property (prop:)  : %s\n", props[i]);
1256b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "-----------------------------------------------\n");
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Check whether ICU will initialize without forcing the build data directory into
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  the ICU_DATA path.  Success here means either the data dll contains data, or that
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  this test program was run with ICU_DATA set externally.  Failure of this check
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  is normal when ICU data is not packaged into a shared library.
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  Whether or not this test succeeds, we want to cleanup and reinitialize
1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  with a data path so that data loading from individual files can be tested.
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_init(&errorCode);
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stderr,
1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "#### Note:  ICU Init without build-specific setDataDirectory() failed.\n");
1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        defaultDataFound = FALSE;
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        defaultDataFound = TRUE;
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_cleanup();
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode = U_ZERO_ERROR;
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Initialize ICU */
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!defaultDataFound) {
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::setICU_DATA();   // Must set data directory before u_init() is called.
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_init(&errorCode);
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stderr,
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "#### ERROR! %s: u_init() failed with status = \"%s\".\n"
1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "*** Check the ICU_DATA environment variable and \n"
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "*** check that the data files are present.\n", argv[0], u_errorName(errorCode));
1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(warnOnMissingData == 0) {
1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fprintf(stderr, "*** Exiting.  Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n");
1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_cleanup();
1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return 1;
1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // initial check for the default converter
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode = U_ZERO_ERROR;
1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv = ucnv_open(0, &errorCode);
1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(cnv != 0) {
1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // ok
1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_close(cnv);
1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout,
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** %s! The default converter [%s] cannot be opened.\n"
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** Check the ICU_DATA environment variable and\n"
1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** check that the data files are present.\n",
1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                warnOrErr, ucnv_getDefaultName());
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!warnOnMissingData) {
1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          fprintf(stdout, "*** Exiting.  Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n");
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return 1;
1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // try more data
1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv = ucnv_open(TRY_CNV_2, &errorCode);
1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(cnv != 0) {
1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // ok
1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_close(cnv);
1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout,
1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** %s! The converter for " TRY_CNV_2 " cannot be opened.\n"
1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** Check the ICU_DATA environment variable and \n"
1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** check that the data files are present.\n", warnOrErr);
1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!warnOnMissingData) {
1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          fprintf(stdout, "*** Exiting.  Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n");
1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return 1;
1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle *rb = ures_open(0, "en", &errorCode);
1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_close(rb);
1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout,
1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** %s! The \"en\" locale resource bundle cannot be opened.\n"
1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** Check the ICU_DATA environment variable and \n"
1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** check that the data files are present.\n", warnOrErr);
1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!warnOnMissingData) {
1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          fprintf(stdout, "*** Exiting.  Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n");
1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return 1;
1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale originalLocale;  // Save the default locale for comparison later on.
1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
134627f654740f2a26ad62a5c155af9199af9e69b889claireho    if(ctest_xml_init("intltest"))
134727f654740f2a26ad62a5c155af9199af9e69b889claireho      return 1;
134827f654740f2a26ad62a5c155af9199af9e69b889claireho
134927f654740f2a26ad62a5c155af9199af9e69b889claireho
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* TODO: Add option to call u_cleanup and rerun tests. */
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (all) {
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        major.runTest();
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (leaks) {
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            major.run_phase2( NULL, NULL );
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int i = 1; i < argc; ++i) {
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (argv[i][0] != '-') {
1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                char* name = argv[i];
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fprintf(stdout, "\n=== Handling test: %s: ===\n", name);
136127f654740f2a26ad62a5c155af9199af9e69b889claireho
136227f654740f2a26ad62a5c155af9199af9e69b889claireho                char baseName[1024];
136327f654740f2a26ad62a5c155af9199af9e69b889claireho                sprintf(baseName, "/%s/", name);
136427f654740f2a26ad62a5c155af9199af9e69b889claireho
1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                char* parameter = strchr( name, '@' );
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (parameter) {
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    *parameter = 0;
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    parameter += 1;
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                execCount = 0;
137127f654740f2a26ad62a5c155af9199af9e69b889claireho                UBool res = major.runTest( name, parameter, baseName );
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (leaks && res) {
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    major.run_phase2( name, parameter );
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (!res || (execCount <= 0)) {
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    fprintf(stdout, "\n---ERROR: Test doesn't exist: %s!\n", name);
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    all_tests_exist = FALSE;
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
137927f654740f2a26ad62a5c155af9199af9e69b889claireho            } else if(!strcmp(argv[i],"-x")) {
138027f654740f2a26ad62a5c155af9199af9e69b889claireho              i++;
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
138527f654740f2a26ad62a5c155af9199af9e69b889claireho
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CalendarTimeZoneTest::cleanup();
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(_testDataPath);
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testDataPath = 0;
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale lastDefaultLocale;
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (originalLocale != lastDefaultLocale) {
1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        major.errln("FAILURE: A test changed the default locale without resetting it.");
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "\n--------------------------------------\n");
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (major.getErrors() == 0) {
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Call it twice to make sure that the defaults were reset. */
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Call it before the OK message to verify proper cleanup. */
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_cleanup();
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_cleanup();
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout, "OK: All tests passed without error.\n");
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (major.getDataErrors() != 0) {
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fprintf(stdout, "\t*WARNING* some data-loading errors were ignored by the -w option.\n");
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout, "Errors in total: %ld.\n", (long)major.getErrors());
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        major.printErrors();
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (major.getDataErrors() != 0) {
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fprintf(stdout, "\t*Note* some errors are data-loading related. If the data used is not the \n"
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "\tstock ICU data (i.e some have been added or removed), consider using\n"
1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "\tthe '-w' option to turn these errors into warnings.\n");
1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Call afterwards to display errors. */
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_cleanup();
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "--------------------------------------\n");
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (execCount <= 0) {
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout, "***** Not all called tests actually exist! *****\n");
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
143054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(!no_time) {
143154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      endTime = uprv_getRawUTCtime();
143254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      diffTime = (int32_t)(endTime - startTime);
143354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      printf("Elapsed Time: %02d:%02d:%02d.%03d\n",
143454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius             (int)((diffTime%U_MILLIS_PER_DAY)/U_MILLIS_PER_HOUR),
143554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius             (int)((diffTime%U_MILLIS_PER_HOUR)/U_MILLIS_PER_MINUTE),
143654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius             (int)((diffTime%U_MILLIS_PER_MINUTE)/U_MILLIS_PER_SECOND),
143754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius             (int)(diffTime%U_MILLIS_PER_SECOND));
143854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
143927f654740f2a26ad62a5c155af9199af9e69b889claireho
144027f654740f2a26ad62a5c155af9199af9e69b889claireho    if(ctest_xml_fini())
144127f654740f2a26ad62a5c155af9199af9e69b889claireho      return 1;
144227f654740f2a26ad62a5c155af9199af9e69b889claireho
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return major.getErrors();
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char* IntlTest::loadTestData(UErrorCode& err){
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( _testDataPath == NULL){
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char*      directory=NULL;
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UResourceBundle* test =NULL;
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char* tdpath=NULL;
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* tdrelativepath;
1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined (U_TOPBUILDDIR)
145454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        tdrelativepath = "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING;
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        directory = U_TOPBUILDDIR;
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
145754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        tdrelativepath = ".." U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING;
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        directory = pathToDataDirectory();
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tdpath = (char*) malloc(sizeof(char) *(( strlen(directory) * strlen(tdrelativepath)) + 100));
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* u_getDataDirectory shoul return \source\data ... set the
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * directory to ..\source\data\..\test\testdata\out\testdata
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(tdpath, directory);
1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcat(tdpath, tdrelativepath);
1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcat(tdpath,"testdata");
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        test=ures_open(tdpath, "testtypes", &err);
1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err)){
1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err = U_FILE_ACCESS_ERROR;
14756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            it_dataerrln((UnicodeString)"Could not load testtypes.res in testdata bundle with path " + tdpath + (UnicodeString)" - " + u_errorName(err));
1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return "";
1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ures_close(test);
1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        _testDataPath = tdpath;
1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return _testDataPath;
1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return _testDataPath;
1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char* IntlTest::getTestDataPath(UErrorCode& err) {
1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return loadTestData(err);
1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Returns the path to icu/source/test/testdata/ */
1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char *IntlTest::getSourceTestData(UErrorCode& /*err*/) {
1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *srcDataDir = NULL;
1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef U_TOPSRCDIR
149354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    srcDataDir = U_TOPSRCDIR U_FILE_SEP_STRING"test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING;
1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
149554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    srcDataDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING;
149654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    FILE *f = fopen(".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING "rbbitst.txt", "r");
1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (f) {
1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* We're in icu/source/test/intltest/ */
1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fclose(f);
1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1502b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        /* We're in icu/source/test/intltest/Platform/(Debug|Release) */
150354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        srcDataDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata"U_FILE_SEP_STRING;
1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return srcDataDir;
1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char* IntlTest::fgDataDir = NULL;
1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* returns the path to icu/source/data */
1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char *  IntlTest::pathToDataDirectory()
1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(fgDataDir != NULL) {
1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return fgDataDir;
1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* U_TOPSRCDIR is set by the makefiles on UNIXes when building cintltst and intltst
1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              to point to the top of the build hierarchy, which may or
1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              may not be the same as the source directory, depending on
1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              the configure options used.  At any rate,
1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              set the data path to the built data from this directory.
1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              The value is complete with quotes, so it can be used
1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              as-is as a string constant.
1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined (U_TOPSRCDIR)
1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fgDataDir = U_TOPSRCDIR  U_FILE_SEP_STRING "data" U_FILE_SEP_STRING;
1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* On Windows, the file name obtained from __FILE__ includes a full path.
1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *             This file is "wherever\icu\source\test\cintltst\cintltst.c"
1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *             Change to    "wherever\icu\source\data"
1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static char p[sizeof(__FILE__) + 10];
1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char *pBackSlash;
1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int i;
1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(p, __FILE__);
1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* We want to back over three '\' chars.                            */
1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*   Only Windows should end up here, so looking for '\' is safe.   */
1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i=1; i<=3; i++) {
1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pBackSlash = strrchr(p, U_FILE_SEP_CHAR);
1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (pBackSlash != NULL) {
1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                *pBackSlash = 0;        /* Truncate the string at the '\'   */
1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (pBackSlash != NULL) {
1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* We found and truncated three names from the path.
1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *  Now append "source\data" and set the environment
1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            */
1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strcpy(pBackSlash, U_FILE_SEP_STRING "data" U_FILE_SEP_STRING );
1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fgDataDir = p;
1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* __FILE__ on MSVC7 does not contain the directory */
156154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            FILE *file = fopen(".." U_FILE_SEP_STRING ".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "Makefile.in", "r");
1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (file) {
1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fclose(file);
156454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                fgDataDir = ".." U_FILE_SEP_STRING ".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING;
1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else {
156754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                fgDataDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING;
1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fgDataDir;
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This is a variant of cintltst/ccolltst.c:CharsToUChars().
157927f654740f2a26ad62a5c155af9199af9e69b889claireho * It converts an invariant-character string into a UnicodeString, with
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * unescaping \u sequences.
1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
158250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString CharsToUnicodeString(const char* chars){
158327f654740f2a26ad62a5c155af9199af9e69b889claireho    return UnicodeString(chars, -1, US_INV).unescape();
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString ctou(const char* chars) {
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return CharsToUnicodeString(chars);
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define RAND_M  (714025)
1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define RAND_IA (1366)
1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define RAND_IC (150889)
1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t RAND_SEED;
1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Returns a uniform random value x, with 0.0 <= x < 1.0.  Use
1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * with care: Does not return all possible values; returns one of
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 714,025 values, uniformly spaced.  However, the period is
1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * effectively infinite.  See: Numerical Recipes, section 7.1.
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param seedp pointer to seed. Set *seedp to any negative value
1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * to restart the sequence.
1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufloat IntlTest::random(int32_t* seedp) {
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static int32_t iy, ir[98];
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static UBool first=TRUE;
1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t j;
1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (*seedp < 0 || first) {
1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        first = FALSE;
1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ((*seedp=(RAND_IC-(*seedp)) % RAND_M) < 0) *seedp = -(*seedp);
1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (j=1;j<=97;++j) {
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *seedp=(RAND_IA*(*seedp)+RAND_IC) % RAND_M;
1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ir[j]=(*seedp);
1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *seedp=(RAND_IA*(*seedp)+RAND_IC) % RAND_M;
1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        iy=(*seedp);
1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    j=(int32_t)(1 + 97.0*iy/RAND_M);
1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U_ASSERT(j>=1 && j<=97);
1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iy=ir[j];
1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *seedp=(RAND_IA*(*seedp)+RAND_IC) % RAND_M;
1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ir[j]=(*seedp);
1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (float) iy/RAND_M;
1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Convenience method using a global seed.
1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufloat IntlTest::random() {
1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return random(&RAND_SEED);
1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic inline UChar toHex(int32_t i) {
1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UChar)(i + (i < 10 ? 0x30 : (0x41 - 10)));
1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UnicodeString& escape(const UnicodeString& s, UnicodeString& result) {
1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i=0; i<s.length(); ++i) {
1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar c = s[i];
1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (c <= (UChar)0x7F) {
1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += c;
1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += (UChar)0x5c;
1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += (UChar)0x75;
1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += toHex((c >> 12) & 0xF);
1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += toHex((c >>  8) & 0xF);
1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += toHex((c >>  4) & 0xF);
1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += toHex( c        & 0xF);
1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return result;
1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define VERBOSE_ASSERTIONS
1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
16578393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusUBool IntlTest::assertTrue(const char* message, UBool condition, UBool quiet, UBool possibleDataError, const char *file, int line) {
16588393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if (file != NULL) {
16598393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        if (!condition) {
16608393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            if (possibleDataError) {
16618393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                dataerrln("%s:%d: FAIL: assertTrue() failed: %s", file, line, message);
16628393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            } else {
16638393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                errln("%s:%d: FAIL: assertTrue() failed: %s", file, line, message);
16648393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            }
16658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        } else if (!quiet) {
16668393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            logln("%s:%d: Ok: %s", file, line, message);
16676d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
16688393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    } else {
16698393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        if (!condition) {
16708393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            if (possibleDataError) {
16718393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                dataerrln("FAIL: assertTrue() failed: %s", message);
16728393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            } else {
16738393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                errln("FAIL: assertTrue() failed: %s", message);
16748393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            }
16758393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        } else if (!quiet) {
16768393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            logln("Ok: %s", message);
16778393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        }
16788393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return condition;
1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertFalse(const char* message, UBool condition, UBool quiet) {
1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (condition) {
1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: assertFalse() failed: %s", message);
1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if (!quiet) {
1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Ok: %s", message);
1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return !condition;
1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
16926d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruUBool IntlTest::assertSuccess(const char* message, UErrorCode ec, UBool possibleDataError) {
1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
16946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (possibleDataError) {
16956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("FAIL: %s (%s)", message, u_errorName(ec));
1696c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        } else {
16976d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            errcheckln(ec, "FAIL: %s (%s)", message, u_errorName(ec));
1698c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
16996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const char* message,
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const UnicodeString& expected,
17076d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                             const UnicodeString& actual,
17086d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                             UBool possibleDataError) {
1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (expected != actual) {
17106d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (possibleDataError) {
17116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln((UnicodeString)"FAIL: " + message + "; got " +
17126d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  prettify(actual) +
17136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  "; expected " + prettify(expected));
17146d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        } else {
17156d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            errln((UnicodeString)"FAIL: " + message + "; got " +
17166d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  prettify(actual) +
17176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  "; expected " + prettify(expected));
17186d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef VERBOSE_ASSERTIONS
1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"Ok: " + message + "; got " + prettify(actual));
1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const char* message,
1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const char* expected,
1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const char* actual) {
1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (uprv_strcmp(expected, actual) != 0) {
1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"FAIL: " + message + "; got \"" +
1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              actual +
1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "\"; expected \"" + expected + "\"");
1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef VERBOSE_ASSERTIONS
1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"Ok: " + message + "; got \"" + actual + "\"");
1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1746f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig CorneliusUBool IntlTest::assertEquals(const char* message,
1747f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius                             int32_t expected,
1748f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius                             int32_t actual) {
1749f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    if (expected != actual) {
1750f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        errln((UnicodeString)"FAIL: " + message + "; got " +
1751f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius              actual + "=0x" + toHex(actual) +
1752f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius              "; expected " + expected + "=0x" + toHex(expected));
1753f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        return FALSE;
1754f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    }
1755f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius#ifdef VERBOSE_ASSERTIONS
1756f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    else {
1757f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        logln((UnicodeString)"Ok: " + message + "; got " + actual + "=0x" + toHex(actual));
1758f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    }
1759f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius#endif
1760f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    return TRUE;
1761f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius}
1762f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius
1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const char* message,
1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const Formattable& expected,
1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const Formattable& actual) {
1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (expected != actual) {
1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"FAIL: " + message + "; got " +
1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              toString(actual) +
1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "; expected " + toString(expected));
1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef VERBOSE_ASSERTIONS
1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"Ok: " + message + "; got " + toString(actual));
1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char ASSERT_BUF[256];
1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* extractToAssertBuf(const UnicodeString& message) {
1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString buf;
1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    escape(message, buf);
1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buf.extract(0, 0x7FFFFFFF, ASSERT_BUF, sizeof(ASSERT_BUF)-1, 0);
1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ASSERT_BUF[sizeof(ASSERT_BUF)-1] = 0;
1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return ASSERT_BUF;
1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertTrue(const UnicodeString& message, UBool condition, UBool quiet) {
1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertTrue(extractToAssertBuf(message), condition, quiet);
1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertFalse(const UnicodeString& message, UBool condition, UBool quiet) {
1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertFalse(extractToAssertBuf(message), condition, quiet);
1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertSuccess(const UnicodeString& message, UErrorCode ec) {
1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertSuccess(extractToAssertBuf(message), ec);
1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const UnicodeString& message,
1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const UnicodeString& expected,
1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const UnicodeString& actual) {
1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertEquals(extractToAssertBuf(message), expected, actual);
1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const UnicodeString& message,
1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const char* expected,
1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const char* actual) {
1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertEquals(extractToAssertBuf(message), expected, actual);
1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//--------------------------------------------------------------------
1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Time bomb - allows temporary behavior that expires at a given
1817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//             release
1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//--------------------------------------------------------------------
1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1820103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusUBool IntlTest::isICUVersionBefore(int major, int minor, int milli) {
1821103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UVersionInfo iv;
1822103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UVersionInfo ov = { (uint8_t)major, (uint8_t)minor, (uint8_t)milli, 0 };
1823103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    u_getVersion(iv);
1824103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    return uprv_memcmp(iv, ov, U_MAX_VERSION_LENGTH) < 0;
1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const UnicodeString& message,
1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const Formattable& expected,
1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const Formattable& actual) {
1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertEquals(extractToAssertBuf(message), expected, actual);
1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1835b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid IntlTest::setProperty(const char* propline) {
1836b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (numProps < kMaxProps) {
1837b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        proplines[numProps] = propline;
1838b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
1839b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    numProps++;
1840b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
1841b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1842b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruconst char* IntlTest::getProperty(const char* prop) {
1843b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char* val = NULL;
1844b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (int32_t i = 0; i < numProps; i++) {
1845b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t plen = uprv_strlen(prop);
1846b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if ((int32_t)uprv_strlen(proplines[i]) > plen + 1
1847b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                && proplines[i][plen] == '='
1848b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                && uprv_strncmp(proplines[i], prop, plen) == 0) {
1849b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            val = &(proplines[i][plen+1]);
1850b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            break;
1851b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
1852b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
1853b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return val;
1854b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
1855b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Hey, Emacs, please set the following:
1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Local Variables:
1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * indent-tabs-mode: nil
1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * End:
1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1864