Revision control
++ // Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB).
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++
++ #include <QtTest/QTest>
++ #include <private/functionrangefinder_p.h>
++
++ using namespace Qt3DAnimation::Animation;
++
++ class tst_FunctionRangeFinder : public QObject
++ {
++ Q_OBJECT
++
++ private Q_SLOTS:
++ void checkDefaultConstruction()
++ {
++ // GIVEN
++ QList<float> data;
++
++ // WHEN
++ FunctionRangeFinder finder(&data);
++
++ // THEN
++ QCOMPARE(finder.rangeSize(), 2);
++ QCOMPARE(finder.isAscending(), true);
++ QCOMPARE(finder.correlationThreshold(), 1);
++ }
++
++ void checkConstructionWithData_data()
++ {
++ QTest::addColumn<QList<float>>("x");
++ QTest::addColumn<int>("correlationThreshold");
++ QTest::addColumn<bool>("ascending");
++
++ QVector<float> data = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f };
++ int correlationThreshold = 1;
++ bool ascending = true;
++ QTest::newRow("10 entries, ascending") << data << correlationThreshold << ascending;
++ data.clear();
++
++ data.resize(10000);
++ for (int i = 0; i < 10000; ++i)
++ data[i] = float(i);
++ ascending = true;
++ correlationThreshold = std::pow(float(10000), 0.25f);
++ QTest::newRow("10k entries, ascending") << data << correlationThreshold << ascending;
++ data.clear();
++
++ data.resize(10000);
++ for (int i = 0; i < 10000; ++i)
++ data[10000 - i - 1] = float(i);
++ ascending = false;
++ correlationThreshold = std::pow(float(10000), 0.25f);
++ QTest::newRow("10k entries, descending") << data << correlationThreshold << ascending;
++ data.clear();
++ }
++
++ void checkConstructionWithData()
++ {
++ // GIVEN
++ QFETCH(QList<float>, x);
++ QFETCH(int, correlationThreshold);
++ QFETCH(bool, ascending);
++
++ // WHEN
++ FunctionRangeFinder finder(&x);
++
++ // THEN
++ QCOMPARE(finder.rangeSize(), 2);
++ QCOMPARE(finder.isAscending(), ascending);
++ QCOMPARE(finder.correlationThreshold(), correlationThreshold);
++ }
++
++ void checkFindLowerBound_data()
++ {
++ QTest::addColumn<QList<float>>("x");
++ QTest::addColumn<QList<float>>("needles");
++ QTest::addColumn<QList<int>>("lowerBounds");
++
++ QVector<float> data = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f };
++ QVector<float> needles = { 2.5f };
++ QVector<int> lowerBounds = { 1 };
++ QTest::newRow("10 entries, ascending") << data << needles << lowerBounds;
++ data.clear();
++ needles.clear();
++ lowerBounds.clear();
++
++ data.resize(10000);
++ for (int i = 0; i < 10000; ++i)
++ data[i] = float(i);
++
++ needles.push_back(23.75f);
++ lowerBounds.push_back(23);
++
++ needles.push_back(500.03f);
++ lowerBounds.push_back(500);
++
++ needles.push_back(500.2f);
++ lowerBounds.push_back(500);
++
++ needles.push_back(501.4f); // Will trigger hunt codepath as previous test is correlated
++ lowerBounds.push_back(501);
++
++ needles.push_back(3405.123f);
++ lowerBounds.push_back(3405);
++
++ QTest::newRow("10k entries, ascending") << data << needles << lowerBounds;
++ data.clear();
++ needles.clear();
++ lowerBounds.clear();
++
++ data.resize(10);
++ for (int i = 0; i < 10; ++i)
++ data[10 - i - 1] = float(i);
++
++ needles.push_back(8.1f);
++ lowerBounds.push_back(0);
++
++ needles.push_back(7.2f);
++ lowerBounds.push_back(1);
++
++ needles.push_back(0.5f);
++ lowerBounds.push_back(8);
++
++ QTest::newRow("10 entries, descending") << data << needles << lowerBounds;
++ data.clear();
++ }
++
++ void checkFindLowerBound()
++ {
++ // GIVEN
++ QFETCH(QList<float>, x);
++ QFETCH(QList<float>, needles);
++ QFETCH(QList<int>, lowerBounds);
++ FunctionRangeFinder finder(&x);
++
++ for (int i = 0; i < needles.size(); ++i) {
++ // WHEN
++ int result = finder.findLowerBound(needles[i]);
++
++ // THEN
++ QCOMPARE(result, lowerBounds[i]);
++ }
++ }
++ };
++
++ QTEST_APPLESS_MAIN(tst_FunctionRangeFinder)
++
++ #include "tst_functionrangefinder.moc"