1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * Copyright (c) 1997-2014, 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
4159d709d503bab6e2b61931737e662dd293b40578ccornelius#include "udbgutil.h"
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef XP_MAC_CONSOLE
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <console.h>
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "Files.h"
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char* _testDataPath=NULL;
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Static list of errors found
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UnicodeString errorList;
5359d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void *knownList = NULL; // known issues
5459d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic UBool noKnownIssues = FALSE; // if TRUE, don't emit known issues
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//-----------------------------------------------------------------------------
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//convenience classes to ease porting code that uses the Java
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//string-concatenation operator (moved from findword test by rtg)
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// [LIU] Just to get things working
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUCharToUnicodeString(UChar c)
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return UnicodeString(c); }
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// [rtg] Just to get things working
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruoperator+(const UnicodeString& left,
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      long num)
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[64];    // nos changed from 10 to 64
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char danger = 'p';  // guard against overrunning the buffer (rtg)
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sprintf(buffer, "%ld", num);
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assert(danger == 'p');
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return left + buffer;
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruoperator+(const UnicodeString& left,
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      unsigned long num)
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[64];    // nos changed from 10 to 64
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char danger = 'p';  // guard against overrunning the buffer (rtg)
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sprintf(buffer, "%lu", num);
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assert(danger == 'p');
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return left + buffer;
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruInt64ToUnicodeString(int64_t num)
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[64];    // nos changed from 10 to 64
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char danger = 'p';  // guard against overrunning the buffer (rtg)
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
98103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if defined(_MSC_VER)
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sprintf(buffer, "%I64d", num);
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sprintf(buffer, "%lld", (long long)num);
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assert(danger == 'p');
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return buffer;
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// [LIU] Just to get things working
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruoperator+(const UnicodeString& left,
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      double num)
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[64];   // was 32, made it arbitrarily bigger (rtg)
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char danger = 'p'; // guard against overrunning the buffer (rtg)
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // IEEE floating point has 52 bits of mantissa, plus one assumed bit
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //  53*log(2)/log(10) = 15.95
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // so there is no need to show more than 16 digits. [alan]
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sprintf(buffer, "%.17g", num);
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assert(danger == 'p');
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return left + buffer;
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
12659d709d503bab6e2b61931737e662dd293b40578ccornelius#if 0
12759d709d503bab6e2b61931737e662dd293b40578ccorneliusUnicodeString
12859d709d503bab6e2b61931737e662dd293b40578ccorneliusoperator+(const UnicodeString& left,
12959d709d503bab6e2b61931737e662dd293b40578ccornelius          int64_t num) {
13059d709d503bab6e2b61931737e662dd293b40578ccornelius  return left + Int64ToUnicodeString(num);
13159d709d503bab6e2b61931737e662dd293b40578ccornelius}
13259d709d503bab6e2b61931737e662dd293b40578ccornelius#endif
13359d709d503bab6e2b61931737e662dd293b40578ccornelius
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
13727f654740f2a26ad62a5c155af9199af9e69b889claireho * Return a string display for this, without surrounding braces.
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString _toString(const Formattable& f) {
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s;
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (f.getType()) {
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kDate:
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UErrorCode status = U_ZERO_ERROR;
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            SimpleDateFormat fmt(status);
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_SUCCESS(status)) {
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                FieldPosition pos;
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fmt.format(f.getDate(), s, pos);
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                s.insert(0, "Date:");
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                s = UnicodeString("Error creating date format]");
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kDouble:
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s = UnicodeString("double:") + f.getDouble();
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kLong:
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s = UnicodeString("long:") + f.getLong();
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kInt64:
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s = UnicodeString("int64:") + Int64ToUnicodeString(f.getInt64());
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kString:
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        f.getString(s);
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s.insert(0, "String:");
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kArray:
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t i, n;
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const Formattable* array = f.getArray(n);
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            s.insert(0, UnicodeString("Array:"));
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString delim(", ");
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (i=0; i<n; ++i) {
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (i > 0) {
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    s.append(delim);
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                s = s + _toString(array[i]);
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
18427f654740f2a26ad62a5c155af9199af9e69b889claireho    case Formattable::kObject: {
18527f654740f2a26ad62a5c155af9199af9e69b889claireho        const CurrencyAmount* c = dynamic_cast<const CurrencyAmount*>(f.getObject());
18627f654740f2a26ad62a5c155af9199af9e69b889claireho        if (c != NULL) {
18727f654740f2a26ad62a5c155af9199af9e69b889claireho            s = _toString(c->getNumber()) + " " + UnicodeString(c->getISOCurrency());
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            s = UnicodeString("Unknown UObject");
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
19227f654740f2a26ad62a5c155af9199af9e69b889claireho    }
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s = UnicodeString("Unknown Formattable type=") + (int32_t)f.getType();
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return s;
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Originally coded this as operator+, but that makes the expression
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * + char* ambiguous. - liu
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString toString(const Formattable& f) {
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s((UChar)91/*[*/);
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.append(_toString(f));
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.append((UChar)0x5d/*]*/);
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return s;
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// useful when operator+ won't cooperate
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString toString(int32_t n) {
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return UnicodeString() + (long)n;
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21859d709d503bab6e2b61931737e662dd293b40578ccornelius
21959d709d503bab6e2b61931737e662dd293b40578ccornelius
22059d709d503bab6e2b61931737e662dd293b40578ccorneliusUnicodeString toString(UBool b) {
22159d709d503bab6e2b61931737e662dd293b40578ccornelius  return b ? UnicodeString("TRUE"):UnicodeString("FALSE");
22259d709d503bab6e2b61931737e662dd293b40578ccornelius}
22359d709d503bab6e2b61931737e662dd293b40578ccornelius
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// stephen - cleaned up 05/05/99
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, char num)
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (long)num; }
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, short num)
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (long)num; }
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, int num)
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (long)num; }
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, unsigned char num)
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (unsigned long)num; }
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, unsigned short num)
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (unsigned long)num; }
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, unsigned int num)
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (unsigned long)num; }
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, float num)
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (double)num; }
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Append a hex string to the target
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString&
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::appendHex(uint32_t number,
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t digits,
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString& target)
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar digitString[] = {
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }; /* "0123456789ABCDEF" */
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
253f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    if (digits < 0) {  // auto-digits
254f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        digits = 2;
255f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        uint32_t max = 0xff;
256f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        while (number > max) {
257f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius            digits += 2;
258f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius            max = (max << 8) | 0xff;
259f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        }
260f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    }
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (digits)
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 8:
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >> 28) & 0xF];
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 7:
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >> 24) & 0xF];
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 6:
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >> 20) & 0xF];
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 5:
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >> 16) & 0xF];
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 4:
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >> 12) & 0xF];
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 3:
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >>  8) & 0xF];
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 2:
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >>  4) & 0xF];
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 1:
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >>  0) & 0xF];
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += "**";
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return target;
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
286f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig CorneliusUnicodeString
287f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig CorneliusIntlTest::toHex(uint32_t number, int32_t digits) {
288f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    UnicodeString result;
289f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    appendHex(number, digits, result);
290f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    return result;
291f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius}
292f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius
29327f654740f2a26ad62a5c155af9199af9e69b889clairehostatic inline UBool isPrintable(UChar32 c) {
29427f654740f2a26ad62a5c155af9199af9e69b889claireho    return c <= 0x7E && (c >= 0x20 || c == 9 || c == 0xA || c == 0xD);
29527f654740f2a26ad62a5c155af9199af9e69b889claireho}
29627f654740f2a26ad62a5c155af9199af9e69b889claireho
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Replace nonprintable characters with unicode escapes
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString&
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::prettify(const UnicodeString &source,
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           UnicodeString &target)
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target.remove();
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target += "\"";
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < source.length(); )
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar32 ch = source.char32At(i);
31027f654740f2a26ad62a5c155af9199af9e69b889claireho        i += U16_LENGTH(ch);
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
31227f654740f2a26ad62a5c155af9199af9e69b889claireho        if (!isPrintable(ch))
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (ch <= 0xFFFF) {
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                target += "\\u";
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                appendHex(ch, 4, target);
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                target += "\\U";
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                appendHex(ch, 8, target);
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            target += ch;
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target += "\"";
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return target;
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Replace nonprintable characters with unicode escapes
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::prettify(const UnicodeString &source, UBool parseBackslash)
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString target;
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target.remove();
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target += "\"";
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < source.length();)
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar32 ch = source.char32At(i);
34527f654740f2a26ad62a5c155af9199af9e69b889claireho        i += U16_LENGTH(ch);
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
34727f654740f2a26ad62a5c155af9199af9e69b889claireho        if (!isPrintable(ch))
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (parseBackslash) {
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // If we are preceded by an odd number of backslashes,
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // then this character has already been backslash escaped.
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // Delete a backslash.
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                int32_t backslashCount = 0;
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                for (int32_t j=target.length()-1; j>=0; --j) {
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (target.charAt(j) == (UChar)92) {
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        ++backslashCount;
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    } else {
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        break;
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if ((backslashCount % 2) == 1) {
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    target.truncate(target.length() - 1);
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (ch <= 0xFFFF) {
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                target += "\\u";
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                appendHex(ch, 4, target);
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                target += "\\U";
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                appendHex(ch, 8, target);
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            target += ch;
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target += "\"";
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return target;
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*  IntlTest::setICU_DATA  - if the ICU_DATA environment variable is not already
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       set, try to deduce the directory in which ICU was built,
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       and set ICU_DATA to "icu/source/data" in that location.
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       The intent is to allow the tests to have a good chance
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       of running without requiring that the user manually set
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       ICU_DATA.  Common data isn't a problem, since it is
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       picked up via a static (build time) reference, but the
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       tests dynamically load some data.
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::setICU_DATA() {
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *original_ICU_DATA = getenv("ICU_DATA");
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (original_ICU_DATA != NULL && *original_ICU_DATA != 0) {
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*  If the user set ICU_DATA, don't second-guess the person. */
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // U_TOPBUILDDIR is set by the makefiles on UNIXes when building cintltst and intltst
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              to point to the top of the build hierarchy, which may or
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              may not be the same as the source directory, depending on
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              the configure options used.  At any rate,
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              set the data path to the built data from this directory.
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              The value is complete with quotes, so it can be used
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              as-is as a string constant.
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined (U_TOPBUILDDIR)
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static char env_string[] = U_TOPBUILDDIR "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING;
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_setDataDirectory(env_string);
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Use #else so we don't get compiler warnings due to the return above.
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* On Windows, the file name obtained from __FILE__ includes a full path.
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *             This file is "wherever\icu\source\test\cintltst\cintltst.c"
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *             Change to    "wherever\icu\source\data"
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char p[sizeof(__FILE__) + 10];
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char *pBackSlash;
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int i;
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(p, __FILE__);
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* We want to back over three '\' chars.                            */
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*   Only Windows should end up here, so looking for '\' is safe.   */
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i=1; i<=3; i++) {
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pBackSlash = strrchr(p, U_FILE_SEP_CHAR);
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (pBackSlash != NULL) {
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                *pBackSlash = 0;        /* Truncate the string at the '\'   */
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (pBackSlash != NULL) {
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* We found and truncated three names from the path.
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             *  Now append "source\data" and set the environment
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             */
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strcpy(pBackSlash, U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING);
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_setDataDirectory(p);     /*  p is "ICU_DATA=wherever\icu\source\data"    */
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* __FILE__ on MSVC7 does not contain the directory */
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_setDataDirectory(".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING);
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* No location for the data dir was identifiable.
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *   Add other fallbacks for the test data location here if the need arises
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//--------------------------------------------------------------------------------------
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const int32_t indentLevel_offset = 3;
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char delim = '/';
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest* IntlTest::gTest = NULL;
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t execCount = 0;
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_log( UnicodeString message )
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->log( message );
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_logln( UnicodeString message )
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->logln( message );
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_logln( void )
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->logln();
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_info( UnicodeString message )
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->info( message );
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_infoln( UnicodeString message )
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->infoln( message );
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_infoln( void )
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->infoln();
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_err()
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->err();
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_err( UnicodeString message )
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->err( message );
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_errln( UnicodeString message )
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->errln( message );
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_dataerr( UnicodeString message )
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->dataerr( message );
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_dataerrln( UnicodeString message )
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->dataerrln( message );
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::IntlTest()
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    caller = NULL;
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testPath = NULL;
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LL_linestart = TRUE;
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCount = 0;
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dataErrorCount = 0;
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    verbose = FALSE;
54354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    no_time = FALSE;
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    no_err_msg = FALSE;
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    warn_on_missing_data = FALSE;
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    quick = FALSE;
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    leaks = FALSE;
54850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    threadCount = 1;
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testoutfp = stdout;
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LL_indentlevel = indentLevel_offset;
551b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    numProps = 0;
55227f654740f2a26ad62a5c155af9199af9e69b889claireho    strcpy(basePath, "/");
55359d709d503bab6e2b61931737e662dd293b40578ccornelius    currName[0]=0;
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::setCaller( IntlTest* callingTest )
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    caller = callingTest;
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (caller) {
560c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        warn_on_missing_data = caller->warn_on_missing_data;
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        verbose = caller->verbose;
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        no_err_msg = caller->no_err_msg;
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        quick = caller->quick;
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testoutfp = caller->testoutfp;
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LL_indentlevel = caller->LL_indentlevel + indentLevel_offset;
566b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        numProps = caller->numProps;
567b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        for (int32_t i = 0; i < numProps; i++) {
568b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            proplines[i] = caller->proplines[i];
569b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::callTest( IntlTest& testToBeCalled, char* par )
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    execCount--; // correct a previously assumed test-exec, as this only calls a subtest
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testToBeCalled.setCaller( this );
57727f654740f2a26ad62a5c155af9199af9e69b889claireho    strcpy(testToBeCalled.basePath, this->basePath );
57827f654740f2a26ad62a5c155af9199af9e69b889claireho    UBool result = testToBeCalled.runTest( testPath, par, testToBeCalled.basePath );
57927f654740f2a26ad62a5c155af9199af9e69b889claireho    strcpy(testToBeCalled.basePath, this->basePath ); // reset it.
58027f654740f2a26ad62a5c155af9199af9e69b889claireho    return result;
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::setPath( char* pathVal )
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->testPath = pathVal;
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setVerbose( UBool verboseVal )
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval = this->verbose;
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->verbose = verboseVal;
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
59554dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusUBool IntlTest::setNotime( UBool no_time )
59654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius{
59754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UBool rval = this->no_time;
59854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    this->no_time = no_time;
59954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return rval;
60054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
60154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setWarnOnMissingData( UBool warn_on_missing_dataVal )
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval = this->warn_on_missing_data;
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->warn_on_missing_data = warn_on_missing_dataVal;
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setNoErrMsg( UBool no_err_msgVal )
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval = this->no_err_msg;
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->no_err_msg = no_err_msgVal;
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setQuick( UBool quickVal )
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval = this->quick;
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->quick = quickVal;
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setLeaks( UBool leaksVal )
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval = this->leaks;
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->leaks = leaksVal;
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
63050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoint32_t IntlTest::setThreadCount( int32_t count )
63150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
63250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t rval = this->threadCount;
63350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    this->threadCount = count;
63450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return rval;
63550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
63650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t IntlTest::getErrors( void )
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return errorCount;
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t IntlTest::getDataErrors( void )
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return dataErrorCount;
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
64727f654740f2a26ad62a5c155af9199af9e69b889clairehoUBool IntlTest::runTest( char* name, char* par, char *baseName )
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval;
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char* pos = NULL;
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
65227f654740f2a26ad62a5c155af9199af9e69b889claireho    char* baseNameBuffer = NULL;
65327f654740f2a26ad62a5c155af9199af9e69b889claireho
65427f654740f2a26ad62a5c155af9199af9e69b889claireho    if(baseName == NULL) {
65527f654740f2a26ad62a5c155af9199af9e69b889claireho      baseNameBuffer = (char*)malloc(1024);
65627f654740f2a26ad62a5c155af9199af9e69b889claireho      baseName=baseNameBuffer;
65727f654740f2a26ad62a5c155af9199af9e69b889claireho      strcpy(baseName, "/");
65827f654740f2a26ad62a5c155af9199af9e69b889claireho    }
65927f654740f2a26ad62a5c155af9199af9e69b889claireho
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (name)
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pos = strchr( name, delim ); // check if name contains path (by looking for '/')
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pos) {
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testPath = pos+1;   // store subpath for calling subtest
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *pos = 0;       // split into two strings
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testPath = NULL;
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!name || (name[0] == 0) || (strcmp(name, "*") == 0)) {
67027f654740f2a26ad62a5c155af9199af9e69b889claireho      rval = runTestLoop( NULL, par, baseName );
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else if (strcmp( name, "LIST" ) == 0) {
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        this->usage();
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rval = TRUE;
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
67727f654740f2a26ad62a5c155af9199af9e69b889claireho      rval = runTestLoop( name, par, baseName );
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pos)
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *pos = delim;  // restore original value at pos
68227f654740f2a26ad62a5c155af9199af9e69b889claireho    if(baseNameBuffer!=NULL) {
68327f654740f2a26ad62a5c155af9199af9e69b889claireho      free(baseNameBuffer);
68427f654740f2a26ad62a5c155af9199af9e69b889claireho    }
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// call individual tests, to be overriden to call implementations
68954dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusvoid IntlTest::runIndexedTest( int32_t /*index*/, UBool /*exec*/, const char* & /*name*/, char* /*par*/ )
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // to be overriden by a method like:
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (index) {
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 0: name = "First Test"; if (exec) FirstTest( par ); break;
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 1: name = "Second Test"; if (exec) SecondTest( par ); break;
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        default: name = ""; break;
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->errln("*** runIndexedTest needs to be overriden! ***");
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
70327f654740f2a26ad62a5c155af9199af9e69b889clairehoUBool IntlTest::runTestLoop( char* testname, char* par, char *baseName )
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t    index = 0;
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char*   name;
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool  run_this_test;
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t    lastErrorCount;
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool  rval = FALSE;
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool   lastTestFailed;
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
71227f654740f2a26ad62a5c155af9199af9e69b889claireho    if(baseName == NULL) {
71327f654740f2a26ad62a5c155af9199af9e69b889claireho      printf("ERROR: baseName can't be null.\n");
71427f654740f2a26ad62a5c155af9199af9e69b889claireho      return FALSE;
71527f654740f2a26ad62a5c155af9199af9e69b889claireho    } else {
71627f654740f2a26ad62a5c155af9199af9e69b889claireho      if ((char *)this->basePath != baseName) {
71727f654740f2a26ad62a5c155af9199af9e69b889claireho        strcpy(this->basePath, baseName);
71827f654740f2a26ad62a5c155af9199af9e69b889claireho      }
71927f654740f2a26ad62a5c155af9199af9e69b889claireho    }
72027f654740f2a26ad62a5c155af9199af9e69b889claireho
72127f654740f2a26ad62a5c155af9199af9e69b889claireho    char * saveBaseLoc = baseName+strlen(baseName);
72227f654740f2a26ad62a5c155af9199af9e69b889claireho
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IntlTest* saveTest = gTest;
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gTest = this;
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    do {
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        this->runIndexedTest( index, FALSE, name, par );
72750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (strcmp(name,"skip") == 0) {
72850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            run_this_test = FALSE;
72950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        } else {
73050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (!name || (name[0] == 0))
73150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                break;
73250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (!testname) {
73350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                run_this_test = TRUE;
73450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }else{
73550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                run_this_test = (UBool) (strcmp( name, testname ) == 0);
73650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (run_this_test) {
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            lastErrorCount = errorCount;
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            execCount++;
74127f654740f2a26ad62a5c155af9199af9e69b889claireho            char msg[256];
74227f654740f2a26ad62a5c155af9199af9e69b889claireho            sprintf(msg, "%s {", name);
74327f654740f2a26ad62a5c155af9199af9e69b889claireho            LL_message(msg, TRUE);
74427f654740f2a26ad62a5c155af9199af9e69b889claireho            UDate timeStart = uprv_getRawUTCtime();
74527f654740f2a26ad62a5c155af9199af9e69b889claireho            strcpy(saveBaseLoc,name);
74627f654740f2a26ad62a5c155af9199af9e69b889claireho            strcat(saveBaseLoc,"/");
74727f654740f2a26ad62a5c155af9199af9e69b889claireho
74859d709d503bab6e2b61931737e662dd293b40578ccornelius            strcpy(currName, name); // set
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            this->runIndexedTest( index, TRUE, name, par );
75059d709d503bab6e2b61931737e662dd293b40578ccornelius            currName[0]=0; // reset
75127f654740f2a26ad62a5c155af9199af9e69b889claireho
75227f654740f2a26ad62a5c155af9199af9e69b889claireho            UDate timeStop = uprv_getRawUTCtime();
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            rval = TRUE; // at least one test has been called
75427f654740f2a26ad62a5c155af9199af9e69b889claireho            char secs[256];
75554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            if(!no_time) {
75654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius              sprintf(secs, "%f", (timeStop-timeStart)/1000.0);
75754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            } else {
75854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius              secs[0]=0;
75954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            }
76027f654740f2a26ad62a5c155af9199af9e69b889claireho
76127f654740f2a26ad62a5c155af9199af9e69b889claireho
76227f654740f2a26ad62a5c155af9199af9e69b889claireho            strcpy(saveBaseLoc,name);
76327f654740f2a26ad62a5c155af9199af9e69b889claireho
76427f654740f2a26ad62a5c155af9199af9e69b889claireho
76527f654740f2a26ad62a5c155af9199af9e69b889claireho            ctest_xml_testcase(baseName, name, secs, (lastErrorCount!=errorCount)?"err":NULL);
76627f654740f2a26ad62a5c155af9199af9e69b889claireho
76727f654740f2a26ad62a5c155af9199af9e69b889claireho
76827f654740f2a26ad62a5c155af9199af9e69b889claireho            saveBaseLoc[0]=0; /* reset path */
76927f654740f2a26ad62a5c155af9199af9e69b889claireho
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (lastErrorCount == errorCount) {
77127f654740f2a26ad62a5c155af9199af9e69b889claireho                sprintf( msg, "   } OK:   %s ", name );
77254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                if(!no_time) str_timeDelta(msg+strlen(msg),timeStop-timeStart);
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                lastTestFailed = FALSE;
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }else{
77527f654740f2a26ad62a5c155af9199af9e69b889claireho                sprintf(msg,  "   } ERRORS (%li) in %s", (long)(errorCount-lastErrorCount), name);
77654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                if(!no_time) str_timeDelta(msg+strlen(msg),timeStop-timeStart);
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                for(int i=0;i<LL_indentlevel;i++) {
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errorList += " ";
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errorList += name;
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errorList += "\n";
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                lastTestFailed = TRUE;
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            LL_indentlevel -= 3;
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (lastTestFailed) {
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                LL_message( "", TRUE);
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            LL_message( msg, TRUE);
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (lastTestFailed) {
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                LL_message( "", TRUE);
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            LL_indentlevel += 3;
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        index++;
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }while(name);
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
79827f654740f2a26ad62a5c155af9199af9e69b889claireho    *saveBaseLoc = 0;
79927f654740f2a26ad62a5c155af9199af9e69b889claireho
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gTest = saveTest;
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Adds given string to the log if we are in verbose mode.
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::log( const UnicodeString &message )
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( verbose ) {
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LL_message( message, FALSE );
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Adds given string to the log if we are in verbose mode. Adds a new line to
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* the given message.
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::logln( const UnicodeString &message )
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( verbose ) {
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LL_message( message, TRUE );
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::logln( void )
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( verbose ) {
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LL_message( "", TRUE );
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Unconditionally adds given string to the log.
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::info( const UnicodeString &message )
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  LL_message( message, FALSE );
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Unconditionally adds given string to the log. Adds a new line to
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* the given message.
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::infoln( const UnicodeString &message )
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  LL_message( message, TRUE );
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::infoln( void )
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  LL_message( "", TRUE );
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t IntlTest::IncErrorCount( void )
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCount++;
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (caller) caller->IncErrorCount();
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return errorCount;
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t IntlTest::IncDataErrorCount( void )
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dataErrorCount++;
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (caller) caller->IncDataErrorCount();
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return dataErrorCount;
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::err()
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IncErrorCount();
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::err( const UnicodeString &message )
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IncErrorCount();
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!no_err_msg) LL_message( message, FALSE );
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::errln( const UnicodeString &message )
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IncErrorCount();
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!no_err_msg) LL_message( message, TRUE );
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::dataerr( const UnicodeString &message )
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IncDataErrorCount();
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!warn_on_missing_data) {
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IncErrorCount();
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!no_err_msg) LL_message( message, FALSE );
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::dataerrln( const UnicodeString &message )
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
89959d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t errCount = IncDataErrorCount();
9006d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UnicodeString msg;
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!warn_on_missing_data) {
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IncErrorCount();
9036d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        msg = message;
9046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    } else {
9056d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        msg = UnicodeString("[DATA] " + message);
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
90859d709d503bab6e2b61931737e662dd293b40578ccornelius    if (!no_err_msg) {
90959d709d503bab6e2b61931737e662dd293b40578ccornelius      if ( errCount == 1) {
91059d709d503bab6e2b61931737e662dd293b40578ccornelius          LL_message( msg + " - (Are you missing data?)", TRUE ); // only show this message the first time
91159d709d503bab6e2b61931737e662dd293b40578ccornelius      } else {
91259d709d503bab6e2b61931737e662dd293b40578ccornelius          LL_message( msg , TRUE );
91359d709d503bab6e2b61931737e662dd293b40578ccornelius      }
91459d709d503bab6e2b61931737e662dd293b40578ccornelius    }
9156d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru}
9166d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
9176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queruvoid IntlTest::errcheckln(UErrorCode status, const UnicodeString &message ) {
9186d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (status == U_FILE_ACCESS_ERROR || status == U_MISSING_RESOURCE_ERROR) {
9196d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln(message);
9206d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    } else {
9216d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errln(message);
9226d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* convenience functions that include sprintf formatting */
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::log(const char *fmt, ...)
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* sprintf it just to make sure that the information is valid */
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( verbose ) {
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log(UnicodeString(buffer, ""));
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::logln(const char *fmt, ...)
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* sprintf it just to make sure that the information is valid */
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( verbose ) {
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString(buffer, ""));
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
95459d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::logKnownIssue(const char *ticket, const char *fmt, ...)
95559d709d503bab6e2b61931737e662dd293b40578ccornelius{
95659d709d503bab6e2b61931737e662dd293b40578ccornelius    char buffer[4000];
95759d709d503bab6e2b61931737e662dd293b40578ccornelius    va_list ap;
95859d709d503bab6e2b61931737e662dd293b40578ccornelius
95959d709d503bab6e2b61931737e662dd293b40578ccornelius    va_start(ap, fmt);
96059d709d503bab6e2b61931737e662dd293b40578ccornelius    /* sprintf it just to make sure that the information is valid */
96159d709d503bab6e2b61931737e662dd293b40578ccornelius    vsprintf(buffer, fmt, ap);
96259d709d503bab6e2b61931737e662dd293b40578ccornelius    va_end(ap);
96359d709d503bab6e2b61931737e662dd293b40578ccornelius    return logKnownIssue(ticket, UnicodeString(buffer, ""));
96459d709d503bab6e2b61931737e662dd293b40578ccornelius}
96559d709d503bab6e2b61931737e662dd293b40578ccornelius
96659d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::logKnownIssue(const char *ticket) {
96759d709d503bab6e2b61931737e662dd293b40578ccornelius  return logKnownIssue(ticket, UnicodeString());
96859d709d503bab6e2b61931737e662dd293b40578ccornelius}
96959d709d503bab6e2b61931737e662dd293b40578ccornelius
97059d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::logKnownIssue(const char *ticket, const UnicodeString &msg) {
97159d709d503bab6e2b61931737e662dd293b40578ccornelius  if(noKnownIssues) return FALSE;
97259d709d503bab6e2b61931737e662dd293b40578ccornelius
97359d709d503bab6e2b61931737e662dd293b40578ccornelius  char fullpath[2048];
97459d709d503bab6e2b61931737e662dd293b40578ccornelius  strcpy(fullpath, basePath);
97559d709d503bab6e2b61931737e662dd293b40578ccornelius  strcat(fullpath, currName);
97659d709d503bab6e2b61931737e662dd293b40578ccornelius  UnicodeString msg2 =msg;
97759d709d503bab6e2b61931737e662dd293b40578ccornelius  UBool firstForTicket, firstForWhere;
97859d709d503bab6e2b61931737e662dd293b40578ccornelius  knownList = udbg_knownIssue_openU(knownList, ticket, fullpath, msg2.getTerminatedBuffer(), &firstForTicket, &firstForWhere);
97959d709d503bab6e2b61931737e662dd293b40578ccornelius
980fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  msg2 = UNICODE_STRING_SIMPLE("(Known issue #") +
981fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      UnicodeString(ticket, -1, US_INV) + UNICODE_STRING_SIMPLE(") ") + msg;
98259d709d503bab6e2b61931737e662dd293b40578ccornelius  if(firstForTicket || firstForWhere) {
983fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    infoln(msg2);
98459d709d503bab6e2b61931737e662dd293b40578ccornelius  } else {
985fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln(msg2);
98659d709d503bab6e2b61931737e662dd293b40578ccornelius  }
98759d709d503bab6e2b61931737e662dd293b40578ccornelius
98859d709d503bab6e2b61931737e662dd293b40578ccornelius  return TRUE;
98959d709d503bab6e2b61931737e662dd293b40578ccornelius}
99059d709d503bab6e2b61931737e662dd293b40578ccornelius
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* convenience functions that include sprintf formatting */
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::info(const char *fmt, ...)
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* sprintf it just to make sure that the information is valid */
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    info(UnicodeString(buffer, ""));
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::infoln(const char *fmt, ...)
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* sprintf it just to make sure that the information is valid */
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    infoln(UnicodeString(buffer, ""));
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::err(const char *fmt, ...)
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err(UnicodeString(buffer, ""));
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::errln(const char *fmt, ...)
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errln(UnicodeString(buffer, ""));
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::dataerrln(const char *fmt, ...)
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dataerrln(UnicodeString(buffer, ""));
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
10496d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queruvoid IntlTest::errcheckln(UErrorCode status, const char *fmt, ...)
10506d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru{
10516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    char buffer[4000];
10526d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    va_list ap;
10536d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
10546d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    va_start(ap, fmt);
10556d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    vsprintf(buffer, fmt, ap);
10566d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    va_end(ap);
10576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
10586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (status == U_FILE_ACCESS_ERROR || status == U_MISSING_RESOURCE_ERROR) {
10596d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln(UnicodeString(buffer, ""));
10606d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    } else {
10616d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errln(UnicodeString(buffer, ""));
10626d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
10636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru}
10646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::printErrors()
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     IntlTest::LL_message(errorList, TRUE);
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
107059d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::printKnownIssues()
107159d709d503bab6e2b61931737e662dd293b40578ccornelius{
107259d709d503bab6e2b61931737e662dd293b40578ccornelius  if(knownList != NULL) {
107359d709d503bab6e2b61931737e662dd293b40578ccornelius    udbg_knownIssue_print(knownList);
107459d709d503bab6e2b61931737e662dd293b40578ccornelius    udbg_knownIssue_close(knownList);
107559d709d503bab6e2b61931737e662dd293b40578ccornelius    return TRUE;
107659d709d503bab6e2b61931737e662dd293b40578ccornelius  } else {
107759d709d503bab6e2b61931737e662dd293b40578ccornelius    return FALSE;
107859d709d503bab6e2b61931737e662dd293b40578ccornelius  }
107959d709d503bab6e2b61931737e662dd293b40578ccornelius}
108059d709d503bab6e2b61931737e662dd293b40578ccornelius
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::LL_message( UnicodeString message, UBool newline )
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // string that starts with a LineFeed character and continues
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // with spaces according to the current indentation
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar indentUChars[] = {
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        '\n',
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString indent(FALSE, indentUChars, 1 + LL_indentlevel);
1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1100fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    char buffer[30000];
1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // stream out the indentation string first if necessary
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length = indent.extract(1, indent.length(), buffer, sizeof(buffer));
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (length > 0) {
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fwrite(buffer, sizeof(*buffer), length, (FILE *)testoutfp);
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // replace each LineFeed by the indentation string
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    message.findAndReplace(UnicodeString((UChar)'\n'), indent);
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // stream out the message
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length = message.extract(0, message.length(), buffer, sizeof(buffer));
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (length > 0) {
1115fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        length = length > 30000 ? 30000 : length;
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fwrite(buffer, sizeof(*buffer), length, (FILE *)testoutfp);
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (newline) {
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char newLine = '\n';
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fwrite(&newLine, sizeof(newLine), 1, (FILE *)testoutfp);
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // A newline usually flushes the buffer, but
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // flush the message just in case of a core dump.
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fflush((FILE *)testoutfp);
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Print a usage message for this test class.
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::usage( void )
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool save_verbose = setVerbose( TRUE );
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Test names:");
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("-----------");
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t index = 0;
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* name = NULL;
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    do{
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        this->runIndexedTest( index, FALSE, name );
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!name) break;
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(name);
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        index++;
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }while (name && (name[0] != 0));
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setVerbose( save_verbose );
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// memory leak reporting software will be able to take advantage of the testsuite
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// being run a second time local to a specific method in order to report only actual leaks
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::run_phase2( char* name, char* par ) // supports reporting memory leaks
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString* strLeak = new UnicodeString("forced leak"); // for verifying purify filter
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strLeak->append(" for verifying purify filter");
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return this->runTest( name, par );
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if UCONFIG_NO_LEGACY_CONVERSION
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define TRY_CNV_1 "iso-8859-1"
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define TRY_CNV_2 "ibm-1208"
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define TRY_CNV_1 "iso-8859-7"
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define TRY_CNV_2 "sjis"
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querumain(int argc, char* argv[])
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool syntax = FALSE;
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool all = FALSE;
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool verbose = FALSE;
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool no_err_msg = FALSE;
117654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UBool no_time = FALSE;
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool quick = TRUE;
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool name = FALSE;
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool leaks = FALSE;
118059d709d503bab6e2b61931737e662dd293b40578ccornelius    UBool utf8 = FALSE;
118159d709d503bab6e2b61931737e662dd293b40578ccornelius    const char *summary_file = NULL;
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool warnOnMissingData = FALSE;
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool defaultDataFound = FALSE;
118450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t threadCount = 1;
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode = U_ZERO_ERROR;
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter *cnv = NULL;
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *warnOrErr = "Failure";
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate startTime, endTime;
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t diffTime;
1190b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char *props[IntlTest::kMaxProps];
1191b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t nProps = 0;
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U_MAIN_INIT_ARGS(argc, argv);
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
119527f654740f2a26ad62a5c155af9199af9e69b889claireho    startTime = uprv_getRawUTCtime();
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int i = 1; i < argc; ++i) {
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (argv[i][0] == '-') {
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const char* str = argv[i] + 1;
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (strcmp("verbose", str) == 0 ||
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                strcmp("v", str) == 0)
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                verbose = TRUE;
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else if (strcmp("noerrormsg", str) == 0 ||
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     strcmp("n", str) == 0)
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                no_err_msg = TRUE;
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else if (strcmp("exhaustive", str) == 0 ||
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     strcmp("e", str) == 0)
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                quick = FALSE;
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else if (strcmp("all", str) == 0 ||
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     strcmp("a", str) == 0)
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                all = TRUE;
121259d709d503bab6e2b61931737e662dd293b40578ccornelius            else if (strcmp("utf-8", str) == 0 ||
121359d709d503bab6e2b61931737e662dd293b40578ccornelius                     strcmp("u", str) == 0)
121459d709d503bab6e2b61931737e662dd293b40578ccornelius                utf8 = TRUE;
121559d709d503bab6e2b61931737e662dd293b40578ccornelius            else if (strcmp("noknownissues", str) == 0 ||
121659d709d503bab6e2b61931737e662dd293b40578ccornelius                     strcmp("K", str) == 0)
121759d709d503bab6e2b61931737e662dd293b40578ccornelius                noKnownIssues = TRUE;
1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else if (strcmp("leaks", str) == 0 ||
1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     strcmp("l", str) == 0)
1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                leaks = TRUE;
122154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            else if (strcmp("notime", str) == 0 ||
122254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                     strcmp("T", str) == 0)
122354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                no_time = TRUE;
122459d709d503bab6e2b61931737e662dd293b40578ccornelius            else if (strncmp("E", str, 1) == 0)
122559d709d503bab6e2b61931737e662dd293b40578ccornelius                summary_file = str+1;
122627f654740f2a26ad62a5c155af9199af9e69b889claireho            else if (strcmp("x", str)==0) {
122727f654740f2a26ad62a5c155af9199af9e69b889claireho              if(++i>=argc) {
122827f654740f2a26ad62a5c155af9199af9e69b889claireho                printf("* Error: '-x' option requires an argument. usage: '-x outfile.xml'.\n");
122927f654740f2a26ad62a5c155af9199af9e69b889claireho                syntax = TRUE;
123027f654740f2a26ad62a5c155af9199af9e69b889claireho              }
123127f654740f2a26ad62a5c155af9199af9e69b889claireho              if(ctest_xml_setFileName(argv[i])) { /* set the name */
123227f654740f2a26ad62a5c155af9199af9e69b889claireho                return 1; /* error */
123327f654740f2a26ad62a5c155af9199af9e69b889claireho              }
123427f654740f2a26ad62a5c155af9199af9e69b889claireho            } else if (strcmp("w", str) == 0) {
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              warnOnMissingData = TRUE;
1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              warnOrErr = "WARNING";
1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
123850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            else if (strncmp("threads:", str, 8) == 0) {
123950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                threadCount = atoi(str + 8);
124050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
1241b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            else if (strncmp("prop:", str, 5) == 0) {
1242b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                if (nProps < IntlTest::kMaxProps) {
1243b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    props[nProps] = str + 5;
1244b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                }
1245b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                nProps++;
1246b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else {
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                syntax = TRUE;
1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else{
1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = TRUE;
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!all && !name) {
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        all = TRUE;
1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if (all && name) {
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        syntax = TRUE;
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (syntax) {
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout,
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### Syntax:\n"
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### IntlTest [-option1 -option2 ...] [testname1 testname2 ...] \n"
126550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                "### \n"
126650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                "### Options are: verbose (v), all (a), noerrormsg (n), \n"
126727f654740f2a26ad62a5c155af9199af9e69b889claireho                "### exhaustive (e), leaks (l), -x xmlfile.xml, prop:<propery>=<value>, \n"
126854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                "### notime (T), \n"
126950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                "### threads:<threadCount> (Mulithreading must first be \n"
127050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                "###     enabled otherwise this will be ignored. \n"
127150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                "###     The default thread count is 1.),\n"
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### (Specify either -all (shortcut -a) or a test name). \n"
1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### -all will run all of the tests.\n"
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### \n"
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### To get a list of the test names type: intltest LIST \n"
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### To run just the utility tests type: intltest utility \n"
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### \n"
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### Test names can be nested using slashes (\"testA/subtest1\") \n"
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### For example to list the utility tests type: intltest utility/LIST \n"
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### To run just the Locale test type: intltest utility/LocaleTest \n"
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### \n"
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### A parameter can be specified for a test by appending '@' and the value \n"
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### to the testname. \n\n");
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 1;
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1287b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (nProps > IntlTest::kMaxProps) {
1288b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        fprintf(stdout, "### Too many properties.  Exiting.\n");
1289b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
1290b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MajorTestLevel major;
1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    major.setVerbose( verbose );
1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    major.setNoErrMsg( no_err_msg );
1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    major.setQuick( quick );
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    major.setLeaks( leaks );
129650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    major.setThreadCount( threadCount );
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    major.setWarnOnMissingData( warnOnMissingData );
129854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    major.setNotime (no_time);
1299b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (int32_t i = 0; i < nProps; i++) {
1300b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        major.setProperty(props[i]);
1301b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
130227f654740f2a26ad62a5c155af9199af9e69b889claireho
130327f654740f2a26ad62a5c155af9199af9e69b889claireho
1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "-----------------------------------------------\n");
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, " IntlTest (C++) Test Suite for                 \n");
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   International Components for Unicode %s\n", U_ICU_VERSION);
130727f654740f2a26ad62a5c155af9199af9e69b889claireho
130827f654740f2a26ad62a5c155af9199af9e69b889claireho
1309b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {
1310b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	const char *charsetFamily = "Unknown";
1311b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t voidSize = (int32_t)sizeof(void*);
1312b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t bits = voidSize * 8;
1313b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(U_CHARSET_FAMILY==U_ASCII_FAMILY) {
1314b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru           charsetFamily="ASCII";
1315b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        } else if(U_CHARSET_FAMILY==U_EBCDIC_FAMILY) {
1316b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru           charsetFamily="EBCDIC";
1317b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
1318b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        fprintf(stdout,
1319b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    "   Bits: %d, Byte order: %s, Chars: %s\n",
1320b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                     bits, U_IS_BIG_ENDIAN?"Big endian":"Little endian",
1321b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                     charsetFamily);
1322b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "-----------------------------------------------\n");
1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, " Options:                                       \n");
1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   all (a)                  : %s\n", (all?               "On" : "Off"));
1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   Verbose (v)              : %s\n", (verbose?           "On" : "Off"));
1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   No error messages (n)    : %s\n", (no_err_msg?        "On" : "Off"));
1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   Exhaustive (e)           : %s\n", (!quick?            "On" : "Off"));
1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   Leaks (l)                : %s\n", (leaks?             "On" : "Off"));
133059d709d503bab6e2b61931737e662dd293b40578ccornelius    fprintf(stdout, "   utf-8 (u)                : %s\n", (utf8?              "On" : "Off"));
133154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    fprintf(stdout, "   notime (T)               : %s\n", (no_time?             "On" : "Off"));
133259d709d503bab6e2b61931737e662dd293b40578ccornelius    fprintf(stdout, "   noknownissues (K)        : %s\n", (noKnownIssues?      "On" : "Off"));
1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   Warn on missing data (w) : %s\n", (warnOnMissingData? "On" : "Off"));
133450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if (ICU_USE_THREADS==0)
133550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fprintf(stdout, "   Threads                  : Disabled\n");
133650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#else
133750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fprintf(stdout, "   Threads                  : %d\n", threadCount);
133850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
1339b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (int32_t i = 0; i < nProps; i++) {
1340b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        fprintf(stdout, "   Custom property (prop:)  : %s\n", props[i]);
1341b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "-----------------------------------------------\n");
1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
134459d709d503bab6e2b61931737e662dd293b40578ccornelius    if(utf8) {
134559d709d503bab6e2b61931737e662dd293b40578ccornelius      ucnv_setDefaultName("utf-8");
134659d709d503bab6e2b61931737e662dd293b40578ccornelius    }
1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Check whether ICU will initialize without forcing the build data directory into
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  the ICU_DATA path.  Success here means either the data dll contains data, or that
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  this test program was run with ICU_DATA set externally.  Failure of this check
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  is normal when ICU data is not packaged into a shared library.
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  Whether or not this test succeeds, we want to cleanup and reinitialize
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  with a data path so that data loading from individual files can be tested.
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_init(&errorCode);
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {
1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stderr,
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "#### Note:  ICU Init without build-specific setDataDirectory() failed.\n");
1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        defaultDataFound = FALSE;
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        defaultDataFound = TRUE;
1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_cleanup();
136559d709d503bab6e2b61931737e662dd293b40578ccornelius    if(utf8) {
136659d709d503bab6e2b61931737e662dd293b40578ccornelius      ucnv_setDefaultName("utf-8");
136759d709d503bab6e2b61931737e662dd293b40578ccornelius    }
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode = U_ZERO_ERROR;
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Initialize ICU */
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!defaultDataFound) {
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::setICU_DATA();   // Must set data directory before u_init() is called.
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_init(&errorCode);
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stderr,
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "#### ERROR! %s: u_init() failed with status = \"%s\".\n"
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "*** Check the ICU_DATA environment variable and \n"
1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "*** check that the data files are present.\n", argv[0], u_errorName(errorCode));
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(warnOnMissingData == 0) {
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fprintf(stderr, "*** Exiting.  Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n");
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_cleanup();
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return 1;
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // initial check for the default converter
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode = U_ZERO_ERROR;
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv = ucnv_open(0, &errorCode);
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(cnv != 0) {
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // ok
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_close(cnv);
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout,
1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** %s! The default converter [%s] cannot be opened.\n"
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** Check the ICU_DATA environment variable and\n"
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** check that the data files are present.\n",
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                warnOrErr, ucnv_getDefaultName());
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!warnOnMissingData) {
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          fprintf(stdout, "*** Exiting.  Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n");
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return 1;
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // try more data
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv = ucnv_open(TRY_CNV_2, &errorCode);
1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(cnv != 0) {
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // ok
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_close(cnv);
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout,
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** %s! The converter for " TRY_CNV_2 " cannot be opened.\n"
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** Check the ICU_DATA environment variable and \n"
1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** check that the data files are present.\n", warnOrErr);
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!warnOnMissingData) {
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          fprintf(stdout, "*** Exiting.  Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n");
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return 1;
1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle *rb = ures_open(0, "en", &errorCode);
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_close(rb);
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout,
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** %s! The \"en\" locale resource bundle cannot be opened.\n"
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** Check the ICU_DATA environment variable and \n"
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** check that the data files are present.\n", warnOrErr);
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!warnOnMissingData) {
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          fprintf(stdout, "*** Exiting.  Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n");
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return 1;
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale originalLocale;  // Save the default locale for comparison later on.
1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
143627f654740f2a26ad62a5c155af9199af9e69b889claireho    if(ctest_xml_init("intltest"))
143727f654740f2a26ad62a5c155af9199af9e69b889claireho      return 1;
143827f654740f2a26ad62a5c155af9199af9e69b889claireho
143927f654740f2a26ad62a5c155af9199af9e69b889claireho
1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* TODO: Add option to call u_cleanup and rerun tests. */
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (all) {
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        major.runTest();
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (leaks) {
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            major.run_phase2( NULL, NULL );
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int i = 1; i < argc; ++i) {
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (argv[i][0] != '-') {
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                char* name = argv[i];
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fprintf(stdout, "\n=== Handling test: %s: ===\n", name);
145127f654740f2a26ad62a5c155af9199af9e69b889claireho
145227f654740f2a26ad62a5c155af9199af9e69b889claireho                char baseName[1024];
145327f654740f2a26ad62a5c155af9199af9e69b889claireho                sprintf(baseName, "/%s/", name);
145427f654740f2a26ad62a5c155af9199af9e69b889claireho
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                char* parameter = strchr( name, '@' );
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (parameter) {
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    *parameter = 0;
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    parameter += 1;
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                execCount = 0;
146127f654740f2a26ad62a5c155af9199af9e69b889claireho                UBool res = major.runTest( name, parameter, baseName );
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (leaks && res) {
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    major.run_phase2( name, parameter );
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (!res || (execCount <= 0)) {
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    fprintf(stdout, "\n---ERROR: Test doesn't exist: %s!\n", name);
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
146827f654740f2a26ad62a5c155af9199af9e69b889claireho            } else if(!strcmp(argv[i],"-x")) {
146927f654740f2a26ad62a5c155af9199af9e69b889claireho              i++;
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
147427f654740f2a26ad62a5c155af9199af9e69b889claireho
1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CalendarTimeZoneTest::cleanup();
1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(_testDataPath);
1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testDataPath = 0;
1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale lastDefaultLocale;
1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (originalLocale != lastDefaultLocale) {
1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        major.errln("FAILURE: A test changed the default locale without resetting it.");
1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "\n--------------------------------------\n");
148859d709d503bab6e2b61931737e662dd293b40578ccornelius    if( major.printKnownIssues() ) {
148959d709d503bab6e2b61931737e662dd293b40578ccornelius      fprintf(stdout, " To run suppressed tests, use the -K option. \n");
149059d709d503bab6e2b61931737e662dd293b40578ccornelius    }
1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (major.getErrors() == 0) {
1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Call it twice to make sure that the defaults were reset. */
1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Call it before the OK message to verify proper cleanup. */
1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_cleanup();
1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_cleanup();
1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout, "OK: All tests passed without error.\n");
1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (major.getDataErrors() != 0) {
1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fprintf(stdout, "\t*WARNING* some data-loading errors were ignored by the -w option.\n");
1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout, "Errors in total: %ld.\n", (long)major.getErrors());
1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        major.printErrors();
1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
150659d709d503bab6e2b61931737e662dd293b40578ccornelius        if(summary_file != NULL) {
150759d709d503bab6e2b61931737e662dd293b40578ccornelius          FILE *summf = fopen(summary_file, "w");
150859d709d503bab6e2b61931737e662dd293b40578ccornelius          if( summf != NULL) {
150959d709d503bab6e2b61931737e662dd293b40578ccornelius            char buf[10000];
151059d709d503bab6e2b61931737e662dd293b40578ccornelius            int32_t length = errorList.extract(0, errorList.length(), buf, sizeof(buf));
151159d709d503bab6e2b61931737e662dd293b40578ccornelius            fwrite(buf, sizeof(*buf), length, (FILE*)summf);
151259d709d503bab6e2b61931737e662dd293b40578ccornelius            fclose(summf);
151359d709d503bab6e2b61931737e662dd293b40578ccornelius          }
151459d709d503bab6e2b61931737e662dd293b40578ccornelius        }
151559d709d503bab6e2b61931737e662dd293b40578ccornelius
1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (major.getDataErrors() != 0) {
1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fprintf(stdout, "\t*Note* some errors are data-loading related. If the data used is not the \n"
1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "\tstock ICU data (i.e some have been added or removed), consider using\n"
1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "\tthe '-w' option to turn these errors into warnings.\n");
1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Call afterwards to display errors. */
1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_cleanup();
1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "--------------------------------------\n");
1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (execCount <= 0) {
1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout, "***** Not all called tests actually exist! *****\n");
1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
153254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(!no_time) {
153354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      endTime = uprv_getRawUTCtime();
153454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      diffTime = (int32_t)(endTime - startTime);
153554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      printf("Elapsed Time: %02d:%02d:%02d.%03d\n",
153654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius             (int)((diffTime%U_MILLIS_PER_DAY)/U_MILLIS_PER_HOUR),
153754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius             (int)((diffTime%U_MILLIS_PER_HOUR)/U_MILLIS_PER_MINUTE),
153854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius             (int)((diffTime%U_MILLIS_PER_MINUTE)/U_MILLIS_PER_SECOND),
153954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius             (int)(diffTime%U_MILLIS_PER_SECOND));
154054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
154127f654740f2a26ad62a5c155af9199af9e69b889claireho
154227f654740f2a26ad62a5c155af9199af9e69b889claireho    if(ctest_xml_fini())
154327f654740f2a26ad62a5c155af9199af9e69b889claireho      return 1;
154427f654740f2a26ad62a5c155af9199af9e69b889claireho
1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return major.getErrors();
1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char* IntlTest::loadTestData(UErrorCode& err){
1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( _testDataPath == NULL){
1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char*      directory=NULL;
1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UResourceBundle* test =NULL;
1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char* tdpath=NULL;
1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* tdrelativepath;
1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined (U_TOPBUILDDIR)
155654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        tdrelativepath = "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING;
1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        directory = U_TOPBUILDDIR;
1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
155954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        tdrelativepath = ".." U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING;
1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        directory = pathToDataDirectory();
1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tdpath = (char*) malloc(sizeof(char) *(( strlen(directory) * strlen(tdrelativepath)) + 100));
1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* u_getDataDirectory shoul return \source\data ... set the
1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * directory to ..\source\data\..\test\testdata\out\testdata
1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(tdpath, directory);
1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcat(tdpath, tdrelativepath);
1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcat(tdpath,"testdata");
1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        test=ures_open(tdpath, "testtypes", &err);
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err)){
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err = U_FILE_ACCESS_ERROR;
15776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            it_dataerrln((UnicodeString)"Could not load testtypes.res in testdata bundle with path " + tdpath + (UnicodeString)" - " + u_errorName(err));
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return "";
1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ures_close(test);
1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        _testDataPath = tdpath;
1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return _testDataPath;
1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return _testDataPath;
1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char* IntlTest::getTestDataPath(UErrorCode& err) {
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return loadTestData(err);
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Returns the path to icu/source/test/testdata/ */
1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char *IntlTest::getSourceTestData(UErrorCode& /*err*/) {
1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *srcDataDir = NULL;
1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef U_TOPSRCDIR
159554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    srcDataDir = U_TOPSRCDIR U_FILE_SEP_STRING"test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING;
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
159754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    srcDataDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING;
159854dcd9b6a06071f647dac967e9e267abb9410720Craig 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");
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (f) {
1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* We're in icu/source/test/intltest/ */
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fclose(f);
1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1604b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        /* We're in icu/source/test/intltest/Platform/(Debug|Release) */
160554dcd9b6a06071f647dac967e9e267abb9410720Craig 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;
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return srcDataDir;
1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char* IntlTest::fgDataDir = NULL;
1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* returns the path to icu/source/data */
1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char *  IntlTest::pathToDataDirectory()
1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(fgDataDir != NULL) {
1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return fgDataDir;
1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* U_TOPSRCDIR is set by the makefiles on UNIXes when building cintltst and intltst
1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              to point to the top of the build hierarchy, which may or
1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              may not be the same as the source directory, depending on
1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              the configure options used.  At any rate,
1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              set the data path to the built data from this directory.
1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              The value is complete with quotes, so it can be used
1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              as-is as a string constant.
1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined (U_TOPSRCDIR)
1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fgDataDir = U_TOPSRCDIR  U_FILE_SEP_STRING "data" U_FILE_SEP_STRING;
1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* On Windows, the file name obtained from __FILE__ includes a full path.
1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *             This file is "wherever\icu\source\test\cintltst\cintltst.c"
1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *             Change to    "wherever\icu\source\data"
1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static char p[sizeof(__FILE__) + 10];
1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char *pBackSlash;
1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int i;
1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(p, __FILE__);
1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* We want to back over three '\' chars.                            */
1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*   Only Windows should end up here, so looking for '\' is safe.   */
1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i=1; i<=3; i++) {
1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pBackSlash = strrchr(p, U_FILE_SEP_CHAR);
1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (pBackSlash != NULL) {
1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                *pBackSlash = 0;        /* Truncate the string at the '\'   */
1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (pBackSlash != NULL) {
1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* We found and truncated three names from the path.
1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *  Now append "source\data" and set the environment
1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            */
1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strcpy(pBackSlash, U_FILE_SEP_STRING "data" U_FILE_SEP_STRING );
1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fgDataDir = p;
1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* __FILE__ on MSVC7 does not contain the directory */
166354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            FILE *file = fopen(".." U_FILE_SEP_STRING ".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "Makefile.in", "r");
1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (file) {
1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fclose(file);
166654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                fgDataDir = ".." U_FILE_SEP_STRING ".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING;
1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else {
166954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                fgDataDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING;
1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fgDataDir;
1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This is a variant of cintltst/ccolltst.c:CharsToUChars().
168127f654740f2a26ad62a5c155af9199af9e69b889claireho * It converts an invariant-character string into a UnicodeString, with
1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * unescaping \u sequences.
1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
168450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString CharsToUnicodeString(const char* chars){
168527f654740f2a26ad62a5c155af9199af9e69b889claireho    return UnicodeString(chars, -1, US_INV).unescape();
1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString ctou(const char* chars) {
1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return CharsToUnicodeString(chars);
1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define RAND_M  (714025)
1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define RAND_IA (1366)
1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define RAND_IC (150889)
1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t RAND_SEED;
1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Returns a uniform random value x, with 0.0 <= x < 1.0.  Use
1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * with care: Does not return all possible values; returns one of
1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 714,025 values, uniformly spaced.  However, the period is
1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * effectively infinite.  See: Numerical Recipes, section 7.1.
1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param seedp pointer to seed. Set *seedp to any negative value
1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * to restart the sequence.
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufloat IntlTest::random(int32_t* seedp) {
1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static int32_t iy, ir[98];
1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static UBool first=TRUE;
1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t j;
1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (*seedp < 0 || first) {
1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        first = FALSE;
1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ((*seedp=(RAND_IC-(*seedp)) % RAND_M) < 0) *seedp = -(*seedp);
1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (j=1;j<=97;++j) {
1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *seedp=(RAND_IA*(*seedp)+RAND_IC) % RAND_M;
1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ir[j]=(*seedp);
1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *seedp=(RAND_IA*(*seedp)+RAND_IC) % RAND_M;
1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        iy=(*seedp);
1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    j=(int32_t)(1 + 97.0*iy/RAND_M);
1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U_ASSERT(j>=1 && j<=97);
1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iy=ir[j];
1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *seedp=(RAND_IA*(*seedp)+RAND_IC) % RAND_M;
1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ir[j]=(*seedp);
1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (float) iy/RAND_M;
1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Convenience method using a global seed.
1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufloat IntlTest::random() {
1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return random(&RAND_SEED);
1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic inline UChar toHex(int32_t i) {
1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UChar)(i + (i < 10 ? 0x30 : (0x41 - 10)));
1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UnicodeString& escape(const UnicodeString& s, UnicodeString& result) {
1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i=0; i<s.length(); ++i) {
1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar c = s[i];
1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (c <= (UChar)0x7F) {
1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += c;
1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += (UChar)0x5c;
1747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += (UChar)0x75;
1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += toHex((c >> 12) & 0xF);
1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += toHex((c >>  8) & 0xF);
1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += toHex((c >>  4) & 0xF);
1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += toHex( c        & 0xF);
1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return result;
1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define VERBOSE_ASSERTIONS
1758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17598393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusUBool IntlTest::assertTrue(const char* message, UBool condition, UBool quiet, UBool possibleDataError, const char *file, int line) {
17608393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if (file != NULL) {
17618393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        if (!condition) {
17628393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            if (possibleDataError) {
17638393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                dataerrln("%s:%d: FAIL: assertTrue() failed: %s", file, line, message);
17648393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            } else {
17658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                errln("%s:%d: FAIL: assertTrue() failed: %s", file, line, message);
17668393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            }
17678393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        } else if (!quiet) {
17688393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            logln("%s:%d: Ok: %s", file, line, message);
17696d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
17708393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    } else {
17718393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        if (!condition) {
17728393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            if (possibleDataError) {
17738393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                dataerrln("FAIL: assertTrue() failed: %s", message);
17748393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            } else {
17758393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                errln("FAIL: assertTrue() failed: %s", message);
17768393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            }
17778393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        } else if (!quiet) {
17788393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            logln("Ok: %s", message);
17798393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        }
17808393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return condition;
1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertFalse(const char* message, UBool condition, UBool quiet) {
1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (condition) {
1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: assertFalse() failed: %s", message);
1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if (!quiet) {
1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Ok: %s", message);
1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return !condition;
1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
179459d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertSuccess(const char* message, UErrorCode ec, UBool possibleDataError, const char *file, int line) {
179559d709d503bab6e2b61931737e662dd293b40578ccornelius    if( file==NULL ) {
179659d709d503bab6e2b61931737e662dd293b40578ccornelius      file = ""; // prevent failure if no file given
179759d709d503bab6e2b61931737e662dd293b40578ccornelius    }
1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
17996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (possibleDataError) {
180059d709d503bab6e2b61931737e662dd293b40578ccornelius          dataerrln("FAIL: %s:%d: %s (%s)", file, line, message, u_errorName(ec));
1801c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        } else {
180259d709d503bab6e2b61931737e662dd293b40578ccornelius          errcheckln(ec, "FAIL: %s:%d: %s (%s)", file, line, message, u_errorName(ec));
1803c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
180559d709d503bab6e2b61931737e662dd293b40578ccornelius    } else {
180659d709d503bab6e2b61931737e662dd293b40578ccornelius      logln("OK: %s:%d: %s - (%s)", file, line, message, u_errorName(ec));
1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const char* message,
1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const UnicodeString& expected,
18136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                             const UnicodeString& actual,
18146d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                             UBool possibleDataError) {
1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (expected != actual) {
18166d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (possibleDataError) {
18176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln((UnicodeString)"FAIL: " + message + "; got " +
18186d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  prettify(actual) +
18196d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  "; expected " + prettify(expected));
18206d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        } else {
18216d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            errln((UnicodeString)"FAIL: " + message + "; got " +
18226d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  prettify(actual) +
18236d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  "; expected " + prettify(expected));
18246d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef VERBOSE_ASSERTIONS
1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"Ok: " + message + "; got " + prettify(actual));
1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const char* message,
1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const char* expected,
1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const char* actual) {
1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (uprv_strcmp(expected, actual) != 0) {
1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"FAIL: " + message + "; got \"" +
1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              actual +
1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "\"; expected \"" + expected + "\"");
1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef VERBOSE_ASSERTIONS
1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"Ok: " + message + "; got \"" + actual + "\"");
1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1852f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig CorneliusUBool IntlTest::assertEquals(const char* message,
1853f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius                             int32_t expected,
1854f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius                             int32_t actual) {
1855f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    if (expected != actual) {
1856f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        errln((UnicodeString)"FAIL: " + message + "; got " +
1857f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius              actual + "=0x" + toHex(actual) +
1858f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius              "; expected " + expected + "=0x" + toHex(expected));
1859f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        return FALSE;
1860f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    }
1861f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius#ifdef VERBOSE_ASSERTIONS
1862f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    else {
1863f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        logln((UnicodeString)"Ok: " + message + "; got " + actual + "=0x" + toHex(actual));
1864f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    }
1865f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius#endif
1866f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    return TRUE;
1867f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius}
1868f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius
1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const char* message,
187059d709d503bab6e2b61931737e662dd293b40578ccornelius                             int64_t expected,
187159d709d503bab6e2b61931737e662dd293b40578ccornelius                             int64_t actual) {
187259d709d503bab6e2b61931737e662dd293b40578ccornelius    if (expected != actual) {
187359d709d503bab6e2b61931737e662dd293b40578ccornelius        errln((UnicodeString)"FAIL: " + message + "; got int64 " +
187459d709d503bab6e2b61931737e662dd293b40578ccornelius              Int64ToUnicodeString(actual) +
187559d709d503bab6e2b61931737e662dd293b40578ccornelius              "; expected " + Int64ToUnicodeString(expected) );
187659d709d503bab6e2b61931737e662dd293b40578ccornelius        return FALSE;
187759d709d503bab6e2b61931737e662dd293b40578ccornelius    }
187859d709d503bab6e2b61931737e662dd293b40578ccornelius#ifdef VERBOSE_ASSERTIONS
187959d709d503bab6e2b61931737e662dd293b40578ccornelius    else {
188059d709d503bab6e2b61931737e662dd293b40578ccornelius      logln((UnicodeString)"Ok: " + message + "; got int64 " + Int64ToUnicodeString(actual));
188159d709d503bab6e2b61931737e662dd293b40578ccornelius    }
188259d709d503bab6e2b61931737e662dd293b40578ccornelius#endif
188359d709d503bab6e2b61931737e662dd293b40578ccornelius    return TRUE;
188459d709d503bab6e2b61931737e662dd293b40578ccornelius}
188559d709d503bab6e2b61931737e662dd293b40578ccornelius
188659d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertEquals(const char* message,
188759d709d503bab6e2b61931737e662dd293b40578ccornelius                             UBool expected,
188859d709d503bab6e2b61931737e662dd293b40578ccornelius                             UBool actual) {
1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (expected != actual) {
1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"FAIL: " + message + "; got " +
1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              toString(actual) +
1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "; expected " + toString(expected));
1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef VERBOSE_ASSERTIONS
1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
189759d709d503bab6e2b61931737e662dd293b40578ccornelius      logln((UnicodeString)"Ok: " + message + "; got " + toString(actual));
189859d709d503bab6e2b61931737e662dd293b40578ccornelius    }
189959d709d503bab6e2b61931737e662dd293b40578ccornelius#endif
190059d709d503bab6e2b61931737e662dd293b40578ccornelius    return TRUE;
190159d709d503bab6e2b61931737e662dd293b40578ccornelius}
190259d709d503bab6e2b61931737e662dd293b40578ccornelius
190359d709d503bab6e2b61931737e662dd293b40578ccornelius#if !UCONFIG_NO_FORMATTING
190459d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertEquals(const char* message,
190559d709d503bab6e2b61931737e662dd293b40578ccornelius                             const Formattable& expected,
190659d709d503bab6e2b61931737e662dd293b40578ccornelius                             const Formattable& actual,
190759d709d503bab6e2b61931737e662dd293b40578ccornelius                             UBool possibleDataError) {
190859d709d503bab6e2b61931737e662dd293b40578ccornelius    if (expected != actual) {
190959d709d503bab6e2b61931737e662dd293b40578ccornelius        if (possibleDataError) {
191059d709d503bab6e2b61931737e662dd293b40578ccornelius            dataerrln((UnicodeString)"FAIL: " + message + "; got " +
191159d709d503bab6e2b61931737e662dd293b40578ccornelius                  toString(actual) +
191259d709d503bab6e2b61931737e662dd293b40578ccornelius                  "; expected " + toString(expected));
191359d709d503bab6e2b61931737e662dd293b40578ccornelius        } else {
191459d709d503bab6e2b61931737e662dd293b40578ccornelius            errln((UnicodeString)"FAIL: " + message + "; got " +
191559d709d503bab6e2b61931737e662dd293b40578ccornelius                  toString(actual) +
191659d709d503bab6e2b61931737e662dd293b40578ccornelius                  "; expected " + toString(expected));
191759d709d503bab6e2b61931737e662dd293b40578ccornelius        }
191859d709d503bab6e2b61931737e662dd293b40578ccornelius        return FALSE;
191959d709d503bab6e2b61931737e662dd293b40578ccornelius    }
192059d709d503bab6e2b61931737e662dd293b40578ccornelius#ifdef VERBOSE_ASSERTIONS
192159d709d503bab6e2b61931737e662dd293b40578ccornelius    else {
1922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"Ok: " + message + "; got " + toString(actual));
1923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
1926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char ASSERT_BUF[256];
1930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* extractToAssertBuf(const UnicodeString& message) {
1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString buf;
1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    escape(message, buf);
1934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buf.extract(0, 0x7FFFFFFF, ASSERT_BUF, sizeof(ASSERT_BUF)-1, 0);
1935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ASSERT_BUF[sizeof(ASSERT_BUF)-1] = 0;
1936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return ASSERT_BUF;
1937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertTrue(const UnicodeString& message, UBool condition, UBool quiet) {
1940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertTrue(extractToAssertBuf(message), condition, quiet);
1941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertFalse(const UnicodeString& message, UBool condition, UBool quiet) {
1944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertFalse(extractToAssertBuf(message), condition, quiet);
1945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertSuccess(const UnicodeString& message, UErrorCode ec) {
1948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertSuccess(extractToAssertBuf(message), ec);
1949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const UnicodeString& message,
1952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const UnicodeString& expected,
195359d709d503bab6e2b61931737e662dd293b40578ccornelius                             const UnicodeString& actual,
195459d709d503bab6e2b61931737e662dd293b40578ccornelius                             UBool possibleDataError) {
195559d709d503bab6e2b61931737e662dd293b40578ccornelius    return assertEquals(extractToAssertBuf(message), expected, actual, possibleDataError);
1956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const UnicodeString& message,
1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const char* expected,
1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const char* actual) {
1961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertEquals(extractToAssertBuf(message), expected, actual);
1962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
196359d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertEquals(const UnicodeString& message,
196459d709d503bab6e2b61931737e662dd293b40578ccornelius                             UBool expected,
196559d709d503bab6e2b61931737e662dd293b40578ccornelius                             UBool actual) {
196659d709d503bab6e2b61931737e662dd293b40578ccornelius    return assertEquals(extractToAssertBuf(message), expected, actual);
196759d709d503bab6e2b61931737e662dd293b40578ccornelius}
196859d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertEquals(const UnicodeString& message,
196959d709d503bab6e2b61931737e662dd293b40578ccornelius                             int32_t expected,
197059d709d503bab6e2b61931737e662dd293b40578ccornelius                             int32_t actual) {
197159d709d503bab6e2b61931737e662dd293b40578ccornelius    return assertEquals(extractToAssertBuf(message), expected, actual);
197259d709d503bab6e2b61931737e662dd293b40578ccornelius}
197359d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertEquals(const UnicodeString& message,
197459d709d503bab6e2b61931737e662dd293b40578ccornelius                             int64_t expected,
197559d709d503bab6e2b61931737e662dd293b40578ccornelius                             int64_t actual) {
197659d709d503bab6e2b61931737e662dd293b40578ccornelius    return assertEquals(extractToAssertBuf(message), expected, actual);
1977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
1980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const UnicodeString& message,
1981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const Formattable& expected,
1982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const Formattable& actual) {
1983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertEquals(extractToAssertBuf(message), expected, actual);
1984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1987b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid IntlTest::setProperty(const char* propline) {
1988b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (numProps < kMaxProps) {
1989b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        proplines[numProps] = propline;
1990b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
1991b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    numProps++;
1992b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
1993b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1994b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruconst char* IntlTest::getProperty(const char* prop) {
1995b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char* val = NULL;
1996b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (int32_t i = 0; i < numProps; i++) {
1997b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t plen = uprv_strlen(prop);
1998b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if ((int32_t)uprv_strlen(proplines[i]) > plen + 1
1999b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                && proplines[i][plen] == '='
2000b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                && uprv_strncmp(proplines[i], prop, plen) == 0) {
2001b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            val = &(proplines[i][plen+1]);
2002b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            break;
2003b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
2004b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
2005b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return val;
2006b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
2007b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Hey, Emacs, please set the following:
2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Local Variables:
2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * indent-tabs-mode: nil
2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * End:
2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2016