8 #ifndef TEST_UFO_PRIMITIVEVARIABLES_H_
9 #define TEST_UFO_PRIMITIVEVARIABLES_H_
16 #define ECKIT_TESTING_SELF_REGISTER_CASES 0
18 #include "eckit/config/LocalConfiguration.h"
19 #include "eckit/testing/Test.h"
20 #include "ioda/ObsSpace.h"
21 #include "oops/mpi/mpi.h"
22 #include "oops/runs/Test.h"
23 #include "oops/util/Expect.h"
24 #include "oops/util/FloatCompare.h"
25 #include "oops/util/parameters/Parameters.h"
26 #include "oops/util/parameters/RequiredParameter.h"
27 #include "test/TestEnvironment.h"
37 template <>
struct VectorPrintSelector<float> {
typedef VectorPrintSimple selector; };
46 oops::RequiredParameter<std::vector<Variable>>
variables{
"variables",
this};
47 oops::RequiredParameter<std::vector<std::string>>
expectedNames{
"expected names",
this};
48 oops::RequiredParameter<std::vector<std::string>>
expectedGroups{
"expected groups",
this};
49 oops::RequiredParameter<std::vector<std::vector<float>>>
expectedValues{
"expected values",
this};
53 class TestFixture :
private boost::noncopyable {
61 return theTestFixture;
65 const eckit::Configuration & conf = ::test::TestEnvironment::config();
66 util::DateTime bgn(conf.getString(
"window begin"));
67 util::DateTime end(conf.getString(
"window end"));
68 const eckit::LocalConfiguration obsconf(conf,
"obs space");
69 ioda::ObsTopLevelParameters obsparams;
70 obsparams.validateAndDeserialize(obsconf);
71 obsspace_.reset(
new ioda::ObsSpace(obsparams, oops::mpi::world(), bgn, end,
72 oops::mpi::myself()));
76 std::shared_ptr<ioda::ObsSpace>
obsspace_;
77 std::unique_ptr<ObsFilterData>
data_;
83 parameters.validateAndDeserialize(conf);
87 variables += variable;
89 std::vector<std::string> names;
90 std::vector<std::string> groups;
91 std::vector<Variable> primitiveVariables;
92 std::vector<std::vector<float>> values;
95 names.push_back(pv.name());
96 groups.push_back(pv.group());
97 primitiveVariables.push_back(pv.variable());
98 values.push_back(pv.values());
103 EXPECT_EQUAL(values.size(), parameters.
expectedValues.value().size());
104 for (
size_t i = 0; i < values.size(); ++i)
105 EXPECT(oops::are_all_close_relative(values[i], parameters.
expectedValues.value()[i], 1e-6f));
107 EXPECT(std::equal(primitiveVariables.begin(), primitiveVariables.end(), names.begin(),
108 [](
const Variable &primitiveVariable,
const std::string &name)
109 {return primitiveVariable.variable() == name; }));
110 EXPECT(std::equal(primitiveVariables.begin(), primitiveVariables.end(), groups.begin(),
111 [](
const Variable &primitiveVariable,
const std::string &group)
112 {return primitiveVariable.group() == group; }));
119 parameters.validateAndDeserialize(conf);
123 variables += variable;
125 std::vector<std::string> names;
126 std::vector<std::vector<float>> values;
133 names.push_back((*it).name());
134 values.push_back(it->values());
139 EXPECT_EQUAL(values.size(), parameters.
expectedValues.value().size());
140 for (
size_t i = 0; i < values.size(); ++i)
141 EXPECT(oops::are_all_close_relative(values[i], parameters.
expectedValues.value()[i], 1e-6f));
146 std::string
testid()
const override {
return "ufo::test::PrimitiveVariables";}
149 std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
151 const eckit::LocalConfiguration conf(::test::TestEnvironment::config(),
"cases");
152 for (
const std::string & testCaseName : conf.keys())
154 const eckit::LocalConfiguration testCaseConf(conf, testCaseName);
155 ts.emplace_back(
CASE(
"ufo/PrimitiveVariables/range/" + testCaseName, testCaseConf)
159 ts.emplace_back(
CASE(
"ufo/PrimitiveVariables/iterator/" + testCaseName, testCaseConf)
Iterator over the names and values of primitive variables held in a Variables object.
std::string testid() const override
void register_tests() const override
void clear() const override
OOPS_CONCRETE_PARAMETERS(TestCaseParameters, Parameters)
oops::RequiredParameter< std::vector< std::string > > expectedNames
oops::RequiredParameter< std::vector< Variable > > variables
oops::RequiredParameter< std::vector< std::vector< float > > > expectedValues
oops::RequiredParameter< std::vector< std::string > > expectedGroups
Code shared by all tests.
static TestFixture & getInstance()
static const ObsFilterData & data()
std::unique_ptr< ObsFilterData > data_
static const ioda::ObsSpace & obsspace()
std::shared_ptr< ioda::ObsSpace > obsspace_
void testPrimitiveVariablesIterator(const eckit::LocalConfiguration &conf)
void testPrimitiveVariables(const eckit::LocalConfiguration &conf)
Test a range-based for loop over the PrimitiveVariables range.
CASE("ufo/DataExtractor/bilinearinterp/float_linear")