8 #ifndef TEST_INTERFACE_VARIABLECHANGE_H_
9 #define TEST_INTERFACE_VARIABLECHANGE_H_
17 #define ECKIT_TESTING_SELF_REGISTER_CASES 0
19 #include <boost/noncopyable.hpp>
21 #include "eckit/config/Configuration.h"
22 #include "eckit/testing/Test.h"
29 #include "oops/util/Expect.h"
30 #include "oops/util/Logger.h"
49 return theVariableChangeFixture;
53 oops::instantiateVariableChangeFactory<MODEL>();
63 ~VariableChangeFixture<MODEL>() {}
65 std::vector<eckit::LocalConfiguration>
confs_;
66 std::unique_ptr<const Geometry_>
resol_;
78 for (std::size_t jj = 0; jj < Test_::confs().size(); ++jj) {
80 std::unique_ptr<VariableChange_> \
81 changevar(VariableChangeFactory_::create(Test_::confs()[jj], Test_::resol()));
84 const double tol = Test_::confs()[jj].getDouble(
"tolerance inverse");
87 const eckit::LocalConfiguration initialConfig(Test_::confs()[jj],
"state");
88 State_ xx(Test_::resol(), initialConfig);
95 const bool inverseFirst = Test_::confs()[jj].getBool(
"inverse first",
false);
100 State_ xin(Test_::resol(), varin, xx.validTime());
101 changevar->changeVarInverse(xx, xin);
102 changevar->changeVar(xin, xx);
105 State_ xout(Test_::resol(), varout, xx.validTime());
106 changevar->changeVar(xx, xout);
107 changevar->changeVarInverse(xout, xx);
111 const double xxnorm_ref = xref.norm();
112 const double xxnorm_tst = xx.norm();
115 oops::Log::info() <<
"<xin>, <K^{-1}[K(xin)]>, (<xin>-<K^{-1}[K(xin)]<xin>)/>=" << xxnorm_ref <<
116 " " << xxnorm_tst <<
" " << (xxnorm_ref - xxnorm_tst)/xxnorm_ref <<std::endl;
119 EXPECT(oops::is_close(xxnorm_tst, xxnorm_ref, tol));
127 for (
const eckit::Configuration &config : Test_::confs()) {
129 EXPECT_NO_THROW(parameters.validateAndDeserialize(config));
136 eckit::LocalConfiguration config;
137 config.set(
"variable change",
"###INVALID###");
139 if (oops::Parameters::isValidationSupported())
140 EXPECT_THROWS_MSG(parameters.validate(config),
"unrecognized enum value");
141 EXPECT_THROWS_MSG(parameters.deserialize(config),
142 "does not exist in VariableChangeFactory");
149 const std::vector<std::string> registeredNames =
151 for (
const eckit::Configuration &config : Test_::confs()) {
152 const std::string validName = config.getString(
"variable change");
153 const bool found = std::find(registeredNames.begin(), registeredNames.end(), validName) !=
154 registeredNames.end();
166 std::string
testid()
const override {
return "test::VariableChange<" + MODEL::name() +
">";}
169 std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
171 ts.emplace_back(
CASE(
"interface/VariableChange/testVariableChangeInverse")
172 { testVariableChangeInverse<MODEL>(); });
173 ts.emplace_back(
CASE(
"interface/VariableChange/"
174 "testVariableChangeParametersWrapperValidName")
175 { testVariableChangeParametersWrapperValidName<MODEL>(); });
176 ts.emplace_back(
CASE(
"interface/VariableChange/"
177 "testVariableChangeParametersWrapperInvalidName")
178 { testVariableChangeParametersWrapperInvalidName<MODEL>(); });
179 ts.emplace_back(
CASE(
"interface/VariableChange/"
180 "testVariableChangeFactoryGetMakerNames")
181 { testVariableChangeFactoryGetMakerNames<MODEL>(); });
191 #endif // TEST_INTERFACE_VARIABLECHANGE_H_