diff --git a/core/include/Data/DataSeries.h b/core/include/Data/DataSeries.h index 0cba40a..f2fcd2a 100644 --- a/core/include/Data/DataSeries.h +++ b/core/include/Data/DataSeries.h @@ -208,11 +208,11 @@ public: auto lowerIt = std::lower_bound(begin, end, min, [](const auto &itValue, const auto &value) { - return itValue.x() == value; + return itValue.x() < value; }); auto upperIt = std::upper_bound(begin, end, max, [](const auto &value, const auto &itValue) { - return itValue.x() == value; + return value < itValue.x(); }); return std::make_pair(lowerIt, upperIt); diff --git a/core/tests/Data/TestDataSeries.cpp b/core/tests/Data/TestDataSeries.cpp index 4be88cc..a8f6525 100644 --- a/core/tests/Data/TestDataSeries.cpp +++ b/core/tests/Data/TestDataSeries.cpp @@ -22,6 +22,13 @@ private slots: /// Tests merge of two data series void testMerge(); + + /// Input test data + /// @sa testSubdata() + void testSubdata_data(); + + /// Tests get subdata of two data series + void testSubdata(); }; void TestDataSeries::testCtor_data() @@ -160,5 +167,66 @@ void TestDataSeries::testMerge() seriesValuesData.cbegin())); } +void TestDataSeries::testSubdata_data() +{ + // ////////////// // + // Test structure // + // ////////////// // + + // Data series to get subdata + QTest::addColumn >("dataSeries"); + + // Min/max values + QTest::addColumn("min"); + QTest::addColumn("max"); + + // Expected values after subdata + QTest::addColumn >("expectedXAxisData"); + QTest::addColumn >("expectedValuesData"); + + // ////////// // + // Test cases // + // ////////// // + + QTest::newRow("subData1") << createSeries({1., 2., 3., 4., 5.}, {100., 200., 300., 400., 500.}) + << -1. << 3.2 << QVector{1., 2., 3.} + << QVector{100., 200., 300.}; + QTest::newRow("subData2") << createSeries({1., 2., 3., 4., 5.}, {100., 200., 300., 400., 500.}) + << 1. << 4. << QVector{1., 2., 3., 4.} + << QVector{100., 200., 300., 400.}; + QTest::newRow("subData3") << createSeries({1., 2., 3., 4., 5.}, {100., 200., 300., 400., 500.}) + << 1. << 3.9 << QVector{1., 2., 3.} + << QVector{100., 200., 300.}; + QTest::newRow("subData4") << createSeries({1., 2., 3., 4., 5.}, {100., 200., 300., 400., 500.}) + << 0. << 0.9 << QVector{} << QVector{}; + QTest::newRow("subData5") << createSeries({1., 2., 3., 4., 5.}, {100., 200., 300., 400., 500.}) + << 0. << 1. << QVector{1.} << QVector{100.}; + QTest::newRow("subData6") << createSeries({1., 2., 3., 4., 5.}, {100., 200., 300., 400., 500.}) + << 2.1 << 6. << QVector{3., 4., 5.} + << QVector{300., 400., 500.}; + QTest::newRow("subData7") << createSeries({1., 2., 3., 4., 5.}, {100., 200., 300., 400., 500.}) + << 6. << 9. << QVector{} << QVector{}; + QTest::newRow("subData8") << createSeries({1., 2., 3., 4., 5.}, {100., 200., 300., 400., 500.}) + << 5. << 9. << QVector{5.} << QVector{500.}; +} + +void TestDataSeries::testSubdata() +{ + QFETCH(std::shared_ptr, dataSeries); + QFETCH(double, min); + QFETCH(double, max); + + QFETCH(QVector, expectedXAxisData); + QFETCH(QVector, expectedValuesData); + + auto bounds = dataSeries->subData(min, max); + QVERIFY(std::equal(bounds.first, bounds.second, expectedXAxisData.cbegin(), + expectedXAxisData.cend(), + [](const auto &it, const auto &expectedX) { return it.x() == expectedX; })); + QVERIFY(std::equal( + bounds.first, bounds.second, expectedValuesData.cbegin(), expectedValuesData.cend(), + [](const auto &it, const auto &expectedVal) { return it.value() == expectedVal; })); +} + QTEST_MAIN(TestDataSeries) #include "TestDataSeries.moc"