UFO
Parameters.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2019 Met Office UK
3  *
4  * This software is licensed under the terms of the Apache Licence Version 2.0
5  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6  */
7 
8 #ifndef TEST_UFO_PARAMETERS_H_
9 #define TEST_UFO_PARAMETERS_H_
10 
11 #include <string>
12 #include <vector>
13 
14 #define ECKIT_TESTING_SELF_REGISTER_CASES 0
15 
16 #include "eckit/config/LocalConfiguration.h"
17 #include "eckit/testing/Test.h"
18 #include "oops/runs/Test.h"
19 #include "oops/util/Expect.h"
20 #include "oops/util/parameters/OptionalParameter.h"
21 #include "oops/util/parameters/Parameters.h"
22 #include "test/TestEnvironment.h"
24 
25 namespace ufo {
26 namespace test {
27 
28 const bool validationSupported = oops::Parameters::isValidationSupported();
29 
30 class MyParameters : public oops::Parameters {
31  OOPS_CONCRETE_PARAMETERS(MyParameters, Parameters)
32  public:
33  oops::OptionalParameter<ufo::Variable> optVariableParameter{"opt_variable_parameter", this};
34 };
35 
36 template <typename ParametersType>
37 void doTestSerialization(const eckit::Configuration &config) {
38  // We deserialize a configuration loaded from a YAML file into parameters and then serialize them
39  // back into a configuration. The test verifies that the configuration objects produce the same
40  // output when printed.
41  //
42  // For this to work, parameter names in the YAML file must be ordered alphabetically; that's
43  // because the YAML parser creates configurations storing keys and values OrderedMapContent
44  // objects (preserving the order in which individual options were specified in the YAML file),
45  // but the LocalConfiguration::set() method stores keys and values in MapContent objects (with
46  // keys ordered alphabetically).
47 
48  ParametersType params;
49  params.deserialize(config);
50 
51  eckit::LocalConfiguration outputConfig;
52  params.serialize(outputConfig);
53 
54  std::stringstream expectedStream;
55  expectedStream << config;
56  const std::string expected = expectedStream.str();
57 
58  std::stringstream receivedStream;
59  receivedStream << outputConfig;
60  std::string received = receivedStream.str();
61 
62  EXPECT_EQUAL(received, expected);
63 }
64 
66  const eckit::LocalConfiguration conf(::test::TestEnvironment::config());
67 
68  MyParameters params;
69  EXPECT(params.optVariableParameter.value() == boost::none);
70 
71  const eckit::LocalConfiguration emptyConf(conf, "empty");
72  EXPECT_NO_THROW(params.validate(emptyConf));
73  params.deserialize(emptyConf);
74 
75  EXPECT(params.optVariableParameter.value() == boost::none);
76 }
77 
79  MyParameters params;
80  const eckit::LocalConfiguration fullConf(::test::TestEnvironment::config(), "full");
81  EXPECT_NO_THROW(params.validate(fullConf));
82  params.deserialize(fullConf);
83 
84  EXPECT(params.optVariableParameter.value() != boost::none);
85  EXPECT_EQUAL(params.optVariableParameter.value().get().group(), "MetaData");
86  EXPECT_EQUAL(params.optVariableParameter.value().get().variable(), "latitude");
87  EXPECT_EQUAL(params.optVariableParameter.value().get().channels(), (std::vector<int>{1, 5}));
88 }
89 
91  MyParameters params;
92  const eckit::LocalConfiguration fullConf(::test::TestEnvironment::config(), "no_channels");
93  EXPECT_NO_THROW(params.validate(fullConf));
94  params.deserialize(fullConf);
95 
96  EXPECT(params.optVariableParameter.value() != boost::none);
97  EXPECT_EQUAL(params.optVariableParameter.value().get().group(), "MetaData");
98  EXPECT_EQUAL(params.optVariableParameter.value().get().variable(), "latitude");
99  EXPECT_EQUAL(params.optVariableParameter.value().get().channels(), (std::vector<int>{}));
100 }
101 
103  MyParameters params;
104  const eckit::LocalConfiguration fullConf(::test::TestEnvironment::config(), "complex_channels");
105  EXPECT_NO_THROW(params.validate(fullConf));
106  params.deserialize(fullConf);
107 
108  EXPECT(params.optVariableParameter.value() != boost::none);
109  EXPECT_EQUAL(params.optVariableParameter.value().get().group(), "MetaData");
110  EXPECT_EQUAL(params.optVariableParameter.value().get().variable(), "latitude");
111  EXPECT_EQUAL(params.optVariableParameter.value().get().channels(),
112  (std::vector<int>{1, 5, 10, 11, 12, 13, 14, 15}));
113 }
114 
116  MyParameters params;
117  const eckit::LocalConfiguration conf(::test::TestEnvironment::config(), "missing_name");
119  EXPECT_THROWS(params.validate(conf));
120  EXPECT_THROWS_AS(params.deserialize(conf), eckit::BadParameter);
121 }
122 
124  MyParameters params;
125  const eckit::LocalConfiguration conf(::test::TestEnvironment::config(), "misspelled_property");
127  EXPECT_THROWS(params.validate(conf));
128 }
129 
131  MyParameters params;
132  const eckit::LocalConfiguration conf(::test::TestEnvironment::config(), "full");
133  doTestSerialization<MyParameters>(conf);
134 }
135 
137  MyParameters params;
138  const eckit::LocalConfiguration conf(::test::TestEnvironment::config(), "no_channels");
139  doTestSerialization<MyParameters>(conf);
140 }
141 
142 class Parameters : public oops::Test {
143  private:
144  std::string testid() const override {return "ufo::test::Parameters";}
145 
146  void register_tests() const override {
147  std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
148 
149  ts.emplace_back(CASE("ufo/Parameters/defaultValue") {
151  });
152  ts.emplace_back(CASE("ufo/Parameters/correctValue") {
154  });
155  ts.emplace_back(CASE("ufo/Parameters/noChannels") {
156  testNoChannels();
157  });
158  ts.emplace_back(CASE("ufo/Parameters/complexChannels") {
160  });
161  ts.emplace_back(CASE("ufo/Parameters/missingName") {
162  testMissingName();
163  });
164  ts.emplace_back(CASE("ufo/Parameters/misspelledProperty") {
166  });
167  ts.emplace_back(CASE("ufo/Parameters/serializationWithChannels") {
169  });
170  ts.emplace_back(CASE("ufo/Parameters/serializationWithoutChannels") {
172  });
173  }
174 
175  void clear() const override {}
176 };
177 
178 } // namespace test
179 } // namespace ufo
180 
181 #endif // TEST_UFO_PARAMETERS_H_
ufo::test::testNoChannels
void testNoChannels()
Definition: Parameters.h:90
ufo::test::Parameters::testid
std::string testid() const override
Definition: Parameters.h:144
ufo::test::doTestSerialization
void doTestSerialization(const eckit::Configuration &config)
Definition: Parameters.h:37
ufo::test::CASE
CASE("ufo/MetOfficeBuddyPairFinder/" "Duplicates, constraints on buddy counts, legacy pair collector")
Definition: test/ufo/MetOfficeBuddyPairFinder.h:171
ufo::test::Parameters
Definition: Parameters.h:142
ufo::test::validationSupported
const bool validationSupported
Definition: Parameters.h:28
ufo::test::MyParameters::optVariableParameter
oops::OptionalParameter< ufo::Variable > optVariableParameter
Definition: Parameters.h:33
ufo
Definition: RunCRTM.h:27
ufo::test::testCorrectValue
void testCorrectValue()
Definition: Parameters.h:78
ufo::test::Parameters::register_tests
void register_tests() const override
Definition: Parameters.h:146
ufo::test::testDefaultValue
void testDefaultValue()
Definition: Parameters.h:65
ufo::test::testSerializationWithChannels
void testSerializationWithChannels()
Definition: Parameters.h:130
ufo::test::Parameters::clear
void clear() const override
Definition: Parameters.h:175
ufo::test::testSerializationWithoutChannels
void testSerializationWithoutChannels()
Definition: Parameters.h:136
ufo::test::MyParameters
Definition: Parameters.h:30
ufo::test::testComplexChannels
void testComplexChannels()
Definition: Parameters.h:102
conf
Definition: conf.py:1
ufo::test::testMisspelledProperty
void testMisspelledProperty()
Definition: Parameters.h:123
ufo::test::testMissingName
void testMissingName()
Definition: Parameters.h:115
ParameterTraitsVariable.h