TestSpectrogramSeries.cpp
198 lines
| 7.0 KiB
| text/x-c
|
CppLexer
|
r866 | #include "Data/SpectrogramSeries.h" | ||
#include "DataSeriesBuilders.h" | ||||
#include "DataSeriesUtils.h" | ||||
#include <QObject> | ||||
#include <QtTest> | ||||
namespace { | ||||
// Aliases used to facilitate reading of test inputs | ||||
using X = DataContainer; | ||||
using Y = DataContainer; | ||||
using Values = DataContainer; | ||||
using Components = std::vector<DataContainer>; | ||||
} // namespace | ||||
/** | ||||
* @brief The TestSpectrogramSeries class defines unit tests on spectrogram series. | ||||
* | ||||
* Most of these unit tests use generic tests defined for DataSeries (@sa DataSeriesUtils) | ||||
*/ | ||||
class TestSpectrogramSeries : public QObject { | ||||
Q_OBJECT | ||||
private slots: | ||||
/// Tests construction of a spectrogram series | ||||
void testCtor_data(); | ||||
void testCtor(); | ||||
/// Tests merge of two spectrogram series | ||||
void testMerge_data(); | ||||
void testMerge(); | ||||
/// Tests get subdata of a spectrogram series | ||||
void testSubDataSeries_data(); | ||||
void testSubDataSeries(); | ||||
}; | ||||
void TestSpectrogramSeries::testCtor_data() | ||||
{ | ||||
// x-axis data | ||||
QTest::addColumn<X>("xAxisData"); | ||||
// y-axis data | ||||
QTest::addColumn<Y>("yAxisData"); | ||||
// values data | ||||
QTest::addColumn<Values>("valuesData"); | ||||
// construction expected to be valid | ||||
QTest::addColumn<bool>("expectOK"); | ||||
// expected x-axis data (when construction is valid) | ||||
QTest::addColumn<X>("expectedXAxisData"); | ||||
// expected components data (when construction is valid) | ||||
QTest::addColumn<Components>("expectedComponentsData"); | ||||
QTest::newRow( | ||||
"invalidData (number of values by component aren't equal to the number of x-axis data)") | ||||
<< X{1., 2., 3., 4., 5.} << Y{1., 2., 3.} << Values{1., 2., 3.} << false << X{} | ||||
<< Components{}; | ||||
QTest::newRow("invalidData (number of components aren't equal to the number of y-axis data)") | ||||
<< X{1., 2., 3., 4., 5.} << Y{1., 2.} // 2 y-axis data | ||||
<< Values{1., 2., 3., 4., 5.} // 1 component | ||||
<< false << X{} << Components{}; | ||||
QTest::newRow("sortedData") << X{1., 2., 3., 4., 5.} << Y{1., 2.} // 2 y-axis data | ||||
<< Values{1., 2., 3., 4., 5., 6., 7., 8., 9., 10.} // 2 components | ||||
<< true << X{1., 2., 3., 4., 5.} | ||||
<< Components{{1., 3., 5., 7., 9.}, {2., 4., 6., 8., 10.}}; | ||||
QTest::newRow("unsortedData") << X{5., 4., 3., 2., 1.} << Y{1., 2.} | ||||
<< Values{1., 2., 3., 4., 5., 6., 7., 8., 9., 10.} << true | ||||
<< X{1., 2., 3., 4., 5.} | ||||
<< Components{{9., 7., 5., 3., 1.}, {10., 8., 6., 4., 2.}}; | ||||
} | ||||
void TestSpectrogramSeries::testCtor() | ||||
{ | ||||
// Creates series | ||||
QFETCH(X, xAxisData); | ||||
QFETCH(Y, yAxisData); | ||||
QFETCH(Values, valuesData); | ||||
QFETCH(bool, expectOK); | ||||
if (expectOK) { | ||||
auto series = SpectrogramBuilder{} | ||||
.setX(std::move(xAxisData)) | ||||
.setY(std::move(yAxisData)) | ||||
.setValues(std::move(valuesData)) | ||||
.build(); | ||||
// Validates results | ||||
QFETCH(X, expectedXAxisData); | ||||
QFETCH(Components, expectedComponentsData); | ||||
validateRange(series->cbegin(), series->cend(), expectedXAxisData, expectedComponentsData); | ||||
} | ||||
else { | ||||
QVERIFY_EXCEPTION_THROWN(SpectrogramBuilder{} | ||||
.setX(std::move(xAxisData)) | ||||
.setY(std::move(yAxisData)) | ||||
.setValues(std::move(valuesData)) | ||||
.build(), | ||||
std::invalid_argument); | ||||
} | ||||
} | ||||
void TestSpectrogramSeries::testMerge_data() | ||||
{ | ||||
testMerge_struct<SpectrogramSeries, Components>(); | ||||
QTest::newRow("sortedMerge") << SpectrogramBuilder{} | ||||
.setX({1., 2., 3.}) | ||||
.setY({1., 2.}) | ||||
.setValues({10., 11., 20., 21., 30., 31}) | ||||
.build() | ||||
<< SpectrogramBuilder{} | ||||
.setX({4., 5., 6.}) | ||||
.setY({1., 2.}) | ||||
.setValues({40., 41., 50., 51., 60., 61}) | ||||
.build() | ||||
<< DataContainer{1., 2., 3., 4., 5., 6.} | ||||
<< Components{{10., 20., 30., 40., 50., 60.}, | ||||
{11., 21., 31., 41., 51., 61}}; | ||||
QTest::newRow( | ||||
"unsortedMerge (merge not made because the two data series have different y-axes)") | ||||
<< SpectrogramBuilder{} | ||||
.setX({4., 5., 6.}) | ||||
.setY({1., 2.}) | ||||
.setValues({40., 41., 50., 51., 60., 61}) | ||||
.build() | ||||
<< SpectrogramBuilder{} | ||||
.setX({1., 2., 3.}) | ||||
.setY({3., 4.}) | ||||
.setValues({10., 11., 20., 21., 30., 31}) | ||||
.build() | ||||
<< DataContainer{4., 5., 6.} << Components{{40., 50., 60.}, {41., 51., 61}}; | ||||
QTest::newRow( | ||||
"unsortedMerge (unsortedMerge (merge is made because the two data series have the same " | ||||
"y-axis)") | ||||
<< SpectrogramBuilder{} | ||||
.setX({4., 5., 6.}) | ||||
.setY({1., 2.}) | ||||
.setValues({40., 41., 50., 51., 60., 61}) | ||||
.build() | ||||
<< SpectrogramBuilder{} | ||||
.setX({1., 2., 3.}) | ||||
.setY({1., 2.}) | ||||
.setValues({10., 11., 20., 21., 30., 31}) | ||||
.build() | ||||
<< DataContainer{1., 2., 3., 4., 5., 6.} | ||||
<< Components{{10., 20., 30., 40., 50., 60.}, {11., 21., 31., 41., 51., 61}}; | ||||
} | ||||
void TestSpectrogramSeries::testMerge() | ||||
{ | ||||
testMerge_t<SpectrogramSeries, Components>(); | ||||
} | ||||
void TestSpectrogramSeries::testSubDataSeries_data() | ||||
{ | ||||
testSubDataSeries_struct<SpectrogramSeries, Components>(); | ||||
QTest::newRow("subDataSeries (the range includes all data)") | ||||
<< SpectrogramBuilder{} | ||||
.setX({1., 2., 3.}) | ||||
.setY({1., 2.}) | ||||
.setValues({10., 11., 20., 21., 30., 31}) | ||||
.build() | ||||
<< SqpRange{0., 5.} << DataContainer{1., 2., 3.} | ||||
<< Components{{10., 20., 30.}, {11., 21., 31.}}; | ||||
QTest::newRow("subDataSeries (the range includes no data)") | ||||
<< SpectrogramBuilder{} | ||||
.setX({1., 2., 3.}) | ||||
.setY({1., 2.}) | ||||
.setValues({10., 11., 20., 21., 30., 31}) | ||||
.build() | ||||
<< SqpRange{4., 5.} << DataContainer{} << Components{{}, {}}; | ||||
QTest::newRow("subDataSeries (the range includes some data)") | ||||
<< SpectrogramBuilder{} | ||||
.setX({1., 2., 3.}) | ||||
.setY({1., 2.}) | ||||
.setValues({10., 11., 20., 21., 30., 31}) | ||||
.build() | ||||
<< SqpRange{1.1, 3} << DataContainer{2., 3.} << Components{{20., 30.}, {21., 31.}}; | ||||
} | ||||
void TestSpectrogramSeries::testSubDataSeries() | ||||
{ | ||||
testSubDataSeries_t<SpectrogramSeries, Components>(); | ||||
} | ||||
QTEST_MAIN(TestSpectrogramSeries) | ||||
#include "TestSpectrogramSeries.moc" | ||||