1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
3c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * Copyright (c) 1997-2015, 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 */
4481b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            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;
564c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        threadCount = caller->threadCount;
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testoutfp = caller->testoutfp;
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LL_indentlevel = caller->LL_indentlevel + indentLevel_offset;
567b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        numProps = caller->numProps;
568b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        for (int32_t i = 0; i < numProps; i++) {
569b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            proplines[i] = caller->proplines[i];
570b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::callTest( IntlTest& testToBeCalled, char* par )
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    execCount--; // correct a previously assumed test-exec, as this only calls a subtest
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testToBeCalled.setCaller( this );
57827f654740f2a26ad62a5c155af9199af9e69b889claireho    strcpy(testToBeCalled.basePath, this->basePath );
57927f654740f2a26ad62a5c155af9199af9e69b889claireho    UBool result = testToBeCalled.runTest( testPath, par, testToBeCalled.basePath );
58027f654740f2a26ad62a5c155af9199af9e69b889claireho    strcpy(testToBeCalled.basePath, this->basePath ); // reset it.
58127f654740f2a26ad62a5c155af9199af9e69b889claireho    return result;
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::setPath( char* pathVal )
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->testPath = pathVal;
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setVerbose( UBool verboseVal )
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval = this->verbose;
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->verbose = verboseVal;
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
59654dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusUBool IntlTest::setNotime( UBool no_time )
59754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius{
59854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UBool rval = this->no_time;
59954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    this->no_time = no_time;
60054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return rval;
60154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
60254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setWarnOnMissingData( UBool warn_on_missing_dataVal )
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval = this->warn_on_missing_data;
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->warn_on_missing_data = warn_on_missing_dataVal;
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setNoErrMsg( UBool no_err_msgVal )
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval = this->no_err_msg;
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->no_err_msg = no_err_msgVal;
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setQuick( UBool quickVal )
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval = this->quick;
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->quick = quickVal;
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setLeaks( UBool leaksVal )
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval = this->leaks;
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->leaks = leaksVal;
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
63150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoint32_t IntlTest::setThreadCount( int32_t count )
63250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
63350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t rval = this->threadCount;
63450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    this->threadCount = count;
63550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return rval;
63650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
63750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t IntlTest::getErrors( void )
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return errorCount;
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t IntlTest::getDataErrors( void )
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return dataErrorCount;
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
64827f654740f2a26ad62a5c155af9199af9e69b889clairehoUBool IntlTest::runTest( char* name, char* par, char *baseName )
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval;
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char* pos = NULL;
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
65327f654740f2a26ad62a5c155af9199af9e69b889claireho    char* baseNameBuffer = NULL;
65427f654740f2a26ad62a5c155af9199af9e69b889claireho
65527f654740f2a26ad62a5c155af9199af9e69b889claireho    if(baseName == NULL) {
65627f654740f2a26ad62a5c155af9199af9e69b889claireho      baseNameBuffer = (char*)malloc(1024);
65727f654740f2a26ad62a5c155af9199af9e69b889claireho      baseName=baseNameBuffer;
65827f654740f2a26ad62a5c155af9199af9e69b889claireho      strcpy(baseName, "/");
65927f654740f2a26ad62a5c155af9199af9e69b889claireho    }
66027f654740f2a26ad62a5c155af9199af9e69b889claireho
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (name)
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pos = strchr( name, delim ); // check if name contains path (by looking for '/')
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pos) {
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testPath = pos+1;   // store subpath for calling subtest
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *pos = 0;       // split into two strings
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testPath = NULL;
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!name || (name[0] == 0) || (strcmp(name, "*") == 0)) {
67127f654740f2a26ad62a5c155af9199af9e69b889claireho      rval = runTestLoop( NULL, par, baseName );
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else if (strcmp( name, "LIST" ) == 0) {
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        this->usage();
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rval = TRUE;
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
67827f654740f2a26ad62a5c155af9199af9e69b889claireho      rval = runTestLoop( name, par, baseName );
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pos)
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *pos = delim;  // restore original value at pos
68327f654740f2a26ad62a5c155af9199af9e69b889claireho    if(baseNameBuffer!=NULL) {
68427f654740f2a26ad62a5c155af9199af9e69b889claireho      free(baseNameBuffer);
68527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// call individual tests, to be overriden to call implementations
69054dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusvoid IntlTest::runIndexedTest( int32_t /*index*/, UBool /*exec*/, const char* & /*name*/, char* /*par*/ )
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // to be overriden by a method like:
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (index) {
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 0: name = "First Test"; if (exec) FirstTest( par ); break;
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 1: name = "Second Test"; if (exec) SecondTest( par ); break;
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        default: name = ""; break;
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->errln("*** runIndexedTest needs to be overriden! ***");
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
70427f654740f2a26ad62a5c155af9199af9e69b889clairehoUBool IntlTest::runTestLoop( char* testname, char* par, char *baseName )
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t    index = 0;
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char*   name;
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool  run_this_test;
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t    lastErrorCount;
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool  rval = FALSE;
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool   lastTestFailed;
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
71327f654740f2a26ad62a5c155af9199af9e69b889claireho    if(baseName == NULL) {
71427f654740f2a26ad62a5c155af9199af9e69b889claireho      printf("ERROR: baseName can't be null.\n");
71527f654740f2a26ad62a5c155af9199af9e69b889claireho      return FALSE;
71627f654740f2a26ad62a5c155af9199af9e69b889claireho    } else {
71727f654740f2a26ad62a5c155af9199af9e69b889claireho      if ((char *)this->basePath != baseName) {
71827f654740f2a26ad62a5c155af9199af9e69b889claireho        strcpy(this->basePath, baseName);
71927f654740f2a26ad62a5c155af9199af9e69b889claireho      }
72027f654740f2a26ad62a5c155af9199af9e69b889claireho    }
72127f654740f2a26ad62a5c155af9199af9e69b889claireho
72227f654740f2a26ad62a5c155af9199af9e69b889claireho    char * saveBaseLoc = baseName+strlen(baseName);
72327f654740f2a26ad62a5c155af9199af9e69b889claireho
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IntlTest* saveTest = gTest;
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gTest = this;
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    do {
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        this->runIndexedTest( index, FALSE, name, par );
72850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (strcmp(name,"skip") == 0) {
72950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            run_this_test = FALSE;
73050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        } else {
73150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (!name || (name[0] == 0))
73250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                break;
73350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (!testname) {
73450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                run_this_test = TRUE;
73550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }else{
73650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                run_this_test = (UBool) (strcmp( name, testname ) == 0);
73750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (run_this_test) {
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            lastErrorCount = errorCount;
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            execCount++;
74227f654740f2a26ad62a5c155af9199af9e69b889claireho            char msg[256];
74327f654740f2a26ad62a5c155af9199af9e69b889claireho            sprintf(msg, "%s {", name);
74427f654740f2a26ad62a5c155af9199af9e69b889claireho            LL_message(msg, TRUE);
74527f654740f2a26ad62a5c155af9199af9e69b889claireho            UDate timeStart = uprv_getRawUTCtime();
74627f654740f2a26ad62a5c155af9199af9e69b889claireho            strcpy(saveBaseLoc,name);
74727f654740f2a26ad62a5c155af9199af9e69b889claireho            strcat(saveBaseLoc,"/");
74827f654740f2a26ad62a5c155af9199af9e69b889claireho
74959d709d503bab6e2b61931737e662dd293b40578ccornelius            strcpy(currName, name); // set
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            this->runIndexedTest( index, TRUE, name, par );
75159d709d503bab6e2b61931737e662dd293b40578ccornelius            currName[0]=0; // reset
75227f654740f2a26ad62a5c155af9199af9e69b889claireho
75327f654740f2a26ad62a5c155af9199af9e69b889claireho            UDate timeStop = uprv_getRawUTCtime();
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            rval = TRUE; // at least one test has been called
75527f654740f2a26ad62a5c155af9199af9e69b889claireho            char secs[256];
75654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            if(!no_time) {
75754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius              sprintf(secs, "%f", (timeStop-timeStart)/1000.0);
75854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            } else {
75954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius              secs[0]=0;
76054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            }
76127f654740f2a26ad62a5c155af9199af9e69b889claireho
76227f654740f2a26ad62a5c155af9199af9e69b889claireho
76327f654740f2a26ad62a5c155af9199af9e69b889claireho            strcpy(saveBaseLoc,name);
76427f654740f2a26ad62a5c155af9199af9e69b889claireho
76527f654740f2a26ad62a5c155af9199af9e69b889claireho
76627f654740f2a26ad62a5c155af9199af9e69b889claireho            ctest_xml_testcase(baseName, name, secs, (lastErrorCount!=errorCount)?"err":NULL);
76727f654740f2a26ad62a5c155af9199af9e69b889claireho
76827f654740f2a26ad62a5c155af9199af9e69b889claireho
76927f654740f2a26ad62a5c155af9199af9e69b889claireho            saveBaseLoc[0]=0; /* reset path */
77027f654740f2a26ad62a5c155af9199af9e69b889claireho
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (lastErrorCount == errorCount) {
77227f654740f2a26ad62a5c155af9199af9e69b889claireho                sprintf( msg, "   } OK:   %s ", name );
77354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                if(!no_time) str_timeDelta(msg+strlen(msg),timeStop-timeStart);
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                lastTestFailed = FALSE;
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }else{
77627f654740f2a26ad62a5c155af9199af9e69b889claireho                sprintf(msg,  "   } ERRORS (%li) in %s", (long)(errorCount-lastErrorCount), name);
77754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                if(!no_time) str_timeDelta(msg+strlen(msg),timeStop-timeStart);
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                for(int i=0;i<LL_indentlevel;i++) {
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errorList += " ";
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errorList += name;
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errorList += "\n";
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                lastTestFailed = TRUE;
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            LL_indentlevel -= 3;
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (lastTestFailed) {
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                LL_message( "", TRUE);
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            LL_message( msg, TRUE);
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (lastTestFailed) {
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                LL_message( "", TRUE);
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            LL_indentlevel += 3;
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        index++;
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }while(name);
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
79927f654740f2a26ad62a5c155af9199af9e69b889claireho    *saveBaseLoc = 0;
80027f654740f2a26ad62a5c155af9199af9e69b889claireho
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gTest = saveTest;
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Adds given string to the log if we are in verbose mode.
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::log( const UnicodeString &message )
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( verbose ) {
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LL_message( message, FALSE );
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Adds given string to the log if we are in verbose mode. Adds a new line to
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* the given message.
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::logln( const UnicodeString &message )
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( verbose ) {
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LL_message( message, TRUE );
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::logln( void )
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( verbose ) {
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LL_message( "", TRUE );
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Unconditionally adds given string to the log.
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::info( const UnicodeString &message )
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  LL_message( message, FALSE );
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Unconditionally adds given string to the log. Adds a new line to
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* the given message.
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::infoln( const UnicodeString &message )
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  LL_message( message, TRUE );
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::infoln( void )
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  LL_message( "", TRUE );
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t IntlTest::IncErrorCount( void )
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCount++;
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (caller) caller->IncErrorCount();
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return errorCount;
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t IntlTest::IncDataErrorCount( void )
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dataErrorCount++;
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (caller) caller->IncDataErrorCount();
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return dataErrorCount;
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::err()
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IncErrorCount();
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::err( const UnicodeString &message )
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IncErrorCount();
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!no_err_msg) LL_message( message, FALSE );
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::errln( const UnicodeString &message )
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IncErrorCount();
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!no_err_msg) LL_message( message, TRUE );
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::dataerr( const UnicodeString &message )
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IncDataErrorCount();
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!warn_on_missing_data) {
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IncErrorCount();
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!no_err_msg) LL_message( message, FALSE );
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::dataerrln( const UnicodeString &message )
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
90059d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t errCount = IncDataErrorCount();
9016d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UnicodeString msg;
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!warn_on_missing_data) {
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IncErrorCount();
9046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        msg = message;
9056d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    } else {
9066d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        msg = UnicodeString("[DATA] " + message);
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
90959d709d503bab6e2b61931737e662dd293b40578ccornelius    if (!no_err_msg) {
91059d709d503bab6e2b61931737e662dd293b40578ccornelius      if ( errCount == 1) {
91159d709d503bab6e2b61931737e662dd293b40578ccornelius          LL_message( msg + " - (Are you missing data?)", TRUE ); // only show this message the first time
91259d709d503bab6e2b61931737e662dd293b40578ccornelius      } else {
91359d709d503bab6e2b61931737e662dd293b40578ccornelius          LL_message( msg , TRUE );
91459d709d503bab6e2b61931737e662dd293b40578ccornelius      }
91559d709d503bab6e2b61931737e662dd293b40578ccornelius    }
9166d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru}
9176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
9186d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queruvoid IntlTest::errcheckln(UErrorCode status, const UnicodeString &message ) {
9196d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (status == U_FILE_ACCESS_ERROR || status == U_MISSING_RESOURCE_ERROR) {
9206d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln(message);
9216d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    } else {
9226d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errln(message);
9236d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* convenience functions that include sprintf formatting */
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::log(const char *fmt, ...)
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* sprintf it just to make sure that the information is valid */
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( verbose ) {
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log(UnicodeString(buffer, ""));
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::logln(const char *fmt, ...)
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* sprintf it just to make sure that the information is valid */
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( verbose ) {
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString(buffer, ""));
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
95559d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::logKnownIssue(const char *ticket, const char *fmt, ...)
95659d709d503bab6e2b61931737e662dd293b40578ccornelius{
95759d709d503bab6e2b61931737e662dd293b40578ccornelius    char buffer[4000];
95859d709d503bab6e2b61931737e662dd293b40578ccornelius    va_list ap;
95959d709d503bab6e2b61931737e662dd293b40578ccornelius
96059d709d503bab6e2b61931737e662dd293b40578ccornelius    va_start(ap, fmt);
96159d709d503bab6e2b61931737e662dd293b40578ccornelius    /* sprintf it just to make sure that the information is valid */
96259d709d503bab6e2b61931737e662dd293b40578ccornelius    vsprintf(buffer, fmt, ap);
96359d709d503bab6e2b61931737e662dd293b40578ccornelius    va_end(ap);
96459d709d503bab6e2b61931737e662dd293b40578ccornelius    return logKnownIssue(ticket, UnicodeString(buffer, ""));
96559d709d503bab6e2b61931737e662dd293b40578ccornelius}
96659d709d503bab6e2b61931737e662dd293b40578ccornelius
96759d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::logKnownIssue(const char *ticket) {
96859d709d503bab6e2b61931737e662dd293b40578ccornelius  return logKnownIssue(ticket, UnicodeString());
96959d709d503bab6e2b61931737e662dd293b40578ccornelius}
97059d709d503bab6e2b61931737e662dd293b40578ccornelius
97159d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::logKnownIssue(const char *ticket, const UnicodeString &msg) {
97259d709d503bab6e2b61931737e662dd293b40578ccornelius  if(noKnownIssues) return FALSE;
97359d709d503bab6e2b61931737e662dd293b40578ccornelius
97459d709d503bab6e2b61931737e662dd293b40578ccornelius  char fullpath[2048];
97559d709d503bab6e2b61931737e662dd293b40578ccornelius  strcpy(fullpath, basePath);
97659d709d503bab6e2b61931737e662dd293b40578ccornelius  strcat(fullpath, currName);
977c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert  UnicodeString msg2 = msg;
978c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert  UBool firstForTicket = TRUE, firstForWhere = TRUE;
97959d709d503bab6e2b61931737e662dd293b40578ccornelius  knownList = udbg_knownIssue_openU(knownList, ticket, fullpath, msg2.getTerminatedBuffer(), &firstForTicket, &firstForWhere);
98059d709d503bab6e2b61931737e662dd293b40578ccornelius
981fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  msg2 = UNICODE_STRING_SIMPLE("(Known issue #") +
982fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      UnicodeString(ticket, -1, US_INV) + UNICODE_STRING_SIMPLE(") ") + msg;
98359d709d503bab6e2b61931737e662dd293b40578ccornelius  if(firstForTicket || firstForWhere) {
984fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    infoln(msg2);
98559d709d503bab6e2b61931737e662dd293b40578ccornelius  } else {
986fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln(msg2);
98759d709d503bab6e2b61931737e662dd293b40578ccornelius  }
98859d709d503bab6e2b61931737e662dd293b40578ccornelius
98959d709d503bab6e2b61931737e662dd293b40578ccornelius  return TRUE;
99059d709d503bab6e2b61931737e662dd293b40578ccornelius}
99159d709d503bab6e2b61931737e662dd293b40578ccornelius
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* convenience functions that include sprintf formatting */
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::info(const char *fmt, ...)
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* sprintf it just to make sure that the information is valid */
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    info(UnicodeString(buffer, ""));
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::infoln(const char *fmt, ...)
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* sprintf it just to make sure that the information is valid */
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    infoln(UnicodeString(buffer, ""));
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::err(const char *fmt, ...)
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    err(UnicodeString(buffer, ""));
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::errln(const char *fmt, ...)
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errln(UnicodeString(buffer, ""));
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::dataerrln(const char *fmt, ...)
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dataerrln(UnicodeString(buffer, ""));
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
10506d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queruvoid IntlTest::errcheckln(UErrorCode status, const char *fmt, ...)
10516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru{
10526d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    char buffer[4000];
10536d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    va_list ap;
10546d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
10556d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    va_start(ap, fmt);
10566d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    vsprintf(buffer, fmt, ap);
10576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    va_end(ap);
10586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
10596d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (status == U_FILE_ACCESS_ERROR || status == U_MISSING_RESOURCE_ERROR) {
10606d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln(UnicodeString(buffer, ""));
10616d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    } else {
10626d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errln(UnicodeString(buffer, ""));
10636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
10646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru}
10656d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::printErrors()
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     IntlTest::LL_message(errorList, TRUE);
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
107159d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::printKnownIssues()
107259d709d503bab6e2b61931737e662dd293b40578ccornelius{
107359d709d503bab6e2b61931737e662dd293b40578ccornelius  if(knownList != NULL) {
107459d709d503bab6e2b61931737e662dd293b40578ccornelius    udbg_knownIssue_print(knownList);
107559d709d503bab6e2b61931737e662dd293b40578ccornelius    udbg_knownIssue_close(knownList);
107659d709d503bab6e2b61931737e662dd293b40578ccornelius    return TRUE;
107759d709d503bab6e2b61931737e662dd293b40578ccornelius  } else {
107859d709d503bab6e2b61931737e662dd293b40578ccornelius    return FALSE;
107959d709d503bab6e2b61931737e662dd293b40578ccornelius  }
108059d709d503bab6e2b61931737e662dd293b40578ccornelius}
108159d709d503bab6e2b61931737e662dd293b40578ccornelius
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::LL_message( UnicodeString message, UBool newline )
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // string that starts with a LineFeed character and continues
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // with spaces according to the current indentation
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar indentUChars[] = {
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        '\n',
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        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString indent(FALSE, indentUChars, 1 + LL_indentlevel);
1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1101fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    char buffer[30000];
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // stream out the indentation string first if necessary
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length = indent.extract(1, indent.length(), buffer, sizeof(buffer));
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (length > 0) {
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fwrite(buffer, sizeof(*buffer), length, (FILE *)testoutfp);
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // replace each LineFeed by the indentation string
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    message.findAndReplace(UnicodeString((UChar)'\n'), indent);
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // stream out the message
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length = message.extract(0, message.length(), buffer, sizeof(buffer));
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (length > 0) {
1116fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        length = length > 30000 ? 30000 : length;
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fwrite(buffer, sizeof(*buffer), length, (FILE *)testoutfp);
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (newline) {
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char newLine = '\n';
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fwrite(&newLine, sizeof(newLine), 1, (FILE *)testoutfp);
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // A newline usually flushes the buffer, but
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // flush the message just in case of a core dump.
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fflush((FILE *)testoutfp);
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Print a usage message for this test class.
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::usage( void )
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool save_verbose = setVerbose( TRUE );
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Test names:");
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("-----------");
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t index = 0;
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* name = NULL;
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    do{
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        this->runIndexedTest( index, FALSE, name );
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!name) break;
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(name);
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        index++;
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }while (name && (name[0] != 0));
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setVerbose( save_verbose );
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// memory leak reporting software will be able to take advantage of the testsuite
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// being run a second time local to a specific method in order to report only actual leaks
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::run_phase2( char* name, char* par ) // supports reporting memory leaks
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString* strLeak = new UnicodeString("forced leak"); // for verifying purify filter
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strLeak->append(" for verifying purify filter");
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return this->runTest( name, par );
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if UCONFIG_NO_LEGACY_CONVERSION
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define TRY_CNV_1 "iso-8859-1"
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define TRY_CNV_2 "ibm-1208"
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define TRY_CNV_1 "iso-8859-7"
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define TRY_CNV_2 "sjis"
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1170c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#ifdef UNISTR_COUNT_FINAL_STRING_LENGTHS
1171c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertU_CAPI void unistr_printLengths();
1172c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#endif
1173c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querumain(int argc, char* argv[])
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool syntax = FALSE;
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool all = FALSE;
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool verbose = FALSE;
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool no_err_msg = FALSE;
118154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UBool no_time = FALSE;
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool quick = TRUE;
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool name = FALSE;
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool leaks = FALSE;
118559d709d503bab6e2b61931737e662dd293b40578ccornelius    UBool utf8 = FALSE;
118659d709d503bab6e2b61931737e662dd293b40578ccornelius    const char *summary_file = NULL;
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool warnOnMissingData = FALSE;
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool defaultDataFound = FALSE;
118950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t threadCount = 1;
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode = U_ZERO_ERROR;
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter *cnv = NULL;
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *warnOrErr = "Failure";
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate startTime, endTime;
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t diffTime;
1195b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char *props[IntlTest::kMaxProps];
1196b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t nProps = 0;
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U_MAIN_INIT_ARGS(argc, argv);
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
120027f654740f2a26ad62a5c155af9199af9e69b889claireho    startTime = uprv_getRawUTCtime();
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int i = 1; i < argc; ++i) {
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (argv[i][0] == '-') {
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const char* str = argv[i] + 1;
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (strcmp("verbose", str) == 0 ||
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                strcmp("v", str) == 0)
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                verbose = TRUE;
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else if (strcmp("noerrormsg", str) == 0 ||
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     strcmp("n", str) == 0)
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                no_err_msg = TRUE;
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else if (strcmp("exhaustive", str) == 0 ||
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     strcmp("e", str) == 0)
1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                quick = FALSE;
1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else if (strcmp("all", str) == 0 ||
1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     strcmp("a", str) == 0)
1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                all = TRUE;
121759d709d503bab6e2b61931737e662dd293b40578ccornelius            else if (strcmp("utf-8", str) == 0 ||
121859d709d503bab6e2b61931737e662dd293b40578ccornelius                     strcmp("u", str) == 0)
121959d709d503bab6e2b61931737e662dd293b40578ccornelius                utf8 = TRUE;
122059d709d503bab6e2b61931737e662dd293b40578ccornelius            else if (strcmp("noknownissues", str) == 0 ||
122159d709d503bab6e2b61931737e662dd293b40578ccornelius                     strcmp("K", str) == 0)
122259d709d503bab6e2b61931737e662dd293b40578ccornelius                noKnownIssues = TRUE;
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else if (strcmp("leaks", str) == 0 ||
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     strcmp("l", str) == 0)
1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                leaks = TRUE;
122654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            else if (strcmp("notime", str) == 0 ||
122754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                     strcmp("T", str) == 0)
122854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                no_time = TRUE;
122959d709d503bab6e2b61931737e662dd293b40578ccornelius            else if (strncmp("E", str, 1) == 0)
123059d709d503bab6e2b61931737e662dd293b40578ccornelius                summary_file = str+1;
123127f654740f2a26ad62a5c155af9199af9e69b889claireho            else if (strcmp("x", str)==0) {
123227f654740f2a26ad62a5c155af9199af9e69b889claireho              if(++i>=argc) {
123327f654740f2a26ad62a5c155af9199af9e69b889claireho                printf("* Error: '-x' option requires an argument. usage: '-x outfile.xml'.\n");
123427f654740f2a26ad62a5c155af9199af9e69b889claireho                syntax = TRUE;
123527f654740f2a26ad62a5c155af9199af9e69b889claireho              }
123627f654740f2a26ad62a5c155af9199af9e69b889claireho              if(ctest_xml_setFileName(argv[i])) { /* set the name */
123727f654740f2a26ad62a5c155af9199af9e69b889claireho                return 1; /* error */
123827f654740f2a26ad62a5c155af9199af9e69b889claireho              }
123927f654740f2a26ad62a5c155af9199af9e69b889claireho            } else if (strcmp("w", str) == 0) {
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              warnOnMissingData = TRUE;
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              warnOrErr = "WARNING";
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
124350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            else if (strncmp("threads:", str, 8) == 0) {
124450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                threadCount = atoi(str + 8);
124550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
1246b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            else if (strncmp("prop:", str, 5) == 0) {
1247b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                if (nProps < IntlTest::kMaxProps) {
1248b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    props[nProps] = str + 5;
1249b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                }
1250b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                nProps++;
1251b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else {
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                syntax = TRUE;
1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else{
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = TRUE;
1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!all && !name) {
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        all = TRUE;
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if (all && name) {
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        syntax = TRUE;
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (syntax) {
1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout,
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### Syntax:\n"
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### IntlTest [-option1 -option2 ...] [testname1 testname2 ...] \n"
127050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                "### \n"
127150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                "### Options are: verbose (v), all (a), noerrormsg (n), \n"
127227f654740f2a26ad62a5c155af9199af9e69b889claireho                "### exhaustive (e), leaks (l), -x xmlfile.xml, prop:<propery>=<value>, \n"
127354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                "### notime (T), \n"
127450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                "### threads:<threadCount> (Mulithreading must first be \n"
127550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                "###     enabled otherwise this will be ignored. \n"
127650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                "###     The default thread count is 1.),\n"
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### (Specify either -all (shortcut -a) or a test name). \n"
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### -all will run all of the tests.\n"
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### \n"
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### To get a list of the test names type: intltest LIST \n"
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### To run just the utility tests type: intltest utility \n"
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### \n"
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### Test names can be nested using slashes (\"testA/subtest1\") \n"
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### For example to list the utility tests type: intltest utility/LIST \n"
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### To run just the Locale test type: intltest utility/LocaleTest \n"
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### \n"
1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### A parameter can be specified for a test by appending '@' and the value \n"
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### to the testname. \n\n");
1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 1;
1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1292b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (nProps > IntlTest::kMaxProps) {
1293b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        fprintf(stdout, "### Too many properties.  Exiting.\n");
1294b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
1295b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MajorTestLevel major;
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    major.setVerbose( verbose );
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    major.setNoErrMsg( no_err_msg );
1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    major.setQuick( quick );
1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    major.setLeaks( leaks );
130150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    major.setThreadCount( threadCount );
1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    major.setWarnOnMissingData( warnOnMissingData );
130354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    major.setNotime (no_time);
1304b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (int32_t i = 0; i < nProps; i++) {
1305b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        major.setProperty(props[i]);
1306b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
130727f654740f2a26ad62a5c155af9199af9e69b889claireho
130827f654740f2a26ad62a5c155af9199af9e69b889claireho
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "-----------------------------------------------\n");
1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, " IntlTest (C++) Test Suite for                 \n");
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   International Components for Unicode %s\n", U_ICU_VERSION);
131227f654740f2a26ad62a5c155af9199af9e69b889claireho
131327f654740f2a26ad62a5c155af9199af9e69b889claireho
1314b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {
1315b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	const char *charsetFamily = "Unknown";
1316b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t voidSize = (int32_t)sizeof(void*);
1317b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t bits = voidSize * 8;
1318b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(U_CHARSET_FAMILY==U_ASCII_FAMILY) {
1319b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru           charsetFamily="ASCII";
1320b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        } else if(U_CHARSET_FAMILY==U_EBCDIC_FAMILY) {
1321b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru           charsetFamily="EBCDIC";
1322b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
1323b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        fprintf(stdout,
1324b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    "   Bits: %d, Byte order: %s, Chars: %s\n",
1325b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                     bits, U_IS_BIG_ENDIAN?"Big endian":"Little endian",
1326b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                     charsetFamily);
1327b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "-----------------------------------------------\n");
1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, " Options:                                       \n");
1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   all (a)                  : %s\n", (all?               "On" : "Off"));
1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   Verbose (v)              : %s\n", (verbose?           "On" : "Off"));
1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   No error messages (n)    : %s\n", (no_err_msg?        "On" : "Off"));
1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   Exhaustive (e)           : %s\n", (!quick?            "On" : "Off"));
1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   Leaks (l)                : %s\n", (leaks?             "On" : "Off"));
133559d709d503bab6e2b61931737e662dd293b40578ccornelius    fprintf(stdout, "   utf-8 (u)                : %s\n", (utf8?              "On" : "Off"));
133654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    fprintf(stdout, "   notime (T)               : %s\n", (no_time?             "On" : "Off"));
133759d709d503bab6e2b61931737e662dd293b40578ccornelius    fprintf(stdout, "   noknownissues (K)        : %s\n", (noKnownIssues?      "On" : "Off"));
1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   Warn on missing data (w) : %s\n", (warnOnMissingData? "On" : "Off"));
133950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fprintf(stdout, "   Threads                  : %d\n", threadCount);
1340b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (int32_t i = 0; i < nProps; i++) {
1341b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        fprintf(stdout, "   Custom property (prop:)  : %s\n", props[i]);
1342b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "-----------------------------------------------\n");
1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
134559d709d503bab6e2b61931737e662dd293b40578ccornelius    if(utf8) {
134659d709d503bab6e2b61931737e662dd293b40578ccornelius      ucnv_setDefaultName("utf-8");
134759d709d503bab6e2b61931737e662dd293b40578ccornelius    }
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Check whether ICU will initialize without forcing the build data directory into
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  the ICU_DATA path.  Success here means either the data dll contains data, or that
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  this test program was run with ICU_DATA set externally.  Failure of this check
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  is normal when ICU data is not packaged into a shared library.
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  Whether or not this test succeeds, we want to cleanup and reinitialize
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  with a data path so that data loading from individual files can be tested.
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_init(&errorCode);
1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stderr,
1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "#### Note:  ICU Init without build-specific setDataDirectory() failed.\n");
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        defaultDataFound = FALSE;
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        defaultDataFound = TRUE;
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_cleanup();
136659d709d503bab6e2b61931737e662dd293b40578ccornelius    if(utf8) {
136759d709d503bab6e2b61931737e662dd293b40578ccornelius      ucnv_setDefaultName("utf-8");
136859d709d503bab6e2b61931737e662dd293b40578ccornelius    }
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode = U_ZERO_ERROR;
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Initialize ICU */
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!defaultDataFound) {
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::setICU_DATA();   // Must set data directory before u_init() is called.
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_init(&errorCode);
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stderr,
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "#### ERROR! %s: u_init() failed with status = \"%s\".\n"
1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "*** Check the ICU_DATA environment variable and \n"
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "*** check that the data files are present.\n", argv[0], u_errorName(errorCode));
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(warnOnMissingData == 0) {
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fprintf(stderr, "*** Exiting.  Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n");
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_cleanup();
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return 1;
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // initial check for the default converter
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode = U_ZERO_ERROR;
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv = ucnv_open(0, &errorCode);
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(cnv != 0) {
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // ok
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_close(cnv);
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout,
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** %s! The default converter [%s] cannot be opened.\n"
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** Check the ICU_DATA environment variable and\n"
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** check that the data files are present.\n",
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                warnOrErr, ucnv_getDefaultName());
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!warnOnMissingData) {
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          fprintf(stdout, "*** Exiting.  Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n");
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return 1;
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // try more data
1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv = ucnv_open(TRY_CNV_2, &errorCode);
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(cnv != 0) {
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // ok
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_close(cnv);
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout,
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** %s! The converter for " TRY_CNV_2 " cannot be opened.\n"
1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** Check the ICU_DATA environment variable and \n"
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** check that the data files are present.\n", warnOrErr);
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!warnOnMissingData) {
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          fprintf(stdout, "*** Exiting.  Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n");
1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return 1;
1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle *rb = ures_open(0, "en", &errorCode);
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_close(rb);
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout,
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** %s! The \"en\" locale resource bundle cannot be opened.\n"
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** Check the ICU_DATA environment variable and \n"
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** check that the data files are present.\n", warnOrErr);
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!warnOnMissingData) {
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          fprintf(stdout, "*** Exiting.  Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n");
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return 1;
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale originalLocale;  // Save the default locale for comparison later on.
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
143727f654740f2a26ad62a5c155af9199af9e69b889claireho    if(ctest_xml_init("intltest"))
143827f654740f2a26ad62a5c155af9199af9e69b889claireho      return 1;
143927f654740f2a26ad62a5c155af9199af9e69b889claireho
144027f654740f2a26ad62a5c155af9199af9e69b889claireho
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* TODO: Add option to call u_cleanup and rerun tests. */
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (all) {
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        major.runTest();
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (leaks) {
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            major.run_phase2( NULL, NULL );
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int i = 1; i < argc; ++i) {
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (argv[i][0] != '-') {
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                char* name = argv[i];
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fprintf(stdout, "\n=== Handling test: %s: ===\n", name);
145227f654740f2a26ad62a5c155af9199af9e69b889claireho
145327f654740f2a26ad62a5c155af9199af9e69b889claireho                char baseName[1024];
145427f654740f2a26ad62a5c155af9199af9e69b889claireho                sprintf(baseName, "/%s/", name);
145527f654740f2a26ad62a5c155af9199af9e69b889claireho
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                char* parameter = strchr( name, '@' );
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (parameter) {
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    *parameter = 0;
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    parameter += 1;
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                execCount = 0;
146227f654740f2a26ad62a5c155af9199af9e69b889claireho                UBool res = major.runTest( name, parameter, baseName );
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (leaks && res) {
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    major.run_phase2( name, parameter );
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (!res || (execCount <= 0)) {
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    fprintf(stdout, "\n---ERROR: Test doesn't exist: %s!\n", name);
1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
146927f654740f2a26ad62a5c155af9199af9e69b889claireho            } else if(!strcmp(argv[i],"-x")) {
147027f654740f2a26ad62a5c155af9199af9e69b889claireho              i++;
1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
147527f654740f2a26ad62a5c155af9199af9e69b889claireho
1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CalendarTimeZoneTest::cleanup();
1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(_testDataPath);
1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testDataPath = 0;
1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale lastDefaultLocale;
1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (originalLocale != lastDefaultLocale) {
1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        major.errln("FAILURE: A test changed the default locale without resetting it.");
1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "\n--------------------------------------\n");
148959d709d503bab6e2b61931737e662dd293b40578ccornelius    if( major.printKnownIssues() ) {
149059d709d503bab6e2b61931737e662dd293b40578ccornelius      fprintf(stdout, " To run suppressed tests, use the -K option. \n");
149159d709d503bab6e2b61931737e662dd293b40578ccornelius    }
1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (major.getErrors() == 0) {
1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Call it twice to make sure that the defaults were reset. */
1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Call it before the OK message to verify proper cleanup. */
1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_cleanup();
1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_cleanup();
1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout, "OK: All tests passed without error.\n");
1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (major.getDataErrors() != 0) {
1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fprintf(stdout, "\t*WARNING* some data-loading errors were ignored by the -w option.\n");
1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout, "Errors in total: %ld.\n", (long)major.getErrors());
1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        major.printErrors();
1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
150759d709d503bab6e2b61931737e662dd293b40578ccornelius        if(summary_file != NULL) {
150859d709d503bab6e2b61931737e662dd293b40578ccornelius          FILE *summf = fopen(summary_file, "w");
150959d709d503bab6e2b61931737e662dd293b40578ccornelius          if( summf != NULL) {
151059d709d503bab6e2b61931737e662dd293b40578ccornelius            char buf[10000];
151159d709d503bab6e2b61931737e662dd293b40578ccornelius            int32_t length = errorList.extract(0, errorList.length(), buf, sizeof(buf));
151259d709d503bab6e2b61931737e662dd293b40578ccornelius            fwrite(buf, sizeof(*buf), length, (FILE*)summf);
151359d709d503bab6e2b61931737e662dd293b40578ccornelius            fclose(summf);
151459d709d503bab6e2b61931737e662dd293b40578ccornelius          }
151559d709d503bab6e2b61931737e662dd293b40578ccornelius        }
151659d709d503bab6e2b61931737e662dd293b40578ccornelius
1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (major.getDataErrors() != 0) {
1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fprintf(stdout, "\t*Note* some errors are data-loading related. If the data used is not the \n"
1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "\tstock ICU data (i.e some have been added or removed), consider using\n"
1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "\tthe '-w' option to turn these errors into warnings.\n");
1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Call afterwards to display errors. */
1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_cleanup();
1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1528c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#ifdef UNISTR_COUNT_FINAL_STRING_LENGTHS
1529c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    unistr_printLengths();
1530c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#endif
1531c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "--------------------------------------\n");
1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (execCount <= 0) {
1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout, "***** Not all called tests actually exist! *****\n");
1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
153754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(!no_time) {
153854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      endTime = uprv_getRawUTCtime();
153954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      diffTime = (int32_t)(endTime - startTime);
154054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      printf("Elapsed Time: %02d:%02d:%02d.%03d\n",
154154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius             (int)((diffTime%U_MILLIS_PER_DAY)/U_MILLIS_PER_HOUR),
154254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius             (int)((diffTime%U_MILLIS_PER_HOUR)/U_MILLIS_PER_MINUTE),
154354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius             (int)((diffTime%U_MILLIS_PER_MINUTE)/U_MILLIS_PER_SECOND),
154454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius             (int)(diffTime%U_MILLIS_PER_SECOND));
154554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
154627f654740f2a26ad62a5c155af9199af9e69b889claireho
154727f654740f2a26ad62a5c155af9199af9e69b889claireho    if(ctest_xml_fini())
154827f654740f2a26ad62a5c155af9199af9e69b889claireho      return 1;
154927f654740f2a26ad62a5c155af9199af9e69b889claireho
1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return major.getErrors();
1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char* IntlTest::loadTestData(UErrorCode& err){
1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( _testDataPath == NULL){
1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char*      directory=NULL;
1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UResourceBundle* test =NULL;
1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char* tdpath=NULL;
1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* tdrelativepath;
1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined (U_TOPBUILDDIR)
156154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        tdrelativepath = "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING;
1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        directory = U_TOPBUILDDIR;
1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
156454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        tdrelativepath = ".." U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING;
1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        directory = pathToDataDirectory();
1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tdpath = (char*) malloc(sizeof(char) *(( strlen(directory) * strlen(tdrelativepath)) + 100));
1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* u_getDataDirectory shoul return \source\data ... set the
1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * directory to ..\source\data\..\test\testdata\out\testdata
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(tdpath, directory);
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcat(tdpath, tdrelativepath);
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcat(tdpath,"testdata");
1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        test=ures_open(tdpath, "testtypes", &err);
1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err)){
1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err = U_FILE_ACCESS_ERROR;
15826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            it_dataerrln((UnicodeString)"Could not load testtypes.res in testdata bundle with path " + tdpath + (UnicodeString)" - " + u_errorName(err));
1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return "";
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ures_close(test);
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        _testDataPath = tdpath;
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return _testDataPath;
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return _testDataPath;
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char* IntlTest::getTestDataPath(UErrorCode& err) {
1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return loadTestData(err);
1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Returns the path to icu/source/test/testdata/ */
1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char *IntlTest::getSourceTestData(UErrorCode& /*err*/) {
1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *srcDataDir = NULL;
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef U_TOPSRCDIR
160054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    srcDataDir = U_TOPSRCDIR U_FILE_SEP_STRING"test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING;
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
160254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    srcDataDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING;
160354dcd9b6a06071f647dac967e9e267abb9410720Craig 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");
1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (f) {
1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* We're in icu/source/test/intltest/ */
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fclose(f);
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1609b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        /* We're in icu/source/test/intltest/Platform/(Debug|Release) */
16101b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        srcDataDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING
16111b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                     "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING;
1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return srcDataDir;
1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1617f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliuschar *IntlTest::getUnidataPath(char path[]) {
1618f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    const int kUnicodeDataTxtLength = 15;  // strlen("UnicodeData.txt")
1619f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
1620f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    // Look inside ICU_DATA first.
1621f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    strcpy(path, pathToDataDirectory());
1622f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    strcat(path, "unidata" U_FILE_SEP_STRING "UnicodeData.txt");
1623f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    FILE *f = fopen(path, "r");
1624f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    if(f != NULL) {
1625f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        fclose(f);
1626f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        *(strchr(path, 0) - kUnicodeDataTxtLength) = 0;  // Remove the basename.
1627f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        return path;
1628f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    }
1629f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
1630f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    // As a fallback, try to guess where the source data was located
1631f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    // at the time ICU was built, and look there.
1632f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#   ifdef U_TOPSRCDIR
1633f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        strcpy(path, U_TOPSRCDIR  U_FILE_SEP_STRING "data");
1634f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#   else
1635f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        UErrorCode errorCode = U_ZERO_ERROR;
1636f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        const char *testDataPath = loadTestData(errorCode);
1637f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        if(U_FAILURE(errorCode)) {
1638f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            it_errln(UnicodeString(
1639f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                        "unable to find path to source/data/unidata/ and loadTestData() failed: ") +
1640f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                    u_errorName(errorCode));
1641f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            return NULL;
1642f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        }
1643f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        strcpy(path, testDataPath);
1644f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        strcat(path, U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".."
1645f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                     U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".."
1646f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                     U_FILE_SEP_STRING "data");
1647f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#   endif
1648f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    strcat(path, U_FILE_SEP_STRING);
1649f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    strcat(path, "unidata" U_FILE_SEP_STRING "UnicodeData.txt");
1650f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    f = fopen(path, "r");
1651f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    if(f != NULL) {
1652f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        fclose(f);
1653f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        *(strchr(path, 0) - kUnicodeDataTxtLength) = 0;  // Remove the basename.
1654f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        return path;
1655f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    }
1656f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    return NULL;
1657f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius}
1658f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char* IntlTest::fgDataDir = NULL;
1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* returns the path to icu/source/data */
1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char *  IntlTest::pathToDataDirectory()
1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(fgDataDir != NULL) {
1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return fgDataDir;
1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* U_TOPSRCDIR is set by the makefiles on UNIXes when building cintltst and intltst
1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              to point to the top of the build hierarchy, which may or
1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              may not be the same as the source directory, depending on
1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              the configure options used.  At any rate,
1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              set the data path to the built data from this directory.
1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              The value is complete with quotes, so it can be used
1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              as-is as a string constant.
1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined (U_TOPSRCDIR)
1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fgDataDir = U_TOPSRCDIR  U_FILE_SEP_STRING "data" U_FILE_SEP_STRING;
1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* On Windows, the file name obtained from __FILE__ includes a full path.
1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *             This file is "wherever\icu\source\test\cintltst\cintltst.c"
1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *             Change to    "wherever\icu\source\data"
1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static char p[sizeof(__FILE__) + 10];
1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char *pBackSlash;
1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int i;
1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(p, __FILE__);
1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* We want to back over three '\' chars.                            */
1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*   Only Windows should end up here, so looking for '\' is safe.   */
1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i=1; i<=3; i++) {
1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pBackSlash = strrchr(p, U_FILE_SEP_CHAR);
1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (pBackSlash != NULL) {
1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                *pBackSlash = 0;        /* Truncate the string at the '\'   */
1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (pBackSlash != NULL) {
1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* We found and truncated three names from the path.
1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *  Now append "source\data" and set the environment
1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            */
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strcpy(pBackSlash, U_FILE_SEP_STRING "data" U_FILE_SEP_STRING );
1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fgDataDir = p;
1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* __FILE__ on MSVC7 does not contain the directory */
17111b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            FILE *file = fopen(".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "Makefile.in", "r");
1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (file) {
1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fclose(file);
17141b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                fgDataDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "data" U_FILE_SEP_STRING;
1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else {
17171b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                fgDataDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "data" U_FILE_SEP_STRING;
1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fgDataDir;
1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This is a variant of cintltst/ccolltst.c:CharsToUChars().
172927f654740f2a26ad62a5c155af9199af9e69b889claireho * It converts an invariant-character string into a UnicodeString, with
1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * unescaping \u sequences.
1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
173250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString CharsToUnicodeString(const char* chars){
173327f654740f2a26ad62a5c155af9199af9e69b889claireho    return UnicodeString(chars, -1, US_INV).unescape();
1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString ctou(const char* chars) {
1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return CharsToUnicodeString(chars);
1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define RAND_M  (714025)
1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define RAND_IA (1366)
1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define RAND_IC (150889)
1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t RAND_SEED;
1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Returns a uniform random value x, with 0.0 <= x < 1.0.  Use
1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * with care: Does not return all possible values; returns one of
1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 714,025 values, uniformly spaced.  However, the period is
1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * effectively infinite.  See: Numerical Recipes, section 7.1.
1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param seedp pointer to seed. Set *seedp to any negative value
1753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * to restart the sequence.
1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufloat IntlTest::random(int32_t* seedp) {
1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static int32_t iy, ir[98];
1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static UBool first=TRUE;
1758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t j;
1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (*seedp < 0 || first) {
1760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        first = FALSE;
1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ((*seedp=(RAND_IC-(*seedp)) % RAND_M) < 0) *seedp = -(*seedp);
1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (j=1;j<=97;++j) {
1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *seedp=(RAND_IA*(*seedp)+RAND_IC) % RAND_M;
1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ir[j]=(*seedp);
1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *seedp=(RAND_IA*(*seedp)+RAND_IC) % RAND_M;
1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        iy=(*seedp);
1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    j=(int32_t)(1 + 97.0*iy/RAND_M);
1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U_ASSERT(j>=1 && j<=97);
1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iy=ir[j];
1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *seedp=(RAND_IA*(*seedp)+RAND_IC) % RAND_M;
1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ir[j]=(*seedp);
1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (float) iy/RAND_M;
1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Convenience method using a global seed.
1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufloat IntlTest::random() {
1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return random(&RAND_SEED);
1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic inline UChar toHex(int32_t i) {
1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UChar)(i + (i < 10 ? 0x30 : (0x41 - 10)));
1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UnicodeString& escape(const UnicodeString& s, UnicodeString& result) {
1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i=0; i<s.length(); ++i) {
1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar c = s[i];
1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (c <= (UChar)0x7F) {
1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += c;
1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += (UChar)0x5c;
1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += (UChar)0x75;
1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += toHex((c >> 12) & 0xF);
1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += toHex((c >>  8) & 0xF);
1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += toHex((c >>  4) & 0xF);
1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += toHex( c        & 0xF);
1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return result;
1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define VERBOSE_ASSERTIONS
1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
18078393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusUBool IntlTest::assertTrue(const char* message, UBool condition, UBool quiet, UBool possibleDataError, const char *file, int line) {
18088393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if (file != NULL) {
18098393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        if (!condition) {
18108393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            if (possibleDataError) {
18118393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                dataerrln("%s:%d: FAIL: assertTrue() failed: %s", file, line, message);
18128393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            } else {
18138393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                errln("%s:%d: FAIL: assertTrue() failed: %s", file, line, message);
18148393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            }
18158393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        } else if (!quiet) {
18168393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            logln("%s:%d: Ok: %s", file, line, message);
18176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
18188393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    } else {
18198393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        if (!condition) {
18208393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            if (possibleDataError) {
18218393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                dataerrln("FAIL: assertTrue() failed: %s", message);
18228393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            } else {
18238393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                errln("FAIL: assertTrue() failed: %s", message);
18248393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            }
18258393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        } else if (!quiet) {
18268393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            logln("Ok: %s", message);
18278393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        }
18288393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return condition;
1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertFalse(const char* message, UBool condition, UBool quiet) {
1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (condition) {
1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: assertFalse() failed: %s", message);
1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if (!quiet) {
1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Ok: %s", message);
1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return !condition;
1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
184259d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertSuccess(const char* message, UErrorCode ec, UBool possibleDataError, const char *file, int line) {
184359d709d503bab6e2b61931737e662dd293b40578ccornelius    if( file==NULL ) {
184459d709d503bab6e2b61931737e662dd293b40578ccornelius      file = ""; // prevent failure if no file given
184559d709d503bab6e2b61931737e662dd293b40578ccornelius    }
1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
18476d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (possibleDataError) {
184859d709d503bab6e2b61931737e662dd293b40578ccornelius          dataerrln("FAIL: %s:%d: %s (%s)", file, line, message, u_errorName(ec));
1849c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        } else {
185059d709d503bab6e2b61931737e662dd293b40578ccornelius          errcheckln(ec, "FAIL: %s:%d: %s (%s)", file, line, message, u_errorName(ec));
1851c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
185359d709d503bab6e2b61931737e662dd293b40578ccornelius    } else {
185459d709d503bab6e2b61931737e662dd293b40578ccornelius      logln("OK: %s:%d: %s - (%s)", file, line, message, u_errorName(ec));
1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const char* message,
1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const UnicodeString& expected,
18616d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                             const UnicodeString& actual,
18626d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                             UBool possibleDataError) {
1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (expected != actual) {
18646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (possibleDataError) {
18656d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln((UnicodeString)"FAIL: " + message + "; got " +
18666d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  prettify(actual) +
18676d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  "; expected " + prettify(expected));
18686d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        } else {
18696d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            errln((UnicodeString)"FAIL: " + message + "; got " +
18706d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  prettify(actual) +
18716d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  "; expected " + prettify(expected));
18726d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
1873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef VERBOSE_ASSERTIONS
1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"Ok: " + message + "; got " + prettify(actual));
1878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
1881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const char* message,
1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const char* expected,
1885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const char* actual) {
1886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (uprv_strcmp(expected, actual) != 0) {
1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"FAIL: " + message + "; got \"" +
1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              actual +
1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "\"; expected \"" + expected + "\"");
1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef VERBOSE_ASSERTIONS
1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"Ok: " + message + "; got \"" + actual + "\"");
1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
1898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1900f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig CorneliusUBool IntlTest::assertEquals(const char* message,
1901f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius                             int32_t expected,
1902f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius                             int32_t actual) {
1903f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    if (expected != actual) {
1904f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        errln((UnicodeString)"FAIL: " + message + "; got " +
1905f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius              actual + "=0x" + toHex(actual) +
1906f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius              "; expected " + expected + "=0x" + toHex(expected));
1907f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        return FALSE;
1908f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    }
1909f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius#ifdef VERBOSE_ASSERTIONS
1910f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    else {
1911f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        logln((UnicodeString)"Ok: " + message + "; got " + actual + "=0x" + toHex(actual));
1912f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    }
1913f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius#endif
1914f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    return TRUE;
1915f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius}
1916f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius
1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const char* message,
191859d709d503bab6e2b61931737e662dd293b40578ccornelius                             int64_t expected,
191959d709d503bab6e2b61931737e662dd293b40578ccornelius                             int64_t actual) {
192059d709d503bab6e2b61931737e662dd293b40578ccornelius    if (expected != actual) {
192159d709d503bab6e2b61931737e662dd293b40578ccornelius        errln((UnicodeString)"FAIL: " + message + "; got int64 " +
192259d709d503bab6e2b61931737e662dd293b40578ccornelius              Int64ToUnicodeString(actual) +
192359d709d503bab6e2b61931737e662dd293b40578ccornelius              "; expected " + Int64ToUnicodeString(expected) );
192459d709d503bab6e2b61931737e662dd293b40578ccornelius        return FALSE;
192559d709d503bab6e2b61931737e662dd293b40578ccornelius    }
192659d709d503bab6e2b61931737e662dd293b40578ccornelius#ifdef VERBOSE_ASSERTIONS
192759d709d503bab6e2b61931737e662dd293b40578ccornelius    else {
192859d709d503bab6e2b61931737e662dd293b40578ccornelius      logln((UnicodeString)"Ok: " + message + "; got int64 " + Int64ToUnicodeString(actual));
192959d709d503bab6e2b61931737e662dd293b40578ccornelius    }
193059d709d503bab6e2b61931737e662dd293b40578ccornelius#endif
193159d709d503bab6e2b61931737e662dd293b40578ccornelius    return TRUE;
193259d709d503bab6e2b61931737e662dd293b40578ccornelius}
193359d709d503bab6e2b61931737e662dd293b40578ccornelius
193459d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertEquals(const char* message,
1935c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                             double expected,
1936c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                             double actual) {
1937c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (expected != actual) {
1938c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        errln((UnicodeString)"FAIL: " + message + "; got " +
1939c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert              actual +
1940c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert              "; expected " + expected);
1941c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
1942c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
1943c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#ifdef VERBOSE_ASSERTIONS
1944c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    else {
1945c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        logln((UnicodeString)"Ok: " + message + "; got " + actual);
1946c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
1947c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#endif
1948c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    return TRUE;
1949c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
1950c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
1951c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
1952c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertUBool IntlTest::assertEquals(const char* message,
195359d709d503bab6e2b61931737e662dd293b40578ccornelius                             UBool expected,
195459d709d503bab6e2b61931737e662dd293b40578ccornelius                             UBool actual) {
1955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (expected != actual) {
1956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"FAIL: " + message + "; got " +
1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              toString(actual) +
1958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "; expected " + toString(expected));
1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef VERBOSE_ASSERTIONS
1962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
196359d709d503bab6e2b61931737e662dd293b40578ccornelius      logln((UnicodeString)"Ok: " + message + "; got " + toString(actual));
196459d709d503bab6e2b61931737e662dd293b40578ccornelius    }
196559d709d503bab6e2b61931737e662dd293b40578ccornelius#endif
196659d709d503bab6e2b61931737e662dd293b40578ccornelius    return TRUE;
196759d709d503bab6e2b61931737e662dd293b40578ccornelius}
196859d709d503bab6e2b61931737e662dd293b40578ccornelius
196959d709d503bab6e2b61931737e662dd293b40578ccornelius#if !UCONFIG_NO_FORMATTING
197059d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertEquals(const char* message,
197159d709d503bab6e2b61931737e662dd293b40578ccornelius                             const Formattable& expected,
197259d709d503bab6e2b61931737e662dd293b40578ccornelius                             const Formattable& actual,
197359d709d503bab6e2b61931737e662dd293b40578ccornelius                             UBool possibleDataError) {
197459d709d503bab6e2b61931737e662dd293b40578ccornelius    if (expected != actual) {
197559d709d503bab6e2b61931737e662dd293b40578ccornelius        if (possibleDataError) {
197659d709d503bab6e2b61931737e662dd293b40578ccornelius            dataerrln((UnicodeString)"FAIL: " + message + "; got " +
197759d709d503bab6e2b61931737e662dd293b40578ccornelius                  toString(actual) +
197859d709d503bab6e2b61931737e662dd293b40578ccornelius                  "; expected " + toString(expected));
197959d709d503bab6e2b61931737e662dd293b40578ccornelius        } else {
198059d709d503bab6e2b61931737e662dd293b40578ccornelius            errln((UnicodeString)"FAIL: " + message + "; got " +
198159d709d503bab6e2b61931737e662dd293b40578ccornelius                  toString(actual) +
198259d709d503bab6e2b61931737e662dd293b40578ccornelius                  "; expected " + toString(expected));
198359d709d503bab6e2b61931737e662dd293b40578ccornelius        }
198459d709d503bab6e2b61931737e662dd293b40578ccornelius        return FALSE;
198559d709d503bab6e2b61931737e662dd293b40578ccornelius    }
198659d709d503bab6e2b61931737e662dd293b40578ccornelius#ifdef VERBOSE_ASSERTIONS
198759d709d503bab6e2b61931737e662dd293b40578ccornelius    else {
1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"Ok: " + message + "; got " + toString(actual));
1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char ASSERT_BUF[256];
1996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* extractToAssertBuf(const UnicodeString& message) {
1998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString buf;
1999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    escape(message, buf);
2000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buf.extract(0, 0x7FFFFFFF, ASSERT_BUF, sizeof(ASSERT_BUF)-1, 0);
2001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ASSERT_BUF[sizeof(ASSERT_BUF)-1] = 0;
2002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return ASSERT_BUF;
2003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertTrue(const UnicodeString& message, UBool condition, UBool quiet) {
2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertTrue(extractToAssertBuf(message), condition, quiet);
2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertFalse(const UnicodeString& message, UBool condition, UBool quiet) {
2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertFalse(extractToAssertBuf(message), condition, quiet);
2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertSuccess(const UnicodeString& message, UErrorCode ec) {
2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertSuccess(extractToAssertBuf(message), ec);
2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const UnicodeString& message,
2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const UnicodeString& expected,
201959d709d503bab6e2b61931737e662dd293b40578ccornelius                             const UnicodeString& actual,
202059d709d503bab6e2b61931737e662dd293b40578ccornelius                             UBool possibleDataError) {
202159d709d503bab6e2b61931737e662dd293b40578ccornelius    return assertEquals(extractToAssertBuf(message), expected, actual, possibleDataError);
2022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const UnicodeString& message,
2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const char* expected,
2026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const char* actual) {
2027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertEquals(extractToAssertBuf(message), expected, actual);
2028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
202959d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertEquals(const UnicodeString& message,
203059d709d503bab6e2b61931737e662dd293b40578ccornelius                             UBool expected,
203159d709d503bab6e2b61931737e662dd293b40578ccornelius                             UBool actual) {
203259d709d503bab6e2b61931737e662dd293b40578ccornelius    return assertEquals(extractToAssertBuf(message), expected, actual);
203359d709d503bab6e2b61931737e662dd293b40578ccornelius}
203459d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertEquals(const UnicodeString& message,
203559d709d503bab6e2b61931737e662dd293b40578ccornelius                             int32_t expected,
203659d709d503bab6e2b61931737e662dd293b40578ccornelius                             int32_t actual) {
203759d709d503bab6e2b61931737e662dd293b40578ccornelius    return assertEquals(extractToAssertBuf(message), expected, actual);
203859d709d503bab6e2b61931737e662dd293b40578ccornelius}
203959d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertEquals(const UnicodeString& message,
204059d709d503bab6e2b61931737e662dd293b40578ccornelius                             int64_t expected,
204159d709d503bab6e2b61931737e662dd293b40578ccornelius                             int64_t actual) {
204259d709d503bab6e2b61931737e662dd293b40578ccornelius    return assertEquals(extractToAssertBuf(message), expected, actual);
2043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
2046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const UnicodeString& message,
2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const Formattable& expected,
2048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const Formattable& actual) {
2049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertEquals(extractToAssertBuf(message), expected, actual);
2050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2053b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid IntlTest::setProperty(const char* propline) {
2054b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (numProps < kMaxProps) {
2055b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        proplines[numProps] = propline;
2056b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
2057b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    numProps++;
2058b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
2059b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2060b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruconst char* IntlTest::getProperty(const char* prop) {
2061b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char* val = NULL;
2062b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (int32_t i = 0; i < numProps; i++) {
2063b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t plen = uprv_strlen(prop);
2064b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if ((int32_t)uprv_strlen(proplines[i]) > plen + 1
2065b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                && proplines[i][plen] == '='
2066b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                && uprv_strncmp(proplines[i], prop, plen) == 0) {
2067b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            val = &(proplines[i][plen+1]);
2068b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            break;
2069b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
2070b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
2071b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return val;
2072b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
2073b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Hey, Emacs, please set the following:
2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
2077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Local Variables:
2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * indent-tabs-mode: nil
2079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * End:
2080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
2081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2082