1 /********************************************************************
2 * COPYRIGHT:
3 * Copyright (c) 2002-2006, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 ********************************************************************/
6
7 /* Created by weiv 05/09/2002 */
8
9 #include "unicode/tstdtmod.h"
10 #include "cmemory.h"
11
~TestLog()12 TestLog::~TestLog() {}
13
getTestDataModule(const char * name,TestLog & log,UErrorCode & status)14 TestDataModule *TestDataModule::getTestDataModule(const char* name, TestLog& log, UErrorCode &status)
15 {
16 if(U_FAILURE(status)) {
17 return NULL;
18 }
19 TestDataModule *result = NULL;
20
21 // TODO: probe for resource bundle and then for XML.
22 // According to that, construct an appropriate driver object
23
24 result = new RBTestDataModule(name, log, status);
25 if(U_SUCCESS(status)) {
26 return result;
27 } else {
28 delete result;
29 return NULL;
30 }
31 }
32
TestDataModule(const char * name,TestLog & log,UErrorCode &)33 TestDataModule::TestDataModule(const char* name, TestLog& log, UErrorCode& /*status*/)
34 : testName(name),
35 fInfo(NULL),
36 fLog(log)
37 {
38 }
39
~TestDataModule()40 TestDataModule::~TestDataModule() {
41 if(fInfo != NULL) {
42 delete fInfo;
43 }
44 }
45
getName() const46 const char * TestDataModule::getName() const
47 {
48 return testName;
49 }
50
51
52
~RBTestDataModule()53 RBTestDataModule::~RBTestDataModule()
54 {
55 ures_close(fTestData);
56 ures_close(fModuleBundle);
57 ures_close(fInfoRB);
58 uprv_free(tdpath);
59 }
60
RBTestDataModule(const char * name,TestLog & log,UErrorCode & status)61 RBTestDataModule::RBTestDataModule(const char* name, TestLog& log, UErrorCode& status)
62 : TestDataModule(name, log, status),
63 fModuleBundle(NULL),
64 fTestData(NULL),
65 fInfoRB(NULL),
66 tdpath(NULL)
67 {
68 fNumberOfTests = 0;
69 fDataTestValid = TRUE;
70 fModuleBundle = getTestBundle(name, status);
71 if(fDataTestValid) {
72 fTestData = ures_getByKey(fModuleBundle, "TestData", NULL, &status);
73 fNumberOfTests = ures_getSize(fTestData);
74 fInfoRB = ures_getByKey(fModuleBundle, "Info", NULL, &status);
75 if(status != U_ZERO_ERROR) {
76 log.errln(UNICODE_STRING_SIMPLE("Unable to initalize test data - missing mandatory description resources!"));
77 fDataTestValid = FALSE;
78 } else {
79 fInfo = new RBDataMap(fInfoRB, status);
80 }
81 }
82 }
83
getInfo(const DataMap * & info,UErrorCode &) const84 UBool RBTestDataModule::getInfo(const DataMap *& info, UErrorCode &/*status*/) const
85 {
86 info = fInfo;
87 if(fInfo) {
88 return TRUE;
89 } else {
90 return FALSE;
91 }
92 }
93
createTestData(int32_t index,UErrorCode & status) const94 TestData* RBTestDataModule::createTestData(int32_t index, UErrorCode &status) const
95 {
96 TestData *result = NULL;
97 UErrorCode intStatus = U_ZERO_ERROR;
98
99 if(fDataTestValid == TRUE) {
100 // Both of these resources get adopted by a TestData object.
101 UResourceBundle *DataFillIn = ures_getByIndex(fTestData, index, NULL, &status);
102 UResourceBundle *headers = ures_getByKey(fInfoRB, "Headers", NULL, &intStatus);
103
104 if(U_SUCCESS(status)) {
105 result = new RBTestData(DataFillIn, headers, status);
106
107 if(U_SUCCESS(status)) {
108 return result;
109 } else {
110 delete result;
111 }
112 } else {
113 ures_close(DataFillIn);
114 ures_close(headers);
115 }
116 } else {
117 status = U_MISSING_RESOURCE_ERROR;
118 }
119 return NULL;
120 }
121
createTestData(const char * name,UErrorCode & status) const122 TestData* RBTestDataModule::createTestData(const char* name, UErrorCode &status) const
123 {
124 TestData *result = NULL;
125 UErrorCode intStatus = U_ZERO_ERROR;
126
127 if(fDataTestValid == TRUE) {
128 // Both of these resources get adopted by a TestData object.
129 UResourceBundle *DataFillIn = ures_getByKey(fTestData, name, NULL, &status);
130 UResourceBundle *headers = ures_getByKey(fInfoRB, "Headers", NULL, &intStatus);
131
132 if(U_SUCCESS(status)) {
133 result = new RBTestData(DataFillIn, headers, status);
134 if(U_SUCCESS(status)) {
135 return result;
136 } else {
137 delete result;
138 }
139 } else {
140 ures_close(DataFillIn);
141 ures_close(headers);
142 }
143 } else {
144 status = U_MISSING_RESOURCE_ERROR;
145 }
146 return NULL;
147 }
148
149
150
151 //Get test data from ResourceBundles
152 UResourceBundle*
getTestBundle(const char * bundleName,UErrorCode & status)153 RBTestDataModule::getTestBundle(const char* bundleName, UErrorCode &status)
154 {
155 if(U_SUCCESS(status)) {
156 UResourceBundle *testBundle = NULL;
157 const char* icu_data = fLog.getTestDataPath(status);
158 if (testBundle == NULL) {
159 testBundle = ures_openDirect(icu_data, bundleName, &status);
160 if (status != U_ZERO_ERROR) {
161 fLog.errln(UNICODE_STRING_SIMPLE("Failed: could not load test data from resourcebundle: ") + UnicodeString(bundleName, -1, US_INV));
162 fDataTestValid = FALSE;
163 }
164 }
165 return testBundle;
166 } else {
167 return NULL;
168 }
169 }
170
171