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