UFO
test/ufo/Variables.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2019 UCAR
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_VARIABLES_H_
9 #define TEST_UFO_VARIABLES_H_
10 
11 #include <algorithm>
12 #include <set>
13 #include <string>
14 #include <vector>
15 
16 #define ECKIT_TESTING_SELF_REGISTER_CASES 0
17 
18 #include "eckit/config/LocalConfiguration.h"
19 #include "eckit/testing/Test.h"
20 #include "oops/base/Variables.h"
21 #include "oops/runs/Test.h"
22 #include "test/TestEnvironment.h"
23 #include "ufo/filters/Variable.h"
24 #include "ufo/filters/Variables.h"
25 
26 namespace ufo {
27 namespace test {
28 
29 // -----------------------------------------------------------------------------
30 
31 void testVariable() {
32  std::vector<eckit::LocalConfiguration> conf;
33  ::test::TestEnvironment::config().get("test variables", conf);
34  for (std::size_t jj = 0; jj < conf.size(); ++jj) {
35  // read variable from config
36  Variable var(conf[jj]);
37  // read reference vector of strings and group
38  std::vector<std::string> refvars(conf[jj].getStringVector("reference names"));
39  const std::string refgroup = conf[jj].getString("reference group");
40  // compare the two
41  EXPECT(var.size() == refvars.size());
42  EXPECT(var.group() == refgroup);
43  for (std::size_t jvar = 0; jvar < var.size(); ++jvar) {
44  EXPECT(var.variable(jvar) == refvars[jvar]);
45  }
46  // test the fullName() method
47  const std::string refFullName = conf[jj].getString("reference full name");
48  EXPECT_EQUAL(var.fullName(), refFullName);
49  }
50 }
51 
52 // -----------------------------------------------------------------------------
54  std::vector<eckit::LocalConfiguration> conf;
55  ::test::TestEnvironment::config().get("oops variables", conf);
56  for (std::size_t jj = 0; jj < conf.size(); ++jj) {
57  // read variable from config
58  oops::Variables oopsvars(conf[jj], "variables");
59  // read reference vector of strings
60  std::vector<std::string> refvars(conf[jj].getStringVector("reference names"));
61  // init ufo::Variables
62  Variables vars(oopsvars);
63  // compare the two
64  EXPECT(vars.nvars() == refvars.size());
65  for (std::size_t jvar = 0; jvar < vars.nvars(); ++jvar) {
66  EXPECT(vars.variable(jvar).variable() == refvars[jvar]);
67  }
68  }
69 }
70 
71 // -----------------------------------------------------------------------------
72 // Helper function: checks if variable is in variables. Ignores functions,
73 // expands channels (i.e. for bt channels 1-2 bt_1, bt_2 are in vars, bt is not)
74 bool hasVariable(const Variables & vars, const Variable & var) {
75  bool found = false;
76  for (size_t jj = 0; jj < vars.nvars(); ++jj) {
77  if (vars.variable(jj).variable() == var.variable() &&
78  vars.variable(jj).group() == var.group()) found = true;
79  }
80  return found;
81 }
82 
83 
84 // -----------------------------------------------------------------------------
85 void testAllFromGroupFor(const std::string &funcName,
86  const eckit::LocalConfiguration &funcConf,
87  const ufo::Variables &initialVars) {
88  ufo::Variables vars = initialVars;
89  vars += Variable(funcName, funcConf);
90 
91  Variables res = vars.allFromGroup("ObsValue");
92  oops::Log::info() << res << std::endl;
93 
94  EXPECT(res.size() == 2);
95  EXPECT(hasVariable(res, Variable("eastward_wind@ObsValue")));
96  EXPECT(hasVariable(res, Variable("temperature@ObsValue")));
97 }
98 
99 // -----------------------------------------------------------------------------
100 // Test that ufo::Variables::allFromGroup() gets variables from the functions
102  Variables vars;
103  vars += Variable("height@GeoVaLs");
104  vars += Variable("latitude@MetaData");
105  vars += Variable("temperature@ObsValue");
106  vars += Variable("longitude@MetaData");
107 
108  const eckit::Configuration &conf = ::test::TestEnvironment::config();
109  testAllFromGroupFor("Conditional@ObsFunction",
110  eckit::LocalConfiguration(conf, "float conditional"),
111  vars);
112  testAllFromGroupFor("Conditional@IntObsFunction",
113  eckit::LocalConfiguration(conf, "int conditional"),
114  vars);
115  testAllFromGroupFor("Conditional@StringObsFunction",
116  eckit::LocalConfiguration(conf, "string conditional"),
117  vars);
118  testAllFromGroupFor("Conditional@DateTimeObsFunction",
119  eckit::LocalConfiguration(conf, "datetime conditional"),
120  vars);
121 }
122 
123 // -----------------------------------------------------------------------------
124 void testHasGroupFor(const std::string &funcName,
125  const eckit::LocalConfiguration &funcConf,
126  const ufo::Variables &initialVars) {
127  ufo::Variables vars = initialVars;
128  vars += Variable(funcName, funcConf);
129  EXPECT(vars.hasGroup("ObsValue"));
130 }
131 
132 // Test that ufo::Variables::hasGroup() works for functions
133 void testHasGroup() {
134  ufo::Variables vars;
135  vars += Variable("latitude@MetaData");
136  vars += Variable("longitude@MetaData");
137 
138  EXPECT(vars.hasGroup("MetaData"));
139  EXPECT(!vars.hasGroup("ObsValue"));
140 
141  const eckit::Configuration &conf = ::test::TestEnvironment::config();
142  testHasGroupFor("Conditional@ObsFunction",
143  eckit::LocalConfiguration(conf, "float conditional"),
144  vars);
145  testHasGroupFor("Conditional@IntObsFunction",
146  eckit::LocalConfiguration(conf, "int conditional"),
147  vars);
148  testHasGroupFor("Conditional@StringObsFunction",
149  eckit::LocalConfiguration(conf, "string conditional"),
150  vars);
151  testHasGroupFor("Conditional@DateTimeObsFunction",
152  eckit::LocalConfiguration(conf, "datetime conditional"),
153  vars);
154 }
155 
156 // -----------------------------------------------------------------------------
157 
158 class Variables : public oops::Test {
159  public:
161  virtual ~Variables() {}
162  private:
163  std::string testid() const override {return "ufo::test::Variables";}
164 
165  void register_tests() const override {
166  std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
167 
168  ts.emplace_back(CASE("ufo/Variables/testVariable")
169  { testVariable(); });
170 
171  ts.emplace_back(CASE("ufo/Variables/testConstructor")
172  { testConstructor(); });
173 
174  ts.emplace_back(CASE("ufo/Variables/testAllFromGroup")
175  { testAllFromGroup(); });
176 
177  ts.emplace_back(CASE("ufo/Variables/testHasGroup")
178  { testHasGroup(); });
179  }
180 
181  void clear() const override {}
182 };
183 
184 // -----------------------------------------------------------------------------
185 
186 } // namespace test
187 } // namespace ufo
188 
189 #endif // TEST_UFO_VARIABLES_H_
const std::string & variable() const
Definition: Variable.cc:99
std::string fullName() const
Definition: Variable.cc:128
const std::string & group() const
Definition: Variable.cc:116
size_t size() const
Definition: Variable.cc:78
bool hasGroup(const std::string &) const
Definition: Variables.cc:168
Variables allFromGroup(const std::string &) const
Definition: Variables.cc:128
void register_tests() const override
std::string testid() const override
void clear() const override
void testVariable()
void testHasGroupFor(const std::string &funcName, const eckit::LocalConfiguration &funcConf, const ufo::Variables &initialVars)
void testAllFromGroup()
void testAllFromGroupFor(const std::string &funcName, const eckit::LocalConfiguration &funcConf, const ufo::Variables &initialVars)
CASE("ufo/DataExtractor/bilinearinterp/float_linear")
bool hasVariable(const Variables &vars, const Variable &var)
void testConstructor()
Definition: RunCRTM.h:27