@@ -7,6 +7,32 | |||
|
7 | 7 | |
|
8 | 8 | #include <memory> |
|
9 | 9 | |
|
10 | namespace { | |
|
11 | ||
|
12 | /// Generates a date in double | |
|
13 | auto date = [](int year, int month, int day, int hours, int minutes, int seconds) { | |
|
14 | return DateUtils::secondsSinceEpoch( | |
|
15 | QDateTime{{year, month, day}, {hours, minutes, seconds}, Qt::UTC}); | |
|
16 | }; | |
|
17 | ||
|
18 | /// Generates a series of test data for a range | |
|
19 | std::shared_ptr<ScalarSeries> dataSeries(const SqpRange &range) | |
|
20 | { | |
|
21 | auto xAxisData = std::vector<double>{}; | |
|
22 | auto valuesData = std::vector<double>{}; | |
|
23 | ||
|
24 | auto value = 0; | |
|
25 | for (auto x = range.m_TStart; x <= range.m_TEnd; ++x, ++value) { | |
|
26 | xAxisData.push_back(x); | |
|
27 | valuesData.push_back(value); | |
|
28 | } | |
|
29 | ||
|
30 | return std::make_shared<ScalarSeries>(std::move(xAxisData), std::move(valuesData), Unit{}, | |
|
31 | Unit{}); | |
|
32 | } | |
|
33 | ||
|
34 | } // namespace | |
|
35 | ||
|
10 | 36 | Q_DECLARE_METATYPE(std::shared_ptr<ScalarSeries>) |
|
11 | 37 | |
|
12 | 38 | class TestVariable : public QObject { |
@@ -18,6 +44,9 private slots: | |||
|
18 | 44 | |
|
19 | 45 | void testNotInCacheRangeList(); |
|
20 | 46 | void testInCacheRangeList(); |
|
47 | ||
|
48 | void testRealRange_data(); | |
|
49 | void testRealRange(); | |
|
21 | 50 | }; |
|
22 | 51 | |
|
23 | 52 | void TestVariable::testClone_data() |
@@ -36,27 +65,6 void TestVariable::testClone_data() | |||
|
36 | 65 | // Test cases // |
|
37 | 66 | // ////////// // |
|
38 | 67 | |
|
39 | /// Generates a date in double | |
|
40 | auto date = [](int year, int month, int day, int hours, int minutes, int seconds) { | |
|
41 | return DateUtils::secondsSinceEpoch( | |
|
42 | QDateTime{{year, month, day}, {hours, minutes, seconds}, Qt::UTC}); | |
|
43 | }; | |
|
44 | ||
|
45 | /// Generates a data series for a range | |
|
46 | auto dataSeries = [](const SqpRange &range) { | |
|
47 | auto xAxisData = std::vector<double>{}; | |
|
48 | auto valuesData = std::vector<double>{}; | |
|
49 | ||
|
50 | auto value = 0; | |
|
51 | for (auto x = range.m_TStart; x < range.m_TEnd; ++x, ++value) { | |
|
52 | xAxisData.push_back(x); | |
|
53 | valuesData.push_back(value); | |
|
54 | } | |
|
55 | ||
|
56 | return std::make_shared<ScalarSeries>(std::move(xAxisData), std::move(valuesData), Unit{}, | |
|
57 | Unit{}); | |
|
58 | }; | |
|
59 | ||
|
60 | 68 | auto cacheRange = SqpRange{date(2017, 1, 1, 12, 0, 0), date(2017, 1, 1, 13, 0, 0)}; |
|
61 | 69 | QTest::newRow("clone1") << QStringLiteral("var1") |
|
62 | 70 | << QVariantHash{{"data1", 1}, {"data2", "abc"}} |
@@ -257,6 +265,76 void TestVariable::testInCacheRangeList() | |||
|
257 | 265 | QCOMPARE(notInCachRange.m_TEnd, DateUtils::secondsSinceEpoch(varCRE)); |
|
258 | 266 | } |
|
259 | 267 | |
|
268 | namespace { | |
|
269 | ||
|
270 | /// Struct used to represent a range operation on a variable | |
|
271 | /// @sa TestVariable::testRealRange() | |
|
272 | struct RangeOperation { | |
|
273 | SqpRange m_CacheRange; /// Range to set for the variable | |
|
274 | std::shared_ptr<ScalarSeries> m_DataSeries; /// Series to merge in the variable | |
|
275 | SqpRange m_ExpectedRealRange; /// Real Range expected after operation on the variable | |
|
276 | }; | |
|
277 | ||
|
278 | using RangeOperations = std::vector<RangeOperation>; | |
|
279 | ||
|
280 | } // namespace | |
|
281 | ||
|
282 | Q_DECLARE_METATYPE(RangeOperations) | |
|
283 | ||
|
284 | void TestVariable::testRealRange_data() | |
|
285 | { | |
|
286 | // ////////////// // | |
|
287 | // Test structure // | |
|
288 | // ////////////// // | |
|
289 | ||
|
290 | QTest::addColumn<RangeOperations>("operations"); | |
|
291 | ||
|
292 | // ////////// // | |
|
293 | // Test cases // | |
|
294 | // ////////// // | |
|
295 | RangeOperations operations{}; | |
|
296 | ||
|
297 | // Inits cache range and data series (expected real range = cache range) | |
|
298 | auto cacheRange = SqpRange{date(2017, 1, 1, 12, 0, 0), date(2017, 1, 1, 13, 0, 0)}; | |
|
299 | operations.push_back({cacheRange, dataSeries(cacheRange), cacheRange}); | |
|
300 | ||
|
301 | // Changes cache range and updates data series (expected real range = cache range) | |
|
302 | cacheRange = SqpRange{date(2017, 1, 1, 14, 0, 0), date(2017, 1, 1, 15, 0, 0)}; | |
|
303 | operations.push_back({cacheRange, dataSeries(cacheRange), cacheRange}); | |
|
304 | ||
|
305 | // Changes cache range and update data series but with a lower range (expected real range = | |
|
306 | // data series range) | |
|
307 | cacheRange = SqpRange{date(2017, 1, 1, 12, 0, 0), date(2017, 1, 1, 16, 0, 0)}; | |
|
308 | auto dataSeriesRange = SqpRange{date(2017, 1, 1, 14, 0, 0), date(2017, 1, 1, 15, 0, 0)}; | |
|
309 | operations.push_back({cacheRange, dataSeries(dataSeriesRange), dataSeriesRange}); | |
|
310 | ||
|
311 | // Changes cache range but DON'T update data series (expected real range = cache range | |
|
312 | // before operation) | |
|
313 | cacheRange = SqpRange{date(2017, 1, 1, 10, 0, 0), date(2017, 1, 1, 17, 0, 0)}; | |
|
314 | operations.push_back({cacheRange, nullptr, dataSeriesRange}); | |
|
315 | ||
|
316 | QTest::newRow("realRange1") << operations; | |
|
317 | } | |
|
318 | ||
|
319 | void TestVariable::testRealRange() | |
|
320 | { | |
|
321 | // Creates variable (real range is invalid) | |
|
322 | Variable variable{"var"}; | |
|
323 | QCOMPARE(variable.realRange(), INVALID_RANGE); | |
|
324 | ||
|
325 | QFETCH(RangeOperations, operations); | |
|
326 | for (const auto &operation : operations) { | |
|
327 | // Sets cache range and merge data series | |
|
328 | variable.setCacheRange(operation.m_CacheRange); | |
|
329 | if (operation.m_DataSeries != nullptr) { | |
|
330 | variable.mergeDataSeries(operation.m_DataSeries); | |
|
331 | } | |
|
332 | ||
|
333 | // Checks real range | |
|
334 | QCOMPARE(variable.realRange(), operation.m_ExpectedRealRange); | |
|
335 | } | |
|
336 | } | |
|
337 | ||
|
260 | 338 | |
|
261 | 339 | QTEST_MAIN(TestVariable) |
|
262 | 340 | #include "TestVariable.moc" |
General Comments 0
You need to be logged in to leave comments.
Login now