OLD | NEW |
(Empty) | |
| 1 /******************************************************************** |
| 2 * COPYRIGHT: |
| 3 * Copyright (c) 2002-2010, International Business Machines Corporation and |
| 4 * others. All Rights Reserved. |
| 5 ********************************************************************/ |
| 6 |
| 7 /* Created by weiv 05/09/2002 */ |
| 8 |
| 9 #include <stdarg.h> |
| 10 |
| 11 #include "unicode/tstdtmod.h" |
| 12 #include "cmemory.h" |
| 13 #include <stdio.h> |
| 14 |
| 15 TestLog::~TestLog() {} |
| 16 |
| 17 IcuTestErrorCode::~IcuTestErrorCode() { |
| 18 // Safe because our handleFailure() does not throw exceptions. |
| 19 if(isFailure()) { handleFailure(); } |
| 20 } |
| 21 |
| 22 UBool IcuTestErrorCode::logIfFailureAndReset(const char *fmt, ...) { |
| 23 if(isFailure()) { |
| 24 char buffer[4000]; |
| 25 va_list ap; |
| 26 va_start(ap, fmt); |
| 27 vsprintf(buffer, fmt, ap); |
| 28 va_end(ap); |
| 29 UnicodeString msg(testName, -1, US_INV); |
| 30 msg.append(UNICODE_STRING_SIMPLE(" failure: ")).append(UnicodeString(err
orName(), -1, US_INV)); |
| 31 msg.append(UNICODE_STRING_SIMPLE(" - ")).append(UnicodeString(buffer, -1
, US_INV)); |
| 32 testClass.errln(msg); |
| 33 reset(); |
| 34 return TRUE; |
| 35 } else { |
| 36 reset(); |
| 37 return FALSE; |
| 38 } |
| 39 } |
| 40 |
| 41 UBool IcuTestErrorCode::logDataIfFailureAndReset(const char *fmt, ...) { |
| 42 if(isFailure()) { |
| 43 char buffer[4000]; |
| 44 va_list ap; |
| 45 va_start(ap, fmt); |
| 46 vsprintf(buffer, fmt, ap); |
| 47 va_end(ap); |
| 48 UnicodeString msg(testName, -1, US_INV); |
| 49 msg.append(UNICODE_STRING_SIMPLE(" failure: ")).append(UnicodeString(err
orName(), -1, US_INV)); |
| 50 msg.append(UNICODE_STRING_SIMPLE(" - ")).append(UnicodeString(buffer, -1
, US_INV)); |
| 51 testClass.dataerrln(msg); |
| 52 reset(); |
| 53 return TRUE; |
| 54 } else { |
| 55 reset(); |
| 56 return FALSE; |
| 57 } |
| 58 } |
| 59 |
| 60 void IcuTestErrorCode::handleFailure() const { |
| 61 // testClass.errln("%s failure - %s", testName, errorName()); |
| 62 UnicodeString msg(testName, -1, US_INV); |
| 63 msg.append(UNICODE_STRING_SIMPLE(" failure: ")).append(UnicodeString(errorNa
me(), -1, US_INV)); |
| 64 |
| 65 if (get() == U_MISSING_RESOURCE_ERROR) { |
| 66 testClass.dataerrln(msg); |
| 67 } else { |
| 68 testClass.errln(msg); |
| 69 } |
| 70 } |
| 71 |
| 72 TestDataModule *TestDataModule::getTestDataModule(const char* name, TestLog& log
, UErrorCode &status) |
| 73 { |
| 74 if(U_FAILURE(status)) { |
| 75 return NULL; |
| 76 } |
| 77 TestDataModule *result = NULL; |
| 78 |
| 79 // TODO: probe for resource bundle and then for XML. |
| 80 // According to that, construct an appropriate driver object |
| 81 |
| 82 result = new RBTestDataModule(name, log, status); |
| 83 if(U_SUCCESS(status)) { |
| 84 return result; |
| 85 } else { |
| 86 delete result; |
| 87 return NULL; |
| 88 } |
| 89 } |
| 90 |
| 91 TestDataModule::TestDataModule(const char* name, TestLog& log, UErrorCode& /*sta
tus*/) |
| 92 : testName(name), |
| 93 fInfo(NULL), |
| 94 fLog(log) |
| 95 { |
| 96 } |
| 97 |
| 98 TestDataModule::~TestDataModule() { |
| 99 if(fInfo != NULL) { |
| 100 delete fInfo; |
| 101 } |
| 102 } |
| 103 |
| 104 const char * TestDataModule::getName() const |
| 105 { |
| 106 return testName; |
| 107 } |
| 108 |
| 109 |
| 110 |
| 111 RBTestDataModule::~RBTestDataModule() |
| 112 { |
| 113 ures_close(fTestData); |
| 114 ures_close(fModuleBundle); |
| 115 ures_close(fInfoRB); |
| 116 uprv_free(tdpath); |
| 117 } |
| 118 |
| 119 RBTestDataModule::RBTestDataModule(const char* name, TestLog& log, UErrorCode& s
tatus) |
| 120 : TestDataModule(name, log, status), |
| 121 fModuleBundle(NULL), |
| 122 fTestData(NULL), |
| 123 fInfoRB(NULL), |
| 124 tdpath(NULL) |
| 125 { |
| 126 fNumberOfTests = 0; |
| 127 fDataTestValid = TRUE; |
| 128 fModuleBundle = getTestBundle(name, status); |
| 129 if(fDataTestValid) { |
| 130 fTestData = ures_getByKey(fModuleBundle, "TestData", NULL, &status); |
| 131 fNumberOfTests = ures_getSize(fTestData); |
| 132 fInfoRB = ures_getByKey(fModuleBundle, "Info", NULL, &status); |
| 133 if(status != U_ZERO_ERROR) { |
| 134 log.errln(UNICODE_STRING_SIMPLE("Unable to initalize test data - missing m
andatory description resources!")); |
| 135 fDataTestValid = FALSE; |
| 136 } else { |
| 137 fInfo = new RBDataMap(fInfoRB, status); |
| 138 } |
| 139 } |
| 140 } |
| 141 |
| 142 UBool RBTestDataModule::getInfo(const DataMap *& info, UErrorCode &/*status*/) c
onst |
| 143 { |
| 144 info = fInfo; |
| 145 if(fInfo) { |
| 146 return TRUE; |
| 147 } else { |
| 148 return FALSE; |
| 149 } |
| 150 } |
| 151 |
| 152 TestData* RBTestDataModule::createTestData(int32_t index, UErrorCode &status) co
nst |
| 153 { |
| 154 TestData *result = NULL; |
| 155 UErrorCode intStatus = U_ZERO_ERROR; |
| 156 |
| 157 if(fDataTestValid == TRUE) { |
| 158 // Both of these resources get adopted by a TestData object. |
| 159 UResourceBundle *DataFillIn = ures_getByIndex(fTestData, index, NULL, &statu
s); |
| 160 UResourceBundle *headers = ures_getByKey(fInfoRB, "Headers", NULL, &intStatu
s); |
| 161 |
| 162 if(U_SUCCESS(status)) { |
| 163 result = new RBTestData(DataFillIn, headers, status); |
| 164 |
| 165 if(U_SUCCESS(status)) { |
| 166 return result; |
| 167 } else { |
| 168 delete result; |
| 169 } |
| 170 } else { |
| 171 ures_close(DataFillIn); |
| 172 ures_close(headers); |
| 173 } |
| 174 } else { |
| 175 status = U_MISSING_RESOURCE_ERROR; |
| 176 } |
| 177 return NULL; |
| 178 } |
| 179 |
| 180 TestData* RBTestDataModule::createTestData(const char* name, UErrorCode &status)
const |
| 181 { |
| 182 TestData *result = NULL; |
| 183 UErrorCode intStatus = U_ZERO_ERROR; |
| 184 |
| 185 if(fDataTestValid == TRUE) { |
| 186 // Both of these resources get adopted by a TestData object. |
| 187 UResourceBundle *DataFillIn = ures_getByKey(fTestData, name, NULL, &status);
|
| 188 UResourceBundle *headers = ures_getByKey(fInfoRB, "Headers", NULL, &intStatu
s); |
| 189 |
| 190 if(U_SUCCESS(status)) { |
| 191 result = new RBTestData(DataFillIn, headers, status); |
| 192 if(U_SUCCESS(status)) { |
| 193 return result; |
| 194 } else { |
| 195 delete result; |
| 196 } |
| 197 } else { |
| 198 ures_close(DataFillIn); |
| 199 ures_close(headers); |
| 200 } |
| 201 } else { |
| 202 status = U_MISSING_RESOURCE_ERROR; |
| 203 } |
| 204 return NULL; |
| 205 } |
| 206 |
| 207 |
| 208 |
| 209 //Get test data from ResourceBundles |
| 210 UResourceBundle* |
| 211 RBTestDataModule::getTestBundle(const char* bundleName, UErrorCode &status) |
| 212 { |
| 213 if(U_SUCCESS(status)) { |
| 214 UResourceBundle *testBundle = NULL; |
| 215 const char* icu_data = fLog.getTestDataPath(status); |
| 216 if (testBundle == NULL) { |
| 217 testBundle = ures_openDirect(icu_data, bundleName, &status); |
| 218 if (status != U_ZERO_ERROR) { |
| 219 fLog.dataerrln(UNICODE_STRING_SIMPLE("Could not load test data from
resourcebundle: ") + UnicodeString(bundleName, -1, US_INV)); |
| 220 fDataTestValid = FALSE; |
| 221 } |
| 222 } |
| 223 return testBundle; |
| 224 } else { |
| 225 return NULL; |
| 226 } |
| 227 } |
| 228 |
OLD | NEW |