1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************** 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT: 3c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * Copyright (c) 1997-2015, International Business Machines Corporation and 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved. 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/ 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * IntlTest is a base class for tests. 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h> 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h> 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <assert.h> 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdarg.h> 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h> 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/unistr.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ures.h" 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/smpdtfmt.h" 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucnv.h" 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uclean.h" 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/timezone.h" 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/curramt.h" 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/putil.h" 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "intltest.h" 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "caltztst.h" 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "itmajor.h" 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h" 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "umutex.h" 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uassert.h" 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h" 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uoptions.h" 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3827f654740f2a26ad62a5c155af9199af9e69b889claireho#include "putilimp.h" // for uprv_getRawUTCtime() 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/locid.h" 4027f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/ctest.h" // for str_timeDelta 4159d709d503bab6e2b61931737e662dd293b40578ccornelius#include "udbgutil.h" 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef XP_MAC_CONSOLE 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <console.h> 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "Files.h" 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char* _testDataPath=NULL; 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Static list of errors found 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UnicodeString errorList; 5359d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void *knownList = NULL; // known issues 5459d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic UBool noKnownIssues = FALSE; // if TRUE, don't emit known issues 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------------- 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//convenience classes to ease porting code that uses the Java 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//string-concatenation operator (moved from findword test by rtg) 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// [LIU] Just to get things working 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUCharToUnicodeString(UChar c) 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return UnicodeString(c); } 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// [rtg] Just to get things working 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruoperator+(const UnicodeString& left, 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru long num) 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char buffer[64]; // nos changed from 10 to 64 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char danger = 'p'; // guard against overrunning the buffer (rtg) 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(buffer, "%ld", num); 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assert(danger == 'p'); 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return left + buffer; 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruoperator+(const UnicodeString& left, 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru unsigned long num) 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char buffer[64]; // nos changed from 10 to 64 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char danger = 'p'; // guard against overrunning the buffer (rtg) 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(buffer, "%lu", num); 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assert(danger == 'p'); 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return left + buffer; 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruInt64ToUnicodeString(int64_t num) 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char buffer[64]; // nos changed from 10 to 64 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char danger = 'p'; // guard against overrunning the buffer (rtg) 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 98103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if defined(_MSC_VER) 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(buffer, "%I64d", num); 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(buffer, "%lld", (long long)num); 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assert(danger == 'p'); 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return buffer; 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// [LIU] Just to get things working 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruoperator+(const UnicodeString& left, 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double num) 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char buffer[64]; // was 32, made it arbitrarily bigger (rtg) 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char danger = 'p'; // guard against overrunning the buffer (rtg) 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // IEEE floating point has 52 bits of mantissa, plus one assumed bit 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 53*log(2)/log(10) = 15.95 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // so there is no need to show more than 16 digits. [alan] 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(buffer, "%.17g", num); 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assert(danger == 'p'); 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return left + buffer; 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 12659d709d503bab6e2b61931737e662dd293b40578ccornelius#if 0 12759d709d503bab6e2b61931737e662dd293b40578ccorneliusUnicodeString 12859d709d503bab6e2b61931737e662dd293b40578ccorneliusoperator+(const UnicodeString& left, 12959d709d503bab6e2b61931737e662dd293b40578ccornelius int64_t num) { 13059d709d503bab6e2b61931737e662dd293b40578ccornelius return left + Int64ToUnicodeString(num); 13159d709d503bab6e2b61931737e662dd293b40578ccornelius} 13259d709d503bab6e2b61931737e662dd293b40578ccornelius#endif 13359d709d503bab6e2b61931737e662dd293b40578ccornelius 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 13727f654740f2a26ad62a5c155af9199af9e69b889claireho * Return a string display for this, without surrounding braces. 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString _toString(const Formattable& f) { 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s; 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (f.getType()) { 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case Formattable::kDate: 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SimpleDateFormat fmt(status); 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos; 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt.format(f.getDate(), s, pos); 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.insert(0, "Date:"); 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s = UnicodeString("Error creating date format]"); 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case Formattable::kDouble: 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s = UnicodeString("double:") + f.getDouble(); 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case Formattable::kLong: 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s = UnicodeString("long:") + f.getLong(); 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case Formattable::kInt64: 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s = UnicodeString("int64:") + Int64ToUnicodeString(f.getInt64()); 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case Formattable::kString: 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru f.getString(s); 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.insert(0, "String:"); 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case Formattable::kArray: 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, n; 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const Formattable* array = f.getArray(n); 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.insert(0, UnicodeString("Array:")); 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString delim(", "); 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<n; ++i) { 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i > 0) { 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.append(delim); 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s = s + _toString(array[i]); 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 18427f654740f2a26ad62a5c155af9199af9e69b889claireho case Formattable::kObject: { 18527f654740f2a26ad62a5c155af9199af9e69b889claireho const CurrencyAmount* c = dynamic_cast<const CurrencyAmount*>(f.getObject()); 18627f654740f2a26ad62a5c155af9199af9e69b889claireho if (c != NULL) { 18727f654740f2a26ad62a5c155af9199af9e69b889claireho s = _toString(c->getNumber()) + " " + UnicodeString(c->getISOCurrency()); 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s = UnicodeString("Unknown UObject"); 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 19227f654740f2a26ad62a5c155af9199af9e69b889claireho } 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s = UnicodeString("Unknown Formattable type=") + (int32_t)f.getType(); 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return s; 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Originally coded this as operator+, but that makes the expression 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * + char* ambiguous. - liu 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString toString(const Formattable& f) { 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s((UChar)91/*[*/); 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.append(_toString(f)); 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.append((UChar)0x5d/*]*/); 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return s; 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// useful when operator+ won't cooperate 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString toString(int32_t n) { 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return UnicodeString() + (long)n; 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 21859d709d503bab6e2b61931737e662dd293b40578ccornelius 21959d709d503bab6e2b61931737e662dd293b40578ccornelius 22059d709d503bab6e2b61931737e662dd293b40578ccorneliusUnicodeString toString(UBool b) { 22159d709d503bab6e2b61931737e662dd293b40578ccornelius return b ? UnicodeString("TRUE"):UnicodeString("FALSE"); 22259d709d503bab6e2b61931737e662dd293b40578ccornelius} 22359d709d503bab6e2b61931737e662dd293b40578ccornelius 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// stephen - cleaned up 05/05/99 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, char num) 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (long)num; } 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, short num) 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (long)num; } 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, int num) 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (long)num; } 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, unsigned char num) 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (unsigned long)num; } 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, unsigned short num) 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (unsigned long)num; } 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, unsigned int num) 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (unsigned long)num; } 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString operator+(const UnicodeString& left, float num) 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ return left + (double)num; } 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------ 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Append a hex string to the target 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::appendHex(uint32_t number, 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t digits, 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& target) 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar digitString[] = { 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; /* "0123456789ABCDEF" */ 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 253f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius if (digits < 0) { // auto-digits 254f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius digits = 2; 255f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius uint32_t max = 0xff; 256f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius while (number > max) { 257f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius digits += 2; 258f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius max = (max << 8) | 0xff; 259f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius } 260f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius } 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (digits) 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 8: 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += digitString[(number >> 28) & 0xF]; 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 7: 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += digitString[(number >> 24) & 0xF]; 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 6: 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += digitString[(number >> 20) & 0xF]; 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 5: 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += digitString[(number >> 16) & 0xF]; 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 4: 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += digitString[(number >> 12) & 0xF]; 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 3: 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += digitString[(number >> 8) & 0xF]; 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 2: 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += digitString[(number >> 4) & 0xF]; 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 1: 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += digitString[(number >> 0) & 0xF]; 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += "**"; 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return target; 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 286f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig CorneliusUnicodeString 287f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig CorneliusIntlTest::toHex(uint32_t number, int32_t digits) { 288f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius UnicodeString result; 289f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius appendHex(number, digits, result); 290f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius return result; 291f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius} 292f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius 29327f654740f2a26ad62a5c155af9199af9e69b889clairehostatic inline UBool isPrintable(UChar32 c) { 29427f654740f2a26ad62a5c155af9199af9e69b889claireho return c <= 0x7E && (c >= 0x20 || c == 9 || c == 0xA || c == 0xD); 29527f654740f2a26ad62a5c155af9199af9e69b889claireho} 29627f654740f2a26ad62a5c155af9199af9e69b889claireho 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Replace nonprintable characters with unicode escapes 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::prettify(const UnicodeString &source, 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString &target) 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target.remove(); 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += "\""; 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < source.length(); ) 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 ch = source.char32At(i); 31027f654740f2a26ad62a5c155af9199af9e69b889claireho i += U16_LENGTH(ch); 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 31227f654740f2a26ad62a5c155af9199af9e69b889claireho if (!isPrintable(ch)) 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ch <= 0xFFFF) { 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += "\\u"; 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendHex(ch, 4, target); 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += "\\U"; 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendHex(ch, 8, target); 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += ch; 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += "\""; 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return target; 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Replace nonprintable characters with unicode escapes 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::prettify(const UnicodeString &source, UBool parseBackslash) 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString target; 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target.remove(); 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += "\""; 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < source.length();) 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 ch = source.char32At(i); 34527f654740f2a26ad62a5c155af9199af9e69b889claireho i += U16_LENGTH(ch); 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 34727f654740f2a26ad62a5c155af9199af9e69b889claireho if (!isPrintable(ch)) 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (parseBackslash) { 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If we are preceded by an odd number of backslashes, 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // then this character has already been backslash escaped. 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Delete a backslash. 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t backslashCount = 0; 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t j=target.length()-1; j>=0; --j) { 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (target.charAt(j) == (UChar)92) { 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++backslashCount; 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((backslashCount % 2) == 1) { 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target.truncate(target.length() - 1); 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ch <= 0xFFFF) { 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += "\\u"; 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendHex(ch, 4, target); 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += "\\U"; 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendHex(ch, 8, target); 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += ch; 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target += "\""; 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return target; 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* IntlTest::setICU_DATA - if the ICU_DATA environment variable is not already 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * set, try to deduce the directory in which ICU was built, 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and set ICU_DATA to "icu/source/data" in that location. 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The intent is to allow the tests to have a good chance 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * of running without requiring that the user manually set 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ICU_DATA. Common data isn't a problem, since it is 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * picked up via a static (build time) reference, but the 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * tests dynamically load some data. 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::setICU_DATA() { 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *original_ICU_DATA = getenv("ICU_DATA"); 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (original_ICU_DATA != NULL && *original_ICU_DATA != 0) { 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* If the user set ICU_DATA, don't second-guess the person. */ 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // U_TOPBUILDDIR is set by the makefiles on UNIXes when building cintltst and intltst 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // to point to the top of the build hierarchy, which may or 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // may not be the same as the source directory, depending on 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // the configure options used. At any rate, 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // set the data path to the built data from this directory. 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // The value is complete with quotes, so it can be used 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // as-is as a string constant. 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined (U_TOPBUILDDIR) 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static char env_string[] = U_TOPBUILDDIR "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING; 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_setDataDirectory(env_string); 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Use #else so we don't get compiler warnings due to the return above. 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* On Windows, the file name obtained from __FILE__ includes a full path. 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This file is "wherever\icu\source\test\cintltst\cintltst.c" 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Change to "wherever\icu\source\data" 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char p[sizeof(__FILE__) + 10]; 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *pBackSlash; 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcpy(p, __FILE__); 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* We want to back over three '\' chars. */ 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Only Windows should end up here, so looking for '\' is safe. */ 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=1; i<=3; i++) { 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pBackSlash = strrchr(p, U_FILE_SEP_CHAR); 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pBackSlash != NULL) { 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *pBackSlash = 0; /* Truncate the string at the '\' */ 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pBackSlash != NULL) { 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* We found and truncated three names from the path. 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Now append "source\data" and set the environment 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcpy(pBackSlash, U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING); 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_setDataDirectory(p); /* p is "ICU_DATA=wherever\icu\source\data" */ 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* __FILE__ on MSVC7 does not contain the directory */ 4481b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert u_setDataDirectory(".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING); 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* No location for the data dir was identifiable. 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Add other fallbacks for the test data location here if the need arises 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//-------------------------------------------------------------------------------------- 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const int32_t indentLevel_offset = 3; 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char delim = '/'; 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest* IntlTest::gTest = NULL; 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t execCount = 0; 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_log( UnicodeString message ) 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (IntlTest::gTest) 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest::gTest->log( message ); 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_logln( UnicodeString message ) 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (IntlTest::gTest) 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest::gTest->logln( message ); 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_logln( void ) 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (IntlTest::gTest) 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest::gTest->logln(); 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_info( UnicodeString message ) 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (IntlTest::gTest) 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest::gTest->info( message ); 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_infoln( UnicodeString message ) 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (IntlTest::gTest) 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest::gTest->infoln( message ); 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_infoln( void ) 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (IntlTest::gTest) 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest::gTest->infoln(); 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_err() 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (IntlTest::gTest) 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest::gTest->err(); 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_err( UnicodeString message ) 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (IntlTest::gTest) 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest::gTest->err( message ); 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_errln( UnicodeString message ) 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (IntlTest::gTest) 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest::gTest->errln( message ); 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_dataerr( UnicodeString message ) 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (IntlTest::gTest) 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest::gTest->dataerr( message ); 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid it_dataerrln( UnicodeString message ) 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (IntlTest::gTest) 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest::gTest->dataerrln( message ); 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::IntlTest() 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru caller = NULL; 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testPath = NULL; 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LL_linestart = TRUE; 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCount = 0; 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dataErrorCount = 0; 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru verbose = FALSE; 54354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius no_time = FALSE; 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru no_err_msg = FALSE; 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru warn_on_missing_data = FALSE; 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru quick = FALSE; 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru leaks = FALSE; 54850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho threadCount = 1; 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testoutfp = stdout; 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LL_indentlevel = indentLevel_offset; 551b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru numProps = 0; 55227f654740f2a26ad62a5c155af9199af9e69b889claireho strcpy(basePath, "/"); 55359d709d503bab6e2b61931737e662dd293b40578ccornelius currName[0]=0; 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::setCaller( IntlTest* callingTest ) 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru caller = callingTest; 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (caller) { 560c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru warn_on_missing_data = caller->warn_on_missing_data; 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru verbose = caller->verbose; 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru no_err_msg = caller->no_err_msg; 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru quick = caller->quick; 564c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert threadCount = caller->threadCount; 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testoutfp = caller->testoutfp; 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LL_indentlevel = caller->LL_indentlevel + indentLevel_offset; 567b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru numProps = caller->numProps; 568b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for (int32_t i = 0; i < numProps; i++) { 569b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru proplines[i] = caller->proplines[i]; 570b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::callTest( IntlTest& testToBeCalled, char* par ) 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru execCount--; // correct a previously assumed test-exec, as this only calls a subtest 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testToBeCalled.setCaller( this ); 57827f654740f2a26ad62a5c155af9199af9e69b889claireho strcpy(testToBeCalled.basePath, this->basePath ); 57927f654740f2a26ad62a5c155af9199af9e69b889claireho UBool result = testToBeCalled.runTest( testPath, par, testToBeCalled.basePath ); 58027f654740f2a26ad62a5c155af9199af9e69b889claireho strcpy(testToBeCalled.basePath, this->basePath ); // reset it. 58127f654740f2a26ad62a5c155af9199af9e69b889claireho return result; 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::setPath( char* pathVal ) 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->testPath = pathVal; 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setVerbose( UBool verboseVal ) 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool rval = this->verbose; 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->verbose = verboseVal; 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return rval; 594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 59654dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusUBool IntlTest::setNotime( UBool no_time ) 59754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius{ 59854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UBool rval = this->no_time; 59954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius this->no_time = no_time; 60054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return rval; 60154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 60254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setWarnOnMissingData( UBool warn_on_missing_dataVal ) 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool rval = this->warn_on_missing_data; 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->warn_on_missing_data = warn_on_missing_dataVal; 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return rval; 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setNoErrMsg( UBool no_err_msgVal ) 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool rval = this->no_err_msg; 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->no_err_msg = no_err_msgVal; 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return rval; 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setQuick( UBool quickVal ) 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool rval = this->quick; 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->quick = quickVal; 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return rval; 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::setLeaks( UBool leaksVal ) 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool rval = this->leaks; 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->leaks = leaksVal; 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return rval; 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 63150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoint32_t IntlTest::setThreadCount( int32_t count ) 63250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 63350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t rval = this->threadCount; 63450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho this->threadCount = count; 63550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return rval; 63650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 63750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t IntlTest::getErrors( void ) 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return errorCount; 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t IntlTest::getDataErrors( void ) 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return dataErrorCount; 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 64827f654740f2a26ad62a5c155af9199af9e69b889clairehoUBool IntlTest::runTest( char* name, char* par, char *baseName ) 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool rval; 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char* pos = NULL; 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 65327f654740f2a26ad62a5c155af9199af9e69b889claireho char* baseNameBuffer = NULL; 65427f654740f2a26ad62a5c155af9199af9e69b889claireho 65527f654740f2a26ad62a5c155af9199af9e69b889claireho if(baseName == NULL) { 65627f654740f2a26ad62a5c155af9199af9e69b889claireho baseNameBuffer = (char*)malloc(1024); 65727f654740f2a26ad62a5c155af9199af9e69b889claireho baseName=baseNameBuffer; 65827f654740f2a26ad62a5c155af9199af9e69b889claireho strcpy(baseName, "/"); 65927f654740f2a26ad62a5c155af9199af9e69b889claireho } 66027f654740f2a26ad62a5c155af9199af9e69b889claireho 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (name) 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos = strchr( name, delim ); // check if name contains path (by looking for '/') 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pos) { 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testPath = pos+1; // store subpath for calling subtest 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *pos = 0; // split into two strings 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else{ 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testPath = NULL; 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!name || (name[0] == 0) || (strcmp(name, "*") == 0)) { 67127f654740f2a26ad62a5c155af9199af9e69b889claireho rval = runTestLoop( NULL, par, baseName ); 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else if (strcmp( name, "LIST" ) == 0) { 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->usage(); 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rval = TRUE; 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else{ 67827f654740f2a26ad62a5c155af9199af9e69b889claireho rval = runTestLoop( name, par, baseName ); 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pos) 682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *pos = delim; // restore original value at pos 68327f654740f2a26ad62a5c155af9199af9e69b889claireho if(baseNameBuffer!=NULL) { 68427f654740f2a26ad62a5c155af9199af9e69b889claireho free(baseNameBuffer); 68527f654740f2a26ad62a5c155af9199af9e69b889claireho } 686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return rval; 687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// call individual tests, to be overriden to call implementations 69054dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusvoid IntlTest::runIndexedTest( int32_t /*index*/, UBool /*exec*/, const char* & /*name*/, char* /*par*/ ) 691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // to be overriden by a method like: 693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (index) { 695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0: name = "First Test"; if (exec) FirstTest( par ); break; 696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 1: name = "Second Test"; if (exec) SecondTest( par ); break; 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: name = ""; break; 698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->errln("*** runIndexedTest needs to be overriden! ***"); 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 70427f654740f2a26ad62a5c155af9199af9e69b889clairehoUBool IntlTest::runTestLoop( char* testname, char* par, char *baseName ) 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t index = 0; 707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* name; 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool run_this_test; 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t lastErrorCount; 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool rval = FALSE; 711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool lastTestFailed; 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 71327f654740f2a26ad62a5c155af9199af9e69b889claireho if(baseName == NULL) { 71427f654740f2a26ad62a5c155af9199af9e69b889claireho printf("ERROR: baseName can't be null.\n"); 71527f654740f2a26ad62a5c155af9199af9e69b889claireho return FALSE; 71627f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 71727f654740f2a26ad62a5c155af9199af9e69b889claireho if ((char *)this->basePath != baseName) { 71827f654740f2a26ad62a5c155af9199af9e69b889claireho strcpy(this->basePath, baseName); 71927f654740f2a26ad62a5c155af9199af9e69b889claireho } 72027f654740f2a26ad62a5c155af9199af9e69b889claireho } 72127f654740f2a26ad62a5c155af9199af9e69b889claireho 72227f654740f2a26ad62a5c155af9199af9e69b889claireho char * saveBaseLoc = baseName+strlen(baseName); 72327f654740f2a26ad62a5c155af9199af9e69b889claireho 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest* saveTest = gTest; 725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gTest = this; 726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru do { 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->runIndexedTest( index, FALSE, name, par ); 72850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (strcmp(name,"skip") == 0) { 72950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho run_this_test = FALSE; 73050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 73150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (!name || (name[0] == 0)) 73250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho break; 73350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (!testname) { 73450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho run_this_test = TRUE; 73550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho }else{ 73650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho run_this_test = (UBool) (strcmp( name, testname ) == 0); 73750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (run_this_test) { 740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lastErrorCount = errorCount; 741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru execCount++; 74227f654740f2a26ad62a5c155af9199af9e69b889claireho char msg[256]; 74327f654740f2a26ad62a5c155af9199af9e69b889claireho sprintf(msg, "%s {", name); 74427f654740f2a26ad62a5c155af9199af9e69b889claireho LL_message(msg, TRUE); 74527f654740f2a26ad62a5c155af9199af9e69b889claireho UDate timeStart = uprv_getRawUTCtime(); 74627f654740f2a26ad62a5c155af9199af9e69b889claireho strcpy(saveBaseLoc,name); 74727f654740f2a26ad62a5c155af9199af9e69b889claireho strcat(saveBaseLoc,"/"); 74827f654740f2a26ad62a5c155af9199af9e69b889claireho 74959d709d503bab6e2b61931737e662dd293b40578ccornelius strcpy(currName, name); // set 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->runIndexedTest( index, TRUE, name, par ); 75159d709d503bab6e2b61931737e662dd293b40578ccornelius currName[0]=0; // reset 75227f654740f2a26ad62a5c155af9199af9e69b889claireho 75327f654740f2a26ad62a5c155af9199af9e69b889claireho UDate timeStop = uprv_getRawUTCtime(); 754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rval = TRUE; // at least one test has been called 75527f654740f2a26ad62a5c155af9199af9e69b889claireho char secs[256]; 75654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(!no_time) { 75754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius sprintf(secs, "%f", (timeStop-timeStart)/1000.0); 75854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 75954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius secs[0]=0; 76054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 76127f654740f2a26ad62a5c155af9199af9e69b889claireho 76227f654740f2a26ad62a5c155af9199af9e69b889claireho 76327f654740f2a26ad62a5c155af9199af9e69b889claireho strcpy(saveBaseLoc,name); 76427f654740f2a26ad62a5c155af9199af9e69b889claireho 76527f654740f2a26ad62a5c155af9199af9e69b889claireho 76627f654740f2a26ad62a5c155af9199af9e69b889claireho ctest_xml_testcase(baseName, name, secs, (lastErrorCount!=errorCount)?"err":NULL); 76727f654740f2a26ad62a5c155af9199af9e69b889claireho 76827f654740f2a26ad62a5c155af9199af9e69b889claireho 76927f654740f2a26ad62a5c155af9199af9e69b889claireho saveBaseLoc[0]=0; /* reset path */ 77027f654740f2a26ad62a5c155af9199af9e69b889claireho 771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (lastErrorCount == errorCount) { 77227f654740f2a26ad62a5c155af9199af9e69b889claireho sprintf( msg, " } OK: %s ", name ); 77354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(!no_time) str_timeDelta(msg+strlen(msg),timeStop-timeStart); 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lastTestFailed = FALSE; 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else{ 77627f654740f2a26ad62a5c155af9199af9e69b889claireho sprintf(msg, " } ERRORS (%li) in %s", (long)(errorCount-lastErrorCount), name); 77754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(!no_time) str_timeDelta(msg+strlen(msg),timeStop-timeStart); 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(int i=0;i<LL_indentlevel;i++) { 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorList += " "; 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorList += name; 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorList += "\n"; 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru lastTestFailed = TRUE; 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LL_indentlevel -= 3; 787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (lastTestFailed) { 788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LL_message( "", TRUE); 789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LL_message( msg, TRUE); 791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (lastTestFailed) { 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LL_message( "", TRUE); 793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LL_indentlevel += 3; 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru index++; 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }while(name); 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 79927f654740f2a26ad62a5c155af9199af9e69b889claireho *saveBaseLoc = 0; 80027f654740f2a26ad62a5c155af9199af9e69b889claireho 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gTest = saveTest; 802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return rval; 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Adds given string to the log if we are in verbose mode. 808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::log( const UnicodeString &message ) 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( verbose ) { 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LL_message( message, FALSE ); 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Adds given string to the log if we are in verbose mode. Adds a new line to 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* the given message. 819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::logln( const UnicodeString &message ) 821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( verbose ) { 823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LL_message( message, TRUE ); 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::logln( void ) 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( verbose ) { 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LL_message( "", TRUE ); 831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Unconditionally adds given string to the log. 836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::info( const UnicodeString &message ) 838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LL_message( message, FALSE ); 840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Unconditionally adds given string to the log. Adds a new line to 844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* the given message. 845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::infoln( const UnicodeString &message ) 847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LL_message( message, TRUE ); 849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::infoln( void ) 852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LL_message( "", TRUE ); 854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t IntlTest::IncErrorCount( void ) 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCount++; 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (caller) caller->IncErrorCount(); 860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return errorCount; 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t IntlTest::IncDataErrorCount( void ) 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dataErrorCount++; 866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (caller) caller->IncDataErrorCount(); 867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return dataErrorCount; 868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::err() 871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IncErrorCount(); 873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::err( const UnicodeString &message ) 876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IncErrorCount(); 878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!no_err_msg) LL_message( message, FALSE ); 879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::errln( const UnicodeString &message ) 882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IncErrorCount(); 884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!no_err_msg) LL_message( message, TRUE ); 885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::dataerr( const UnicodeString &message ) 888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IncDataErrorCount(); 890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!warn_on_missing_data) { 892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IncErrorCount(); 893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!no_err_msg) LL_message( message, FALSE ); 896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::dataerrln( const UnicodeString &message ) 899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 90059d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t errCount = IncDataErrorCount(); 9016d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru UnicodeString msg; 902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!warn_on_missing_data) { 903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IncErrorCount(); 9046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru msg = message; 9056d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } else { 9066d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru msg = UnicodeString("[DATA] " + message); 907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 90959d709d503bab6e2b61931737e662dd293b40578ccornelius if (!no_err_msg) { 91059d709d503bab6e2b61931737e662dd293b40578ccornelius if ( errCount == 1) { 91159d709d503bab6e2b61931737e662dd293b40578ccornelius LL_message( msg + " - (Are you missing data?)", TRUE ); // only show this message the first time 91259d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 91359d709d503bab6e2b61931737e662dd293b40578ccornelius LL_message( msg , TRUE ); 91459d709d503bab6e2b61931737e662dd293b40578ccornelius } 91559d709d503bab6e2b61931737e662dd293b40578ccornelius } 9166d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru} 9176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 9186d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queruvoid IntlTest::errcheckln(UErrorCode status, const UnicodeString &message ) { 9196d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (status == U_FILE_ACCESS_ERROR || status == U_MISSING_RESOURCE_ERROR) { 9206d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln(message); 9216d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } else { 9226d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errln(message); 9236d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* convenience functions that include sprintf formatting */ 927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::log(const char *fmt, ...) 928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char buffer[4000]; 930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_list ap; 931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_start(ap, fmt); 933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* sprintf it just to make sure that the information is valid */ 934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru vsprintf(buffer, fmt, ap); 935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_end(ap); 936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( verbose ) { 937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log(UnicodeString(buffer, "")); 938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::logln(const char *fmt, ...) 942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char buffer[4000]; 944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_list ap; 945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_start(ap, fmt); 947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* sprintf it just to make sure that the information is valid */ 948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru vsprintf(buffer, fmt, ap); 949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_end(ap); 950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( verbose ) { 951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString(buffer, "")); 952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 95559d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::logKnownIssue(const char *ticket, const char *fmt, ...) 95659d709d503bab6e2b61931737e662dd293b40578ccornelius{ 95759d709d503bab6e2b61931737e662dd293b40578ccornelius char buffer[4000]; 95859d709d503bab6e2b61931737e662dd293b40578ccornelius va_list ap; 95959d709d503bab6e2b61931737e662dd293b40578ccornelius 96059d709d503bab6e2b61931737e662dd293b40578ccornelius va_start(ap, fmt); 96159d709d503bab6e2b61931737e662dd293b40578ccornelius /* sprintf it just to make sure that the information is valid */ 96259d709d503bab6e2b61931737e662dd293b40578ccornelius vsprintf(buffer, fmt, ap); 96359d709d503bab6e2b61931737e662dd293b40578ccornelius va_end(ap); 96459d709d503bab6e2b61931737e662dd293b40578ccornelius return logKnownIssue(ticket, UnicodeString(buffer, "")); 96559d709d503bab6e2b61931737e662dd293b40578ccornelius} 96659d709d503bab6e2b61931737e662dd293b40578ccornelius 96759d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::logKnownIssue(const char *ticket) { 96859d709d503bab6e2b61931737e662dd293b40578ccornelius return logKnownIssue(ticket, UnicodeString()); 96959d709d503bab6e2b61931737e662dd293b40578ccornelius} 97059d709d503bab6e2b61931737e662dd293b40578ccornelius 97159d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::logKnownIssue(const char *ticket, const UnicodeString &msg) { 97259d709d503bab6e2b61931737e662dd293b40578ccornelius if(noKnownIssues) return FALSE; 97359d709d503bab6e2b61931737e662dd293b40578ccornelius 97459d709d503bab6e2b61931737e662dd293b40578ccornelius char fullpath[2048]; 97559d709d503bab6e2b61931737e662dd293b40578ccornelius strcpy(fullpath, basePath); 97659d709d503bab6e2b61931737e662dd293b40578ccornelius strcat(fullpath, currName); 977c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString msg2 = msg; 978c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UBool firstForTicket = TRUE, firstForWhere = TRUE; 97959d709d503bab6e2b61931737e662dd293b40578ccornelius knownList = udbg_knownIssue_openU(knownList, ticket, fullpath, msg2.getTerminatedBuffer(), &firstForTicket, &firstForWhere); 98059d709d503bab6e2b61931737e662dd293b40578ccornelius 981fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius msg2 = UNICODE_STRING_SIMPLE("(Known issue #") + 982fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius UnicodeString(ticket, -1, US_INV) + UNICODE_STRING_SIMPLE(") ") + msg; 98359d709d503bab6e2b61931737e662dd293b40578ccornelius if(firstForTicket || firstForWhere) { 984fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius infoln(msg2); 98559d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 986fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius logln(msg2); 98759d709d503bab6e2b61931737e662dd293b40578ccornelius } 98859d709d503bab6e2b61931737e662dd293b40578ccornelius 98959d709d503bab6e2b61931737e662dd293b40578ccornelius return TRUE; 99059d709d503bab6e2b61931737e662dd293b40578ccornelius} 99159d709d503bab6e2b61931737e662dd293b40578ccornelius 992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* convenience functions that include sprintf formatting */ 993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::info(const char *fmt, ...) 994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char buffer[4000]; 996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_list ap; 997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_start(ap, fmt); 999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* sprintf it just to make sure that the information is valid */ 1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru vsprintf(buffer, fmt, ap); 1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_end(ap); 1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru info(UnicodeString(buffer, "")); 1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::infoln(const char *fmt, ...) 1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char buffer[4000]; 1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_list ap; 1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_start(ap, fmt); 1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* sprintf it just to make sure that the information is valid */ 1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru vsprintf(buffer, fmt, ap); 1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_end(ap); 1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru infoln(UnicodeString(buffer, "")); 1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::err(const char *fmt, ...) 1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char buffer[4000]; 1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_list ap; 1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_start(ap, fmt); 1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru vsprintf(buffer, fmt, ap); 1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_end(ap); 1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err(UnicodeString(buffer, "")); 1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::errln(const char *fmt, ...) 1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char buffer[4000]; 1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_list ap; 1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_start(ap, fmt); 1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru vsprintf(buffer, fmt, ap); 1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_end(ap); 1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString(buffer, "")); 1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::dataerrln(const char *fmt, ...) 1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char buffer[4000]; 1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_list ap; 1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_start(ap, fmt); 1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru vsprintf(buffer, fmt, ap); 1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru va_end(ap); 1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dataerrln(UnicodeString(buffer, "")); 1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 10506d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queruvoid IntlTest::errcheckln(UErrorCode status, const char *fmt, ...) 10516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru{ 10526d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru char buffer[4000]; 10536d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru va_list ap; 10546d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 10556d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru va_start(ap, fmt); 10566d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru vsprintf(buffer, fmt, ap); 10576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru va_end(ap); 10586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 10596d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (status == U_FILE_ACCESS_ERROR || status == U_MISSING_RESOURCE_ERROR) { 10606d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln(UnicodeString(buffer, "")); 10616d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } else { 10626d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errln(UnicodeString(buffer, "")); 10636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 10646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru} 10656d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::printErrors() 1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest::LL_message(errorList, TRUE); 1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 107159d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::printKnownIssues() 107259d709d503bab6e2b61931737e662dd293b40578ccornelius{ 107359d709d503bab6e2b61931737e662dd293b40578ccornelius if(knownList != NULL) { 107459d709d503bab6e2b61931737e662dd293b40578ccornelius udbg_knownIssue_print(knownList); 107559d709d503bab6e2b61931737e662dd293b40578ccornelius udbg_knownIssue_close(knownList); 107659d709d503bab6e2b61931737e662dd293b40578ccornelius return TRUE; 107759d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 107859d709d503bab6e2b61931737e662dd293b40578ccornelius return FALSE; 107959d709d503bab6e2b61931737e662dd293b40578ccornelius } 108059d709d503bab6e2b61931737e662dd293b40578ccornelius} 108159d709d503bab6e2b61931737e662dd293b40578ccornelius 1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::LL_message( UnicodeString message, UBool newline ) 1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // string that starts with a LineFeed character and continues 1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // with spaces according to the current indentation 1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar indentUChars[] = { 1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru '\n', 1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32 1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString indent(FALSE, indentUChars, 1 + LL_indentlevel); 1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1101fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius char buffer[30000]; 1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length; 1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // stream out the indentation string first if necessary 1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length = indent.extract(1, indent.length(), buffer, sizeof(buffer)); 1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (length > 0) { 1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fwrite(buffer, sizeof(*buffer), length, (FILE *)testoutfp); 1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // replace each LineFeed by the indentation string 1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru message.findAndReplace(UnicodeString((UChar)'\n'), indent); 1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // stream out the message 1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length = message.extract(0, message.length(), buffer, sizeof(buffer)); 1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (length > 0) { 1116fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius length = length > 30000 ? 30000 : length; 1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fwrite(buffer, sizeof(*buffer), length, (FILE *)testoutfp); 1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (newline) { 1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char newLine = '\n'; 1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fwrite(&newLine, sizeof(newLine), 1, (FILE *)testoutfp); 1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // A newline usually flushes the buffer, but 1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // flush the message just in case of a core dump. 1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fflush((FILE *)testoutfp); 1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Print a usage message for this test class. 1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTest::usage( void ) 1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool save_verbose = setVerbose( TRUE ); 1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Test names:"); 1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("-----------"); 1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t index = 0; 1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* name = NULL; 1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru do{ 1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->runIndexedTest( index, FALSE, name ); 1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!name) break; 1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(name); 1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru index++; 1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }while (name && (name[0] != 0)); 1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setVerbose( save_verbose ); 1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// memory leak reporting software will be able to take advantage of the testsuite 1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// being run a second time local to a specific method in order to report only actual leaks 1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTest::run_phase2( char* name, char* par ) // supports reporting memory leaks 1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString* strLeak = new UnicodeString("forced leak"); // for verifying purify filter 1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strLeak->append(" for verifying purify filter"); 1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return this->runTest( name, par ); 1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if UCONFIG_NO_LEGACY_CONVERSION 1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# define TRY_CNV_1 "iso-8859-1" 1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# define TRY_CNV_2 "ibm-1208" 1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# define TRY_CNV_1 "iso-8859-7" 1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# define TRY_CNV_2 "sjis" 1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1170c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#ifdef UNISTR_COUNT_FINAL_STRING_LENGTHS 1171c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertU_CAPI void unistr_printLengths(); 1172c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#endif 1173c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint 1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querumain(int argc, char* argv[]) 1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool syntax = FALSE; 1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool all = FALSE; 1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool verbose = FALSE; 1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool no_err_msg = FALSE; 118154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UBool no_time = FALSE; 1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool quick = TRUE; 1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool name = FALSE; 1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool leaks = FALSE; 118559d709d503bab6e2b61931737e662dd293b40578ccornelius UBool utf8 = FALSE; 118659d709d503bab6e2b61931737e662dd293b40578ccornelius const char *summary_file = NULL; 1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool warnOnMissingData = FALSE; 1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool defaultDataFound = FALSE; 118950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t threadCount = 1; 1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode = U_ZERO_ERROR; 1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UConverter *cnv = NULL; 1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *warnOrErr = "Failure"; 1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate startTime, endTime; 1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t diffTime; 1195b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const char *props[IntlTest::kMaxProps]; 1196b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t nProps = 0; 1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_MAIN_INIT_ARGS(argc, argv); 1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 120027f654740f2a26ad62a5c155af9199af9e69b889claireho startTime = uprv_getRawUTCtime(); 1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i = 1; i < argc; ++i) { 1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (argv[i][0] == '-') { 1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* str = argv[i] + 1; 1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (strcmp("verbose", str) == 0 || 1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcmp("v", str) == 0) 1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru verbose = TRUE; 1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (strcmp("noerrormsg", str) == 0 || 1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcmp("n", str) == 0) 1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru no_err_msg = TRUE; 1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (strcmp("exhaustive", str) == 0 || 1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcmp("e", str) == 0) 1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru quick = FALSE; 1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (strcmp("all", str) == 0 || 1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcmp("a", str) == 0) 1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru all = TRUE; 121759d709d503bab6e2b61931737e662dd293b40578ccornelius else if (strcmp("utf-8", str) == 0 || 121859d709d503bab6e2b61931737e662dd293b40578ccornelius strcmp("u", str) == 0) 121959d709d503bab6e2b61931737e662dd293b40578ccornelius utf8 = TRUE; 122059d709d503bab6e2b61931737e662dd293b40578ccornelius else if (strcmp("noknownissues", str) == 0 || 122159d709d503bab6e2b61931737e662dd293b40578ccornelius strcmp("K", str) == 0) 122259d709d503bab6e2b61931737e662dd293b40578ccornelius noKnownIssues = TRUE; 1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (strcmp("leaks", str) == 0 || 1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcmp("l", str) == 0) 1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru leaks = TRUE; 122654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius else if (strcmp("notime", str) == 0 || 122754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius strcmp("T", str) == 0) 122854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius no_time = TRUE; 122959d709d503bab6e2b61931737e662dd293b40578ccornelius else if (strncmp("E", str, 1) == 0) 123059d709d503bab6e2b61931737e662dd293b40578ccornelius summary_file = str+1; 123127f654740f2a26ad62a5c155af9199af9e69b889claireho else if (strcmp("x", str)==0) { 123227f654740f2a26ad62a5c155af9199af9e69b889claireho if(++i>=argc) { 123327f654740f2a26ad62a5c155af9199af9e69b889claireho printf("* Error: '-x' option requires an argument. usage: '-x outfile.xml'.\n"); 123427f654740f2a26ad62a5c155af9199af9e69b889claireho syntax = TRUE; 123527f654740f2a26ad62a5c155af9199af9e69b889claireho } 123627f654740f2a26ad62a5c155af9199af9e69b889claireho if(ctest_xml_setFileName(argv[i])) { /* set the name */ 123727f654740f2a26ad62a5c155af9199af9e69b889claireho return 1; /* error */ 123827f654740f2a26ad62a5c155af9199af9e69b889claireho } 123927f654740f2a26ad62a5c155af9199af9e69b889claireho } else if (strcmp("w", str) == 0) { 1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru warnOnMissingData = TRUE; 1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru warnOrErr = "WARNING"; 1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 124350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho else if (strncmp("threads:", str, 8) == 0) { 124450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho threadCount = atoi(str + 8); 124550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 1246b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru else if (strncmp("prop:", str, 5) == 0) { 1247b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (nProps < IntlTest::kMaxProps) { 1248b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru props[nProps] = str + 5; 1249b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1250b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru nProps++; 1251b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru syntax = TRUE; 1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else{ 1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = TRUE; 1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!all && !name) { 1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru all = TRUE; 1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (all && name) { 1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru syntax = TRUE; 1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (syntax) { 1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, 1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "### Syntax:\n" 1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "### IntlTest [-option1 -option2 ...] [testname1 testname2 ...] \n" 127050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "### \n" 127150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "### Options are: verbose (v), all (a), noerrormsg (n), \n" 127227f654740f2a26ad62a5c155af9199af9e69b889claireho "### exhaustive (e), leaks (l), -x xmlfile.xml, prop:<propery>=<value>, \n" 127354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius "### notime (T), \n" 127450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "### threads:<threadCount> (Mulithreading must first be \n" 127550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "### enabled otherwise this will be ignored. \n" 127650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "### The default thread count is 1.),\n" 1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "### (Specify either -all (shortcut -a) or a test name). \n" 1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "### -all will run all of the tests.\n" 1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "### \n" 1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "### To get a list of the test names type: intltest LIST \n" 1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "### To run just the utility tests type: intltest utility \n" 1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "### \n" 1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "### Test names can be nested using slashes (\"testA/subtest1\") \n" 1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "### For example to list the utility tests type: intltest utility/LIST \n" 1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "### To run just the Locale test type: intltest utility/LocaleTest \n" 1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "### \n" 1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "### A parameter can be specified for a test by appending '@' and the value \n" 1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "### to the testname. \n\n"); 1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 1; 1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1292b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (nProps > IntlTest::kMaxProps) { 1293b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fprintf(stdout, "### Too many properties. Exiting.\n"); 1294b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1295b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MajorTestLevel major; 1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru major.setVerbose( verbose ); 1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru major.setNoErrMsg( no_err_msg ); 1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru major.setQuick( quick ); 1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru major.setLeaks( leaks ); 130150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho major.setThreadCount( threadCount ); 1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru major.setWarnOnMissingData( warnOnMissingData ); 130354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius major.setNotime (no_time); 1304b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for (int32_t i = 0; i < nProps; i++) { 1305b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru major.setProperty(props[i]); 1306b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 130727f654740f2a26ad62a5c155af9199af9e69b889claireho 130827f654740f2a26ad62a5c155af9199af9e69b889claireho 1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "-----------------------------------------------\n"); 1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, " IntlTest (C++) Test Suite for \n"); 1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, " International Components for Unicode %s\n", U_ICU_VERSION); 131227f654740f2a26ad62a5c155af9199af9e69b889claireho 131327f654740f2a26ad62a5c155af9199af9e69b889claireho 1314b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { 1315b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const char *charsetFamily = "Unknown"; 1316b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t voidSize = (int32_t)sizeof(void*); 1317b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t bits = voidSize * 8; 1318b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(U_CHARSET_FAMILY==U_ASCII_FAMILY) { 1319b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru charsetFamily="ASCII"; 1320b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else if(U_CHARSET_FAMILY==U_EBCDIC_FAMILY) { 1321b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru charsetFamily="EBCDIC"; 1322b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1323b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fprintf(stdout, 1324b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru " Bits: %d, Byte order: %s, Chars: %s\n", 1325b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru bits, U_IS_BIG_ENDIAN?"Big endian":"Little endian", 1326b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru charsetFamily); 1327b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "-----------------------------------------------\n"); 1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, " Options: \n"); 1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, " all (a) : %s\n", (all? "On" : "Off")); 1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, " Verbose (v) : %s\n", (verbose? "On" : "Off")); 1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, " No error messages (n) : %s\n", (no_err_msg? "On" : "Off")); 1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, " Exhaustive (e) : %s\n", (!quick? "On" : "Off")); 1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, " Leaks (l) : %s\n", (leaks? "On" : "Off")); 133559d709d503bab6e2b61931737e662dd293b40578ccornelius fprintf(stdout, " utf-8 (u) : %s\n", (utf8? "On" : "Off")); 133654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius fprintf(stdout, " notime (T) : %s\n", (no_time? "On" : "Off")); 133759d709d503bab6e2b61931737e662dd293b40578ccornelius fprintf(stdout, " noknownissues (K) : %s\n", (noKnownIssues? "On" : "Off")); 1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, " Warn on missing data (w) : %s\n", (warnOnMissingData? "On" : "Off")); 133950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stdout, " Threads : %d\n", threadCount); 1340b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for (int32_t i = 0; i < nProps; i++) { 1341b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fprintf(stdout, " Custom property (prop:) : %s\n", props[i]); 1342b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "-----------------------------------------------\n"); 1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 134559d709d503bab6e2b61931737e662dd293b40578ccornelius if(utf8) { 134659d709d503bab6e2b61931737e662dd293b40578ccornelius ucnv_setDefaultName("utf-8"); 134759d709d503bab6e2b61931737e662dd293b40578ccornelius } 1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Check whether ICU will initialize without forcing the build data directory into 1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the ICU_DATA path. Success here means either the data dll contains data, or that 1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * this test program was run with ICU_DATA set externally. Failure of this check 1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * is normal when ICU data is not packaged into a shared library. 1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Whether or not this test succeeds, we want to cleanup and reinitialize 1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * with a data path so that data loading from individual files can be tested. 1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_init(&errorCode); 1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(errorCode)) { 1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, 1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "#### Note: ICU Init without build-specific setDataDirectory() failed.\n"); 1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru defaultDataFound = FALSE; 1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru defaultDataFound = TRUE; 1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_cleanup(); 136659d709d503bab6e2b61931737e662dd293b40578ccornelius if(utf8) { 136759d709d503bab6e2b61931737e662dd293b40578ccornelius ucnv_setDefaultName("utf-8"); 136859d709d503bab6e2b61931737e662dd293b40578ccornelius } 1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode = U_ZERO_ERROR; 1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Initialize ICU */ 1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!defaultDataFound) { 1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest::setICU_DATA(); // Must set data directory before u_init() is called. 1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_init(&errorCode); 1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(errorCode)) { 1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, 1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "#### ERROR! %s: u_init() failed with status = \"%s\".\n" 1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "*** Check the ICU_DATA environment variable and \n" 1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "*** check that the data files are present.\n", argv[0], u_errorName(errorCode)); 1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(warnOnMissingData == 0) { 1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, "*** Exiting. Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n"); 1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_cleanup(); 1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 1; 1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // initial check for the default converter 1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode = U_ZERO_ERROR; 1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cnv = ucnv_open(0, &errorCode); 1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(cnv != 0) { 1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // ok 1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucnv_close(cnv); 1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, 1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "*** %s! The default converter [%s] cannot be opened.\n" 1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "*** Check the ICU_DATA environment variable and\n" 1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "*** check that the data files are present.\n", 1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru warnOrErr, ucnv_getDefaultName()); 1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!warnOnMissingData) { 1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "*** Exiting. Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n"); 1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 1; 1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // try more data 1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cnv = ucnv_open(TRY_CNV_2, &errorCode); 1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(cnv != 0) { 1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // ok 1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucnv_close(cnv); 1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, 1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "*** %s! The converter for " TRY_CNV_2 " cannot be opened.\n" 1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "*** Check the ICU_DATA environment variable and \n" 1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "*** check that the data files are present.\n", warnOrErr); 1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!warnOnMissingData) { 1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "*** Exiting. Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n"); 1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 1; 1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UResourceBundle *rb = ures_open(0, "en", &errorCode); 1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_close(rb); 1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, 1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "*** %s! The \"en\" locale resource bundle cannot be opened.\n" 1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "*** Check the ICU_DATA environment variable and \n" 1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "*** check that the data files are present.\n", warnOrErr); 1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!warnOnMissingData) { 1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "*** Exiting. Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n"); 1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 1; 1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale originalLocale; // Save the default locale for comparison later on. 1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 143727f654740f2a26ad62a5c155af9199af9e69b889claireho if(ctest_xml_init("intltest")) 143827f654740f2a26ad62a5c155af9199af9e69b889claireho return 1; 143927f654740f2a26ad62a5c155af9199af9e69b889claireho 144027f654740f2a26ad62a5c155af9199af9e69b889claireho 1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* TODO: Add option to call u_cleanup and rerun tests. */ 1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (all) { 1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru major.runTest(); 1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (leaks) { 1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru major.run_phase2( NULL, NULL ); 1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else{ 1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i = 1; i < argc; ++i) { 1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (argv[i][0] != '-') { 1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char* name = argv[i]; 1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "\n=== Handling test: %s: ===\n", name); 145227f654740f2a26ad62a5c155af9199af9e69b889claireho 145327f654740f2a26ad62a5c155af9199af9e69b889claireho char baseName[1024]; 145427f654740f2a26ad62a5c155af9199af9e69b889claireho sprintf(baseName, "/%s/", name); 145527f654740f2a26ad62a5c155af9199af9e69b889claireho 1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char* parameter = strchr( name, '@' ); 1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (parameter) { 1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *parameter = 0; 1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parameter += 1; 1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru execCount = 0; 146227f654740f2a26ad62a5c155af9199af9e69b889claireho UBool res = major.runTest( name, parameter, baseName ); 1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (leaks && res) { 1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru major.run_phase2( name, parameter ); 1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!res || (execCount <= 0)) { 1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "\n---ERROR: Test doesn't exist: %s!\n", name); 1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 146927f654740f2a26ad62a5c155af9199af9e69b889claireho } else if(!strcmp(argv[i],"-x")) { 147027f654740f2a26ad62a5c155af9199af9e69b889claireho i++; 1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 147527f654740f2a26ad62a5c155af9199af9e69b889claireho 1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CalendarTimeZoneTest::cleanup(); 1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(_testDataPath); 1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testDataPath = 0; 1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale lastDefaultLocale; 1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (originalLocale != lastDefaultLocale) { 1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru major.errln("FAILURE: A test changed the default locale without resetting it."); 1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "\n--------------------------------------\n"); 148959d709d503bab6e2b61931737e662dd293b40578ccornelius if( major.printKnownIssues() ) { 149059d709d503bab6e2b61931737e662dd293b40578ccornelius fprintf(stdout, " To run suppressed tests, use the -K option. \n"); 149159d709d503bab6e2b61931737e662dd293b40578ccornelius } 1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (major.getErrors() == 0) { 1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Call it twice to make sure that the defaults were reset. */ 1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Call it before the OK message to verify proper cleanup. */ 1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_cleanup(); 1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_cleanup(); 1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "OK: All tests passed without error.\n"); 1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (major.getDataErrors() != 0) { 1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "\t*WARNING* some data-loading errors were ignored by the -w option.\n"); 1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else{ 1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "Errors in total: %ld.\n", (long)major.getErrors()); 1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru major.printErrors(); 1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 150759d709d503bab6e2b61931737e662dd293b40578ccornelius if(summary_file != NULL) { 150859d709d503bab6e2b61931737e662dd293b40578ccornelius FILE *summf = fopen(summary_file, "w"); 150959d709d503bab6e2b61931737e662dd293b40578ccornelius if( summf != NULL) { 151059d709d503bab6e2b61931737e662dd293b40578ccornelius char buf[10000]; 151159d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t length = errorList.extract(0, errorList.length(), buf, sizeof(buf)); 151259d709d503bab6e2b61931737e662dd293b40578ccornelius fwrite(buf, sizeof(*buf), length, (FILE*)summf); 151359d709d503bab6e2b61931737e662dd293b40578ccornelius fclose(summf); 151459d709d503bab6e2b61931737e662dd293b40578ccornelius } 151559d709d503bab6e2b61931737e662dd293b40578ccornelius } 151659d709d503bab6e2b61931737e662dd293b40578ccornelius 1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (major.getDataErrors() != 0) { 1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "\t*Note* some errors are data-loading related. If the data used is not the \n" 1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\tstock ICU data (i.e some have been added or removed), consider using\n" 1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\tthe '-w' option to turn these errors into warnings.\n"); 1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Call afterwards to display errors. */ 1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_cleanup(); 1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1528c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#ifdef UNISTR_COUNT_FINAL_STRING_LENGTHS 1529c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert unistr_printLengths(); 1530c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#endif 1531c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "--------------------------------------\n"); 1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (execCount <= 0) { 1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "***** Not all called tests actually exist! *****\n"); 1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 153754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(!no_time) { 153854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius endTime = uprv_getRawUTCtime(); 153954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius diffTime = (int32_t)(endTime - startTime); 154054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("Elapsed Time: %02d:%02d:%02d.%03d\n", 154154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius (int)((diffTime%U_MILLIS_PER_DAY)/U_MILLIS_PER_HOUR), 154254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius (int)((diffTime%U_MILLIS_PER_HOUR)/U_MILLIS_PER_MINUTE), 154354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius (int)((diffTime%U_MILLIS_PER_MINUTE)/U_MILLIS_PER_SECOND), 154454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius (int)(diffTime%U_MILLIS_PER_SECOND)); 154554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 154627f654740f2a26ad62a5c155af9199af9e69b889claireho 154727f654740f2a26ad62a5c155af9199af9e69b889claireho if(ctest_xml_fini()) 154827f654740f2a26ad62a5c155af9199af9e69b889claireho return 1; 154927f654740f2a26ad62a5c155af9199af9e69b889claireho 1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return major.getErrors(); 1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char* IntlTest::loadTestData(UErrorCode& err){ 1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( _testDataPath == NULL){ 1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* directory=NULL; 1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UResourceBundle* test =NULL; 1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char* tdpath=NULL; 1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* tdrelativepath; 1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined (U_TOPBUILDDIR) 156154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius tdrelativepath = "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING; 1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru directory = U_TOPBUILDDIR; 1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 156454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius tdrelativepath = ".." U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING; 1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru directory = pathToDataDirectory(); 1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tdpath = (char*) malloc(sizeof(char) *(( strlen(directory) * strlen(tdrelativepath)) + 100)); 1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* u_getDataDirectory shoul return \source\data ... set the 1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * directory to ..\source\data\..\test\testdata\out\testdata 1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcpy(tdpath, directory); 1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(tdpath, tdrelativepath); 1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(tdpath,"testdata"); 1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test=ures_open(tdpath, "testtypes", &err); 1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err)){ 1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_FILE_ACCESS_ERROR; 15826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru it_dataerrln((UnicodeString)"Could not load testtypes.res in testdata bundle with path " + tdpath + (UnicodeString)" - " + u_errorName(err)); 1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ""; 1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_close(test); 1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testDataPath = tdpath; 1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return _testDataPath; 1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return _testDataPath; 1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char* IntlTest::getTestDataPath(UErrorCode& err) { 1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return loadTestData(err); 1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Returns the path to icu/source/test/testdata/ */ 1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char *IntlTest::getSourceTestData(UErrorCode& /*err*/) { 1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *srcDataDir = NULL; 1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef U_TOPSRCDIR 160054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius srcDataDir = U_TOPSRCDIR U_FILE_SEP_STRING"test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING; 1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 160254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius srcDataDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING; 160354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius FILE *f = fopen(".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING "rbbitst.txt", "r"); 1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (f) { 1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* We're in icu/source/test/intltest/ */ 1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fclose(f); 1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 1609b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* We're in icu/source/test/intltest/Platform/(Debug|Release) */ 16101b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert srcDataDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING 16111b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING; 1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return srcDataDir; 1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1617f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliuschar *IntlTest::getUnidataPath(char path[]) { 1618f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius const int kUnicodeDataTxtLength = 15; // strlen("UnicodeData.txt") 1619f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 1620f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // Look inside ICU_DATA first. 1621f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius strcpy(path, pathToDataDirectory()); 1622f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius strcat(path, "unidata" U_FILE_SEP_STRING "UnicodeData.txt"); 1623f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FILE *f = fopen(path, "r"); 1624f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(f != NULL) { 1625f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius fclose(f); 1626f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius *(strchr(path, 0) - kUnicodeDataTxtLength) = 0; // Remove the basename. 1627f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius return path; 1628f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 1629f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 1630f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // As a fallback, try to guess where the source data was located 1631f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // at the time ICU was built, and look there. 1632f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius# ifdef U_TOPSRCDIR 1633f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius strcpy(path, U_TOPSRCDIR U_FILE_SEP_STRING "data"); 1634f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius# else 1635f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UErrorCode errorCode = U_ZERO_ERROR; 1636f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius const char *testDataPath = loadTestData(errorCode); 1637f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_FAILURE(errorCode)) { 1638f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius it_errln(UnicodeString( 1639f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "unable to find path to source/data/unidata/ and loadTestData() failed: ") + 1640f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius u_errorName(errorCode)); 1641f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius return NULL; 1642f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 1643f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius strcpy(path, testDataPath); 1644f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius strcat(path, U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." 1645f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." 1646f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius U_FILE_SEP_STRING "data"); 1647f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius# endif 1648f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius strcat(path, U_FILE_SEP_STRING); 1649f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius strcat(path, "unidata" U_FILE_SEP_STRING "UnicodeData.txt"); 1650f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius f = fopen(path, "r"); 1651f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(f != NULL) { 1652f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius fclose(f); 1653f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius *(strchr(path, 0) - kUnicodeDataTxtLength) = 0; // Remove the basename. 1654f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius return path; 1655f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 1656f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius return NULL; 1657f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius} 1658f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char* IntlTest::fgDataDir = NULL; 1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* returns the path to icu/source/data */ 1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char * IntlTest::pathToDataDirectory() 1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(fgDataDir != NULL) { 1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fgDataDir; 1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* U_TOPSRCDIR is set by the makefiles on UNIXes when building cintltst and intltst 1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // to point to the top of the build hierarchy, which may or 1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // may not be the same as the source directory, depending on 1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // the configure options used. At any rate, 1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // set the data path to the built data from this directory. 1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // The value is complete with quotes, so it can be used 1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // as-is as a string constant. 1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined (U_TOPSRCDIR) 1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fgDataDir = U_TOPSRCDIR U_FILE_SEP_STRING "data" U_FILE_SEP_STRING; 1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* On Windows, the file name obtained from __FILE__ includes a full path. 1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This file is "wherever\icu\source\test\cintltst\cintltst.c" 1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Change to "wherever\icu\source\data" 1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static char p[sizeof(__FILE__) + 10]; 1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *pBackSlash; 1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcpy(p, __FILE__); 1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* We want to back over three '\' chars. */ 1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Only Windows should end up here, so looking for '\' is safe. */ 1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=1; i<=3; i++) { 1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pBackSlash = strrchr(p, U_FILE_SEP_CHAR); 1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pBackSlash != NULL) { 1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *pBackSlash = 0; /* Truncate the string at the '\' */ 1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pBackSlash != NULL) { 1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* We found and truncated three names from the path. 1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Now append "source\data" and set the environment 1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcpy(pBackSlash, U_FILE_SEP_STRING "data" U_FILE_SEP_STRING ); 1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fgDataDir = p; 1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* __FILE__ on MSVC7 does not contain the directory */ 17111b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert FILE *file = fopen(".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "Makefile.in", "r"); 1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (file) { 1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fclose(file); 17141b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert fgDataDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "data" U_FILE_SEP_STRING; 1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 17171b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert fgDataDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "data" U_FILE_SEP_STRING; 1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fgDataDir; 1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This is a variant of cintltst/ccolltst.c:CharsToUChars(). 172927f654740f2a26ad62a5c155af9199af9e69b889claireho * It converts an invariant-character string into a UnicodeString, with 1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * unescaping \u sequences. 1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 173250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString CharsToUnicodeString(const char* chars){ 173327f654740f2a26ad62a5c155af9199af9e69b889claireho return UnicodeString(chars, -1, US_INV).unescape(); 1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString ctou(const char* chars) { 1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return CharsToUnicodeString(chars); 1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define RAND_M (714025) 1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define RAND_IA (1366) 1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define RAND_IC (150889) 1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t RAND_SEED; 1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Returns a uniform random value x, with 0.0 <= x < 1.0. Use 1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * with care: Does not return all possible values; returns one of 1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 714,025 values, uniformly spaced. However, the period is 1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * effectively infinite. See: Numerical Recipes, section 7.1. 1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param seedp pointer to seed. Set *seedp to any negative value 1753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * to restart the sequence. 1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufloat IntlTest::random(int32_t* seedp) { 1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static int32_t iy, ir[98]; 1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static UBool first=TRUE; 1758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t j; 1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*seedp < 0 || first) { 1760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru first = FALSE; 1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((*seedp=(RAND_IC-(*seedp)) % RAND_M) < 0) *seedp = -(*seedp); 1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (j=1;j<=97;++j) { 1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *seedp=(RAND_IA*(*seedp)+RAND_IC) % RAND_M; 1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ir[j]=(*seedp); 1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *seedp=(RAND_IA*(*seedp)+RAND_IC) % RAND_M; 1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iy=(*seedp); 1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru j=(int32_t)(1 + 97.0*iy/RAND_M); 1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_ASSERT(j>=1 && j<=97); 1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru iy=ir[j]; 1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *seedp=(RAND_IA*(*seedp)+RAND_IC) % RAND_M; 1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ir[j]=(*seedp); 1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (float) iy/RAND_M; 1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Convenience method using a global seed. 1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufloat IntlTest::random() { 1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return random(&RAND_SEED); 1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic inline UChar toHex(int32_t i) { 1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UChar)(i + (i < 10 ? 0x30 : (0x41 - 10))); 1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UnicodeString& escape(const UnicodeString& s, UnicodeString& result) { 1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<s.length(); ++i) { 1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar c = s[i]; 1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c <= (UChar)0x7F) { 1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result += c; 1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result += (UChar)0x5c; 1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result += (UChar)0x75; 1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result += toHex((c >> 12) & 0xF); 1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result += toHex((c >> 8) & 0xF); 1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result += toHex((c >> 4) & 0xF); 1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result += toHex( c & 0xF); 1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define VERBOSE_ASSERTIONS 1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 18078393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusUBool IntlTest::assertTrue(const char* message, UBool condition, UBool quiet, UBool possibleDataError, const char *file, int line) { 18088393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (file != NULL) { 18098393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (!condition) { 18108393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (possibleDataError) { 18118393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius dataerrln("%s:%d: FAIL: assertTrue() failed: %s", file, line, message); 18128393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } else { 18138393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius errln("%s:%d: FAIL: assertTrue() failed: %s", file, line, message); 18148393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 18158393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } else if (!quiet) { 18168393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius logln("%s:%d: Ok: %s", file, line, message); 18176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 18188393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } else { 18198393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (!condition) { 18208393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (possibleDataError) { 18218393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius dataerrln("FAIL: assertTrue() failed: %s", message); 18228393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } else { 18238393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius errln("FAIL: assertTrue() failed: %s", message); 18248393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 18258393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } else if (!quiet) { 18268393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius logln("Ok: %s", message); 18278393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 18288393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return condition; 1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertFalse(const char* message, UBool condition, UBool quiet) { 1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (condition) { 1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: assertFalse() failed: %s", message); 1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (!quiet) { 1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Ok: %s", message); 1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return !condition; 1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 184259d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertSuccess(const char* message, UErrorCode ec, UBool possibleDataError, const char *file, int line) { 184359d709d503bab6e2b61931737e662dd293b40578ccornelius if( file==NULL ) { 184459d709d503bab6e2b61931737e662dd293b40578ccornelius file = ""; // prevent failure if no file given 184559d709d503bab6e2b61931737e662dd293b40578ccornelius } 1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 18476d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (possibleDataError) { 184859d709d503bab6e2b61931737e662dd293b40578ccornelius dataerrln("FAIL: %s:%d: %s (%s)", file, line, message, u_errorName(ec)); 1849c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 185059d709d503bab6e2b61931737e662dd293b40578ccornelius errcheckln(ec, "FAIL: %s:%d: %s (%s)", file, line, message, u_errorName(ec)); 1851c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 185359d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 185459d709d503bab6e2b61931737e662dd293b40578ccornelius logln("OK: %s:%d: %s - (%s)", file, line, message, u_errorName(ec)); 1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const char* message, 1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& expected, 18616d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru const UnicodeString& actual, 18626d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru UBool possibleDataError) { 1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (expected != actual) { 18646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (possibleDataError) { 18656d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln((UnicodeString)"FAIL: " + message + "; got " + 18666d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru prettify(actual) + 18676d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru "; expected " + prettify(expected)); 18686d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } else { 18696d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errln((UnicodeString)"FAIL: " + message + "; got " + 18706d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru prettify(actual) + 18716d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru "; expected " + prettify(expected)); 18726d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 1873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef VERBOSE_ASSERTIONS 1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 1877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"Ok: " + message + "; got " + prettify(actual)); 1878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 1881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const char* message, 1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* expected, 1885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* actual) { 1886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (uprv_strcmp(expected, actual) != 0) { 1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: " + message + "; got \"" + 1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru actual + 1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\"; expected \"" + expected + "\""); 1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef VERBOSE_ASSERTIONS 1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"Ok: " + message + "; got \"" + actual + "\""); 1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 1898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1900f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig CorneliusUBool IntlTest::assertEquals(const char* message, 1901f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius int32_t expected, 1902f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius int32_t actual) { 1903f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius if (expected != actual) { 1904f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius errln((UnicodeString)"FAIL: " + message + "; got " + 1905f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius actual + "=0x" + toHex(actual) + 1906f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius "; expected " + expected + "=0x" + toHex(expected)); 1907f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius return FALSE; 1908f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius } 1909f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius#ifdef VERBOSE_ASSERTIONS 1910f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius else { 1911f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius logln((UnicodeString)"Ok: " + message + "; got " + actual + "=0x" + toHex(actual)); 1912f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius } 1913f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius#endif 1914f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius return TRUE; 1915f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius} 1916f760e5e9e080f32b3afdfaea0b961ce09eb052f4Craig Cornelius 1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const char* message, 191859d709d503bab6e2b61931737e662dd293b40578ccornelius int64_t expected, 191959d709d503bab6e2b61931737e662dd293b40578ccornelius int64_t actual) { 192059d709d503bab6e2b61931737e662dd293b40578ccornelius if (expected != actual) { 192159d709d503bab6e2b61931737e662dd293b40578ccornelius errln((UnicodeString)"FAIL: " + message + "; got int64 " + 192259d709d503bab6e2b61931737e662dd293b40578ccornelius Int64ToUnicodeString(actual) + 192359d709d503bab6e2b61931737e662dd293b40578ccornelius "; expected " + Int64ToUnicodeString(expected) ); 192459d709d503bab6e2b61931737e662dd293b40578ccornelius return FALSE; 192559d709d503bab6e2b61931737e662dd293b40578ccornelius } 192659d709d503bab6e2b61931737e662dd293b40578ccornelius#ifdef VERBOSE_ASSERTIONS 192759d709d503bab6e2b61931737e662dd293b40578ccornelius else { 192859d709d503bab6e2b61931737e662dd293b40578ccornelius logln((UnicodeString)"Ok: " + message + "; got int64 " + Int64ToUnicodeString(actual)); 192959d709d503bab6e2b61931737e662dd293b40578ccornelius } 193059d709d503bab6e2b61931737e662dd293b40578ccornelius#endif 193159d709d503bab6e2b61931737e662dd293b40578ccornelius return TRUE; 193259d709d503bab6e2b61931737e662dd293b40578ccornelius} 193359d709d503bab6e2b61931737e662dd293b40578ccornelius 193459d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertEquals(const char* message, 1935c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert double expected, 1936c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert double actual) { 1937c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (expected != actual) { 1938c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln((UnicodeString)"FAIL: " + message + "; got " + 1939c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert actual + 1940c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "; expected " + expected); 1941c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return FALSE; 1942c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 1943c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#ifdef VERBOSE_ASSERTIONS 1944c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert else { 1945c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert logln((UnicodeString)"Ok: " + message + "; got " + actual); 1946c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 1947c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#endif 1948c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return TRUE; 1949c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert} 1950c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 1951c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 1952c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertUBool IntlTest::assertEquals(const char* message, 195359d709d503bab6e2b61931737e662dd293b40578ccornelius UBool expected, 195459d709d503bab6e2b61931737e662dd293b40578ccornelius UBool actual) { 1955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (expected != actual) { 1956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: " + message + "; got " + 1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru toString(actual) + 1958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "; expected " + toString(expected)); 1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef VERBOSE_ASSERTIONS 1962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 196359d709d503bab6e2b61931737e662dd293b40578ccornelius logln((UnicodeString)"Ok: " + message + "; got " + toString(actual)); 196459d709d503bab6e2b61931737e662dd293b40578ccornelius } 196559d709d503bab6e2b61931737e662dd293b40578ccornelius#endif 196659d709d503bab6e2b61931737e662dd293b40578ccornelius return TRUE; 196759d709d503bab6e2b61931737e662dd293b40578ccornelius} 196859d709d503bab6e2b61931737e662dd293b40578ccornelius 196959d709d503bab6e2b61931737e662dd293b40578ccornelius#if !UCONFIG_NO_FORMATTING 197059d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertEquals(const char* message, 197159d709d503bab6e2b61931737e662dd293b40578ccornelius const Formattable& expected, 197259d709d503bab6e2b61931737e662dd293b40578ccornelius const Formattable& actual, 197359d709d503bab6e2b61931737e662dd293b40578ccornelius UBool possibleDataError) { 197459d709d503bab6e2b61931737e662dd293b40578ccornelius if (expected != actual) { 197559d709d503bab6e2b61931737e662dd293b40578ccornelius if (possibleDataError) { 197659d709d503bab6e2b61931737e662dd293b40578ccornelius dataerrln((UnicodeString)"FAIL: " + message + "; got " + 197759d709d503bab6e2b61931737e662dd293b40578ccornelius toString(actual) + 197859d709d503bab6e2b61931737e662dd293b40578ccornelius "; expected " + toString(expected)); 197959d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 198059d709d503bab6e2b61931737e662dd293b40578ccornelius errln((UnicodeString)"FAIL: " + message + "; got " + 198159d709d503bab6e2b61931737e662dd293b40578ccornelius toString(actual) + 198259d709d503bab6e2b61931737e662dd293b40578ccornelius "; expected " + toString(expected)); 198359d709d503bab6e2b61931737e662dd293b40578ccornelius } 198459d709d503bab6e2b61931737e662dd293b40578ccornelius return FALSE; 198559d709d503bab6e2b61931737e662dd293b40578ccornelius } 198659d709d503bab6e2b61931737e662dd293b40578ccornelius#ifdef VERBOSE_ASSERTIONS 198759d709d503bab6e2b61931737e662dd293b40578ccornelius else { 1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"Ok: " + message + "; got " + toString(actual)); 1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char ASSERT_BUF[256]; 1996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* extractToAssertBuf(const UnicodeString& message) { 1998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString buf; 1999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru escape(message, buf); 2000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buf.extract(0, 0x7FFFFFFF, ASSERT_BUF, sizeof(ASSERT_BUF)-1, 0); 2001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ASSERT_BUF[sizeof(ASSERT_BUF)-1] = 0; 2002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ASSERT_BUF; 2003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertTrue(const UnicodeString& message, UBool condition, UBool quiet) { 2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return assertTrue(extractToAssertBuf(message), condition, quiet); 2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertFalse(const UnicodeString& message, UBool condition, UBool quiet) { 2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return assertFalse(extractToAssertBuf(message), condition, quiet); 2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertSuccess(const UnicodeString& message, UErrorCode ec) { 2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return assertSuccess(extractToAssertBuf(message), ec); 2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const UnicodeString& message, 2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& expected, 201959d709d503bab6e2b61931737e662dd293b40578ccornelius const UnicodeString& actual, 202059d709d503bab6e2b61931737e662dd293b40578ccornelius UBool possibleDataError) { 202159d709d503bab6e2b61931737e662dd293b40578ccornelius return assertEquals(extractToAssertBuf(message), expected, actual, possibleDataError); 2022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const UnicodeString& message, 2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* expected, 2026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* actual) { 2027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return assertEquals(extractToAssertBuf(message), expected, actual); 2028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 202959d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertEquals(const UnicodeString& message, 203059d709d503bab6e2b61931737e662dd293b40578ccornelius UBool expected, 203159d709d503bab6e2b61931737e662dd293b40578ccornelius UBool actual) { 203259d709d503bab6e2b61931737e662dd293b40578ccornelius return assertEquals(extractToAssertBuf(message), expected, actual); 203359d709d503bab6e2b61931737e662dd293b40578ccornelius} 203459d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertEquals(const UnicodeString& message, 203559d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t expected, 203659d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t actual) { 203759d709d503bab6e2b61931737e662dd293b40578ccornelius return assertEquals(extractToAssertBuf(message), expected, actual); 203859d709d503bab6e2b61931737e662dd293b40578ccornelius} 203959d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool IntlTest::assertEquals(const UnicodeString& message, 204059d709d503bab6e2b61931737e662dd293b40578ccornelius int64_t expected, 204159d709d503bab6e2b61931737e662dd293b40578ccornelius int64_t actual) { 204259d709d503bab6e2b61931737e662dd293b40578ccornelius return assertEquals(extractToAssertBuf(message), expected, actual); 2043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 2046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool IntlTest::assertEquals(const UnicodeString& message, 2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const Formattable& expected, 2048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const Formattable& actual) { 2049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return assertEquals(extractToAssertBuf(message), expected, actual); 2050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 2052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2053b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid IntlTest::setProperty(const char* propline) { 2054b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (numProps < kMaxProps) { 2055b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru proplines[numProps] = propline; 2056b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2057b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru numProps++; 2058b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 2059b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 2060b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruconst char* IntlTest::getProperty(const char* prop) { 2061b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const char* val = NULL; 2062b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for (int32_t i = 0; i < numProps; i++) { 2063b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t plen = uprv_strlen(prop); 2064b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ((int32_t)uprv_strlen(proplines[i]) > plen + 1 2065b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru && proplines[i][plen] == '=' 2066b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru && uprv_strncmp(proplines[i], prop, plen) == 0) { 2067b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru val = &(proplines[i][plen+1]); 2068b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru break; 2069b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2070b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2071b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return val; 2072b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 2073b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 2074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Hey, Emacs, please set the following: 2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Local Variables: 2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * indent-tabs-mode: nil 2079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * End: 2080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2082