1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru********************************************************************** 354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius* Copyright (C) 2002-2012, International Business Machines 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru********************************************************************** 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* file name: iotest.cpp 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* encoding: US-ASCII 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* tab size: 8 (not used) 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* indentation:4 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* created on: 2002feb21 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* created by: George Rhoten 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustdio.h" 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uclean.h" 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucnv.h" 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/unistr.h" 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ustr_cnv.h" 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "iotest.h" 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/tstdtmod.h" 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "putilimp.h" 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h> 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h> 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass DataDrivenLogger : public TestLog { 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* fgDataDir; 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static char *fgTestDataPath; 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static void cleanUp() { 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fgTestDataPath) { 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(fgTestDataPath); 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fgTestDataPath = NULL; 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void errln( const UnicodeString &message ) { 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char buffer[4000]; 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru message.extract(0, message.length(), buffer, sizeof(buffer)); 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[3999] = 0; /* NULL terminate */ 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err(buffer); 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 4950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho virtual void logln( const UnicodeString &message ) { 5050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho char buffer[4000]; 5150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho message.extract(0, message.length(), buffer, sizeof(buffer)); 5250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho buffer[3999] = 0; /* NULL terminate */ 5350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_info(buffer); 5450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 5550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 56c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru virtual void dataerrln( const UnicodeString &message ) { 57c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru char buffer[4000]; 58c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru message.extract(0, message.length(), buffer, sizeof(buffer)); 59c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru buffer[3999] = 0; /* NULL terminate */ 60c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_data_err(buffer); 61c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char * pathToDataDirectory(void) 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(fgDataDir != NULL) { 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fgDataDir; 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* U_TOPSRCDIR is set by the makefiles on UNIXes when building cintltst and intltst 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // to point to the top of the build hierarchy, which may or 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // may not be the same as the source directory, depending on 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // the configure options used. At any rate, 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // set the data path to the built data from this directory. 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // The value is complete with quotes, so it can be used 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // as-is as a string constant. 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru #if defined (U_TOPSRCDIR) 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fgDataDir = U_TOPSRCDIR U_FILE_SEP_STRING "data" U_FILE_SEP_STRING; 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru #else 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* On Windows, the file name obtained from __FILE__ includes a full path. 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This file is "wherever\icu\source\test\cintltst\cintltst.c" 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Change to "wherever\icu\source\data" 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static char p[sizeof(__FILE__) + 10]; 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *pBackSlash; 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcpy(p, __FILE__); 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* We want to back over three '\' chars. */ 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Only Windows should end up here, so looking for '\' is safe. */ 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=1; i<=3; i++) { 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pBackSlash = strrchr(p, U_FILE_SEP_CHAR); 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pBackSlash != NULL) { 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *pBackSlash = 0; /* Truncate the string at the '\' */ 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pBackSlash != NULL) { 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* We found and truncated three names from the path. 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Now append "source\data" and set the environment 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcpy(pBackSlash, U_FILE_SEP_STRING "data" U_FILE_SEP_STRING ); 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fgDataDir = p; 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* __FILE__ on MSVC7 does not contain the directory */ 11254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius FILE *file = fopen(".." U_FILE_SEP_STRING".." U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "Makefile.in", "r"); 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (file) { 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fclose(file); 11554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius fgDataDir = ".." U_FILE_SEP_STRING".." U_FILE_SEP_STRING "data" U_FILE_SEP_STRING; 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 11854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius fgDataDir = ".." U_FILE_SEP_STRING".." U_FILE_SEP_STRING".." U_FILE_SEP_STRING".." U_FILE_SEP_STRING "data" U_FILE_SEP_STRING; 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru #endif 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fgDataDir; 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* loadTestData(UErrorCode& err){ 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( fgTestDataPath == NULL){ 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* directory=NULL; 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UResourceBundle* test =NULL; 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char* tdpath=NULL; 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* tdrelativepath; 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined (U_TOPBUILDDIR) 13654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius tdrelativepath = "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING; 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru directory = U_TOPBUILDDIR; 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 13954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius tdrelativepath = ".." U_FILE_SEP_STRING "test" U_FILE_SEP_STRING "testdata" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING; 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru directory = pathToDataDirectory(); 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tdpath = (char*) malloc(sizeof(char) *(( strlen(directory) * strlen(tdrelativepath)) + 100)); 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* u_getDataDirectory shoul return \source\data ... set the 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * directory to ..\source\data\..\test\testdata\out\testdata 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcpy(tdpath, directory); 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(tdpath, tdrelativepath); 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(tdpath,"testdata"); 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test=ures_open(tdpath, "testtypes", &err); 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(err)){ 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_FILE_ACCESS_ERROR; 157c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_data_err("Could not load testtypes.res in testdata bundle with path %s - %s\n", tdpath, u_errorName(err)); 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return ""; 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_close(test); 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fgTestDataPath = tdpath; 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fgTestDataPath; 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual const char* getTestDataPath(UErrorCode& err) { 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return loadTestData(err); 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char* DataDrivenLogger::fgDataDir = NULL; 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruchar* DataDrivenLogger::fgTestDataPath = NULL; 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 17454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_FILE_IO 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int64_t 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuto64(const UChar *buffer) 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int64_t result = 0; 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* iterate through buffer */ 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(*buffer) { 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* read the next digit */ 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result *= 16; 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!u_isxdigit(*buffer)) { 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("\\u%04X is not a valid hex digit for this test\n", (UChar)*buffer); 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result += *buffer - 0x0030 - (*buffer >= 0x0041 ? (*buffer >= 0x0061 ? 39 : 7) : 0); 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer++; 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 19154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_BEGIN 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void U_CALLCONV DataDrivenPrintf(void) 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 19650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_FILE_IO 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestDataModule *dataModule; 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestData *testData; 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const DataMap *testCase; 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DataDrivenLogger logger; 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar uBuffer[512]; 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char cBuffer[512]; 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char cFormat[sizeof(cBuffer)]; 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char cExpected[sizeof(cBuffer)]; 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString tempStr; 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar format[512]; 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar expectedResult[512]; 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar argument[512]; 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int8_t i8; 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int16_t i16; 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i32; 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int64_t i64; 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double dbl; 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t uBufferLenReturned; 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *fileLocale = "en_US_POSIX"; 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t uFileBufferLenReturned; 22050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUFILEPointer testFile; 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dataModule=TestDataModule::getTestDataModule("icuio", logger, errorCode); 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(errorCode)) { 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testData=dataModule->createTestData("printf", errorCode); 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(errorCode)) { 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; testData->nextCase(testCase, errorCode); ++i) { 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error retrieving icuio/printf test case %d - %s\n", 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, u_errorName(errorCode)); 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 23450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho testFile.adoptInstead(u_fopen(STANDARD_TEST_FILE, "w", fileLocale, "UTF-8")); 23550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (testFile.isNull()) { 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Can't open test file - %s\n", 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru STANDARD_TEST_FILE); 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_memset(uBuffer, 0x2A, sizeof(uBuffer)/sizeof(uBuffer[0])); 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBuffer[sizeof(uBuffer)/sizeof(uBuffer[0])-1] = 0; 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempStr=testCase->getString("format", errorCode); 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempStr.extract(format, sizeof(format)/sizeof(format[0]), errorCode); 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempStr=testCase->getString("result", errorCode); 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempStr.extract(expectedResult, sizeof(expectedResult)/sizeof(expectedResult[0]), errorCode); 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempStr=testCase->getString("argument", errorCode); 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempStr.extract(argument, sizeof(argument)/sizeof(argument[0]), errorCode); 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cBuffer, format, sizeof(cBuffer)); 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error retrieving icuio/printf test case %d - %s\n", 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, u_errorName(errorCode)); 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Test %d: format=\"%s\"\n", i, cBuffer); 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (testCase->getString("argumentType", errorCode)[0]) { 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x64: // 'd' double 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dbl = atof(u_austrcpy(cBuffer, argument)); 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sprintf_u(uBuffer, format, dbl); 26050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uFileBufferLenReturned = u_fprintf_u(testFile.getAlias(), format, dbl); 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x31: // '1' int8_t 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i8 = (int8_t)uto64(argument); 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sprintf_u(uBuffer, format, i8); 26550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uFileBufferLenReturned = u_fprintf_u(testFile.getAlias(), format, i8); 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x32: // '2' int16_t 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i16 = (int16_t)uto64(argument); 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sprintf_u(uBuffer, format, i16); 27050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uFileBufferLenReturned = u_fprintf_u(testFile.getAlias(), format, i16); 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x34: // '4' int32_t 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i32 = (int32_t)uto64(argument); 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sprintf_u(uBuffer, format, i32); 27550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uFileBufferLenReturned = u_fprintf_u(testFile.getAlias(), format, i32); 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x38: // '8' int64_t 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i64 = uto64(argument); 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sprintf_u(uBuffer, format, i64); 28050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uFileBufferLenReturned = u_fprintf_u(testFile.getAlias(), format, i64); 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x73: // 's' char * 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cBuffer, argument, sizeof(cBuffer)); 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sprintf_u(uBuffer, format, cBuffer); 28550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uFileBufferLenReturned = u_fprintf_u(testFile.getAlias(), format, cBuffer); 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x53: // 'S' UChar * 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sprintf_u(uBuffer, format, argument); 28950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uFileBufferLenReturned = u_fprintf_u(testFile.getAlias(), format, argument); 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = 0; 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uFileBufferLenReturned = 0; 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Unknown type %c for test %d\n", testCase->getString("argumentType", errorCode)[0], i); 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcmp(uBuffer, expectedResult) != 0) { 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cFormat, format, sizeof(cFormat)); 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cExpected, expectedResult, sizeof(cExpected)); 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cBuffer[sizeof(cBuffer)-1] = 0; 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAILURE string test case %d \"%s\" - Got: \"%s\" Expected: \"%s\"\n", 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, cFormat, cBuffer, cExpected); 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (uBufferLenReturned <= 0) { 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAILURE test case %d - \"%s\" is an empty string.\n", 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, cBuffer); 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (uBuffer[uBufferLenReturned-1] == 0 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || uBuffer[uBufferLenReturned] != 0 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || uBuffer[uBufferLenReturned+1] != 0x2A 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || uBuffer[uBufferLenReturned+2] != 0x2A) 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cBuffer[sizeof(cBuffer)-1] = 0; 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAILURE test case %d - \"%s\" wrong amount of characters was written. Got %d.\n", 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, cBuffer, uBufferLenReturned); 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 31850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho testFile.adoptInstead(u_fopen(STANDARD_TEST_FILE, "r", fileLocale, "UTF-8")); 31950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (testFile.isNull()) { 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Can't open test file - %s\n", 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru STANDARD_TEST_FILE); 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBuffer[0]=0; 32450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_fgets(uBuffer, sizeof(uBuffer)/sizeof(uBuffer[0]), testFile.getAlias()); 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcmp(uBuffer, expectedResult) != 0) { 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cFormat, format, sizeof(cFormat)); 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cExpected, expectedResult, sizeof(cExpected)); 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cBuffer[sizeof(cBuffer)-1] = 0; 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAILURE file test case %d \"%s\" - Got: \"%s\" Expected: \"%s\"\n", 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, cFormat, cBuffer, cExpected); 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (uFileBufferLenReturned != uBufferLenReturned) 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cBuffer[sizeof(cBuffer)-1] = 0; 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAILURE uFileBufferLenReturned(%d) != uBufferLenReturned(%d)\n", 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uFileBufferLenReturned, uBufferLenReturned); 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error running icuio/printf test case %d - %s\n", 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, u_errorName(errorCode)); 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete testData; 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete dataModule; 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 353c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_data_err("Failed: could not load test icuio data\n"); 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_END 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_BEGIN 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void U_CALLCONV DataDrivenScanf(void) 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 36250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_FILE_IO 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestDataModule *dataModule; 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestData *testData; 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const DataMap *testCase; 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DataDrivenLogger logger; 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar uBuffer[512]; 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char cBuffer[512]; 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char cExpected[sizeof(cBuffer)]; 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString tempStr; 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar format[512]; 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar expectedResult[512]; 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar argument[512]; 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int8_t i8, expected8; 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int16_t i16, expected16; 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i32, expected32; 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int64_t i64, expected64; 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double dbl, expectedDbl; 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru volatile float flt, expectedFlt; // Use volatile in order to get around an Intel compiler issue. 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t uBufferLenReturned; 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //const char *fileLocale = "en_US_POSIX"; 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //int32_t uFileBufferLenReturned; 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //UFILE *testFile; 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dataModule=TestDataModule::getTestDataModule("icuio", logger, errorCode); 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(errorCode)) { 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testData=dataModule->createTestData("scanf", errorCode); 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(errorCode)) { 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; testData->nextCase(testCase, errorCode); ++i) { 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error retrieving icuio/printf test case %d - %s\n", 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, u_errorName(errorCode)); 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* testFile = u_fopen(STANDARD_TEST_FILE, "w", fileLocale, "UTF-8"); 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!testFile) { 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Can't open test file - %s\n", 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru STANDARD_TEST_FILE); 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_memset(uBuffer, 0x2A, sizeof(uBuffer)/sizeof(uBuffer[0])); 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBuffer[sizeof(uBuffer)/sizeof(uBuffer[0])-1] = 0; 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempStr=testCase->getString("format", errorCode); 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempStr.extract(format, sizeof(format)/sizeof(format[0]), errorCode); 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempStr=testCase->getString("result", errorCode); 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempStr.extract(expectedResult, sizeof(expectedResult)/sizeof(expectedResult[0]), errorCode); 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempStr=testCase->getString("argument", errorCode); 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempStr.extract(argument, sizeof(argument)/sizeof(argument[0]), errorCode); 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cBuffer, format, sizeof(cBuffer)); 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error retrieving icuio/printf test case %d - %s\n", 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, u_errorName(errorCode)); 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Test %d: format=\"%s\"\n", i, cBuffer); 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (testCase->getString("argumentType", errorCode)[0]) { 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x64: // 'd' double 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedDbl = atof(u_austrcpy(cBuffer, expectedResult)); 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sscanf_u(argument, format, &dbl); 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //uFileBufferLenReturned = u_fscanf_u(testFile, format, dbl); 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (dbl != expectedDbl) { 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error in scanf test case[%d] Got: %f Exp: %f\n", 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, dbl, expectedDbl); 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x66: // 'f' float 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedFlt = (float)atof(u_austrcpy(cBuffer, expectedResult)); 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sscanf_u(argument, format, &flt); 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //uFileBufferLenReturned = u_fscanf_u(testFile, format, flt); 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (flt != expectedFlt) { 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error in scanf test case[%d] Got: %f Exp: %f\n", 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, flt, expectedFlt); 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x31: // '1' int8_t 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expected8 = (int8_t)uto64(expectedResult); 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sscanf_u(argument, format, &i8); 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //uFileBufferLenReturned = u_fscanf_u(testFile, format, i8); 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i8 != expected8) { 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error in scanf test case[%d] Got: %02X Exp: %02X\n", 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, i8, expected8); 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x32: // '2' int16_t 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expected16 = (int16_t)uto64(expectedResult); 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sscanf_u(argument, format, &i16); 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //uFileBufferLenReturned = u_fscanf_u(testFile, format, i16); 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i16 != expected16) { 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error in scanf test case[%d] Got: %04X Exp: %04X\n", 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, i16, expected16); 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x34: // '4' int32_t 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expected32 = (int32_t)uto64(expectedResult); 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sscanf_u(argument, format, &i32); 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //uFileBufferLenReturned = u_fscanf_u(testFile, format, i32); 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i32 != expected32) { 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error in scanf test case[%d] Got: %08X Exp: %08X\n", 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, i32, expected32); 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x38: // '8' int64_t 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expected64 = uto64(expectedResult); 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sscanf_u(argument, format, &i64); 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //uFileBufferLenReturned = u_fscanf_u(testFile, format, i64); 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i64 != expected64) { 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error in scanf 64-bit. Test case = %d\n", i); 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x73: // 's' char * 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrcpy(cExpected, expectedResult); 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sscanf_u(argument, format, cBuffer); 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //uFileBufferLenReturned = u_fscanf_u(testFile, format, cBuffer); 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (strcmp(cBuffer, cExpected) != 0) { 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error in scanf char * string. Got \"%s\" Expected \"%s\". Test case = %d\n", cBuffer, cExpected, i); 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x53: // 'S' UChar * 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sscanf_u(argument, format, uBuffer); 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //uFileBufferLenReturned = u_fscanf_u(testFile, format, argument); 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcmp(uBuffer, expectedResult) != 0) { 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrcpy(cExpected, format); 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrcpy(cBuffer, uBuffer); 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error in scanf UChar * string %s Got: \"%s\". Test case = %d\n", cExpected, cBuffer, i); 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = 0; 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //uFileBufferLenReturned = 0; 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Unknown type %c for test %d\n", testCase->getString("argumentType", errorCode)[0], i); 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (uBufferLenReturned != 1) { 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error scanf converted %d arguments. Test case = %d\n", uBufferLenReturned, i); 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* if (u_strcmp(uBuffer, expectedResult) != 0) { 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cFormat, format, sizeof(cFormat)); 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cExpected, expectedResult, sizeof(cExpected)); 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cBuffer[sizeof(cBuffer)-1] = 0; 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAILURE string test case %d \"%s\" - Got: \"%s\" Expected: \"%s\"\n", 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, cFormat, cBuffer, cExpected); 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (uBuffer[uBufferLenReturned-1] == 0 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || uBuffer[uBufferLenReturned] != 0 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || uBuffer[uBufferLenReturned+1] != 0x2A 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || uBuffer[uBufferLenReturned+2] != 0x2A) 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cBuffer[sizeof(cBuffer)-1] = 0; 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAILURE test case %d - \"%s\" wrong amount of characters was written. Got %d.\n", 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, cBuffer, uBufferLenReturned); 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* u_fclose(testFile); 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testFile = u_fopen(STANDARD_TEST_FILE, "r", fileLocale, "UTF-8"); 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!testFile) { 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Can't open test file - %s\n", 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru STANDARD_TEST_FILE); 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBuffer[0]; 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_fgets(uBuffer, sizeof(uBuffer)/sizeof(uBuffer[0]), testFile); 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcmp(uBuffer, expectedResult) != 0) { 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cFormat, format, sizeof(cFormat)); 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cExpected, expectedResult, sizeof(cExpected)); 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cBuffer[sizeof(cBuffer)-1] = 0; 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAILURE file test case %d \"%s\" - Got: \"%s\" Expected: \"%s\"\n", 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, cFormat, cBuffer, cExpected); 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (uFileBufferLenReturned != uBufferLenReturned) 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cBuffer[sizeof(cBuffer)-1] = 0; 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAILURE uFileBufferLenReturned(%d) != uBufferLenReturned(%d)\n", 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uFileBufferLenReturned, uBufferLenReturned); 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error running icuio/printf test case %d - %s\n", 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, u_errorName(errorCode)); 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// u_fclose(testFile); 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete testData; 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete dataModule; 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 555c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_data_err("Failed: could not load test icuio data\n"); 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_END 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_BEGIN 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void U_CALLCONV DataDrivenPrintfPrecision(void) 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 56450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_FILE_IO 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestDataModule *dataModule; 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestData *testData; 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const DataMap *testCase; 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DataDrivenLogger logger; 570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar uBuffer[512]; 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char cBuffer[512]; 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char cFormat[sizeof(cBuffer)]; 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char cExpected[sizeof(cBuffer)]; 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString tempStr; 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar format[512]; 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar expectedResult[512]; 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar argument[512]; 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t precision; 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int8_t i8; 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int16_t i16; 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i32; 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int64_t i64; 584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double dbl; 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t uBufferLenReturned; 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dataModule=TestDataModule::getTestDataModule("icuio", logger, errorCode); 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(errorCode)) { 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testData=dataModule->createTestData("printfPrecision", errorCode); 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(errorCode)) { 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i=0; testData->nextCase(testCase, errorCode); ++i) { 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error retrieving icuio/printf test case %d - %s\n", 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, u_errorName(errorCode)); 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_memset(uBuffer, 0x2A, sizeof(uBuffer)/sizeof(uBuffer[0])); 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBuffer[sizeof(uBuffer)/sizeof(uBuffer[0])-1] = 0; 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempStr=testCase->getString("format", errorCode); 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempStr.extract(format, sizeof(format)/sizeof(format[0]), errorCode); 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempStr=testCase->getString("result", errorCode); 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempStr.extract(expectedResult, sizeof(expectedResult)/sizeof(expectedResult[0]), errorCode); 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempStr=testCase->getString("argument", errorCode); 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempStr.extract(argument, sizeof(argument)/sizeof(argument[0]), errorCode); 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru precision=testCase->getInt28("precision", errorCode); 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cBuffer, format, sizeof(cBuffer)); 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error retrieving icuio/printf test case %d - %s\n", 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, u_errorName(errorCode)); 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Test %d: format=\"%s\"\n", i, cBuffer); 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (testCase->getString("argumentType", errorCode)[0]) { 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x64: // 'd' double 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dbl = atof(u_austrcpy(cBuffer, argument)); 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sprintf_u(uBuffer, format, precision, dbl); 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x31: // '1' int8_t 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i8 = (int8_t)uto64(argument); 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sprintf_u(uBuffer, format, precision, i8); 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x32: // '2' int16_t 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i16 = (int16_t)uto64(argument); 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sprintf_u(uBuffer, format, precision, i16); 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x34: // '4' int32_t 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i32 = (int32_t)uto64(argument); 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sprintf_u(uBuffer, format, precision, i32); 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x38: // '8' int64_t 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i64 = uto64(argument); 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sprintf_u(uBuffer, format, precision, i64); 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x73: // 's' char * 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sprintf_u(uBuffer, format, precision, cBuffer); 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x53: // 'S' UChar * 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = u_sprintf_u(uBuffer, format, precision, argument); 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uBufferLenReturned = 0; 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Unknown type %c for test %d\n", testCase->getString("argumentType", errorCode)[0], i); 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strcmp(uBuffer, expectedResult) != 0) { 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cFormat, format, sizeof(cFormat)); 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cExpected, expectedResult, sizeof(cExpected)); 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cBuffer[sizeof(cBuffer)-1] = 0; 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAILURE test case %d \"%s\" - Got: \"%s\" Expected: \"%s\"\n", 654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, cFormat, cBuffer, cExpected); 655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (uBufferLenReturned <= 0) { 657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAILURE test case %d - \"%s\" is an empty string.\n", 658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, cBuffer); 659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (uBuffer[uBufferLenReturned-1] == 0 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || uBuffer[uBufferLenReturned] != 0 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || uBuffer[uBufferLenReturned+1] != 0x2A 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || uBuffer[uBufferLenReturned+2] != 0x2A) 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(cBuffer, uBuffer, sizeof(cBuffer)); 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cBuffer[sizeof(cBuffer)-1] = 0; 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("FAILURE test case %d - \"%s\" wrong amount of characters was written. Got %d.\n", 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, cBuffer, uBufferLenReturned); 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode)) { 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("error running icuio/printf test case %d - %s\n", 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i, u_errorName(errorCode)); 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete testData; 678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete dataModule; 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 682c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_data_err("Failed: could not load test icuio data\n"); 683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_END 687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void addAllTests(TestNode** root) { 689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addFileTest(root); 690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addStringTest(root); 691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTranslitTest(root); 692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 69350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_LEGACY_CONVERSION 694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &DataDrivenPrintf, "datadriv/DataDrivenPrintf"); 695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &DataDrivenPrintfPrecision, "datadriv/DataDrivenPrintfPrecision"); 696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &DataDrivenScanf, "datadriv/DataDrivenScanf"); 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 698103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_IOSTREAM_SOURCE >= 199711 699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addStreamTests(root); 700b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#endif 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* returns the path to icu/source/data/out */ 704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char *ctest_dataOutDir() 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char *dataOutDir = NULL; 707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(dataOutDir) { 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return dataOutDir; 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* U_TOPBUILDDIR is set by the makefiles on UNIXes when building cintltst and intltst 713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // to point to the top of the build hierarchy, which may or 714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // may not be the same as the source directory, depending on 715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // the configure options used. At any rate, 716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // set the data path to the built data from this directory. 717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // The value is complete with quotes, so it can be used 718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // as-is as a string constant. 719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined (U_TOPBUILDDIR) 721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 72254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius dataOutDir = U_TOPBUILDDIR "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING; 723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* On Windows, the file name obtained from __FILE__ includes a full path. 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This file is "wherever\icu\source\test\cintltst\cintltst.c" 728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Change to "wherever\icu\source\data" 729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static char p[sizeof(__FILE__) + 20]; 732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *pBackSlash; 733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcpy(p, __FILE__); 736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* We want to back over three '\' chars. */ 737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Only Windows should end up here, so looking for '\' is safe. */ 738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=1; i<=3; i++) { 739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pBackSlash = strrchr(p, U_FILE_SEP_CHAR); 740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pBackSlash != NULL) { 741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *pBackSlash = 0; /* Truncate the string at the '\' */ 742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pBackSlash != NULL) { 746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* We found and truncated three names from the path. 747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Now append "source\data" and set the environment 748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcpy(pBackSlash, U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING); 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dataOutDir = p; 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* __FILE__ on MSVC7 does not contain the directory */ 75454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius FILE *file = fopen(".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "Makefile.in", "r"); 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (file) { 756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fclose(file); 75754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius dataOutDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING; 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 76054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius dataOutDir = ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING ".." U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING; 761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return dataOutDir; 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* ctest_setICU_DATA - if the ICU_DATA environment variable is not already 770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * set, try to deduce the directory in which ICU was built, 771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and set ICU_DATA to "icu/source/data" in that location. 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The intent is to allow the tests to have a good chance 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * of running without requiring that the user manually set 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ICU_DATA. Common data isn't a problem, since it is 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * picked up via a static (build time) reference, but the 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * tests dynamically load some data. 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void ctest_setICU_DATA() { 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* No location for the data dir was identifiable. 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Add other fallbacks for the test data location here if the need arises 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (getenv("ICU_DATA") == NULL) { 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* If ICU_DATA isn't set, set it to the usual location */ 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_setDataDirectory(ctest_dataOutDir()); 786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 789c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruU_CDECL_BEGIN 790c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/* 791c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * Note: this assumes that context is a pointer to STANDARD_TEST_FILE. It would be 792c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * cleaner to define an acutal context with a string pointer in it and set STANDARD_TEST_FILE 793c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * after the call to initArgs()... 794c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 795c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic int U_CALLCONV argHandler(int arg, int /*argc*/, const char * const argv[], void *context) 796c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 797c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const char **str = (const char **) context; 798c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 799c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (argv[arg][0] != '/' && argv[arg][0] != '-') { 800c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru *str = argv[arg]; 801c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return 1; 802c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 803c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 804c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return 0; 805c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 806c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruU_CDECL_END 807c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint main(int argc, char* argv[]) 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t nerrors = 0; 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestNode *root = NULL; 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode = U_ZERO_ERROR; 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate startTime, endTime; 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t diffTime; 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 81627f654740f2a26ad62a5c155af9199af9e69b889claireho startTime = uprv_getRawUTCtime(); 817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Check whether ICU will initialize without forcing the build data directory into 819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the ICU_DATA path. Success here means either the data dll contains data, or that 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * this test program was run with ICU_DATA set externally. Failure of this check 821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * is normal when ICU data is not packaged into a shared library. 822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Whether or not this test succeeds, we want to cleanup and reinitialize 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * with a data path so that data loading from individual files can be tested. 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_init(&errorCode); 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(errorCode)) { 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "#### Note: ICU Init without build-specific setDataDirectory() failed.\n"); 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_cleanup(); 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode = U_ZERO_ERROR; 833c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (!initArgs(argc, argv, argHandler, (void *) &STANDARD_TEST_FILE)) { 834c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* Error already displayed. */ 835c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return -1; 836c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Initialize ICU */ 839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ctest_setICU_DATA(); /* u_setDataDirectory() must happen Before u_init() */ 840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_init(&errorCode); 841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(errorCode)) { 842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, 843b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "#### ERROR! %s: u_init() failed with status = \"%s\".\n" 844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "*** Check the ICU_DATA environment variable and \n" 845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "*** check that the data files are present.\n", argv[0], u_errorName(errorCode)); 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 1; 847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stdout, "Default charset for this run is %s\n", ucnv_getDefaultName()); 850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addAllTests(&root); 852c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru nerrors = runTestRequest(root, argc, argv); 853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 1 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FILE* fileToRemove = fopen(STANDARD_TEST_FILE, "r"); 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* This should delete any temporary files. */ 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fileToRemove) { 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fclose(fileToRemove); 86027f654740f2a26ad62a5c155af9199af9e69b889claireho log_verbose("Deleting: %s\n", STANDARD_TEST_FILE); 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (remove(STANDARD_TEST_FILE) != 0) { 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Maybe someone didn't close the file correctly. */ 863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, "FAIL: Could not delete %s\n", STANDARD_TEST_FILE); 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nerrors += 1; 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cleanUpTestTree(root); 871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DataDrivenLogger::cleanUp(); 872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_cleanup(); 873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 87427f654740f2a26ad62a5c155af9199af9e69b889claireho endTime = uprv_getRawUTCtime(); 875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru diffTime = (int32_t)(endTime - startTime); 876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("Elapsed Time: %02d:%02d:%02d.%03d\n", 877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (int)((diffTime%U_MILLIS_PER_DAY)/U_MILLIS_PER_HOUR), 878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (int)((diffTime%U_MILLIS_PER_HOUR)/U_MILLIS_PER_MINUTE), 879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (int)((diffTime%U_MILLIS_PER_MINUTE)/U_MILLIS_PER_SECOND), 880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (int)(diffTime%U_MILLIS_PER_SECOND)); 881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return nerrors; 883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 884