164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// Copyright (C) 2016 and later: Unicode, Inc. and others.
264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
58de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * Copyright (c) 1997-2016, International Business Machines Corporation and
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * IntlTest is a base class for tests.
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <assert.h>
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdarg.h>
188de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include <stdio.h>
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h>
208de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include <string.h>
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
228de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "unicode/ctest.h" // for str_timeDelta
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/curramt.h"
248de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "unicode/locid.h"
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/putil.h"
268de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "unicode/smpdtfmt.h"
278de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "unicode/timezone.h"
288de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "unicode/uclean.h"
298de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "unicode/ucnv.h"
308de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "unicode/unistr.h"
318de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "unicode/ures.h"
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "intltest.h"
348de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "caltztst.h"
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
378de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "cstring.h"
388de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "itmajor.h"
398de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "mutex.h"
4027f654740f2a26ad62a5c155af9199af9e69b889claireho#include "putilimp.h" // for uprv_getRawUTCtime()
418de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "uassert.h"
4259d709d503bab6e2b61931737e662dd293b40578ccornelius#include "udbgutil.h"
438de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "umutex.h"
448de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "uoptions.h"
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef XP_MAC_CONSOLE
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <console.h>
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "Files.h"
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char* _testDataPath=NULL;
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Static list of errors found
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UnicodeString errorList;
5659d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void *knownList = NULL; // known issues
5759d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic UBool noKnownIssues = FALSE; // if TRUE, don't emit known issues
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//-----------------------------------------------------------------------------
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//convenience classes to ease porting code that uses the Java
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//string-concatenation operator (moved from findword test by rtg)
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// [LIU] Just to get things working
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUCharToUnicodeString(UChar c)
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return UnicodeString(c); }
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// [rtg] Just to get things working
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruoperator+(const UnicodeString& left,
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      long num)
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[64];    // nos changed from 10 to 64
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char danger = 'p';  // guard against overrunning the buffer (rtg)
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sprintf(buffer, "%ld", num);
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assert(danger == 'p');
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return left + buffer;
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruoperator+(const UnicodeString& left,
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      unsigned long num)
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[64];    // nos changed from 10 to 64
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char danger = 'p';  // guard against overrunning the buffer (rtg)
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sprintf(buffer, "%lu", num);
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assert(danger == 'p');
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return left + buffer;
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruInt64ToUnicodeString(int64_t num)
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[64];    // nos changed from 10 to 64
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char danger = 'p';  // guard against overrunning the buffer (rtg)
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
101103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if defined(_MSC_VER)
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sprintf(buffer, "%I64d", num);
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sprintf(buffer, "%lld", (long long)num);
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assert(danger == 'p');
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return buffer;
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// [LIU] Just to get things working
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruoperator+(const UnicodeString& left,
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      double num)
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[64];   // was 32, made it arbitrarily bigger (rtg)
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char danger = 'p'; // guard against overrunning the buffer (rtg)
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // IEEE floating point has 52 bits of mantissa, plus one assumed bit
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //  53*log(2)/log(10) = 15.95
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // so there is no need to show more than 16 digits. [alan]
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sprintf(buffer, "%.17g", num);
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assert(danger == 'p');
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return left + buffer;
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
12959d709d503bab6e2b61931737e662dd293b40578ccornelius#if 0
13059d709d503bab6e2b61931737e662dd293b40578ccorneliusUnicodeString
13159d709d503bab6e2b61931737e662dd293b40578ccorneliusoperator+(const UnicodeString& left,
13259d709d503bab6e2b61931737e662dd293b40578ccornelius          int64_t num) {
13359d709d503bab6e2b61931737e662dd293b40578ccornelius  return left + Int64ToUnicodeString(num);
13459d709d503bab6e2b61931737e662dd293b40578ccornelius}
13559d709d503bab6e2b61931737e662dd293b40578ccornelius#endif
13659d709d503bab6e2b61931737e662dd293b40578ccornelius
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
14027f654740f2a26ad62a5c155af9199af9e69b889claireho * Return a string display for this, without surrounding braces.
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString _toString(const Formattable& f) {
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s;
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (f.getType()) {
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kDate:
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UErrorCode status = U_ZERO_ERROR;
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            SimpleDateFormat fmt(status);
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_SUCCESS(status)) {
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                FieldPosition pos;
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fmt.format(f.getDate(), s, pos);
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                s.insert(0, "Date:");
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                s = UnicodeString("Error creating date format]");
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kDouble:
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s = UnicodeString("double:") + f.getDouble();
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kLong:
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s = UnicodeString("long:") + f.getLong();
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kInt64:
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s = UnicodeString("int64:") + Int64ToUnicodeString(f.getInt64());
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kString:
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        f.getString(s);
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s.insert(0, "String:");
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kArray:
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t i, n;
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const Formattable* array = f.getArray(n);
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            s.insert(0, UnicodeString("Array:"));
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString delim(", ");
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (i=0; i<n; ++i) {
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (i > 0) {
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    s.append(delim);
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                s = s + _toString(array[i]);
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
18727f654740f2a26ad62a5c155af9199af9e69b889claireho    case Formattable::kObject: {
18827f654740f2a26ad62a5c155af9199af9e69b889claireho        const CurrencyAmount* c = dynamic_cast<const CurrencyAmount*>(f.getObject());
18927f654740f2a26ad62a5c155af9199af9e69b889claireho        if (c != NULL) {
19027f654740f2a26ad62a5c155af9199af9e69b889claireho            s = _toString(c->getNumber()) + " " + UnicodeString(c->getISOCurrency());
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            s = UnicodeString("Unknown UObject");
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
19527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s = UnicodeString("Unknown Formattable type=") + (int32_t)f.getType();
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return s;
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Originally coded this as operator+, but that makes the expression
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * + char* ambiguous. - liu
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString toString(const Formattable& f) {
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s((UChar)91/*[*/);
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.append(_toString(f));
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.append((UChar)0x5d/*]*/);
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return s;
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// useful when operator+ won't cooperate
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString toString(int32_t n) {
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return UnicodeString() + (long)n;
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
22159d709d503bab6e2b61931737e662dd293b40578ccornelius
22259d709d503bab6e2b61931737e662dd293b40578ccornelius
22359d709d503bab6e2b61931737e662dd293b40578ccorneliusUnicodeString toString(UBool b) {
22459d709d503bab6e2b61931737e662dd293b40578ccornelius  return b ? UnicodeString("TRUE"):UnicodeString("FALSE");
22559d709d503bab6e2b61931737e662dd293b40578ccornelius}
22659d709d503bab6e2b61931737e662dd293b40578ccornelius
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// stephen - cleaned up 05/05/99
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, char num)
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (long)num; }
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, short num)
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (long)num; }
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, int num)
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (long)num; }
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, unsigned char num)
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (unsigned long)num; }
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, unsigned short num)
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (unsigned long)num; }
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, unsigned int num)
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (unsigned long)num; }
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, float num)
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (double)num; }
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Append a hex string to the target
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString&
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::appendHex(uint32_t number,
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t digits,
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString& target)
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar digitString[] = {
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }; /* "0123456789ABCDEF" */
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
256f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    if (digits < 0) {  // auto-digits
257f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        digits = 2;
258f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        uint32_t max = 0xff;
259f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        while (number > max) {
260f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius            digits += 2;
261f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius            max = (max << 8) | 0xff;
262f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        }
263f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    }
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (digits)
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 8:
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >> 28) & 0xF];
2688de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        U_FALLTHROUGH;
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 7:
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >> 24) & 0xF];
2718de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        U_FALLTHROUGH;
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 6:
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >> 20) & 0xF];
2748de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        U_FALLTHROUGH;
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 5:
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >> 16) & 0xF];
2778de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        U_FALLTHROUGH;
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 4:
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >> 12) & 0xF];
2808de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        U_FALLTHROUGH;
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 3:
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >>  8) & 0xF];
2838de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        U_FALLTHROUGH;
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 2:
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >>  4) & 0xF];
2868de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        U_FALLTHROUGH;
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case 1:
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += digitString[(number >>  0) & 0xF];
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        target += "**";
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return target;
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
296f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig CorneliusUnicodeString
297f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig CorneliusIntlTest::toHex(uint32_t number, int32_t digits) {
298f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    UnicodeString result;
299f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    appendHex(number, digits, result);
300f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    return result;
301f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius}
302f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius
30327f654740f2a26ad62a5c155af9199af9e69b889clairehostatic inline UBool isPrintable(UChar32 c) {
30427f654740f2a26ad62a5c155af9199af9e69b889claireho    return c <= 0x7E && (c >= 0x20 || c == 9 || c == 0xA || c == 0xD);
30527f654740f2a26ad62a5c155af9199af9e69b889claireho}
30627f654740f2a26ad62a5c155af9199af9e69b889claireho
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Replace nonprintable characters with unicode escapes
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString&
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::prettify(const UnicodeString &source,
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           UnicodeString &target)
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target.remove();
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target += "\"";
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < source.length(); )
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar32 ch = source.char32At(i);
32027f654740f2a26ad62a5c155af9199af9e69b889claireho        i += U16_LENGTH(ch);
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
32227f654740f2a26ad62a5c155af9199af9e69b889claireho        if (!isPrintable(ch))
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (ch <= 0xFFFF) {
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                target += "\\u";
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                appendHex(ch, 4, target);
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                target += "\\U";
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                appendHex(ch, 8, target);
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            target += ch;
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target += "\"";
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return target;
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Replace nonprintable characters with unicode escapes
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::prettify(const UnicodeString &source, UBool parseBackslash)
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString target;
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target.remove();
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target += "\"";
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < source.length();)
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar32 ch = source.char32At(i);
35527f654740f2a26ad62a5c155af9199af9e69b889claireho        i += U16_LENGTH(ch);
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
35727f654740f2a26ad62a5c155af9199af9e69b889claireho        if (!isPrintable(ch))
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (parseBackslash) {
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // If we are preceded by an odd number of backslashes,
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // then this character has already been backslash escaped.
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                // Delete a backslash.
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                int32_t backslashCount = 0;
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                for (int32_t j=target.length()-1; j>=0; --j) {
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (target.charAt(j) == (UChar)92) {
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        ++backslashCount;
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    } else {
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        break;
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if ((backslashCount % 2) == 1) {
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    target.truncate(target.length() - 1);
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (ch <= 0xFFFF) {
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                target += "\\u";
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                appendHex(ch, 4, target);
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                target += "\\U";
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                appendHex(ch, 8, target);
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            target += ch;
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    target += "\"";
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return target;
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*  IntlTest::setICU_DATA  - if the ICU_DATA environment variable is not already
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       set, try to deduce the directory in which ICU was built,
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       and set ICU_DATA to "icu/source/data" in that location.
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       The intent is to allow the tests to have a good chance
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       of running without requiring that the user manually set
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       ICU_DATA.  Common data isn't a problem, since it is
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       picked up via a static (build time) reference, but the
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                       tests dynamically load some data.
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::setICU_DATA() {
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *original_ICU_DATA = getenv("ICU_DATA");
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (original_ICU_DATA != NULL && *original_ICU_DATA != 0) {
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*  If the user set ICU_DATA, don't second-guess the person. */
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // U_TOPBUILDDIR is set by the makefiles on UNIXes when building cintltst and intltst
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              to point to the top of the build hierarchy, which may or
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              may not be the same as the source directory, depending on
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              the configure options used.  At any rate,
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              set the data path to the built data from this directory.
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              The value is complete with quotes, so it can be used
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              as-is as a string constant.
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined (U_TOPBUILDDIR)
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static char env_string[] = U_TOPBUILDDIR "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING;
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_setDataDirectory(env_string);
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Use #else so we don't get compiler warnings due to the return above.
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* On Windows, the file name obtained from __FILE__ includes a full path.
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *             This file is "wherever\icu\source\test\cintltst\cintltst.c"
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *             Change to    "wherever\icu\source\data"
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char p[sizeof(__FILE__) + 10];
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char *pBackSlash;
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int i;
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(p, __FILE__);
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* We want to back over three '\' chars.                            */
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*   Only Windows should end up here, so looking for '\' is safe.   */
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i=1; i<=3; i++) {
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pBackSlash = strrchr(p, U_FILE_SEP_CHAR);
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (pBackSlash != NULL) {
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                *pBackSlash = 0;        /* Truncate the string at the '\'   */
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (pBackSlash != NULL) {
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* We found and truncated three names from the path.
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             *  Now append "source\data" and set the environment
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             */
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strcpy(pBackSlash, U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING);
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_setDataDirectory(p);     /*  p is "ICU_DATA=wherever\icu\source\data"    */
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* __FILE__ on MSVC7 does not contain the directory */
4581b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            u_setDataDirectory(".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING);
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* No location for the data dir was identifiable.
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *   Add other fallbacks for the test data location here if the need arises
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//--------------------------------------------------------------------------------------
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const int32_t indentLevel_offset = 3;
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char delim = '/';
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest* IntlTest::gTest = NULL;
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t execCount = 0;
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_log( UnicodeString message )
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->log( message );
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_logln( UnicodeString message )
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->logln( message );
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_logln( void )
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->logln();
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_info( UnicodeString message )
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->info( message );
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_infoln( UnicodeString message )
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->infoln( message );
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_infoln( void )
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->infoln();
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_err()
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->err();
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_err( UnicodeString message )
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->err( message );
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_errln( UnicodeString message )
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->errln( message );
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_dataerr( UnicodeString message )
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->dataerr( message );
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_dataerrln( UnicodeString message )
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (IntlTest::gTest)
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::gTest->dataerrln( message );
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::IntlTest()
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    caller = NULL;
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testPath = NULL;
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LL_linestart = TRUE;
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCount = 0;
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dataErrorCount = 0;
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    verbose = FALSE;
55354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    no_time = FALSE;
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    no_err_msg = FALSE;
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    warn_on_missing_data = FALSE;
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    quick = FALSE;
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    leaks = FALSE;
5588de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    threadCount = 12;
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testoutfp = stdout;
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LL_indentlevel = indentLevel_offset;
561b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    numProps = 0;
56227f654740f2a26ad62a5c155af9199af9e69b889claireho    strcpy(basePath, "/");
56359d709d503bab6e2b61931737e662dd293b40578ccornelius    currName[0]=0;
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::setCaller( IntlTest* callingTest )
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    caller = callingTest;
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (caller) {
570c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        warn_on_missing_data = caller->warn_on_missing_data;
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        verbose = caller->verbose;
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        no_err_msg = caller->no_err_msg;
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        quick = caller->quick;
574c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        threadCount = caller->threadCount;
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testoutfp = caller->testoutfp;
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LL_indentlevel = caller->LL_indentlevel + indentLevel_offset;
577b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        numProps = caller->numProps;
578b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        for (int32_t i = 0; i < numProps; i++) {
579b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            proplines[i] = caller->proplines[i];
580b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::callTest( IntlTest& testToBeCalled, char* par )
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    execCount--; // correct a previously assumed test-exec, as this only calls a subtest
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testToBeCalled.setCaller( this );
58827f654740f2a26ad62a5c155af9199af9e69b889claireho    strcpy(testToBeCalled.basePath, this->basePath );
58927f654740f2a26ad62a5c155af9199af9e69b889claireho    UBool result = testToBeCalled.runTest( testPath, par, testToBeCalled.basePath );
59027f654740f2a26ad62a5c155af9199af9e69b889claireho    strcpy(testToBeCalled.basePath, this->basePath ); // reset it.
59127f654740f2a26ad62a5c155af9199af9e69b889claireho    return result;
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::setPath( char* pathVal )
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->testPath = pathVal;
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setVerbose( UBool verboseVal )
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval = this->verbose;
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->verbose = verboseVal;
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
60654dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusUBool IntlTest::setNotime( UBool no_time )
60754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius{
60854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UBool rval = this->no_time;
60954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    this->no_time = no_time;
61054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return rval;
61154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
61254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setWarnOnMissingData( UBool warn_on_missing_dataVal )
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval = this->warn_on_missing_data;
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->warn_on_missing_data = warn_on_missing_dataVal;
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setNoErrMsg( UBool no_err_msgVal )
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval = this->no_err_msg;
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->no_err_msg = no_err_msgVal;
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setQuick( UBool quickVal )
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval = this->quick;
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->quick = quickVal;
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setLeaks( UBool leaksVal )
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval = this->leaks;
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->leaks = leaksVal;
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
64150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoint32_t IntlTest::setThreadCount( int32_t count )
64250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{
64350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t rval = this->threadCount;
64450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    this->threadCount = count;
64550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return rval;
64650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
64750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t IntlTest::getErrors( void )
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return errorCount;
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t IntlTest::getDataErrors( void )
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return dataErrorCount;
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
65827f654740f2a26ad62a5c155af9199af9e69b889clairehoUBool IntlTest::runTest( char* name, char* par, char *baseName )
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool rval;
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char* pos = NULL;
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
66327f654740f2a26ad62a5c155af9199af9e69b889claireho    char* baseNameBuffer = NULL;
66427f654740f2a26ad62a5c155af9199af9e69b889claireho
66527f654740f2a26ad62a5c155af9199af9e69b889claireho    if(baseName == NULL) {
66627f654740f2a26ad62a5c155af9199af9e69b889claireho      baseNameBuffer = (char*)malloc(1024);
66727f654740f2a26ad62a5c155af9199af9e69b889claireho      baseName=baseNameBuffer;
66827f654740f2a26ad62a5c155af9199af9e69b889claireho      strcpy(baseName, "/");
66927f654740f2a26ad62a5c155af9199af9e69b889claireho    }
67027f654740f2a26ad62a5c155af9199af9e69b889claireho
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (name)
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pos = strchr( name, delim ); // check if name contains path (by looking for '/')
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pos) {
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testPath = pos+1;   // store subpath for calling subtest
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *pos = 0;       // split into two strings
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testPath = NULL;
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!name || (name[0] == 0) || (strcmp(name, "*") == 0)) {
68127f654740f2a26ad62a5c155af9199af9e69b889claireho      rval = runTestLoop( NULL, par, baseName );
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else if (strcmp( name, "LIST" ) == 0) {
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        this->usage();
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rval = TRUE;
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
68827f654740f2a26ad62a5c155af9199af9e69b889claireho      rval = runTestLoop( name, par, baseName );
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pos)
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *pos = delim;  // restore original value at pos
69327f654740f2a26ad62a5c155af9199af9e69b889claireho    if(baseNameBuffer!=NULL) {
69427f654740f2a26ad62a5c155af9199af9e69b889claireho      free(baseNameBuffer);
69527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// call individual tests, to be overriden to call implementations
70054dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusvoid IntlTest::runIndexedTest( int32_t /*index*/, UBool /*exec*/, const char* & /*name*/, char* /*par*/ )
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // to be overriden by a method like:
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (index) {
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 0: name = "First Test"; if (exec) FirstTest( par ); break;
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 1: name = "Second Test"; if (exec) SecondTest( par ); break;
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        default: name = ""; break;
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    this->errln("*** runIndexedTest needs to be overriden! ***");
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
71427f654740f2a26ad62a5c155af9199af9e69b889clairehoUBool IntlTest::runTestLoop( char* testname, char* par, char *baseName )
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t    index = 0;
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char*   name;
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool  run_this_test;
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t    lastErrorCount;
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool  rval = FALSE;
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool   lastTestFailed;
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
72327f654740f2a26ad62a5c155af9199af9e69b889claireho    if(baseName == NULL) {
72427f654740f2a26ad62a5c155af9199af9e69b889claireho      printf("ERROR: baseName can't be null.\n");
72527f654740f2a26ad62a5c155af9199af9e69b889claireho      return FALSE;
72627f654740f2a26ad62a5c155af9199af9e69b889claireho    } else {
72727f654740f2a26ad62a5c155af9199af9e69b889claireho      if ((char *)this->basePath != baseName) {
72827f654740f2a26ad62a5c155af9199af9e69b889claireho        strcpy(this->basePath, baseName);
72927f654740f2a26ad62a5c155af9199af9e69b889claireho      }
73027f654740f2a26ad62a5c155af9199af9e69b889claireho    }
73127f654740f2a26ad62a5c155af9199af9e69b889claireho
73227f654740f2a26ad62a5c155af9199af9e69b889claireho    char * saveBaseLoc = baseName+strlen(baseName);
73327f654740f2a26ad62a5c155af9199af9e69b889claireho
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IntlTest* saveTest = gTest;
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gTest = this;
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    do {
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        this->runIndexedTest( index, FALSE, name, par );
73850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (strcmp(name,"skip") == 0) {
73950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            run_this_test = FALSE;
74050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        } else {
74150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (!name || (name[0] == 0))
74250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                break;
74350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (!testname) {
74450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                run_this_test = TRUE;
74550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }else{
74650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                run_this_test = (UBool) (strcmp( name, testname ) == 0);
74750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (run_this_test) {
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            lastErrorCount = errorCount;
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            execCount++;
75227f654740f2a26ad62a5c155af9199af9e69b889claireho            char msg[256];
75327f654740f2a26ad62a5c155af9199af9e69b889claireho            sprintf(msg, "%s {", name);
75427f654740f2a26ad62a5c155af9199af9e69b889claireho            LL_message(msg, TRUE);
75527f654740f2a26ad62a5c155af9199af9e69b889claireho            UDate timeStart = uprv_getRawUTCtime();
75627f654740f2a26ad62a5c155af9199af9e69b889claireho            strcpy(saveBaseLoc,name);
75727f654740f2a26ad62a5c155af9199af9e69b889claireho            strcat(saveBaseLoc,"/");
75827f654740f2a26ad62a5c155af9199af9e69b889claireho
75959d709d503bab6e2b61931737e662dd293b40578ccornelius            strcpy(currName, name); // set
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            this->runIndexedTest( index, TRUE, name, par );
76159d709d503bab6e2b61931737e662dd293b40578ccornelius            currName[0]=0; // reset
76227f654740f2a26ad62a5c155af9199af9e69b889claireho
76327f654740f2a26ad62a5c155af9199af9e69b889claireho            UDate timeStop = uprv_getRawUTCtime();
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            rval = TRUE; // at least one test has been called
76527f654740f2a26ad62a5c155af9199af9e69b889claireho            char secs[256];
76654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            if(!no_time) {
76754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius              sprintf(secs, "%f", (timeStop-timeStart)/1000.0);
76854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            } else {
76954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius              secs[0]=0;
77054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            }
77127f654740f2a26ad62a5c155af9199af9e69b889claireho
77227f654740f2a26ad62a5c155af9199af9e69b889claireho
77327f654740f2a26ad62a5c155af9199af9e69b889claireho            strcpy(saveBaseLoc,name);
77427f654740f2a26ad62a5c155af9199af9e69b889claireho
77527f654740f2a26ad62a5c155af9199af9e69b889claireho
77627f654740f2a26ad62a5c155af9199af9e69b889claireho            ctest_xml_testcase(baseName, name, secs, (lastErrorCount!=errorCount)?"err":NULL);
77727f654740f2a26ad62a5c155af9199af9e69b889claireho
77827f654740f2a26ad62a5c155af9199af9e69b889claireho
77927f654740f2a26ad62a5c155af9199af9e69b889claireho            saveBaseLoc[0]=0; /* reset path */
78027f654740f2a26ad62a5c155af9199af9e69b889claireho
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (lastErrorCount == errorCount) {
78227f654740f2a26ad62a5c155af9199af9e69b889claireho                sprintf( msg, "   } OK:   %s ", name );
78354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                if(!no_time) str_timeDelta(msg+strlen(msg),timeStop-timeStart);
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                lastTestFailed = FALSE;
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }else{
78627f654740f2a26ad62a5c155af9199af9e69b889claireho                sprintf(msg,  "   } ERRORS (%li) in %s", (long)(errorCount-lastErrorCount), name);
78754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                if(!no_time) str_timeDelta(msg+strlen(msg),timeStop-timeStart);
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                for(int i=0;i<LL_indentlevel;i++) {
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errorList += " ";
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errorList += name;
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errorList += "\n";
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                lastTestFailed = TRUE;
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            LL_indentlevel -= 3;
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (lastTestFailed) {
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                LL_message( "", TRUE);
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            LL_message( msg, TRUE);
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (lastTestFailed) {
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                LL_message( "", TRUE);
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            LL_indentlevel += 3;
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        index++;
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }while(name);
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
80927f654740f2a26ad62a5c155af9199af9e69b889claireho    *saveBaseLoc = 0;
81027f654740f2a26ad62a5c155af9199af9e69b889claireho
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gTest = saveTest;
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rval;
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.
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::log( const UnicodeString &message )
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( verbose ) {
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LL_message( message, FALSE );
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Adds given string to the log if we are in verbose mode. Adds a new line to
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* the given message.
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::logln( const UnicodeString &message )
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( verbose ) {
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LL_message( message, TRUE );
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::logln( void )
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( verbose ) {
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        LL_message( "", TRUE );
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Unconditionally adds given string to the log.
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::info( const UnicodeString &message )
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  LL_message( message, FALSE );
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Unconditionally adds given string to the log. Adds a new line to
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* the given message.
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::infoln( const UnicodeString &message )
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  LL_message( message, TRUE );
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::infoln( void )
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  LL_message( "", TRUE );
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t IntlTest::IncErrorCount( void )
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCount++;
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (caller) caller->IncErrorCount();
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return errorCount;
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t IntlTest::IncDataErrorCount( void )
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dataErrorCount++;
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (caller) caller->IncDataErrorCount();
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return dataErrorCount;
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::err()
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IncErrorCount();
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::err( const UnicodeString &message )
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IncErrorCount();
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!no_err_msg) LL_message( message, FALSE );
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::errln( const UnicodeString &message )
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IncErrorCount();
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!no_err_msg) LL_message( message, TRUE );
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::dataerr( const UnicodeString &message )
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    IncDataErrorCount();
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!warn_on_missing_data) {
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IncErrorCount();
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!no_err_msg) LL_message( message, FALSE );
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::dataerrln( const UnicodeString &message )
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
91059d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t errCount = IncDataErrorCount();
9116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    UnicodeString msg;
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!warn_on_missing_data) {
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IncErrorCount();
9146d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        msg = message;
9156d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    } else {
9166d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        msg = UnicodeString("[DATA] " + message);
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
91959d709d503bab6e2b61931737e662dd293b40578ccornelius    if (!no_err_msg) {
92059d709d503bab6e2b61931737e662dd293b40578ccornelius      if ( errCount == 1) {
92159d709d503bab6e2b61931737e662dd293b40578ccornelius          LL_message( msg + " - (Are you missing data?)", TRUE ); // only show this message the first time
92259d709d503bab6e2b61931737e662dd293b40578ccornelius      } else {
92359d709d503bab6e2b61931737e662dd293b40578ccornelius          LL_message( msg , TRUE );
92459d709d503bab6e2b61931737e662dd293b40578ccornelius      }
92559d709d503bab6e2b61931737e662dd293b40578ccornelius    }
9266d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru}
9276d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
9286d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queruvoid IntlTest::errcheckln(UErrorCode status, const UnicodeString &message ) {
9296d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (status == U_FILE_ACCESS_ERROR || status == U_MISSING_RESOURCE_ERROR) {
9306d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln(message);
9316d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    } else {
9326d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errln(message);
9336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* convenience functions that include sprintf formatting */
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::log(const char *fmt, ...)
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* sprintf it just to make sure that the information is valid */
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( verbose ) {
9478de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        log(UnicodeString(buffer, (const char *)NULL));
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::logln(const char *fmt, ...)
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* sprintf it just to make sure that the information is valid */
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( verbose ) {
9618de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        logln(UnicodeString(buffer, (const char *)NULL));
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
96559d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::logKnownIssue(const char *ticket, const char *fmt, ...)
96659d709d503bab6e2b61931737e662dd293b40578ccornelius{
96759d709d503bab6e2b61931737e662dd293b40578ccornelius    char buffer[4000];
96859d709d503bab6e2b61931737e662dd293b40578ccornelius    va_list ap;
96959d709d503bab6e2b61931737e662dd293b40578ccornelius
97059d709d503bab6e2b61931737e662dd293b40578ccornelius    va_start(ap, fmt);
97159d709d503bab6e2b61931737e662dd293b40578ccornelius    /* sprintf it just to make sure that the information is valid */
97259d709d503bab6e2b61931737e662dd293b40578ccornelius    vsprintf(buffer, fmt, ap);
97359d709d503bab6e2b61931737e662dd293b40578ccornelius    va_end(ap);
9748de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    return logKnownIssue(ticket, UnicodeString(buffer, (const char *)NULL));
97559d709d503bab6e2b61931737e662dd293b40578ccornelius}
97659d709d503bab6e2b61931737e662dd293b40578ccornelius
97759d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::logKnownIssue(const char *ticket) {
97859d709d503bab6e2b61931737e662dd293b40578ccornelius  return logKnownIssue(ticket, UnicodeString());
97959d709d503bab6e2b61931737e662dd293b40578ccornelius}
98059d709d503bab6e2b61931737e662dd293b40578ccornelius
98159d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::logKnownIssue(const char *ticket, const UnicodeString &msg) {
98259d709d503bab6e2b61931737e662dd293b40578ccornelius  if(noKnownIssues) return FALSE;
98359d709d503bab6e2b61931737e662dd293b40578ccornelius
98459d709d503bab6e2b61931737e662dd293b40578ccornelius  char fullpath[2048];
98559d709d503bab6e2b61931737e662dd293b40578ccornelius  strcpy(fullpath, basePath);
98659d709d503bab6e2b61931737e662dd293b40578ccornelius  strcat(fullpath, currName);
987c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert  UnicodeString msg2 = msg;
988c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert  UBool firstForTicket = TRUE, firstForWhere = TRUE;
98959d709d503bab6e2b61931737e662dd293b40578ccornelius  knownList = udbg_knownIssue_openU(knownList, ticket, fullpath, msg2.getTerminatedBuffer(), &firstForTicket, &firstForWhere);
99059d709d503bab6e2b61931737e662dd293b40578ccornelius
991fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  msg2 = UNICODE_STRING_SIMPLE("(Known issue #") +
992fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      UnicodeString(ticket, -1, US_INV) + UNICODE_STRING_SIMPLE(") ") + msg;
99359d709d503bab6e2b61931737e662dd293b40578ccornelius  if(firstForTicket || firstForWhere) {
994fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    infoln(msg2);
99559d709d503bab6e2b61931737e662dd293b40578ccornelius  } else {
996fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    logln(msg2);
99759d709d503bab6e2b61931737e662dd293b40578ccornelius  }
99859d709d503bab6e2b61931737e662dd293b40578ccornelius
99959d709d503bab6e2b61931737e662dd293b40578ccornelius  return TRUE;
100059d709d503bab6e2b61931737e662dd293b40578ccornelius}
100159d709d503bab6e2b61931737e662dd293b40578ccornelius
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* convenience functions that include sprintf formatting */
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::info(const char *fmt, ...)
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* sprintf it just to make sure that the information is valid */
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
10128de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    info(UnicodeString(buffer, (const char *)NULL));
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::infoln(const char *fmt, ...)
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* sprintf it just to make sure that the information is valid */
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
10248de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    infoln(UnicodeString(buffer, (const char *)NULL));
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::err(const char *fmt, ...)
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
10358de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    err(UnicodeString(buffer, (const char *)NULL));
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::errln(const char *fmt, ...)
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
10468de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    errln(UnicodeString(buffer, (const char *)NULL));
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::dataerrln(const char *fmt, ...)
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buffer[4000];
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_list ap;
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_start(ap, fmt);
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    vsprintf(buffer, fmt, ap);
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    va_end(ap);
10578de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    dataerrln(UnicodeString(buffer, (const char *)NULL));
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
10606d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queruvoid IntlTest::errcheckln(UErrorCode status, const char *fmt, ...)
10616d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru{
10626d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    char buffer[4000];
10636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    va_list ap;
10646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
10656d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    va_start(ap, fmt);
10666d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    vsprintf(buffer, fmt, ap);
10676d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    va_end(ap);
10686d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
10696d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (status == U_FILE_ACCESS_ERROR || status == U_MISSING_RESOURCE_ERROR) {
10708de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        dataerrln(UnicodeString(buffer, (const char *)NULL));
10716d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    } else {
10728de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        errln(UnicodeString(buffer, (const char *)NULL));
10736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
10746d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru}
10756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::printErrors()
1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     IntlTest::LL_message(errorList, TRUE);
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
108159d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::printKnownIssues()
108259d709d503bab6e2b61931737e662dd293b40578ccornelius{
108359d709d503bab6e2b61931737e662dd293b40578ccornelius  if(knownList != NULL) {
108459d709d503bab6e2b61931737e662dd293b40578ccornelius    udbg_knownIssue_print(knownList);
108559d709d503bab6e2b61931737e662dd293b40578ccornelius    udbg_knownIssue_close(knownList);
108659d709d503bab6e2b61931737e662dd293b40578ccornelius    return TRUE;
108759d709d503bab6e2b61931737e662dd293b40578ccornelius  } else {
108859d709d503bab6e2b61931737e662dd293b40578ccornelius    return FALSE;
108959d709d503bab6e2b61931737e662dd293b40578ccornelius  }
109059d709d503bab6e2b61931737e662dd293b40578ccornelius}
109159d709d503bab6e2b61931737e662dd293b40578ccornelius
10928de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubertstatic UMutex messageMutex = U_MUTEX_INITIALIZER;
10938de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::LL_message( UnicodeString message, UBool newline )
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
10968de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    // Synchronize this function.
10978de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    // All error messages generated by tests funnel through here.
10988de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    // Multithreaded tests can concurrently generate errors, requiring syncronization
10998de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    // to keep each message together.
11008de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    Mutex lock(&messageMutex);
11018de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // string that starts with a LineFeed character and continues
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // with spaces according to the current indentation
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar indentUChars[] = {
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        '\n',
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
11178de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    U_ASSERT(1 + LL_indentlevel <= UPRV_LENGTHOF(indentUChars));
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString indent(FALSE, indentUChars, 1 + LL_indentlevel);
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1120fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    char buffer[30000];
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // stream out the indentation string first if necessary
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length = indent.extract(1, indent.length(), buffer, sizeof(buffer));
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (length > 0) {
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fwrite(buffer, sizeof(*buffer), length, (FILE *)testoutfp);
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // replace each LineFeed by the indentation string
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    message.findAndReplace(UnicodeString((UChar)'\n'), indent);
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // stream out the message
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length = message.extract(0, message.length(), buffer, sizeof(buffer));
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (length > 0) {
1135fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        length = length > 30000 ? 30000 : length;
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fwrite(buffer, sizeof(*buffer), length, (FILE *)testoutfp);
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (newline) {
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char newLine = '\n';
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fwrite(&newLine, sizeof(newLine), 1, (FILE *)testoutfp);
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // A newline usually flushes the buffer, but
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // flush the message just in case of a core dump.
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fflush((FILE *)testoutfp);
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Print a usage message for this test class.
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::usage( void )
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool save_verbose = setVerbose( TRUE );
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Test names:");
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("-----------");
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t index = 0;
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* name = NULL;
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    do{
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        this->runIndexedTest( index, FALSE, name );
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!name) break;
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(name);
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        index++;
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }while (name && (name[0] != 0));
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    setVerbose( save_verbose );
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// memory leak reporting software will be able to take advantage of the testsuite
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// being run a second time local to a specific method in order to report only actual leaks
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::run_phase2( char* name, char* par ) // supports reporting memory leaks
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString* strLeak = new UnicodeString("forced leak"); // for verifying purify filter
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    strLeak->append(" for verifying purify filter");
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return this->runTest( name, par );
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if UCONFIG_NO_LEGACY_CONVERSION
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define TRY_CNV_1 "iso-8859-1"
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define TRY_CNV_2 "ibm-1208"
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define TRY_CNV_1 "iso-8859-7"
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define TRY_CNV_2 "sjis"
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1189c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#ifdef UNISTR_COUNT_FINAL_STRING_LENGTHS
1190c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertU_CAPI void unistr_printLengths();
1191c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#endif
1192c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querumain(int argc, char* argv[])
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool syntax = FALSE;
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool all = FALSE;
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool verbose = FALSE;
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool no_err_msg = FALSE;
120054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UBool no_time = FALSE;
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool quick = TRUE;
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool name = FALSE;
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool leaks = FALSE;
120459d709d503bab6e2b61931737e662dd293b40578ccornelius    UBool utf8 = FALSE;
120559d709d503bab6e2b61931737e662dd293b40578ccornelius    const char *summary_file = NULL;
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool warnOnMissingData = FALSE;
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool defaultDataFound = FALSE;
12088de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    int32_t threadCount = 12;
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode = U_ZERO_ERROR;
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UConverter *cnv = NULL;
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *warnOrErr = "Failure";
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate startTime, endTime;
1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t diffTime;
1214b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char *props[IntlTest::kMaxProps];
1215b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t nProps = 0;
1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U_MAIN_INIT_ARGS(argc, argv);
1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
121927f654740f2a26ad62a5c155af9199af9e69b889claireho    startTime = uprv_getRawUTCtime();
1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int i = 1; i < argc; ++i) {
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (argv[i][0] == '-') {
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const char* str = argv[i] + 1;
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (strcmp("verbose", str) == 0 ||
1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                strcmp("v", str) == 0)
1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                verbose = TRUE;
1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else if (strcmp("noerrormsg", str) == 0 ||
1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     strcmp("n", str) == 0)
1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                no_err_msg = TRUE;
1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else if (strcmp("exhaustive", str) == 0 ||
1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     strcmp("e", str) == 0)
1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                quick = FALSE;
1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else if (strcmp("all", str) == 0 ||
1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     strcmp("a", str) == 0)
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                all = TRUE;
123659d709d503bab6e2b61931737e662dd293b40578ccornelius            else if (strcmp("utf-8", str) == 0 ||
123759d709d503bab6e2b61931737e662dd293b40578ccornelius                     strcmp("u", str) == 0)
123859d709d503bab6e2b61931737e662dd293b40578ccornelius                utf8 = TRUE;
123959d709d503bab6e2b61931737e662dd293b40578ccornelius            else if (strcmp("noknownissues", str) == 0 ||
124059d709d503bab6e2b61931737e662dd293b40578ccornelius                     strcmp("K", str) == 0)
124159d709d503bab6e2b61931737e662dd293b40578ccornelius                noKnownIssues = TRUE;
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else if (strcmp("leaks", str) == 0 ||
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     strcmp("l", str) == 0)
1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                leaks = TRUE;
124554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            else if (strcmp("notime", str) == 0 ||
124654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                     strcmp("T", str) == 0)
124754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                no_time = TRUE;
124859d709d503bab6e2b61931737e662dd293b40578ccornelius            else if (strncmp("E", str, 1) == 0)
124959d709d503bab6e2b61931737e662dd293b40578ccornelius                summary_file = str+1;
125027f654740f2a26ad62a5c155af9199af9e69b889claireho            else if (strcmp("x", str)==0) {
125127f654740f2a26ad62a5c155af9199af9e69b889claireho              if(++i>=argc) {
125227f654740f2a26ad62a5c155af9199af9e69b889claireho                printf("* Error: '-x' option requires an argument. usage: '-x outfile.xml'.\n");
125327f654740f2a26ad62a5c155af9199af9e69b889claireho                syntax = TRUE;
125427f654740f2a26ad62a5c155af9199af9e69b889claireho              }
125527f654740f2a26ad62a5c155af9199af9e69b889claireho              if(ctest_xml_setFileName(argv[i])) { /* set the name */
125627f654740f2a26ad62a5c155af9199af9e69b889claireho                return 1; /* error */
125727f654740f2a26ad62a5c155af9199af9e69b889claireho              }
125827f654740f2a26ad62a5c155af9199af9e69b889claireho            } else if (strcmp("w", str) == 0) {
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              warnOnMissingData = TRUE;
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              warnOrErr = "WARNING";
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
126250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            else if (strncmp("threads:", str, 8) == 0) {
126350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                threadCount = atoi(str + 8);
126450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
1265b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            else if (strncmp("prop:", str, 5) == 0) {
1266b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                if (nProps < IntlTest::kMaxProps) {
1267b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    props[nProps] = str + 5;
1268b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                }
1269b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                nProps++;
1270b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else {
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                syntax = TRUE;
1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else{
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = TRUE;
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!all && !name) {
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        all = TRUE;
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if (all && name) {
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        syntax = TRUE;
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (syntax) {
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout,
1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### Syntax:\n"
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### IntlTest [-option1 -option2 ...] [testname1 testname2 ...] \n"
128950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                "### \n"
129050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                "### Options are: verbose (v), all (a), noerrormsg (n), \n"
129127f654740f2a26ad62a5c155af9199af9e69b889claireho                "### exhaustive (e), leaks (l), -x xmlfile.xml, prop:<propery>=<value>, \n"
129254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                "### notime (T), \n"
12938de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert                "### threads:<threadCount>\n"
12948de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert                "###     (The default thread count is 12.),\n"
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### (Specify either -all (shortcut -a) or a test name). \n"
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### -all will run all of the tests.\n"
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### \n"
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### To get a list of the test names type: intltest LIST \n"
1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### To run just the utility tests type: intltest utility \n"
1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### \n"
1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### Test names can be nested using slashes (\"testA/subtest1\") \n"
1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### For example to list the utility tests type: intltest utility/LIST \n"
1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### To run just the Locale test type: intltest utility/LocaleTest \n"
1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### \n"
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### A parameter can be specified for a test by appending '@' and the value \n"
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "### to the testname. \n\n");
1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 1;
1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1310b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (nProps > IntlTest::kMaxProps) {
1311b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        fprintf(stdout, "### Too many properties.  Exiting.\n");
1312b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
1313b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MajorTestLevel major;
1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    major.setVerbose( verbose );
1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    major.setNoErrMsg( no_err_msg );
1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    major.setQuick( quick );
1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    major.setLeaks( leaks );
131950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    major.setThreadCount( threadCount );
1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    major.setWarnOnMissingData( warnOnMissingData );
132154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    major.setNotime (no_time);
1322b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (int32_t i = 0; i < nProps; i++) {
1323b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        major.setProperty(props[i]);
1324b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
132527f654740f2a26ad62a5c155af9199af9e69b889claireho
132627f654740f2a26ad62a5c155af9199af9e69b889claireho
1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "-----------------------------------------------\n");
1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, " IntlTest (C++) Test Suite for                 \n");
1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   International Components for Unicode %s\n", U_ICU_VERSION);
133027f654740f2a26ad62a5c155af9199af9e69b889claireho
133127f654740f2a26ad62a5c155af9199af9e69b889claireho
1332b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    {
1333b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru	const char *charsetFamily = "Unknown";
1334b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t voidSize = (int32_t)sizeof(void*);
1335b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t bits = voidSize * 8;
1336b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(U_CHARSET_FAMILY==U_ASCII_FAMILY) {
1337b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru           charsetFamily="ASCII";
1338b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        } else if(U_CHARSET_FAMILY==U_EBCDIC_FAMILY) {
1339b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru           charsetFamily="EBCDIC";
1340b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
1341b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        fprintf(stdout,
1342b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    "   Bits: %d, Byte order: %s, Chars: %s\n",
1343b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                     bits, U_IS_BIG_ENDIAN?"Big endian":"Little endian",
1344b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                     charsetFamily);
1345b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "-----------------------------------------------\n");
1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, " Options:                                       \n");
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   all (a)                  : %s\n", (all?               "On" : "Off"));
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   Verbose (v)              : %s\n", (verbose?           "On" : "Off"));
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   No error messages (n)    : %s\n", (no_err_msg?        "On" : "Off"));
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   Exhaustive (e)           : %s\n", (!quick?            "On" : "Off"));
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   Leaks (l)                : %s\n", (leaks?             "On" : "Off"));
135359d709d503bab6e2b61931737e662dd293b40578ccornelius    fprintf(stdout, "   utf-8 (u)                : %s\n", (utf8?              "On" : "Off"));
135454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    fprintf(stdout, "   notime (T)               : %s\n", (no_time?             "On" : "Off"));
135559d709d503bab6e2b61931737e662dd293b40578ccornelius    fprintf(stdout, "   noknownissues (K)        : %s\n", (noKnownIssues?      "On" : "Off"));
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "   Warn on missing data (w) : %s\n", (warnOnMissingData? "On" : "Off"));
135750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fprintf(stdout, "   Threads                  : %d\n", threadCount);
1358b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (int32_t i = 0; i < nProps; i++) {
1359b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        fprintf(stdout, "   Custom property (prop:)  : %s\n", props[i]);
1360b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "-----------------------------------------------\n");
1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
136359d709d503bab6e2b61931737e662dd293b40578ccornelius    if(utf8) {
136459d709d503bab6e2b61931737e662dd293b40578ccornelius      ucnv_setDefaultName("utf-8");
136559d709d503bab6e2b61931737e662dd293b40578ccornelius    }
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Check whether ICU will initialize without forcing the build data directory into
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  the ICU_DATA path.  Success here means either the data dll contains data, or that
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  this test program was run with ICU_DATA set externally.  Failure of this check
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  is normal when ICU data is not packaged into a shared library.
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  Whether or not this test succeeds, we want to cleanup and reinitialize
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  with a data path so that data loading from individual files can be tested.
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_init(&errorCode);
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stderr,
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "#### Note:  ICU Init without build-specific setDataDirectory() failed.\n");
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        defaultDataFound = FALSE;
1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        defaultDataFound = TRUE;
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_cleanup();
138459d709d503bab6e2b61931737e662dd293b40578ccornelius    if(utf8) {
138559d709d503bab6e2b61931737e662dd293b40578ccornelius      ucnv_setDefaultName("utf-8");
138659d709d503bab6e2b61931737e662dd293b40578ccornelius    }
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode = U_ZERO_ERROR;
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Initialize ICU */
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!defaultDataFound) {
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        IntlTest::setICU_DATA();   // Must set data directory before u_init() is called.
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_init(&errorCode);
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(errorCode)) {
1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stderr,
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "#### ERROR! %s: u_init() failed with status = \"%s\".\n"
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "*** Check the ICU_DATA environment variable and \n"
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "*** check that the data files are present.\n", argv[0], u_errorName(errorCode));
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(warnOnMissingData == 0) {
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fprintf(stderr, "*** Exiting.  Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n");
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_cleanup();
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return 1;
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // initial check for the default converter
1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode = U_ZERO_ERROR;
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv = ucnv_open(0, &errorCode);
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(cnv != 0) {
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // ok
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_close(cnv);
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout,
1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** %s! The default converter [%s] cannot be opened.\n"
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** Check the ICU_DATA environment variable and\n"
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** check that the data files are present.\n",
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                warnOrErr, ucnv_getDefaultName());
1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!warnOnMissingData) {
1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          fprintf(stdout, "*** Exiting.  Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n");
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return 1;
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // try more data
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cnv = ucnv_open(TRY_CNV_2, &errorCode);
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(cnv != 0) {
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // ok
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ucnv_close(cnv);
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout,
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** %s! The converter for " TRY_CNV_2 " cannot be opened.\n"
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** Check the ICU_DATA environment variable and \n"
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** check that the data files are present.\n", warnOrErr);
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!warnOnMissingData) {
1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          fprintf(stdout, "*** Exiting.  Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n");
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return 1;
1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UResourceBundle *rb = ures_open(0, "en", &errorCode);
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ures_close(rb);
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout,
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** %s! The \"en\" locale resource bundle cannot be opened.\n"
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** Check the ICU_DATA environment variable and \n"
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                "*** check that the data files are present.\n", warnOrErr);
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!warnOnMissingData) {
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          fprintf(stdout, "*** Exiting.  Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n");
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return 1;
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale originalLocale;  // Save the default locale for comparison later on.
1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
145527f654740f2a26ad62a5c155af9199af9e69b889claireho    if(ctest_xml_init("intltest"))
145627f654740f2a26ad62a5c155af9199af9e69b889claireho      return 1;
145727f654740f2a26ad62a5c155af9199af9e69b889claireho
145827f654740f2a26ad62a5c155af9199af9e69b889claireho
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* TODO: Add option to call u_cleanup and rerun tests. */
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (all) {
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        major.runTest();
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (leaks) {
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            major.run_phase2( NULL, NULL );
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int i = 1; i < argc; ++i) {
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (argv[i][0] != '-') {
1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                char* name = argv[i];
1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fprintf(stdout, "\n=== Handling test: %s: ===\n", name);
147027f654740f2a26ad62a5c155af9199af9e69b889claireho
147127f654740f2a26ad62a5c155af9199af9e69b889claireho                char baseName[1024];
147227f654740f2a26ad62a5c155af9199af9e69b889claireho                sprintf(baseName, "/%s/", name);
147327f654740f2a26ad62a5c155af9199af9e69b889claireho
1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                char* parameter = strchr( name, '@' );
1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (parameter) {
1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    *parameter = 0;
1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    parameter += 1;
1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                execCount = 0;
148027f654740f2a26ad62a5c155af9199af9e69b889claireho                UBool res = major.runTest( name, parameter, baseName );
1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (leaks && res) {
1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    major.run_phase2( name, parameter );
1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (!res || (execCount <= 0)) {
1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    fprintf(stdout, "\n---ERROR: Test doesn't exist: %s!\n", name);
1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
148727f654740f2a26ad62a5c155af9199af9e69b889claireho            } else if(!strcmp(argv[i],"-x")) {
148827f654740f2a26ad62a5c155af9199af9e69b889claireho              i++;
1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
149327f654740f2a26ad62a5c155af9199af9e69b889claireho
1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CalendarTimeZoneTest::cleanup();
1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(_testDataPath);
1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testDataPath = 0;
1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale lastDefaultLocale;
1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (originalLocale != lastDefaultLocale) {
1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        major.errln("FAILURE: A test changed the default locale without resetting it.");
1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "\n--------------------------------------\n");
150759d709d503bab6e2b61931737e662dd293b40578ccornelius    if( major.printKnownIssues() ) {
150859d709d503bab6e2b61931737e662dd293b40578ccornelius      fprintf(stdout, " To run suppressed tests, use the -K option. \n");
150959d709d503bab6e2b61931737e662dd293b40578ccornelius    }
1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (major.getErrors() == 0) {
1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Call it twice to make sure that the defaults were reset. */
1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Call it before the OK message to verify proper cleanup. */
1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_cleanup();
1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_cleanup();
1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout, "OK: All tests passed without error.\n");
1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (major.getDataErrors() != 0) {
1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fprintf(stdout, "\t*WARNING* some data-loading errors were ignored by the -w option.\n");
1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout, "Errors in total: %ld.\n", (long)major.getErrors());
1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        major.printErrors();
1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
152559d709d503bab6e2b61931737e662dd293b40578ccornelius        if(summary_file != NULL) {
152659d709d503bab6e2b61931737e662dd293b40578ccornelius          FILE *summf = fopen(summary_file, "w");
152759d709d503bab6e2b61931737e662dd293b40578ccornelius          if( summf != NULL) {
152859d709d503bab6e2b61931737e662dd293b40578ccornelius            char buf[10000];
152959d709d503bab6e2b61931737e662dd293b40578ccornelius            int32_t length = errorList.extract(0, errorList.length(), buf, sizeof(buf));
153059d709d503bab6e2b61931737e662dd293b40578ccornelius            fwrite(buf, sizeof(*buf), length, (FILE*)summf);
153159d709d503bab6e2b61931737e662dd293b40578ccornelius            fclose(summf);
153259d709d503bab6e2b61931737e662dd293b40578ccornelius          }
153359d709d503bab6e2b61931737e662dd293b40578ccornelius        }
153459d709d503bab6e2b61931737e662dd293b40578ccornelius
1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (major.getDataErrors() != 0) {
1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fprintf(stdout, "\t*Note* some errors are data-loading related. If the data used is not the \n"
1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "\tstock ICU data (i.e some have been added or removed), consider using\n"
1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "\tthe '-w' option to turn these errors into warnings.\n");
1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Call afterwards to display errors. */
1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_cleanup();
1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1546c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#ifdef UNISTR_COUNT_FINAL_STRING_LENGTHS
1547c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    unistr_printLengths();
1548c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#endif
1549c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fprintf(stdout, "--------------------------------------\n");
1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (execCount <= 0) {
1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fprintf(stdout, "***** Not all called tests actually exist! *****\n");
1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
155554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(!no_time) {
155654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      endTime = uprv_getRawUTCtime();
155754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      diffTime = (int32_t)(endTime - startTime);
155854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      printf("Elapsed Time: %02d:%02d:%02d.%03d\n",
155954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius             (int)((diffTime%U_MILLIS_PER_DAY)/U_MILLIS_PER_HOUR),
156054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius             (int)((diffTime%U_MILLIS_PER_HOUR)/U_MILLIS_PER_MINUTE),
156154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius             (int)((diffTime%U_MILLIS_PER_MINUTE)/U_MILLIS_PER_SECOND),
156254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius             (int)(diffTime%U_MILLIS_PER_SECOND));
156354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
156427f654740f2a26ad62a5c155af9199af9e69b889claireho
156527f654740f2a26ad62a5c155af9199af9e69b889claireho    if(ctest_xml_fini())
156627f654740f2a26ad62a5c155af9199af9e69b889claireho      return 1;
156727f654740f2a26ad62a5c155af9199af9e69b889claireho
1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return major.getErrors();
1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char* IntlTest::loadTestData(UErrorCode& err){
1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( _testDataPath == NULL){
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char*      directory=NULL;
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UResourceBundle* test =NULL;
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char* tdpath=NULL;
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* tdrelativepath;
1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined (U_TOPBUILDDIR)
157954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        tdrelativepath = "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING;
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        directory = U_TOPBUILDDIR;
1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
158254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        tdrelativepath = ".." U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING;
1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        directory = pathToDataDirectory();
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tdpath = (char*) malloc(sizeof(char) *(( strlen(directory) * strlen(tdrelativepath)) + 100));
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* u_getDataDirectory shoul return \source\data ... set the
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * directory to ..\source\data\..\test\testdata\out\testdata
1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(tdpath, directory);
1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcat(tdpath, tdrelativepath);
1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcat(tdpath,"testdata");
1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        test=ures_open(tdpath, "testtypes", &err);
1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(err)){
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            err = U_FILE_ACCESS_ERROR;
16006d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            it_dataerrln((UnicodeString)"Could not load testtypes.res in testdata bundle with path " + tdpath + (UnicodeString)" - " + u_errorName(err));
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return "";
1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ures_close(test);
1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        _testDataPath = tdpath;
1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return _testDataPath;
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return _testDataPath;
1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char* IntlTest::getTestDataPath(UErrorCode& err) {
1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return loadTestData(err);
1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Returns the path to icu/source/test/testdata/ */
1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char *IntlTest::getSourceTestData(UErrorCode& /*err*/) {
1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *srcDataDir = NULL;
1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef U_TOPSRCDIR
161854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    srcDataDir = U_TOPSRCDIR U_FILE_SEP_STRING"test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING;
1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
162054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    srcDataDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING;
162154dcd9b6a06071f647dac967e9e267abb9410720Craig 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");
1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (f) {
1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* We're in icu/source/test/intltest/ */
1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fclose(f);
1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1627b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        /* We're in icu/source/test/intltest/Platform/(Debug|Release) */
16281b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        srcDataDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING
16291b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                     "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING;
1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return srcDataDir;
1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1635f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliuschar *IntlTest::getUnidataPath(char path[]) {
1636f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    const int kUnicodeDataTxtLength = 15;  // strlen("UnicodeData.txt")
1637f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
1638f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    // Look inside ICU_DATA first.
1639f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    strcpy(path, pathToDataDirectory());
1640f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    strcat(path, "unidata" U_FILE_SEP_STRING "UnicodeData.txt");
1641f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    FILE *f = fopen(path, "r");
1642f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    if(f != NULL) {
1643f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        fclose(f);
1644f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        *(strchr(path, 0) - kUnicodeDataTxtLength) = 0;  // Remove the basename.
1645f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        return path;
1646f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    }
1647f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
1648f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    // As a fallback, try to guess where the source data was located
1649f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    // at the time ICU was built, and look there.
1650f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#   ifdef U_TOPSRCDIR
1651f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        strcpy(path, U_TOPSRCDIR  U_FILE_SEP_STRING "data");
1652f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#   else
1653f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        UErrorCode errorCode = U_ZERO_ERROR;
1654f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        const char *testDataPath = loadTestData(errorCode);
1655f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        if(U_FAILURE(errorCode)) {
1656f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            it_errln(UnicodeString(
1657f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                        "unable to find path to source/data/unidata/ and loadTestData() failed: ") +
1658f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                    u_errorName(errorCode));
1659f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            return NULL;
1660f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        }
1661f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        strcpy(path, testDataPath);
1662f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        strcat(path, U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".."
1663f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                     U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".."
1664f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                     U_FILE_SEP_STRING "data");
1665f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#   endif
1666f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    strcat(path, U_FILE_SEP_STRING);
1667f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    strcat(path, "unidata" U_FILE_SEP_STRING "UnicodeData.txt");
1668f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    f = fopen(path, "r");
1669f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    if(f != NULL) {
1670f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        fclose(f);
1671f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        *(strchr(path, 0) - kUnicodeDataTxtLength) = 0;  // Remove the basename.
1672f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        return path;
1673f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    }
1674f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    return NULL;
1675f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius}
1676f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char* IntlTest::fgDataDir = NULL;
1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* returns the path to icu/source/data */
1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char *  IntlTest::pathToDataDirectory()
1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(fgDataDir != NULL) {
1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return fgDataDir;
1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* U_TOPSRCDIR is set by the makefiles on UNIXes when building cintltst and intltst
1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              to point to the top of the build hierarchy, which may or
1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              may not be the same as the source directory, depending on
1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              the configure options used.  At any rate,
1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              set the data path to the built data from this directory.
1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              The value is complete with quotes, so it can be used
1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //              as-is as a string constant.
1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined (U_TOPSRCDIR)
1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fgDataDir = U_TOPSRCDIR  U_FILE_SEP_STRING "data" U_FILE_SEP_STRING;
1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* On Windows, the file name obtained from __FILE__ includes a full path.
1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *             This file is "wherever\icu\source\test\cintltst\cintltst.c"
1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *             Change to    "wherever\icu\source\data"
1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static char p[sizeof(__FILE__) + 10];
1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char *pBackSlash;
1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int i;
1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        strcpy(p, __FILE__);
1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* We want to back over three '\' chars.                            */
1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*   Only Windows should end up here, so looking for '\' is safe.   */
1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i=1; i<=3; i++) {
1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pBackSlash = strrchr(p, U_FILE_SEP_CHAR);
1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (pBackSlash != NULL) {
1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                *pBackSlash = 0;        /* Truncate the string at the '\'   */
1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (pBackSlash != NULL) {
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* We found and truncated three names from the path.
1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *  Now append "source\data" and set the environment
1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            */
1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            strcpy(pBackSlash, U_FILE_SEP_STRING "data" U_FILE_SEP_STRING );
1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fgDataDir = p;
1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* __FILE__ on MSVC7 does not contain the directory */
17291b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            FILE *file = fopen(".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "Makefile.in", "r");
1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (file) {
1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fclose(file);
17321b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                fgDataDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "data" U_FILE_SEP_STRING;
1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else {
17351b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                fgDataDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "data" U_FILE_SEP_STRING;
1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fgDataDir;
1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This is a variant of cintltst/ccolltst.c:CharsToUChars().
174727f654740f2a26ad62a5c155af9199af9e69b889claireho * It converts an invariant-character string into a UnicodeString, with
1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * unescaping \u sequences.
1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
175050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString CharsToUnicodeString(const char* chars){
175127f654740f2a26ad62a5c155af9199af9e69b889claireho    return UnicodeString(chars, -1, US_INV).unescape();
1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString ctou(const char* chars) {
1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return CharsToUnicodeString(chars);
1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define RAND_M  (714025)
1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define RAND_IA (1366)
1760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define RAND_IC (150889)
1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t RAND_SEED;
1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Returns a uniform random value x, with 0.0 <= x < 1.0.  Use
1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * with care: Does not return all possible values; returns one of
1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 714,025 values, uniformly spaced.  However, the period is
1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * effectively infinite.  See: Numerical Recipes, section 7.1.
1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param seedp pointer to seed. Set *seedp to any negative value
1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * to restart the sequence.
1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufloat IntlTest::random(int32_t* seedp) {
1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static int32_t iy, ir[98];
1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static UBool first=TRUE;
1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t j;
1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (*seedp < 0 || first) {
1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        first = FALSE;
1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ((*seedp=(RAND_IC-(*seedp)) % RAND_M) < 0) *seedp = -(*seedp);
1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (j=1;j<=97;++j) {
1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *seedp=(RAND_IA*(*seedp)+RAND_IC) % RAND_M;
1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ir[j]=(*seedp);
1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *seedp=(RAND_IA*(*seedp)+RAND_IC) % RAND_M;
1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        iy=(*seedp);
1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    j=(int32_t)(1 + 97.0*iy/RAND_M);
1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    U_ASSERT(j>=1 && j<=97);
1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iy=ir[j];
1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *seedp=(RAND_IA*(*seedp)+RAND_IC) % RAND_M;
1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ir[j]=(*seedp);
1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (float) iy/RAND_M;
1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Convenience method using a global seed.
1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufloat IntlTest::random() {
1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return random(&RAND_SEED);
1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
18028de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
18038de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert/*
18048de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * Integer random number class implementation.
18058de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * Similar to C++ std::minstd_rand, with the same algorithm & constants.
18068de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert */
18078de051c3d18a56cc126f0f44e368495a52f9148cFredrik RoubertIntlTest::icu_rand::icu_rand(uint32_t seed) {
18088de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    seed = seed % 2147483647UL;
18098de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    if (seed == 0) {
18108de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        seed = 1;
18118de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    }
18128de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    fLast = seed;
18138de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert}
18148de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
18158de051c3d18a56cc126f0f44e368495a52f9148cFredrik RoubertIntlTest::icu_rand::~icu_rand() {}
18168de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
18178de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubertvoid IntlTest::icu_rand::seed(uint32_t seed) {
18188de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    if (seed == 0) {
18198de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert        seed = 1;
18208de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    }
18218de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    fLast = seed;
18228de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert}
18238de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
18248de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubertuint32_t IntlTest::icu_rand::operator() () {
18258de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    fLast = ((uint64_t)fLast * 48271UL) % 2147483647UL;
18268de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    return fLast;
18278de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert}
18288de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
18298de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubertuint32_t IntlTest::icu_rand::getSeed() {
18308de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert    return (uint32_t) fLast;
18318de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert}
18328de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
18338de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
18348de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert
1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic inline UChar toHex(int32_t i) {
1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UChar)(i + (i < 10 ? 0x30 : (0x41 - 10)));
1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UnicodeString& escape(const UnicodeString& s, UnicodeString& result) {
1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i=0; i<s.length(); ++i) {
1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar c = s[i];
1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (c <= (UChar)0x7F) {
1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += c;
1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += (UChar)0x5c;
1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += (UChar)0x75;
1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += toHex((c >> 12) & 0xF);
1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += toHex((c >>  8) & 0xF);
1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += toHex((c >>  4) & 0xF);
1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result += toHex( c        & 0xF);
1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return result;
1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define VERBOSE_ASSERTIONS
1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
18588393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusUBool IntlTest::assertTrue(const char* message, UBool condition, UBool quiet, UBool possibleDataError, const char *file, int line) {
18598393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if (file != NULL) {
18608393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        if (!condition) {
18618393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            if (possibleDataError) {
18628393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                dataerrln("%s:%d: FAIL: assertTrue() failed: %s", file, line, message);
18638393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            } else {
18648393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                errln("%s:%d: FAIL: assertTrue() failed: %s", file, line, message);
18658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            }
18668393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        } else if (!quiet) {
18678393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            logln("%s:%d: Ok: %s", file, line, message);
18686d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
18698393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    } else {
18708393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        if (!condition) {
18718393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            if (possibleDataError) {
18728393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                dataerrln("FAIL: assertTrue() failed: %s", message);
18738393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            } else {
18748393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                errln("FAIL: assertTrue() failed: %s", message);
18758393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            }
18768393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        } else if (!quiet) {
18778393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            logln("Ok: %s", message);
18788393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        }
18798393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
1880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return condition;
1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertFalse(const char* message, UBool condition, UBool quiet) {
1885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (condition) {
1886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: assertFalse() failed: %s", message);
1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if (!quiet) {
1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Ok: %s", message);
1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return !condition;
1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
189359d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertSuccess(const char* message, UErrorCode ec, UBool possibleDataError, const char *file, int line) {
189459d709d503bab6e2b61931737e662dd293b40578ccornelius    if( file==NULL ) {
189559d709d503bab6e2b61931737e662dd293b40578ccornelius      file = ""; // prevent failure if no file given
189659d709d503bab6e2b61931737e662dd293b40578ccornelius    }
1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
18986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (possibleDataError) {
189959d709d503bab6e2b61931737e662dd293b40578ccornelius          dataerrln("FAIL: %s:%d: %s (%s)", file, line, message, u_errorName(ec));
1900c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        } else {
190159d709d503bab6e2b61931737e662dd293b40578ccornelius          errcheckln(ec, "FAIL: %s:%d: %s (%s)", file, line, message, u_errorName(ec));
1902c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
1903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
190459d709d503bab6e2b61931737e662dd293b40578ccornelius    } else {
190559d709d503bab6e2b61931737e662dd293b40578ccornelius      logln("OK: %s:%d: %s - (%s)", file, line, message, u_errorName(ec));
1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
1908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const char* message,
1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const UnicodeString& expected,
19126d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                             const UnicodeString& actual,
19136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                             UBool possibleDataError) {
1914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (expected != actual) {
19156d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (possibleDataError) {
19166d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln((UnicodeString)"FAIL: " + message + "; got " +
19176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  prettify(actual) +
19186d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  "; expected " + prettify(expected));
19196d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        } else {
19206d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            errln((UnicodeString)"FAIL: " + message + "; got " +
19216d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  prettify(actual) +
19226d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  "; expected " + prettify(expected));
19236d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
1924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
1925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef VERBOSE_ASSERTIONS
1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"Ok: " + message + "; got " + prettify(actual));
1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const char* message,
1935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const char* expected,
1936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const char* actual) {
1937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (uprv_strcmp(expected, actual) != 0) {
1938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"FAIL: " + message + "; got \"" +
1939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              actual +
1940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "\"; expected \"" + expected + "\"");
1941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
1942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef VERBOSE_ASSERTIONS
1944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"Ok: " + message + "; got \"" + actual + "\"");
1946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
1949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1951f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig CorneliusUBool IntlTest::assertEquals(const char* message,
1952f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius                             int32_t expected,
1953f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius                             int32_t actual) {
1954f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    if (expected != actual) {
1955f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        errln((UnicodeString)"FAIL: " + message + "; got " +
1956f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius              actual + "=0x" + toHex(actual) +
1957f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius              "; expected " + expected + "=0x" + toHex(expected));
1958f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        return FALSE;
1959f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    }
1960f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius#ifdef VERBOSE_ASSERTIONS
1961f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    else {
1962f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius        logln((UnicodeString)"Ok: " + message + "; got " + actual + "=0x" + toHex(actual));
1963f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    }
1964f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius#endif
1965f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius    return TRUE;
1966f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius}
1967f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius
1968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const char* message,
196959d709d503bab6e2b61931737e662dd293b40578ccornelius                             int64_t expected,
197059d709d503bab6e2b61931737e662dd293b40578ccornelius                             int64_t actual) {
197159d709d503bab6e2b61931737e662dd293b40578ccornelius    if (expected != actual) {
197259d709d503bab6e2b61931737e662dd293b40578ccornelius        errln((UnicodeString)"FAIL: " + message + "; got int64 " +
197359d709d503bab6e2b61931737e662dd293b40578ccornelius              Int64ToUnicodeString(actual) +
197459d709d503bab6e2b61931737e662dd293b40578ccornelius              "; expected " + Int64ToUnicodeString(expected) );
197559d709d503bab6e2b61931737e662dd293b40578ccornelius        return FALSE;
197659d709d503bab6e2b61931737e662dd293b40578ccornelius    }
197759d709d503bab6e2b61931737e662dd293b40578ccornelius#ifdef VERBOSE_ASSERTIONS
197859d709d503bab6e2b61931737e662dd293b40578ccornelius    else {
197959d709d503bab6e2b61931737e662dd293b40578ccornelius      logln((UnicodeString)"Ok: " + message + "; got int64 " + Int64ToUnicodeString(actual));
198059d709d503bab6e2b61931737e662dd293b40578ccornelius    }
198159d709d503bab6e2b61931737e662dd293b40578ccornelius#endif
198259d709d503bab6e2b61931737e662dd293b40578ccornelius    return TRUE;
198359d709d503bab6e2b61931737e662dd293b40578ccornelius}
198459d709d503bab6e2b61931737e662dd293b40578ccornelius
198559d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertEquals(const char* message,
1986c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                             double expected,
1987c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert                             double actual) {
1988c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    if (expected != actual) {
1989c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        errln((UnicodeString)"FAIL: " + message + "; got " +
1990c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert              actual +
1991c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert              "; expected " + expected);
1992c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        return FALSE;
1993c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
1994c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#ifdef VERBOSE_ASSERTIONS
1995c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    else {
1996c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        logln((UnicodeString)"Ok: " + message + "; got " + actual);
1997c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    }
1998c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#endif
1999c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    return TRUE;
2000c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}
2001c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
2002c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
2003c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertUBool IntlTest::assertEquals(const char* message,
200459d709d503bab6e2b61931737e662dd293b40578ccornelius                             UBool expected,
200559d709d503bab6e2b61931737e662dd293b40578ccornelius                             UBool actual) {
2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (expected != actual) {
2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"FAIL: " + message + "; got " +
2008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              toString(actual) +
2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "; expected " + toString(expected));
2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef VERBOSE_ASSERTIONS
2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
201459d709d503bab6e2b61931737e662dd293b40578ccornelius      logln((UnicodeString)"Ok: " + message + "; got " + toString(actual));
201559d709d503bab6e2b61931737e662dd293b40578ccornelius    }
201659d709d503bab6e2b61931737e662dd293b40578ccornelius#endif
201759d709d503bab6e2b61931737e662dd293b40578ccornelius    return TRUE;
201859d709d503bab6e2b61931737e662dd293b40578ccornelius}
201959d709d503bab6e2b61931737e662dd293b40578ccornelius
202059d709d503bab6e2b61931737e662dd293b40578ccornelius#if !UCONFIG_NO_FORMATTING
202159d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertEquals(const char* message,
202259d709d503bab6e2b61931737e662dd293b40578ccornelius                             const Formattable& expected,
202359d709d503bab6e2b61931737e662dd293b40578ccornelius                             const Formattable& actual,
202459d709d503bab6e2b61931737e662dd293b40578ccornelius                             UBool possibleDataError) {
202559d709d503bab6e2b61931737e662dd293b40578ccornelius    if (expected != actual) {
202659d709d503bab6e2b61931737e662dd293b40578ccornelius        if (possibleDataError) {
202759d709d503bab6e2b61931737e662dd293b40578ccornelius            dataerrln((UnicodeString)"FAIL: " + message + "; got " +
202859d709d503bab6e2b61931737e662dd293b40578ccornelius                  toString(actual) +
202959d709d503bab6e2b61931737e662dd293b40578ccornelius                  "; expected " + toString(expected));
203059d709d503bab6e2b61931737e662dd293b40578ccornelius        } else {
203159d709d503bab6e2b61931737e662dd293b40578ccornelius            errln((UnicodeString)"FAIL: " + message + "; got " +
203259d709d503bab6e2b61931737e662dd293b40578ccornelius                  toString(actual) +
203359d709d503bab6e2b61931737e662dd293b40578ccornelius                  "; expected " + toString(expected));
203459d709d503bab6e2b61931737e662dd293b40578ccornelius        }
203559d709d503bab6e2b61931737e662dd293b40578ccornelius        return FALSE;
203659d709d503bab6e2b61931737e662dd293b40578ccornelius    }
203759d709d503bab6e2b61931737e662dd293b40578ccornelius#ifdef VERBOSE_ASSERTIONS
203859d709d503bab6e2b61931737e662dd293b40578ccornelius    else {
2039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"Ok: " + message + "; got " + toString(actual));
2040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
2043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char ASSERT_BUF[256];
2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* extractToAssertBuf(const UnicodeString& message) {
2049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString buf;
2050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    escape(message, buf);
2051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buf.extract(0, 0x7FFFFFFF, ASSERT_BUF, sizeof(ASSERT_BUF)-1, 0);
2052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ASSERT_BUF[sizeof(ASSERT_BUF)-1] = 0;
2053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return ASSERT_BUF;
2054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertTrue(const UnicodeString& message, UBool condition, UBool quiet) {
2057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertTrue(extractToAssertBuf(message), condition, quiet);
2058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertFalse(const UnicodeString& message, UBool condition, UBool quiet) {
2061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertFalse(extractToAssertBuf(message), condition, quiet);
2062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertSuccess(const UnicodeString& message, UErrorCode ec) {
2065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertSuccess(extractToAssertBuf(message), ec);
2066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const UnicodeString& message,
2069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const UnicodeString& expected,
207059d709d503bab6e2b61931737e662dd293b40578ccornelius                             const UnicodeString& actual,
207159d709d503bab6e2b61931737e662dd293b40578ccornelius                             UBool possibleDataError) {
207259d709d503bab6e2b61931737e662dd293b40578ccornelius    return assertEquals(extractToAssertBuf(message), expected, actual, possibleDataError);
2073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const UnicodeString& message,
2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const char* expected,
2077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const char* actual) {
2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertEquals(extractToAssertBuf(message), expected, actual);
2079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
208059d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertEquals(const UnicodeString& message,
208159d709d503bab6e2b61931737e662dd293b40578ccornelius                             UBool expected,
208259d709d503bab6e2b61931737e662dd293b40578ccornelius                             UBool actual) {
208359d709d503bab6e2b61931737e662dd293b40578ccornelius    return assertEquals(extractToAssertBuf(message), expected, actual);
208459d709d503bab6e2b61931737e662dd293b40578ccornelius}
208559d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertEquals(const UnicodeString& message,
208659d709d503bab6e2b61931737e662dd293b40578ccornelius                             int32_t expected,
208759d709d503bab6e2b61931737e662dd293b40578ccornelius                             int32_t actual) {
208859d709d503bab6e2b61931737e662dd293b40578ccornelius    return assertEquals(extractToAssertBuf(message), expected, actual);
208959d709d503bab6e2b61931737e662dd293b40578ccornelius}
209059d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertEquals(const UnicodeString& message,
209159d709d503bab6e2b61931737e662dd293b40578ccornelius                             int64_t expected,
209259d709d503bab6e2b61931737e662dd293b40578ccornelius                             int64_t actual) {
209359d709d503bab6e2b61931737e662dd293b40578ccornelius    return assertEquals(extractToAssertBuf(message), expected, actual);
2094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
2097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const UnicodeString& message,
2098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const Formattable& expected,
2099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             const Formattable& actual) {
2100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return assertEquals(extractToAssertBuf(message), expected, actual);
2101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2104b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid IntlTest::setProperty(const char* propline) {
2105b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (numProps < kMaxProps) {
2106b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        proplines[numProps] = propline;
2107b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
2108b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    numProps++;
2109b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
2110b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2111b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruconst char* IntlTest::getProperty(const char* prop) {
2112b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char* val = NULL;
2113b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (int32_t i = 0; i < numProps; i++) {
2114b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t plen = uprv_strlen(prop);
2115b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if ((int32_t)uprv_strlen(proplines[i]) > plen + 1
2116b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                && proplines[i][plen] == '='
2117b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                && uprv_strncmp(proplines[i], prop, plen) == 0) {
2118b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            val = &(proplines[i][plen+1]);
2119b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            break;
2120b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
2121b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
2122b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return val;
2123b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
2124b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Hey, Emacs, please set the following:
2127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
2128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Local Variables:
2129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * indent-tabs-mode: nil
2130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * End:
2131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
2132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2133