UFO
test/ufo/OperatorUtils.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2021 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_OPERATORUTILS_H_
9 #define TEST_UFO_OPERATORUTILS_H_
10 
11 #include <iomanip>
12 #include <memory>
13 #include <string>
14 #include <vector>
15 
16 #include "eckit/config/LocalConfiguration.h"
17 #include "eckit/testing/Test.h"
18 #include "ioda/ObsSpace.h"
19 #include "ioda/ObsVector.h"
20 #include "oops/mpi/mpi.h"
21 #include "oops/runs/Test.h"
22 #include "oops/util/Expect.h"
23 #include "test/TestEnvironment.h"
24 #include "ufo/filters/Variables.h"
26 
27 namespace ufo {
28 namespace test {
29 
30 /// Code shared by all tests
31 class TestFixture : private boost::noncopyable {
32  public:
33  static const ioda::ObsSpace & obsspace() {return *getInstance().obsspace_;}
34  static const eckit::LocalConfiguration & config() {return getInstance().config_;}
35 
36  private:
37  static TestFixture & getInstance() {
38  static TestFixture theTestFixture;
39  return theTestFixture;
40  }
41 
43  const eckit::Configuration & conf = ::test::TestEnvironment::config();
44  util::DateTime bgn(conf.getString("window begin"));
45  util::DateTime end(conf.getString("window end"));
46  const eckit::LocalConfiguration obsconf(conf, "obs space");
47  ioda::ObsTopLevelParameters obsparams;
48  obsparams.validateAndDeserialize(obsconf);
49  obsspace_.reset(new ioda::ObsSpace(obsparams, oops::mpi::world(), bgn, end,
50  oops::mpi::myself()));
51  config_ = conf.getSubConfiguration("cases");
52  }
53 
54  std::shared_ptr<ioda::ObsSpace> obsspace_;
55  eckit::LocalConfiguration config_;
56 };
57 
58 void testOperatorUtils(const eckit::LocalConfiguration &conf) {
59  oops::Variables expectedOperatorVariables =
60  ufo::Variables(conf.getSubConfigurations("expected operator variables")).toOopsVariables();
61  std::vector<int> expectedOperatorVariableIndices =
62  conf.getIntVector("expected indices");
63 
64  oops::Variables operatorVariables;
65  std::vector<int> operatorVariableIndices;
66  ufo::getOperatorVariables(conf, TestFixture::obsspace().obsvariables(),
67  operatorVariables, operatorVariableIndices);
68 
69  EXPECT_EQUAL(operatorVariables, expectedOperatorVariables);
70  EXPECT_EQUAL(operatorVariableIndices, expectedOperatorVariableIndices);
71 }
72 
73 CASE("ufo/OperatorUtils/Without 'variables' option") {
74  testOperatorUtils(TestFixture::config().getSubConfiguration("without variables"));
75 }
76 
77 CASE("ufo/OperatorUtils/With 'variables' option") {
78  testOperatorUtils(TestFixture::config().getSubConfiguration("with variables"));
79 }
80 
81 class OperatorUtils : public oops::Test {
82  private:
83  std::string testid() const override {return "ufo::test::OperatorUtils";}
84 
85  void register_tests() const override {}
86 
87  void clear() const override {}
88 };
89 
90 } // namespace test
91 } // namespace ufo
92 
93 #endif // TEST_UFO_OPERATORUTILS_H_
oops::Variables toOopsVariables() const
Definition: Variables.cc:156
std::string testid() const override
void clear() const override
void register_tests() const override
Code shared by all tests.
static TestFixture & getInstance()
static const eckit::LocalConfiguration & config()
eckit::LocalConfiguration config_
static const ioda::ObsSpace & obsspace()
std::shared_ptr< ioda::ObsSpace > obsspace_
CASE("ufo/DataExtractor/bilinearinterp/float_linear")
void testOperatorUtils(const eckit::LocalConfiguration &conf)
Definition: RunCRTM.h:27
void getOperatorVariables(const eckit::Configuration &conf, const oops::Variables &simulatedVariables, oops::Variables &operatorVariables, std::vector< int > &operatorVariableIndices)