11 #ifndef TEST_IO_IODAIO_H_
12 #define TEST_IO_IODAIO_H_
22 #define ECKIT_TESTING_SELF_REGISTER_CASES 0
24 #include <boost/any.hpp>
25 #include <boost/noncopyable.hpp>
27 #include "eckit/config/LocalConfiguration.h"
28 #include "eckit/testing/Test.h"
30 #include "oops/mpi/mpi.h"
31 #include "oops/runs/Test.h"
32 #include "oops/test/TestEnvironment.h"
33 #include "oops/util/Logger.h"
35 #include "ioda/io/IodaIO.h"
36 #include "ioda/io/IodaIOfactory.h"
44 std::size_t MaxSize = 0;
45 for (std::size_t i = 0; i < Strings.size(); ++i) {
46 if (Strings[i].size() > MaxSize) {
47 MaxSize = Strings[i].size();
56 const eckit::LocalConfiguration conf(::test::TestEnvironment::config());
59 std::size_t MaxFrameSize;
60 std::unique_ptr<ioda::IodaIO> TestIO;
64 std::size_t ExpectedNlocs;
65 std::size_t ExpectedNvars;
68 FileName = conf.getString(
"test input.filename");
69 MaxFrameSize = conf.getUnsigned(
"test input.frames.max frame size",
75 ExpectedNlocs = conf.getInt(
"test input.nlocs");
76 ExpectedNvars = conf.getInt(
"test input.nvars");
78 Nlocs = TestIO->nlocs();
79 Nvars = TestIO->nvars();
81 EXPECT(ExpectedNlocs == Nlocs);
82 EXPECT(ExpectedNvars == Nvars);
85 FileName = conf.getString(
"test output.filename");
88 ExpectedNlocs = conf.getInt(
"test output.nlocs");
89 ExpectedNvars = conf.getInt(
"test output.nvars");
98 const eckit::LocalConfiguration conf(::test::TestEnvironment::config());
99 std::vector<eckit::LocalConfiguration> obstypes;
101 std::string FileName;
102 std::size_t MaxFrameSize;
103 std::unique_ptr<ioda::IodaIO> TestIO;
107 FileName = conf.getString(
"test input.filename");
108 MaxFrameSize = conf.getUnsigned(
"test input.frames.max frame size",
111 EXPECT(TestIO.get());
116 std::size_t VarCount = 0;
117 std::size_t ExpectedVarCount = conf.getInt(
"test input.nvars");
118 for (
IodaIO::GroupIter igrp = TestIO->group_begin(); igrp != TestIO->group_end(); ++igrp) {
119 std::string GroupName = TestIO->group_name(igrp);
121 for (
IodaIO::VarIter ivar = TestIO->var_begin(igrp); ivar != TestIO->var_end(igrp); ++ivar) {
125 EXPECT(VarCount == ExpectedVarCount);
128 std::vector<std::string> DimNames;
129 std::vector<std::size_t> DimIds;
130 std::vector<std::size_t> DimSizes;
131 std::vector<std::string> ExpectedDimNames = conf.getStringVector(
"test input.dimensions.names");
132 std::vector<std::size_t> ExpectedDimIds = conf.getUnsignedVector(
"test input.dimensions.ids");
133 std::vector<std::size_t> ExpectedDimSizes = conf.getUnsignedVector(
"test input.dimensions.sizes");
134 for (
IodaIO::DimIter idim = TestIO->dim_begin(); idim != TestIO->dim_end(); ++idim) {
135 DimNames.push_back(TestIO->dim_name(idim));
136 DimIds.push_back(TestIO->dim_id(idim));
137 DimSizes.push_back(TestIO->dim_size(idim));
139 for (std::size_t i = 0; i < DimNames.size(); i++) {
140 EXPECT(DimNames[i] == ExpectedDimNames[i]);
141 EXPECT(DimIds[i] == ExpectedDimIds[i]);
142 EXPECT(DimSizes[i] == ExpectedDimSizes[i]);
146 std::vector<std::size_t> FrameStarts = conf.getUnsignedVector(
"test input.frames.starts");
147 std::vector<std::size_t> FrameSizes = conf.getUnsignedVector(
"test input.frames.sizes");
150 iframe != TestIO->frame_end(); ++iframe) {
151 EXPECT(TestIO->frame_start(iframe) == FrameStarts[i]);
152 EXPECT(TestIO->frame_size(iframe) == FrameSizes[i]);
160 const eckit::LocalConfiguration conf(::test::TestEnvironment::config());
162 std::vector<eckit::LocalConfiguration> obstypes;
163 std::vector<std::string> GrpVarNames;
165 std::unique_ptr<ioda::IodaIO> TestIO;
168 std::string FileName = conf.getString(
"test input.filename");
169 std::size_t MaxFrameSize = conf.getUnsigned(
"test input.frames.max frame size",
176 std::vector<eckit::LocalConfiguration> var_config =
177 conf.getSubConfigurations(
"test input.variables");
179 std::map<std::string, std::vector<int>> IntVars;
180 std::map<std::string, std::vector<float>> FloatVars;
181 std::map<std::string, std::vector<std::string>> StringVars;
183 std::map<std::string, std::vector<int>> ExpectedIntVars;
184 std::map<std::string, std::vector<float>> ExpectedFloatVars;
185 std::map<std::string, std::vector<std::string>> ExpectedStringVars;
187 for (std::size_t i = 0; i < var_config.size(); i++) {
188 std::string VarGrpName = var_config[i].getString(
"name");
189 std::string VarType = var_config[i].getString(
"type");
191 if (VarType ==
"int") {
192 ExpectedIntVars[VarGrpName] = var_config[i].getIntVector(
"values");
193 IntVars[VarGrpName] = std::vector<int>(ExpectedIntVars[VarGrpName].size(), 0);
194 }
else if (VarType ==
"float") {
195 ExpectedFloatVars[VarGrpName] = var_config[i].getFloatVector(
"values");
196 FloatVars[VarGrpName] = std::vector<float>(ExpectedFloatVars[VarGrpName].size(), 0.0);
197 }
else if (VarType ==
"string") {
198 ExpectedStringVars[VarGrpName] = var_config[i].getStringVector(
"values");
199 StringVars[VarGrpName] = std::vector<std::string>(ExpectedStringVars[VarGrpName].size(),
"");
203 TestIO->frame_initialize();
205 iframe != TestIO->frame_end(); ++iframe) {
206 std::size_t FrameStart = TestIO->frame_start(iframe);
209 TestIO->frame_read(iframe);
213 idata != TestIO->frame_int_end(); ++idata) {
214 std::string VarGrpName =
215 TestIO->frame_int_get_vname(idata) +
"@" + TestIO->frame_int_get_gname(idata);
216 std::vector<int> FrameData = TestIO->frame_int_get_data(idata);
217 for (std::size_t i = 0; i < FrameData.size(); ++i) {
218 IntVars[VarGrpName][FrameStart + i] = FrameData[i];
224 idata != TestIO->frame_float_end(); ++idata) {
225 std::string VarGrpName =
226 TestIO->frame_float_get_vname(idata) +
"@" + TestIO->frame_float_get_gname(idata);
227 std::vector<float> FrameData = TestIO->frame_float_get_data(idata);
228 for (std::size_t i = 0; i < FrameData.size(); ++i) {
229 FloatVars[VarGrpName][FrameStart + i] = FrameData[i];
235 idata != TestIO->frame_string_end(); ++idata) {
236 std::string VarGrpName =
237 TestIO->frame_string_get_vname(idata) +
"@" + TestIO->frame_string_get_gname(idata);
238 std::vector<std::string> FrameData = TestIO->frame_string_get_data(idata);
239 for (std::size_t i = 0; i < FrameData.size(); ++i) {
240 StringVars[VarGrpName][FrameStart + i] = FrameData[i];
244 TestIO->frame_finalize();
247 std::map<std::string, std::vector<int>>::iterator iint;
248 std::map<std::string, std::vector<float>>::iterator ifloat;
249 std::map<std::string, std::vector<std::string>>::iterator istring;
251 for (iint = IntVars.begin(); iint != IntVars.end(); ++iint) {
252 std::vector<int> IntVect = iint->second;
253 std::vector<int> ExpectedIntVect = ExpectedIntVars[iint->first];
254 for (std::size_t i = 0; i < IntVect.size(); i++) {
255 EXPECT(IntVect[i] == ExpectedIntVect[i]);
259 float FloatTol = conf.getFloat(
"test input.tolerance");
260 for (ifloat = FloatVars.begin(); ifloat != FloatVars.end(); ++ifloat) {
261 std::vector<float> FloatVect = ifloat->second;
262 std::vector<float> ExpectedFloatVect = ExpectedFloatVars[ifloat->first];
263 for (std::size_t i = 0; i < FloatVect.size(); i++) {
264 EXPECT(oops::is_close(FloatVect[i], ExpectedFloatVect[i], FloatTol));
268 for (istring = StringVars.begin(); istring != StringVars.end(); ++istring) {
269 std::vector<std::string> StringVect = istring->second;
270 std::vector<std::string> ExpectedStringVect = ExpectedStringVars[istring->first];
271 for (std::size_t i = 0; i < StringVect.size(); i++) {
272 EXPECT(StringVect[i] == ExpectedStringVect[i]);
280 const eckit::LocalConfiguration conf(::test::TestEnvironment::config());
281 std::unique_ptr<ioda::IodaIO> TestIO;
285 std::string FileName = conf.getString(
"test output.filename");
286 std::size_t MaxFrameSize = conf.getUnsigned(
"test output.max frame size",
288 std::size_t ExpectedNlocs = conf.getInt(
"test output.nlocs");
289 std::size_t ExpectedNvars = conf.getInt(
"test output.nvars");
291 std::size_t MaxVarSize = 0;
293 std::map<std::string, std::vector<int>>::iterator iint;
294 std::map<std::string, std::vector<float>>::iterator ifloat;
295 std::map<std::string, std::vector<std::string>>::iterator istring;
297 std::map<std::string, std::vector<int>> IntVars;
298 std::map<std::string, std::vector<float>> FloatVars;
299 std::map<std::string, std::vector<std::string>> StringVars;
301 std::map<std::string, std::vector<int>> ExpectedIntVars;
302 std::map<std::string, std::vector<float>> ExpectedFloatVars;
303 std::map<std::string, std::vector<std::string>> ExpectedStringVars;
306 std::vector<eckit::LocalConfiguration> var_config =
307 conf.getSubConfigurations(
"test output.variables");
309 for (std::size_t i = 0; i < var_config.size(); i++) {
310 std::string VarGrpName = var_config[i].getString(
"name");
311 std::string VarType = var_config[i].getString(
"type");
313 if (VarType ==
"int") {
314 ExpectedIntVars[VarGrpName] = var_config[i].getIntVector(
"values");
315 IntVars[VarGrpName] = std::vector<int>(ExpectedIntVars[VarGrpName].size(), 0);
316 MaxVarSize = std::max(MaxVarSize, ExpectedIntVars[VarGrpName].size());
317 }
else if (VarType ==
"float") {
318 ExpectedFloatVars[VarGrpName] = var_config[i].getFloatVector(
"values");
319 FloatVars[VarGrpName] = std::vector<float>(ExpectedFloatVars[VarGrpName].size(), 0.0);
320 MaxVarSize = std::max(MaxVarSize, ExpectedFloatVars[VarGrpName].size());
321 }
else if (VarType ==
"string") {
322 ExpectedStringVars[VarGrpName] = var_config[i].getStringVector(
"values");
323 StringVars[VarGrpName] = std::vector<std::string>(ExpectedStringVars[VarGrpName].size(),
"");
324 MaxVarSize = std::max(MaxVarSize, ExpectedStringVars[VarGrpName].size());
331 TestIO->frame_info_init(MaxVarSize);
332 TestIO->dim_insert(
"nlocs", ExpectedNlocs);
333 TestIO->dim_insert(
"nvars", ExpectedNvars);
335 std::string GroupName;
337 for (iint = ExpectedIntVars.begin(); iint != ExpectedIntVars.end(); ++iint) {
338 TestIO->ExtractGrpVarName(iint->first, GroupName, VarName);
339 std::vector<std::size_t> VarShape(1, (iint->second).size());
340 TestIO->grp_var_insert(GroupName, VarName,
"int", VarShape, iint->first,
"int");
342 for (ifloat = ExpectedFloatVars.begin(); ifloat != ExpectedFloatVars.end(); ++ifloat) {
343 TestIO->ExtractGrpVarName(ifloat->first, GroupName, VarName);
344 std::vector<std::size_t> VarShape(1, (ifloat->second).size());
345 TestIO->grp_var_insert(GroupName, VarName,
"float", VarShape, ifloat->first,
"float");
347 for (istring = ExpectedStringVars.begin(); istring != ExpectedStringVars.end(); ++istring) {
348 TestIO->ExtractGrpVarName(istring->first, GroupName, VarName);
349 std::vector<std::size_t> VarShape(1, (istring->second).size());
351 TestIO->grp_var_insert(GroupName, VarName,
"string", VarShape, istring->first,
"string",
356 iframe != TestIO->frame_end(); ++iframe) {
357 TestIO->frame_data_init();
358 std::size_t FrameStart = TestIO->frame_start(iframe);
359 std::size_t FrameSize = TestIO->frame_size(iframe);
361 for (iint = ExpectedIntVars.begin(); iint != ExpectedIntVars.end(); ++iint) {
362 TestIO->ExtractGrpVarName(iint->first, GroupName, VarName);
363 std::vector<std::size_t> VarShape = TestIO->var_shape(GroupName, VarName);
365 if (VarShape[0] > FrameStart) {
367 if (FrameStart + FrameSize > VarShape[0]) {
368 VarSize = VarShape[0] - FrameStart;
373 std::vector<int>::iterator Start = ExpectedIntVars[iint->first].begin() + FrameStart;
374 std::vector<int>::iterator End = Start + VarSize;
375 std::vector<int> FrameData(Start, End);
376 TestIO->frame_int_put_data(GroupName, VarName, FrameData);
380 for (ifloat = ExpectedFloatVars.begin(); ifloat != ExpectedFloatVars.end(); ++ifloat) {
381 TestIO->ExtractGrpVarName(ifloat->first, GroupName, VarName);
382 std::vector<std::size_t> VarShape = TestIO->var_shape(GroupName, VarName);
384 if (VarShape[0] > FrameStart) {
386 if (FrameStart + FrameSize > VarShape[0]) {
387 VarSize = VarShape[0] - FrameStart;
392 std::vector<float>::iterator Start =
393 ExpectedFloatVars[ifloat->first].begin() + FrameStart;
394 std::vector<float>::iterator End = Start + VarSize;
395 std::vector<float> FrameData(Start, End);
396 TestIO->frame_float_put_data(GroupName, VarName, FrameData);
400 for (istring = ExpectedStringVars.begin(); istring != ExpectedStringVars.end(); ++istring) {
401 TestIO->ExtractGrpVarName(istring->first, GroupName, VarName);
402 std::vector<std::size_t> VarShape = TestIO->var_shape(GroupName, VarName);
404 if (VarShape[0] > FrameStart) {
406 if (FrameStart + FrameSize > VarShape[0]) {
407 VarSize = VarShape[0] - FrameStart;
412 std::vector<std::string>::iterator Start =
413 ExpectedStringVars[istring->first].begin() + FrameStart;
414 std::vector<std::string>::iterator End = Start + VarSize;
415 std::vector<std::string> FrameData(Start, End);
416 TestIO->frame_string_put_data(GroupName, VarName, FrameData);
421 TestIO->frame_write(iframe);
426 TestIO->frame_initialize();
428 iframe != TestIO->frame_end(); ++iframe) {
429 std::size_t FrameStart = TestIO->frame_start(iframe);
430 std::size_t FrameSize = TestIO->frame_size(iframe);
433 TestIO->frame_read(iframe);
437 idata != TestIO->frame_int_end(); ++idata) {
438 std::string GroupName = TestIO->frame_int_get_gname(idata);
439 std::string VarName = TestIO->frame_int_get_vname(idata);
440 std::vector<int> FrameData;
441 TestIO->frame_int_get_data(GroupName, VarName, FrameData);
443 std::string VarGrpName = VarName +
"@" + GroupName;
444 for (std::size_t i = 0; i < FrameData.size(); ++i) {
445 IntVars[VarGrpName][FrameStart + i] = FrameData[i];
451 idata != TestIO->frame_float_end(); ++idata) {
452 std::string GroupName = TestIO->frame_float_get_gname(idata);
453 std::string VarName = TestIO->frame_float_get_vname(idata);
454 std::vector<float> FrameData;
455 TestIO->frame_float_get_data(GroupName, VarName, FrameData);
457 std::string VarGrpName = VarName +
"@" + GroupName;
458 for (std::size_t i = 0; i < FrameData.size(); ++i) {
459 FloatVars[VarGrpName][FrameStart + i] = FrameData[i];
465 idata != TestIO->frame_string_end(); ++idata) {
466 std::string GroupName = TestIO->frame_string_get_gname(idata);
467 std::string VarName = TestIO->frame_string_get_vname(idata);
468 std::vector<std::string> FrameData;
469 TestIO->frame_string_get_data(GroupName, VarName, FrameData);
471 std::string VarGrpName = VarName +
"@" + GroupName;
472 for (std::size_t i = 0; i < FrameData.size(); ++i) {
473 StringVars[VarGrpName][FrameStart + i] = FrameData[i];
477 TestIO->frame_finalize();
480 for (iint = IntVars.begin(); iint != IntVars.end(); ++iint) {
481 std::vector<int> IntVect = iint->second;
482 std::vector<int> ExpectedIntVect = ExpectedIntVars[iint->first];
483 for (std::size_t i = 0; i < IntVect.size(); i++) {
484 EXPECT(IntVect[i] == ExpectedIntVect[i]);
488 float FloatTol = conf.getFloat(
"test output.tolerance");
489 for (ifloat = FloatVars.begin(); ifloat != FloatVars.end(); ++ifloat) {
490 std::vector<float> FloatVect = ifloat->second;
491 std::vector<float> ExpectedFloatVect = ExpectedFloatVars[ifloat->first];
492 for (std::size_t i = 0; i < FloatVect.size(); i++) {
493 EXPECT(oops::is_close(FloatVect[i], ExpectedFloatVect[i], FloatTol));
497 for (istring = StringVars.begin(); istring != StringVars.end(); ++istring) {
498 std::vector<std::string> StringVect = istring->second;
499 std::vector<std::string> ExpectedStringVect = ExpectedStringVars[istring->first];
500 for (std::size_t i = 0; i < StringVect.size(); i++) {
501 EXPECT(StringVect[i] == ExpectedStringVect[i]);
513 std::string
testid()
const override {
return "test::IodaIO";}
516 std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
518 ts.emplace_back(CASE(
"io/IodaIO/testConstructor")
520 ts.emplace_back(CASE(
"io/IodaIO/testContainers")
522 ts.emplace_back(CASE(
"io/IodaIO/testReadVar")
524 ts.emplace_back(CASE(
"io/IodaIO/testWriteVar")
536 #endif // TEST_IO_IODAIO_H_