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