xref: /aosp_15_r20/external/icu/icu4c/source/tools/ctestfw/testdata.cpp (revision 0e209d3975ff4a8c132096b14b0e9364a753506e)
1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /********************************************************************
4  * COPYRIGHT:
5  * Copyright (c) 2002-2005, International Business Machines Corporation and
6  * others. All Rights Reserved.
7  ********************************************************************/
8 
9 /* Created by weiv 05/09/2002 */
10 
11 #include "unicode/testdata.h"
12 
13 
TestData(const char * testName)14 TestData::TestData(const char* testName)
15 : name(testName),
16 fInfo(nullptr),
17 fCurrSettings(nullptr),
18 fCurrCase(nullptr),
19 fSettingsSize(0),
20 fCasesSize(0),
21 fCurrentSettings(0),
22 fCurrentCase(0)
23 
24 {
25 }
26 
~TestData()27 TestData::~TestData() {
28   delete fInfo;
29   delete fCurrSettings;
30   delete fCurrCase;
31 }
32 
getName() const33 const char * TestData::getName() const
34 {
35   return name;
36 }
37 
38 
39 
RBTestData(const char * testName)40 RBTestData::RBTestData(const char* testName)
41 : TestData(testName),
42 fData(nullptr),
43 fHeaders(nullptr),
44 fSettings(nullptr),
45 fCases(nullptr)
46 {
47 }
48 
RBTestData(UResourceBundle * data,UResourceBundle * headers,UErrorCode & status)49 RBTestData::RBTestData(UResourceBundle *data, UResourceBundle *headers, UErrorCode& status)
50 : TestData(ures_getKey(data)),
51 fData(data),
52 fHeaders(headers),
53 fSettings(nullptr),
54 fCases(nullptr)
55 {
56   UErrorCode intStatus = U_ZERO_ERROR;
57   UResourceBundle *currHeaders = ures_getByKey(data, "Headers", nullptr, &intStatus);
58   if(intStatus == U_ZERO_ERROR) {
59     ures_close(fHeaders);
60     fHeaders = currHeaders;
61   } else {
62     intStatus = U_ZERO_ERROR;
63   }
64   fSettings = ures_getByKey(data, "Settings", nullptr, &intStatus);
65   fSettingsSize = ures_getSize(fSettings);
66   UResourceBundle *info = ures_getByKey(data, "Info", nullptr, &intStatus);
67   if(U_SUCCESS(intStatus)) {
68     fInfo = new RBDataMap(info, status);
69   } else {
70     intStatus = U_ZERO_ERROR;
71   }
72   fCases = ures_getByKey(data, "Cases", nullptr, &status);
73   fCasesSize = ures_getSize(fCases);
74 
75   ures_close(info);
76 }
77 
78 
~RBTestData()79 RBTestData::~RBTestData()
80 {
81   ures_close(fData);
82   ures_close(fHeaders);
83   ures_close(fSettings);
84   ures_close(fCases);
85 }
86 
getInfo(const DataMap * & info,UErrorCode &) const87 UBool RBTestData::getInfo(const DataMap *& info, UErrorCode &/*status*/) const
88 {
89   if(fInfo) {
90     info = fInfo;
91     return true;
92   } else {
93     info = nullptr;
94     return false;
95   }
96 }
97 
nextSettings(const DataMap * & settings,UErrorCode & status)98 UBool RBTestData::nextSettings(const DataMap *& settings, UErrorCode &status)
99 {
100   UErrorCode intStatus = U_ZERO_ERROR;
101   UResourceBundle *data = ures_getByIndex(fSettings, fCurrentSettings++, nullptr, &intStatus);
102   if(U_SUCCESS(intStatus)) {
103     // reset the cases iterator
104     fCurrentCase = 0;
105     if(fCurrSettings == nullptr) {
106       fCurrSettings = new RBDataMap(data, status);
107     } else {
108       ((RBDataMap *)fCurrSettings)->init(data, status);
109     }
110     ures_close(data);
111     settings = fCurrSettings;
112     return true;
113   } else {
114     settings = nullptr;
115     return false;
116   }
117 }
118 
nextCase(const DataMap * & nextCase,UErrorCode & status)119 UBool RBTestData::nextCase(const DataMap *& nextCase, UErrorCode &status)
120 {
121   UErrorCode intStatus = U_ZERO_ERROR;
122   UResourceBundle *currCase = ures_getByIndex(fCases, fCurrentCase++, nullptr, &intStatus);
123   if(U_SUCCESS(intStatus)) {
124     if(fCurrCase == nullptr) {
125       fCurrCase = new RBDataMap(fHeaders, currCase, status);
126     } else {
127       ((RBDataMap *)fCurrCase)->init(fHeaders, currCase, status);
128     }
129     ures_close(currCase);
130     nextCase = fCurrCase;
131     return true;
132   } else {
133     nextCase = nullptr;
134     return false;
135   }
136 }
137 
138 
139