11 #include "eckit/config/Resource.h"
12 #include "eckit/testing/Test.h"
13 #include "eckit/types/FloatCompare.h"
14 #include "eckit/value/Value.h"
19 #if __cplusplus <= 199711L
23 #define fabs(x) std::fabs((x))
24 #define modf(x,y) std::modf((x),(y))
27 using namespace eckit::testing;
28 using eckit::types::is_approximately_equal;
35 CellData(
const std::string n,
const T& v,
bool m=
false) :
name(n), value(v), missing(
m) {}
51 typedef std::map<size_t, std::vector<CellData> >
RowStore;
57 std::vector<CellData> rowData;
59 rowData.push_back(
CellData(
"expver@desc", std::string(
"0018 ")));
60 rowData.push_back(
CellData(
"andate@desc", 20000101));
61 rowData.push_back(
CellData(
"antime@desc", 60000));
62 rowData.push_back(
CellData(
"seqno@hdr", 66969));
63 rowData.push_back(
CellData(
"obstype@hdr", 2));
64 rowData.push_back(
CellData(
"obschar@hdr", 67132561));
65 rowData.push_back(
CellData(
"subtype@hdr", 145));
66 rowData.push_back(
CellData(
"date@hdr", 20000101));
67 rowData.push_back(
CellData(
"time@hdr", 32200));
68 rowData.push_back(
CellData(
"rdbflag@hdr", 0));
69 rowData.push_back(
CellData(
"status@hdr", 4));
70 rowData.push_back(
CellData(
"event1@hdr", 512));
71 rowData.push_back(
CellData(
"blacklist@hdr", 0));
72 rowData.push_back(
CellData(
"sortbox@hdr", 2147483647,
true));
73 rowData.push_back(
CellData(
"sitedep@hdr", 0));
74 rowData.push_back(
CellData(
"statid@hdr", std::string(
"MR413SRA")));
75 rowData.push_back(
CellData(
"ident@hdr", 0));
76 rowData.push_back(
CellData(
"lat@hdr", 0.831300));
77 rowData.push_back(
CellData(
"lon@hdr", -2.057394));
78 rowData.push_back(
CellData(
"stalt@hdr", -2147483647.000000,
true));
79 rowData.push_back(
CellData(
"modoro@hdr", 717.562744));
80 rowData.push_back(
CellData(
"trlat@hdr", 0.831300));
81 rowData.push_back(
CellData(
"trlon@hdr", 4.225791));
82 rowData.push_back(
CellData(
"instspec@hdr", 3095));
83 rowData.push_back(
CellData(
"event2@hdr", 0));
84 rowData.push_back(
CellData(
"anemoht@hdr", 0.000000));
85 rowData.push_back(
CellData(
"baroht@hdr", 0.000000));
86 rowData.push_back(
CellData(
"sensor@hdr", 0));
87 rowData.push_back(
CellData(
"numlev@hdr", 1));
88 rowData.push_back(
CellData(
"varno_presence@hdr", 12));
89 rowData.push_back(
CellData(
"varno@body", 3));
90 rowData.push_back(
CellData(
"vertco_type@body", 1));
91 rowData.push_back(
CellData(
"rdbflag@body", 0));
92 rowData.push_back(
CellData(
"anflag@body", 0));
93 rowData.push_back(
CellData(
"status@body", 4));
94 rowData.push_back(
CellData(
"event1@body", 33554432));
95 rowData.push_back(
CellData(
"blacklist@body", 0));
96 rowData.push_back(
CellData(
"entryno@body", 1));
97 rowData.push_back(
CellData(
"press@body", 23840.000000));
98 rowData.push_back(
CellData(
"press_rl@body", -2147483647.000000,
true));
99 rowData.push_back(
CellData(
"obsvalue@body", 34.739117));
100 rowData.push_back(
CellData(
"aux1@body", 35.000000));
101 rowData.push_back(
CellData(
"event2@body", 0));
102 rowData.push_back(
CellData(
"ppcode@body", 0));
103 rowData.push_back(
CellData(
"level@body", 0));
104 rowData.push_back(
CellData(
"biascorr@body", 0.000000));
105 rowData.push_back(
CellData(
"final_obs_error@errstat", 2.920646));
106 rowData.push_back(
CellData(
"obs_error@errstat", 2.920646));
107 rowData.push_back(
CellData(
"repres_error@errstat", -2147483647.000000,
true));
108 rowData.push_back(
CellData(
"pers_error@errstat", -2147483647.000000,
true));
109 rowData.push_back(
CellData(
"fg_error@errstat", 3.002484));
114 rowData.push_back(
CellData(
"expver@desc", std::string(
"0018 ")));
115 rowData.push_back(
CellData(
"andate@desc", 20000101));
116 rowData.push_back(
CellData(
"antime@desc", 60000));
117 rowData.push_back(
CellData(
"seqno@hdr", 6020684));
118 rowData.push_back(
CellData(
"obstype@hdr", 7));
119 rowData.push_back(
CellData(
"obschar@hdr", 135265490));
120 rowData.push_back(
CellData(
"subtype@hdr", 54));
121 rowData.push_back(
CellData(
"date@hdr", 20000101));
122 rowData.push_back(
CellData(
"time@hdr", 54533));
123 rowData.push_back(
CellData(
"rdbflag@hdr", 0));
124 rowData.push_back(
CellData(
"status@hdr", 44));
125 rowData.push_back(
CellData(
"event1@hdr", 2));
126 rowData.push_back(
CellData(
"blacklist@hdr", 16777223));
127 rowData.push_back(
CellData(
"sortbox@hdr", 2147483647,
true));
128 rowData.push_back(
CellData(
"sitedep@hdr", 2147483647,
true));
129 rowData.push_back(
CellData(
"statid@hdr", std::string(
" 203")));
130 rowData.push_back(
CellData(
"ident@hdr", 203));
131 rowData.push_back(
CellData(
"lat@hdr", -0.933479));
132 rowData.push_back(
CellData(
"lon@hdr", -2.107894));
133 rowData.push_back(
CellData(
"stalt@hdr", 870000.000000));
134 rowData.push_back(
CellData(
"modoro@hdr", 0.963609));
135 rowData.push_back(
CellData(
"trlat@hdr", -0.933479));
136 rowData.push_back(
CellData(
"trlon@hdr", 4.175291));
137 rowData.push_back(
CellData(
"instspec@hdr", 9215));
138 rowData.push_back(
CellData(
"event2@hdr", 0));
139 rowData.push_back(
CellData(
"anemoht@hdr", 0.000000));
140 rowData.push_back(
CellData(
"baroht@hdr", 0.000000));
141 rowData.push_back(
CellData(
"sensor@hdr", 0));
142 rowData.push_back(
CellData(
"numlev@hdr", 0));
143 rowData.push_back(
CellData(
"varno_presence@hdr", 1032));
144 rowData.push_back(
CellData(
"varno@body", 119));
145 rowData.push_back(
CellData(
"vertco_type@body", 3));
146 rowData.push_back(
CellData(
"rdbflag@body", 0));
147 rowData.push_back(
CellData(
"anflag@body", 48));
148 rowData.push_back(
CellData(
"status@body", 44));
149 rowData.push_back(
CellData(
"event1@body", 512));
150 rowData.push_back(
CellData(
"blacklist@body", 0));
151 rowData.push_back(
CellData(
"entryno@body", 6));
152 rowData.push_back(
CellData(
"press@body", 6.000000));
153 rowData.push_back(
CellData(
"press_rl@body", -2147483647.000000,
true));
154 rowData.push_back(
CellData(
"obsvalue@body", 243.490005));
155 rowData.push_back(
CellData(
"aux1@body", -2147483647.000000,
true));
156 rowData.push_back(
CellData(
"event2@body", 0));
157 rowData.push_back(
CellData(
"ppcode@body", 0));
158 rowData.push_back(
CellData(
"level@body", 0));
159 rowData.push_back(
CellData(
"biascorr@body", 0.493023));
160 rowData.push_back(
CellData(
"final_obs_error@errstat", 0.600000));
161 rowData.push_back(
CellData(
"obs_error@errstat", 0.600000));
162 rowData.push_back(
CellData(
"repres_error@errstat", -2147483647.000000,
true));
163 rowData.push_back(
CellData(
"pers_error@errstat", 0.958788));
164 rowData.push_back(
CellData(
"fg_error@errstat", 0.269232));
166 data_[371426] = rowData;
173 if (data_.find(num) != data_.end()) {
174 std::vector<CellData>& reference(data_[num]);
175 EXPECT(reference.size() == row->
columns().size());
177 for (
size_t i = 0;
i < reference.size();
i++) {
178 EXPECT(row->
columns()[
i]->name() == reference[
i].name);
183 if (reference[
i].value.isString()) {
184 std::string s(
reinterpret_cast<const char*
>(&row->
data()[
i]), 8);
185 EXPECT(reference[
i].value == s);
186 }
else if (reference[
i].value.isNumber()) {
188 EXPECT(modf(row->
data()[
i], &intpart) == 0.0);
189 EXPECT(
static_cast<long long>(reference[
i].value) ==
static_cast<long long>(intpart));
190 }
else if (reference[
i].value.isDouble()) {
191 EXPECT(is_approximately_equal(
static_cast<double>(reference[
i].value), row->
data()[
i],
192 fabs(1.0e-5 *
static_cast<double>(reference[
i].value))));
199 EXPECT(reference[
i].missing == (row->
data()[
i] == row->
columns()[
i]->missingValue()));
205 size_t biggestRow = 0;
206 for (RowStore::const_iterator it = data_.begin(); it != data_.end(); ++it) {
207 biggestRow = (it->first > biggestRow) ? it->first : biggestRow;
220 eckit::Resource<eckit::PathName>
testDataPath(
"$TEST_DATA_DIRECTORY",
"..");
222 CASE(
"The correct number of rows are decoded") {
224 eckit::PathName filename =
testDataPath /
"2000010106.odb";
233 for (; it != in.
end(); ++it) {
235 if (
count < 3320000) {
244 EXPECT(
count == 3321753);
249 CASE(
"The correct data is present in a selection of random rows") {
251 eckit::PathName filename =
testDataPath /
"2000010106.odb";
261 for (; it != in.
end() &&
count <= biggestRow; ++it) {
272 int main(
int argc,
char* argv[]) {
273 return run_tests(argc, argv);
static void count(void *counter, const double *data, size_t n)
size_t highestRow() const
void checkRow(size_t num, const odc::Reader::iterator &row)
std::map< size_t, std::vector< CellData > > RowStore
const iterator end() const
const core::MetaData & columns() const
CellData(const std::string n, const T &v, bool m=false)
int main(int argc, char *argv[])
eckit::Resource< eckit::PathName > testDataPath("$TEST_DATA_DIRECTORY", "..")
CASE("The correct number of rows are decoded")