##// END OF EJS Templates
Wait for the end of an acquisition to validate an operation (3)...
Wait for the end of an acquisition to validate an operation (3) If an operation is to validate, waits the end of the acquisition

File last commit:

r977:fce4a3cd44f3
r1215:7541b71e5b78
Show More
TestScalarSeries.cpp
426 lines | 19.8 KiB | text/x-c | CppLexer
/ core / tests / Data / TestScalarSeries.cpp
#include "Data/ScalarSeries.h"
#include "DataSeriesBuilders.h"
#include "DataSeriesTestsUtils.h"
#include <QObject>
#include <QtTest>
/**
* @brief The TestScalarSeries class defines unit tests on scalar series.
*
* Most of these unit tests use generic tests defined for DataSeries (@sa DataSeriesTestsUtils)
*/
class TestScalarSeries : public QObject {
Q_OBJECT
private slots:
/// Tests construction of a scalar series
void testCtor_data();
void testCtor();
/// Tests merge of two scalar series
void testMerge_data();
void testMerge();
/// Tests merge of a vector series in a scalar series
void testMergeWithVector_data();
void testMergeWithVector();
/// Tests get min x-axis data of a scalar series
void testMinXAxisData_data();
void testMinXAxisData();
/// Tests get max x-axis data of a scalar series
void testMaxXAxisData_data();
void testMaxXAxisData();
/// Tests purge of a scalar series
void testPurge_data();
void testPurge();
/// Tests get x-axis range of a scalar series
void testXAxisRange_data();
void testXAxisRange();
/// Tests get values bounds of a scalar series
void testValuesBounds_data();
void testValuesBounds();
};
void TestScalarSeries::testCtor_data()
{
// x-axis data
QTest::addColumn<DataContainer>("xAxisData");
// values data
QTest::addColumn<DataContainer>("valuesData");
// construction expected to be valid
QTest::addColumn<bool>("expectOK");
// expected x-axis data (when construction is valid)
QTest::addColumn<DataContainer>("expectedXAxisData");
// expected values data (when construction is valid)
QTest::addColumn<DataContainer>("expectedValuesData");
QTest::newRow("invalidData (different sizes of vectors)")
<< DataContainer{1., 2., 3., 4., 5.} << DataContainer{100., 200., 300.} << false
<< DataContainer{} << DataContainer{};
QTest::newRow("sortedData") << DataContainer{1., 2., 3., 4., 5.}
<< DataContainer{100., 200., 300., 400., 500.} << true
<< DataContainer{1., 2., 3., 4., 5.}
<< DataContainer{100., 200., 300., 400., 500.};
QTest::newRow("unsortedData") << DataContainer{5., 4., 3., 2., 1.}
<< DataContainer{100., 200., 300., 400., 500.} << true
<< DataContainer{1., 2., 3., 4., 5.}
<< DataContainer{500., 400., 300., 200., 100.};
QTest::newRow("unsortedData2")
<< DataContainer{1., 4., 3., 5., 2.} << DataContainer{100., 200., 300., 400., 500.} << true
<< DataContainer{1., 2., 3., 4., 5.} << DataContainer{100., 500., 300., 200., 400.};
}
void TestScalarSeries::testCtor()
{
// Creates series
QFETCH(DataContainer, xAxisData);
QFETCH(DataContainer, valuesData);
QFETCH(bool, expectOK);
if (expectOK) {
auto series = std::make_shared<ScalarSeries>(std::move(xAxisData), std::move(valuesData),
Unit{}, Unit{});
// Validates results : we check that the data series is sorted on its x-axis data
QFETCH(DataContainer, expectedXAxisData);
QFETCH(DataContainer, expectedValuesData);
validateRange(series->cbegin(), series->cend(), expectedXAxisData, expectedValuesData);
}
else {
QVERIFY_EXCEPTION_THROWN(std::make_shared<ScalarSeries>(
std::move(xAxisData), std::move(valuesData), Unit{}, Unit{}),
std::invalid_argument);
}
}
void TestScalarSeries::testMerge_data()
{
testMerge_struct<ScalarSeries, DataContainer>();
QTest::newRow("sortedMerge") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< ScalarBuilder{}
.setX({6., 7., 8., 9., 10.})
.setValues({600., 700., 800., 900., 1000.})
.build()
<< DataContainer{1., 2., 3., 4., 5., 6., 7., 8., 9., 10.}
<< DataContainer{100., 200., 300., 400., 500.,
600., 700., 800., 900., 1000.};
QTest::newRow("unsortedMerge")
<< ScalarBuilder{}
.setX({6., 7., 8., 9., 10.})
.setValues({600., 700., 800., 900., 1000.})
.build()
<< ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< DataContainer{1., 2., 3., 4., 5., 6., 7., 8., 9., 10.}
<< DataContainer{100., 200., 300., 400., 500., 600., 700., 800., 900., 1000.};
QTest::newRow("unsortedMerge2 (merge not made because source is in the bounds of dest)")
<< ScalarBuilder{}
.setX({1., 2., 8., 9., 10})
.setValues({100., 200., 800., 900., 1000.})
.build()
<< ScalarBuilder{}
.setX({3., 4., 5., 6., 7.})
.setValues({300., 400., 500., 600., 700.})
.build()
<< DataContainer{1., 2., 8., 9., 10.} << DataContainer{100., 200., 800., 900., 1000.};
QTest::newRow("unsortedMerge3")
<< ScalarBuilder{}
.setX({3., 4., 5., 7., 8})
.setValues({300., 400., 500., 700., 800.})
.build()
<< ScalarBuilder{}
.setX({1., 2., 3., 7., 10.})
.setValues({100., 200., 333., 777., 1000.})
.build()
<< DataContainer{1., 2., 3., 4., 5., 7., 8., 10.}
<< DataContainer{100., 200., 300., 400., 500., 700., 800., 1000.};
QTest::newRow("emptySource") << ScalarBuilder{}
.setX({3., 4., 5., 7., 8})
.setValues({300., 400., 500., 700., 800.})
.build()
<< ScalarBuilder{}.setX({}).setValues({}).build()
<< DataContainer{3., 4., 5., 7., 8.}
<< DataContainer{300., 400., 500., 700., 800.};
}
void TestScalarSeries::testMerge()
{
testMerge_t<ScalarSeries, DataContainer>();
}
void TestScalarSeries::testMergeWithVector_data()
{
testMergeDifferentTypes_struct<VectorSeries, ScalarSeries>();
QTest::newRow("mergeVectorInScalar") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< VectorBuilder{}
.setX({6., 7., 8., 9., 10.})
.setXValues({600., 700., 800., 900., 1000.})
.setYValues({610., 710., 810., 910., 1010.})
.setZValues({620., 720., 820., 920., 1020.})
.build()
<< DataContainer{1., 2., 3., 4., 5.}
<< DataContainer{100., 200., 300., 400., 500.};
}
void TestScalarSeries::testMergeWithVector()
{
testMergeDifferentTypes_t<VectorSeries, ScalarSeries>();
}
void TestScalarSeries::testMinXAxisData_data()
{
testMinXAxisData_struct<ScalarSeries>();
QTest::newRow("minData1") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 0. << true << 1.;
QTest::newRow("minData2") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 1. << true << 1.;
QTest::newRow("minData3") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 1.1 << true << 2.;
QTest::newRow("minData4") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 5. << true << 5.;
QTest::newRow("minData5") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 5.1 << false << std::numeric_limits<double>::quiet_NaN();
QTest::newRow("minData6") << ScalarBuilder{}.setX({}).setValues({}).build() << 1.1 << false
<< std::numeric_limits<double>::quiet_NaN();
}
void TestScalarSeries::testMinXAxisData()
{
testMinXAxisData_t<ScalarSeries>();
}
void TestScalarSeries::testMaxXAxisData_data()
{
testMaxXAxisData_struct<ScalarSeries>();
QTest::newRow("maxData1") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 6. << true << 5.;
QTest::newRow("maxData2") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 5. << true << 5.;
QTest::newRow("maxData3") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 4.9 << true << 4.;
QTest::newRow("maxData4") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 1.1 << true << 1.;
QTest::newRow("maxData5") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 1. << true << 1.;
QTest::newRow("maxData6") << ScalarBuilder{}.setX({}).setValues({}).build() << 1.1 << false
<< std::numeric_limits<double>::quiet_NaN();
}
void TestScalarSeries::testMaxXAxisData()
{
testMaxXAxisData_t<ScalarSeries>();
}
void TestScalarSeries::testPurge_data()
{
testPurge_struct<ScalarSeries>();
QTest::newRow("purgeScalar") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 2. << 4. << DataContainer{2., 3., 4.}
<< std::vector<DataContainer>{{200., 300., 400.}};
QTest::newRow("purgeScalar1 (min/max swap)") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 4. << 2. << DataContainer{2., 3., 4.}
<< std::vector<DataContainer>{{200., 300., 400.}};
QTest::newRow("purgeScalar2") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 0. << 2.5 << DataContainer{1., 2.}
<< std::vector<DataContainer>{{100., 200.}};
QTest::newRow("purgeScalar3") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 3.5 << 7. << DataContainer{4., 5.}
<< std::vector<DataContainer>{{400., 500.}};
QTest::newRow("purgeScalar4") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 0. << 7. << DataContainer{1., 2., 3., 4., 5.}
<< std::vector<DataContainer>{{100., 200., 300., 400., 500.}};
QTest::newRow("purgeScalar5") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 5.5 << 7. << DataContainer{} << std::vector<DataContainer>{{}};
}
void TestScalarSeries::testPurge()
{
testPurge_t<ScalarSeries>();
}
void TestScalarSeries::testXAxisRange_data()
{
testXAxisRange_struct<ScalarSeries>();
QTest::newRow("xAxisRange") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< -1. << 3.2 << DataContainer{1., 2., 3.}
<< DataContainer{100., 200., 300.};
QTest::newRow("xAxisRange1 (min/max swap)") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 3.2 << -1. << DataContainer{1., 2., 3.}
<< DataContainer{100., 200., 300.};
QTest::newRow("xAxisRange2") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 1. << 4. << DataContainer{1., 2., 3., 4.}
<< DataContainer{100., 200., 300., 400.};
QTest::newRow("xAxisRange3") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 1. << 3.9 << DataContainer{1., 2., 3.}
<< DataContainer{100., 200., 300.};
QTest::newRow("xAxisRange4") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 0. << 0.9 << DataContainer{} << DataContainer{};
QTest::newRow("xAxisRange5") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 0. << 1. << DataContainer{1.} << DataContainer{100.};
QTest::newRow("xAxisRange6") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 2.1 << 6. << DataContainer{3., 4., 5.}
<< DataContainer{300., 400., 500.};
QTest::newRow("xAxisRange7") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 6. << 9. << DataContainer{} << DataContainer{};
QTest::newRow("xAxisRange8") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 5. << 9. << DataContainer{5.} << DataContainer{500.};
}
void TestScalarSeries::testXAxisRange()
{
testXAxisRange_t<ScalarSeries>();
}
void TestScalarSeries::testValuesBounds_data()
{
testValuesBounds_struct<ScalarSeries>();
auto nan = std::numeric_limits<double>::quiet_NaN();
QTest::newRow("scalarBounds1") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 0. << 6. << true << 100. << 500.;
QTest::newRow("scalarBounds2") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 2. << 4. << true << 200. << 400.;
QTest::newRow("scalarBounds3") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 0. << 0.5 << false << nan << nan;
QTest::newRow("scalarBounds4") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({100., 200., 300., 400., 500.})
.build()
<< 5.1 << 6. << false << nan << nan;
QTest::newRow("scalarBounds5") << ScalarBuilder{}.setX({1.}).setValues({100.}).build() << 0.
<< 2. << true << 100. << 100.;
QTest::newRow("scalarBounds6") << ScalarBuilder{}.setX({}).setValues({}).build() << 0. << 2.
<< false << nan << nan;
// Tests with NaN values: NaN values are not included in min/max search
QTest::newRow("scalarBounds7") << ScalarBuilder{}
.setX({1., 2., 3., 4., 5.})
.setValues({nan, 200., 300., 400., nan})
.build()
<< 0. << 6. << true << 200. << 400.;
QTest::newRow("scalarBounds8")
<< ScalarBuilder{}.setX({1., 2., 3., 4., 5.}).setValues({nan, nan, nan, nan, nan}).build()
<< 0. << 6. << true << nan << nan;
}
void TestScalarSeries::testValuesBounds()
{
testValuesBounds_t<ScalarSeries>();
}
QTEST_MAIN(TestScalarSeries)
#include "TestScalarSeries.moc"