libdballe  8.6
db/tests.h
1 #include <dballe/msg/tests.h>
2 #include <dballe/values.h>
3 #include <dballe/core/data.h>
4 #include <dballe/db/fwd.h>
5 #include <dballe/db/v7/fwd.h>
6 #include <dballe/db/db.h>
7 #include <dballe/db/summary.h>
8 #include <dballe/sql/fwd.h>
9 #include <utility>
10 #include <functional>
11 
12 namespace dballe {
13 namespace tests {
14 
15 impl::Messages messages_from_db(std::shared_ptr<db::Transaction> tr, const dballe::Query& query);
16 impl::Messages messages_from_db(std::shared_ptr<db::Transaction> tr, const char* query);
17 
20 {
22  std::map<std::string, core::Data> stations;
24  std::map<std::string, core::Data> data;
25 
26  TestDataSet() {}
27  virtual ~TestDataSet() {}
28 
29  void populate_db(DB& db);
30  virtual void populate_transaction(Transaction& tr);
31 };
32 
34 {
35  void populate_db();
36 };
37 
40 {
42 };
43 
44 bool has_driver(const std::string& backend);
45 
46 struct V7DB
47 {
48  typedef db::v7::DB DB;
49  typedef db::v7::Transaction TR;
50  static const auto format = db::Format::V7;
51  static std::shared_ptr<DB> create_db(const std::string& backend, bool wipe);
52 };
53 
54 template<typename DB>
55 struct BaseDBFixture : public Fixture
56 {
57  std::string backend;
58  std::shared_ptr<typename DB::DB> db;
59 
60  BaseDBFixture(const char* backend);
61  ~BaseDBFixture();
62 
63  void test_setup();
64  virtual void create_db();
65  bool has_driver();
66 };
67 
68 template<typename DB>
70 {
72  std::shared_ptr<typename DB::TR> tr;
73 
74  void test_setup();
75  void test_teardown();
76  void populate(TestDataSet& data_set);
77 };
78 
79 template<typename DB, typename TestData>
81 {
83 
84  TestData test_data;
85 
86  void create_db() override
87  {
89  wassert(test_data.populate_db(*this->db));
90  }
91 };
92 
93 template<typename DB>
94 struct DBFixture : public BaseDBFixture<DB>
95 {
97 
98  void test_setup();
99  void populate_database(TestDataSet& data_set);
100 };
101 
102 
103 struct ActualCursor : public Actual<dballe::Cursor&>
104 {
105  using Actual::Actual;
106 
108  void station_keys_match(const DBStation& expected);
109 
111  void data_context_matches(const Data& expected);
112 
114  void data_var_matches(const Data& expected, wreport::Varcode code) {
115  data_var_matches(core::Data::downcast(expected).values.var(code));
116  }
118  void data_var_matches(const DBValues& expected) {
119  if (auto c = dynamic_cast<dballe::db::CursorStation*>(&_actual))
120  {
121  DBValues actual_values = c->get_values();
122  if (!actual_values.vars_equal(expected))
123  // Quick hack to get proper formatting of mismatch
124  wassert(actual(c->get_values()) == expected);
125  }
126  else if (auto c = dynamic_cast<dballe::CursorStationData*>(&_actual))
127  data_var_matches(expected.var(c->get_varcode()));
128  else if (auto c = dynamic_cast<dballe::CursorData*>(&_actual))
129  data_var_matches(expected.var(c->get_varcode()));
130  else
131  throw wreport::error_consistency("cannot call data_var_matches on this kind of cursor");
132  }
134  void data_var_matches(const Values& expected, wreport::Varcode code) {
135  data_var_matches(expected.var(code));
136  }
138  void data_var_matches(const wreport::Var& expected);
139 
141  void data_matches(const Data& ds)
142  {
143  if (auto c = dynamic_cast<dballe::CursorStationData*>(&_actual))
144  data_matches(ds, c->get_varcode());
145  else if (auto c = dynamic_cast<dballe::CursorData*>(&_actual))
146  data_matches(ds, c->get_varcode());
147  else
148  throw wreport::error_consistency("cannot call data_matches on this kind of cursor");
149  }
151  void data_matches(const Data& ds, wreport::Varcode code);
152 };
153 
154 typedef std::function<void(const db::DBSummary&)> result_checker;
155 
156 template<typename DB>
157 struct ActualDB : public Actual<std::shared_ptr<DB>>
158 {
160 
162  void try_data_query(const std::string& query, unsigned expected);
163 
165  void try_data_query(const Query& query, unsigned expected);
166 
168  void try_station_query(const std::string& query, unsigned expected);
169 
171  void try_summary_query(const std::string& query, unsigned expected, result_checker checker=nullptr);
172 };
173 
174 inline ActualCursor actual(dballe::Cursor& actual) { return ActualCursor(actual); }
175 inline ActualCursor actual(dballe::CursorStation& actual) { return ActualCursor(actual); }
176 inline ActualCursor actual(dballe::CursorStationData& actual) { return ActualCursor(actual); }
177 inline ActualCursor actual(dballe::CursorData& actual) { return ActualCursor(actual); }
178 inline ActualCursor actual(dballe::CursorSummary& actual) { return ActualCursor(actual); }
179 inline ActualCursor actual(std::unique_ptr<dballe::Cursor>& actual) { return ActualCursor(*actual); }
180 inline ActualCursor actual(std::unique_ptr<dballe::CursorStation>& actual) { return ActualCursor(*actual); }
181 inline ActualCursor actual(std::unique_ptr<dballe::CursorStationData>& actual) { return ActualCursor(*actual); }
182 inline ActualCursor actual(std::unique_ptr<dballe::CursorData>& actual) { return ActualCursor(*actual); }
183 inline ActualCursor actual(std::unique_ptr<dballe::CursorSummary>& actual) { return ActualCursor(*actual); }
184 inline ActualDB<dballe::DB> actual(std::shared_ptr<dballe::DB> actual) { return ActualDB<dballe::DB>(actual); }
185 ActualDB<dballe::DB> actual(std::shared_ptr<dballe::db::v7::DB> actual);
186 inline ActualDB<dballe::db::Transaction> actual(std::shared_ptr<dballe::db::Transaction> actual) { return ActualDB<dballe::db::Transaction>(actual); }
187 ActualDB<dballe::db::Transaction> actual(std::shared_ptr<dballe::db::v7::Transaction> actual);
188 
189 extern template class BaseDBFixture<V7DB>;
190 extern template class DBFixture<V7DB>;
191 extern template class EmptyTransactionFixture<V7DB>;
192 extern template class ActualDB<dballe::DB>;
193 extern template class ActualDB<dballe::db::Transaction>;
194 
195 }
196 }
Forward declarations for public dballe/sql names.
Base class for cursors that iterate over DB query results.
Definition: cursor.h:15
Definition: db.h:149
const wreport::Var & var(wreport::Varcode code) const
Lookup a wreport::Var, throwing an exception if not found.
Definition: db/tests.h:46
void data_var_matches(const DBValues &expected)
Check cursor data variable(s) after a query_data.
Definition: db/tests.h:118
Functions used to connect to DB-All.e and insert, query and delete data.
Cursor iterating over summary entries.
Definition: cursor.h:97
static const Data & downcast(const dballe::Data &data)
Return a reference to record downcasted as core::Record.
void data_var_matches(const Data &expected, wreport::Varcode code)
Check cursor data variable after a query_data.
Definition: db/tests.h:114
Definition: cmdline.h:18
Cursor iterating over data values.
Definition: cursor.h:77
Collection of DBValue objects, indexed by wreport::Varcode.
Definition: values.h:191
bool vars_equal(const DBValues &o) const
Check if the variables are the same, regardless of the data_id.
Definition: db/tests.h:33
Definition: db/tests.h:94
void data_var_matches(const Values &expected, wreport::Varcode code)
Check cursor data variable after a query_data.
Definition: db/tests.h:134
uint16_t Varcode
Definition: db/tests.h:55
Key/value store where keys are strings and values are wreport variables.
Definition: data.h:17
Definition: transaction.h:15
Definition: db.h:296
Cursor iterating over station data values.
Definition: cursor.h:66
Test fixture used by old DB-All.e db tests.
Definition: db/tests.h:39
std::map< std::string, core::Data > data
Arbitrarily named data values.
Definition: db/tests.h:24
DB-ALLe database connection for database format V7.
Definition: db/v7/db.h:20
void data_matches(const Data &ds)
Check cursor data context and variable after a query_data.
Definition: db/tests.h:141
std::map< std::string, core::Data > stations
Arbitrarily named station values.
Definition: db/tests.h:22
Cursor iterating over stations.
Definition: cursor.h:56
Definition: db/tests.h:80
Definition: types.h:850
Definition: db/tests.h:157
Structures used as input to database insert functions.
Query used to filter DB-All.e data.
Definition: query.h:14
Base for datasets used to populate test databases.
Definition: db/tests.h:19
Collection of Value objects, indexed by wreport::Varcode.
Definition: values.h:176
Definition: db/tests.h:103