]> git.saurik.com Git - apple/icu.git/blame - icuSources/tools/ctestfw/tstdtmod.cpp
ICU-531.48.tar.gz
[apple/icu.git] / icuSources / tools / ctestfw / tstdtmod.cpp
CommitLineData
b75a7d8f
A
1/********************************************************************
2 * COPYRIGHT:
57a6839d 3 * Copyright (c) 2002-2014, International Business Machines Corporation and
b75a7d8f
A
4 * others. All Rights Reserved.
5 ********************************************************************/
6
7/* Created by weiv 05/09/2002 */
8
729e4ab9
A
9#include <stdarg.h>
10
374ca955 11#include "unicode/tstdtmod.h"
b75a7d8f 12#include "cmemory.h"
729e4ab9 13#include <stdio.h>
b75a7d8f 14
73c04bcf
A
15TestLog::~TestLog() {}
16
729e4ab9
A
17IcuTestErrorCode::~IcuTestErrorCode() {
18 // Safe because our handleFailure() does not throw exceptions.
19 if(isFailure()) { handleFailure(); }
20}
21
22UBool 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(errorName(), -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
41UBool 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(errorName(), -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
60void 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(errorName(), -1, US_INV));
64
57a6839d 65 if (get() == U_MISSING_RESOURCE_ERROR || get() == U_FILE_ACCESS_ERROR) {
729e4ab9
A
66 testClass.dataerrln(msg);
67 } else {
68 testClass.errln(msg);
69 }
70}
71
b75a7d8f
A
72TestDataModule *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
91TestDataModule::TestDataModule(const char* name, TestLog& log, UErrorCode& /*status*/)
92: testName(name),
93fInfo(NULL),
94fLog(log)
95{
96}
97
98TestDataModule::~TestDataModule() {
99 if(fInfo != NULL) {
100 delete fInfo;
101 }
102}
103
104const char * TestDataModule::getName() const
105{
106 return testName;
107}
108
109
110
111RBTestDataModule::~RBTestDataModule()
112{
113 ures_close(fTestData);
114 ures_close(fModuleBundle);
115 ures_close(fInfoRB);
116 uprv_free(tdpath);
117}
118
119RBTestDataModule::RBTestDataModule(const char* name, TestLog& log, UErrorCode& status)
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) {
73c04bcf 134 log.errln(UNICODE_STRING_SIMPLE("Unable to initalize test data - missing mandatory description resources!"));
b75a7d8f
A
135 fDataTestValid = FALSE;
136 } else {
137 fInfo = new RBDataMap(fInfoRB, status);
138 }
139 }
140}
141
142UBool RBTestDataModule::getInfo(const DataMap *& info, UErrorCode &/*status*/) const
143{
144 info = fInfo;
145 if(fInfo) {
146 return TRUE;
147 } else {
148 return FALSE;
149 }
150}
151
152TestData* RBTestDataModule::createTestData(int32_t index, UErrorCode &status) const
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, &status);
160 UResourceBundle *headers = ures_getByKey(fInfoRB, "Headers", NULL, &intStatus);
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
180TestData* 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, &intStatus);
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
210UResourceBundle*
211RBTestDataModule::getTestBundle(const char* bundleName, UErrorCode &status)
212{
213 if(U_SUCCESS(status)) {
214 UResourceBundle *testBundle = NULL;
374ca955 215 const char* icu_data = fLog.getTestDataPath(status);
b75a7d8f
A
216 if (testBundle == NULL) {
217 testBundle = ures_openDirect(icu_data, bundleName, &status);
218 if (status != U_ZERO_ERROR) {
729e4ab9 219 fLog.dataerrln(UNICODE_STRING_SIMPLE("Could not load test data from resourcebundle: ") + UnicodeString(bundleName, -1, US_INV));
b75a7d8f
A
220 fDataTestValid = FALSE;
221 }
222 }
223 return testBundle;
224 } else {
225 return NULL;
226 }
227}
228