diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2019-12-02 15:00:16 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2019-12-03 10:39:32 +0100 |
commit | f6b550ea5eae80124576766fe1a9609ae5aba1e3 (patch) | |
tree | aa77775c9fd891cda2dda4ca26a87be20a4b6225 /tests/auto/sensors2qmlapi/tst_sensors2qmlapi.cpp | |
parent | 7aef9656318bb5f827be997a526e9effcfb62502 (diff) |
Fix QML API for sensor ranges
Previously the QQmlListProperties were constructed on stack-allocated
lists, which immediately turned into dangling pointers on return. Also,
none of the sensor ranges was ever deleted.
Keep the sensor ranges in persistent lists in the private object, parent
them to the main QmlSensor object, and add some tests for them.
Fixes: QTBUG-79224
Change-Id: Ie61d0aaeaaaf998c1d1f46f60c81848ae48659d6
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
Diffstat (limited to 'tests/auto/sensors2qmlapi/tst_sensors2qmlapi.cpp')
-rw-r--r-- | tests/auto/sensors2qmlapi/tst_sensors2qmlapi.cpp | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/tests/auto/sensors2qmlapi/tst_sensors2qmlapi.cpp b/tests/auto/sensors2qmlapi/tst_sensors2qmlapi.cpp index d0074146..51007fcb 100644 --- a/tests/auto/sensors2qmlapi/tst_sensors2qmlapi.cpp +++ b/tests/auto/sensors2qmlapi/tst_sensors2qmlapi.cpp @@ -29,10 +29,14 @@ #include <QtTest/QtTest> #include <QtTest/QSignalSpy> #include <QtCore/QDebug> + +#include "../../../src/imports/sensors/qmlsensor.h" #include "../../../src/imports/sensors/qmlsensorgesture.h" + #include "qtemplategestureplugin.h" #include "qtemplaterecognizer.h" #include <qsensorgesturemanager.h> +#include <qsensorbackend.h> #include "qsensormanager.h" QT_USE_NAMESPACE @@ -46,6 +50,7 @@ class tst_Sensors2QMLAPI : public QObject private slots: void initTestCase(); void testGesture(); + void testSensorRanges(); }; void tst_Sensors2QMLAPI::initTestCase() @@ -169,6 +174,114 @@ void tst_Sensors2QMLAPI::testGesture() QCOMPARE(spy2_detected.count(), 1); } +class QDummySensorBackend : public QSensorBackend +{ + Q_OBJECT +public: + QDummySensorBackend(QSensor *sensor) : QSensorBackend(sensor) + { + addDataRate(2, 3); + addDataRate(5, 7); + addOutputRange(100, 200, 1); + addOutputRange(600, 700, 10); + addOutputRange(0, 1, 2); + } + + void start() override {} + void stop() override {} +}; + +class QDummySensorReading : public QSensorReading +{ + Q_OBJECT +public: + QDummySensorReading(QObject *parent) : QSensorReading(parent, nullptr) {} +}; + +class QmlDummySensorReading : public QmlSensorReading +{ + Q_OBJECT +public: + QmlDummySensorReading(QSensor *sensor) : + QmlSensorReading(sensor), + m_reading(new QDummySensorReading(this)) + {} + + QSensorReading *reading() const override { return m_reading; } + void readingUpdate() override {} + +private: + QSensorReading *m_reading = nullptr; +}; + +class QmlDummySensor : public QmlSensor +{ + Q_OBJECT +public: + QmlDummySensor(QObject *parent = nullptr) : + QmlSensor(parent), + m_sensor(new QSensor("dummy", this)) + { + QDummySensorBackend b(m_sensor); + Q_UNUSED(b); + } + + QSensor *sensor() const override { return m_sensor; } + QmlSensorReading *createReading() const override { return new QmlDummySensorReading(m_sensor); } + + void componentComplete() override { QmlSensor::componentComplete(); } + +private: + QSensor *m_sensor = nullptr; +}; + +void tst_Sensors2QMLAPI::testSensorRanges() +{ + QScopedPointer<QmlDummySensor> qmlSensor(new QmlDummySensor); + qmlSensor->componentComplete(); + + auto ranges = qmlSensor->availableDataRates(); + QCOMPARE(ranges.count(&ranges), 2); + + const auto range0 = ranges.at(&ranges, 0); + QCOMPARE(range0->minimum(), 2); + QCOMPARE(range0->maximum(), 3); + QSignalSpy range0Spy(range0, SIGNAL(destroyed())); + + const auto range1 = ranges.at(&ranges, 1); + QCOMPARE(range1->minimum(), 5); + QCOMPARE(range1->maximum(), 7); + QSignalSpy range1Spy(range1, SIGNAL(destroyed())); + + auto outputs = qmlSensor->outputRanges(); + QCOMPARE(outputs.count(&outputs), 3); + + const auto output0 = outputs.at(&outputs, 0); + QCOMPARE(output0->minimum(), 100); + QCOMPARE(output0->maximum(), 200); + QCOMPARE(output0->accuracy(), 1); + QSignalSpy output0Spy(output0, SIGNAL(destroyed())); + + const auto output1 = outputs.at(&outputs, 1); + QCOMPARE(output1->minimum(), 600); + QCOMPARE(output1->maximum(), 700); + QCOMPARE(output1->accuracy(), 10); + QSignalSpy output1Spy(output1, SIGNAL(destroyed())); + + const auto output2 = outputs.at(&outputs, 2); + QCOMPARE(output2->minimum(), 0); + QCOMPARE(output2->maximum(), 1); + QCOMPARE(output2->accuracy(), 2); + QSignalSpy output2Spy(output2, SIGNAL(destroyed())); + + qmlSensor.reset(); + QCOMPARE(range0Spy.count(), 1); + QCOMPARE(range1Spy.count(), 1); + QCOMPARE(output0Spy.count(), 1); + QCOMPARE(output1Spy.count(), 1); + QCOMPARE(output2Spy.count(), 1); +} + QT_END_NAMESPACE QTEST_MAIN(tst_Sensors2QMLAPI) |