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