/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtSensors module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include #include #include Q_IMPORT_PLUGIN(QTestSensorGesturePlugin) Q_IMPORT_PLUGIN(QTestSensorGestureDupPlugin) static QString removeParens(const QString &arg) { return arg.left(arg.indexOf("(")); } class QSensorGestureWithSlots : public QObject { Q_OBJECT public: QSensorGestureWithSlots(const QStringList &ids) : gesture(new QSensorGesture(ids, this)) { } QSensorGesture *gesture; public slots: void startDetection() { gesture->startDetection(); } void stopDetection() { gesture->stopDetection(); } }; class QTest3Recognizer : public QSensorGestureRecognizer { Q_OBJECT public: QTest3Recognizer(QObject *parent = 0); void create(); QString id() const; bool start() ; bool stop(); bool isActive(); void changeId(const QString &); QString recognizerId; }; QTest3Recognizer::QTest3Recognizer(QObject *parent) : QSensorGestureRecognizer(parent), recognizerId("QtSensors/test3"){} void QTest3Recognizer::create(){} QString QTest3Recognizer::id() const{ return recognizerId; } bool QTest3Recognizer::start(){return true;} bool QTest3Recognizer::stop() { return true;} bool QTest3Recognizer::isActive() { return true; } void QTest3Recognizer::changeId(const QString &id) { recognizerId = id; } class Tst_qsensorgestureTest : public QObject { Q_OBJECT public: Tst_qsensorgestureTest(); private Q_SLOTS: void tst_sensor_gesture_notinitialized(); void tst_recognizer_dup(); //comes first to weed out messages void tst_manager(); void tst_manager_gestureids(); void tst_manager_recognizerSignals(); void tst_manager_registerSensorGestureRecognizer(); void tst_manager__newSensorAvailable(); void tst_sensor_gesture_signals(); void tst_sensor_gesture_threaded(); void tst_sensor_gesture(); void tst_recognizer(); void tst_sensorgesture_noid(); void tst_sensor_gesture_multi(); void shakeDetected(const QString &); private: QString currentSignal; }; Tst_qsensorgestureTest::Tst_qsensorgestureTest() { } void Tst_qsensorgestureTest::tst_recognizer_dup() { QStringList idList; { // QTest::ignoreMessage(QtWarningMsg, "\"QtSensors.test.dup\" from the plugin \"TestGesturesDup\" is already known."); QSensorGestureManager manager; idList = manager.gestureIds(); for (int i = 0; i < idList.count(); i++) { if (idList.at(i) == "QtSensors.test.dup") QTest::ignoreMessage(QtWarningMsg, "Ignoring recognizer \"QtSensors.test.dup\" from plugin \"TestGesturesDup\" because it is already registered"); QStringList recognizerSignalsList = manager.recognizerSignals(idList.at(i)); QVERIFY(!recognizerSignalsList.contains("QtSensors.test2")); } QScopedPointer sensorGesture(new QSensorGesture(idList)); QVERIFY(sensorGesture->validIds().contains("QtSensors.test2")); QVERIFY(sensorGesture->validIds().contains("QtSensors.test")); QVERIFY(sensorGesture->validIds().contains("QtSensors.test.dup")); } QScopedPointer thisGesture; QString plugin; plugin = "QtSensors.test2"; thisGesture.reset(new QSensorGesture(QStringList() << plugin)); QVERIFY(thisGesture->validIds().contains("QtSensors.test2")); plugin = "QtSensors.test.dup"; thisGesture.reset(new QSensorGesture(QStringList() << plugin)); QVERIFY(!thisGesture->validIds().contains("QtSensors.test2")); } void Tst_qsensorgestureTest::tst_manager() { QSensorGestureManager *manager2; manager2 = new QSensorGestureManager(this); QVERIFY(manager2 != 0); delete manager2; } void Tst_qsensorgestureTest::tst_manager_gestureids() { QStringList idList; QSensorGestureManager manager; idList = manager.gestureIds(); QVERIFY(idList.count() > 0); QVERIFY(idList.contains("QtSensors.test")); QVERIFY(idList.contains("QtSensors.test2")); QVERIFY(idList.contains("QtSensors.test.dup")); } void Tst_qsensorgestureTest::tst_manager_recognizerSignals() { QStringList idList; QSensorGestureManager manager; idList = manager.gestureIds(); idList.removeOne("QtSensors.test.dup"); for (int i = 0; i < idList.count(); i++) { QStringList recognizerSignalsList = manager.recognizerSignals(idList.at(i)); if (idList.at(i) == "QtSensors.test") { QStringList signalList; signalList << "detected(QString)"; signalList << "tested()"; QCOMPARE(recognizerSignalsList.count(), 2); QCOMPARE(recognizerSignalsList, signalList); } else if (idList.at(i) == "QtSensors.test2") { QStringList signalList; signalList << "detected(QString)"; signalList << "test2()"; signalList << "test3(bool)"; QCOMPARE(recognizerSignalsList.count(), 3); QCOMPARE(recognizerSignalsList, signalList); } } } void Tst_qsensorgestureTest::tst_manager_registerSensorGestureRecognizer() { QSensorGestureManager manager; int num = manager.gestureIds().count(); QSensorGestureRecognizer *recognizer = new QTest3Recognizer; bool ok = manager.registerSensorGestureRecognizer(recognizer); QCOMPARE(ok, true); QCOMPARE(num+1, manager.gestureIds().count()); recognizer = new QTest3Recognizer; // QTest::ignoreMessage(QtWarningMsg, "\"QtSensors/test3\" is already known"); ok = manager.registerSensorGestureRecognizer(recognizer); QCOMPARE(ok, false); QCOMPARE(num+1, manager.gestureIds().count()); } void Tst_qsensorgestureTest::tst_manager__newSensorAvailable() { QSensorGestureManager manager; QSensorGestureManager manager2; QSignalSpy spy_manager_available(&manager, SIGNAL(newSensorGestureAvailable())); QSignalSpy spy_manager2_available(&manager2, SIGNAL(newSensorGestureAvailable())); manager.gestureIds(); QCOMPARE(spy_manager_available.count(),0); QCOMPARE(spy_manager2_available.count(),0); QTest3Recognizer *recognizer = new QTest3Recognizer; recognizer->changeId("QtSensors.test4"); bool ok = manager.registerSensorGestureRecognizer(recognizer); QCOMPARE(ok, true); QCOMPARE(spy_manager_available.count(),1); recognizer = new QTest3Recognizer; recognizer->changeId("QtSensors.test4"); // QTest::ignoreMessage(QtWarningMsg, "\"QtSensors.test4\" is already known"); ok = manager.registerSensorGestureRecognizer(recognizer); QCOMPARE(ok, false); QCOMPARE(spy_manager_available.count(),1); QCOMPARE(spy_manager2_available.count(),1); QScopedPointer test4sg; test4sg.reset(new QSensorGesture(QStringList() << "QtSensors.test4")); QVERIFY(!test4sg->validIds().isEmpty()); QVERIFY(test4sg->invalidIds().isEmpty()); } void Tst_qsensorgestureTest::tst_sensor_gesture_signals() { QStringList testidList; testidList << "QtSensors.test"; testidList << "QtSensors.test2"; Q_FOREACH (const QString &plugin, testidList) { QScopedPointer thisGesture(new QSensorGesture(QStringList() << plugin)); QSignalSpy spy_gesture_detected(thisGesture.data(), SIGNAL(detected(QString))); QScopedPointer spy_gesture_tested(0); if (plugin == "QtSensors.test") { QStringList signalList; signalList << "detected(QString)"; signalList << "tested()"; QCOMPARE(thisGesture->gestureSignals().count(), 2); QCOMPARE(thisGesture->gestureSignals(), signalList); QCOMPARE(thisGesture->gestureSignals().at(1), QString("tested()")); spy_gesture_tested.reset(new QSignalSpy(thisGesture.data(), SIGNAL(tested()))); } else if (plugin == "QtSensors.test2") { QStringList signalList; signalList << "detected(QString)"; signalList << "test2()"; signalList << "test3(bool)"; QCOMPARE(thisGesture->gestureSignals().count(), 3); QCOMPARE(thisGesture->gestureSignals(), signalList); QCOMPARE(thisGesture->gestureSignals().at(1), QString("test2()")); spy_gesture_tested.reset(new QSignalSpy(thisGesture.data(), SIGNAL(test2()))); } QVERIFY(!thisGesture->validIds().isEmpty()); thisGesture->startDetection(); QCOMPARE(spy_gesture_detected.count(),1); if (plugin == "QtSensors.test") { QCOMPARE(spy_gesture_tested->count(),1); QList arguments ; arguments = spy_gesture_detected.takeFirst(); // take the first signal QCOMPARE(arguments.at(0).toString(), QString("tested")); } else if (plugin == "QtSensors.test2") { QCOMPARE(spy_gesture_tested->count(),1); } } } void Tst_qsensorgestureTest::tst_sensor_gesture_threaded() { QScopedPointer gesture(new QSensorGesture(QStringList() << "QtSensors.test")); QScopedPointer thread(new QThread); QScopedPointer t_gesture(new QSensorGestureWithSlots(QStringList() << "QtSensors.test")); t_gesture->moveToThread(thread.data()); currentSignal = removeParens(gesture->gestureSignals().at(0)); QSignalSpy thread_gesture(t_gesture->gesture, SIGNAL(detected(QString))); QSignalSpy spy_gesture2(gesture.data(), SIGNAL(detected(QString))); QCOMPARE(gesture->isActive(),false); gesture->startDetection(); QCOMPARE(thread_gesture.count(),0); QCOMPARE(spy_gesture2.count(),1); QCOMPARE(gesture->isActive(),true); thread->start(); QTimer::singleShot(0, t_gesture.data(), SLOT(startDetection())); // Delivered on the thread QTRY_COMPARE(t_gesture->gesture->isActive(),true); QTRY_VERIFY(thread_gesture.count() > 0); spy_gesture2.clear(); QTRY_VERIFY(spy_gesture2.count() > 0); QTimer::singleShot(0, t_gesture.data(), SLOT(stopDetection())); // Delivered on the thread QTRY_COMPARE(t_gesture->gesture->isActive(),false); QCOMPARE(gesture->isActive(),true); thread->quit(); thread->wait(); } void Tst_qsensorgestureTest::tst_sensor_gesture() { QScopedPointer gesture(new QSensorGesture(QStringList() << "QtSensors.test")); QScopedPointer gesture2(new QSensorGesture(QStringList() << "QtSensors.test2")); QScopedPointer gesture3(new QSensorGesture(QStringList() << "QtSensors.test2")); QCOMPARE(gesture->validIds(),QStringList() << "QtSensors.test"); QCOMPARE(gesture->gestureSignals().at(1), QString("tested()")); QVERIFY(gesture->invalidIds().isEmpty()); QVERIFY(gesture2->invalidIds().isEmpty()); QVERIFY(gesture3->invalidIds().isEmpty()); currentSignal = removeParens(gesture->gestureSignals().at(1)); QSignalSpy spy_gesture(gesture.data(), SIGNAL(detected(QString))); QSignalSpy spy_gesture2(gesture2.data(), SIGNAL(detected(QString))); QSignalSpy spy_gesture3_detected(gesture3.data(), SIGNAL(detected(QString))); QSignalSpy spy_gesture4_test2(gesture3.data(), SIGNAL(test2())); QSignalSpy spy_gesture5_test3(gesture3.data(), SIGNAL(test3(bool))); QCOMPARE(gesture->isActive(),false); gesture->startDetection(); QCOMPARE(spy_gesture.count(),1); QCOMPARE(gesture->isActive(),true); QCOMPARE(gesture2->validIds(),QStringList() <<"QtSensors.test2"); QCOMPARE(gesture2->gestureSignals().at(1), QString("test2()")); currentSignal = removeParens(gesture2->gestureSignals().at(1)); connect(gesture2.data(),SIGNAL(detected(QString)), this,SLOT(shakeDetected(QString))); QCOMPARE(gesture2->isActive(),false); gesture2->startDetection(); QCOMPARE(gesture2->isActive(),true); QCOMPARE(spy_gesture2.count(),1); QCOMPARE(spy_gesture3_detected.count(),0); gesture2->stopDetection(); QCOMPARE(gesture2->isActive(),false); QCOMPARE(gesture3->isActive(),false); gesture3->startDetection(); QCOMPARE(gesture3->isActive(),true); QCOMPARE(gesture2->isActive(),false); QCOMPARE(spy_gesture.count(),1); QCOMPARE(spy_gesture2.count(),1); QCOMPARE(spy_gesture3_detected.count(),1); QCOMPARE(spy_gesture4_test2.count(),1); QCOMPARE(spy_gesture5_test3.count(),1); QList arguments2 = spy_gesture5_test3.takeFirst(); QCOMPARE(arguments2.at(0).toBool(), true); } void Tst_qsensorgestureTest::tst_recognizer() { QScopedPointer gesture(new QSensorGesture(QStringList() << "QtSensors.test")); QScopedPointer gesture2(new QSensorGesture(QStringList() << "QtSensors.test")); QSignalSpy spy_gesture(gesture.data(), SIGNAL(detected(QString))); QSignalSpy spy_gesture2(gesture2.data(), SIGNAL(detected(QString))); QCOMPARE(gesture->isActive(),false); QCOMPARE(gesture2->isActive(),false); currentSignal = removeParens(gesture2->gestureSignals().at(0)); gesture2->startDetection();//activate 2 QCOMPARE(gesture->isActive(),false); QCOMPARE(gesture2->isActive(),true); QCOMPARE(spy_gesture.count(),0); QCOMPARE(spy_gesture2.count(),1); QList arguments = spy_gesture2.takeFirst(); QCOMPARE(arguments.at(0).toString(), QString("tested")); QCOMPARE(spy_gesture2.count(),0); gesture->startDetection(); //activate 1 QCOMPARE(gesture->isActive(),true); QCOMPARE(gesture2->isActive(),true); QTRY_COMPARE(spy_gesture.count(),1); QCOMPARE(spy_gesture2.count(),1); arguments = spy_gesture.takeFirst(); // take the first signal QCOMPARE(arguments.at(0).toString(), QString("tested")); spy_gesture2.removeFirst(); gesture->stopDetection(); //stop 1 gesture object QCOMPARE(gesture->isActive(),false); QCOMPARE(gesture2->isActive(),true); spy_gesture2.clear(); gesture2->startDetection(); QCOMPARE(gesture->isActive(),false); QCOMPARE(spy_gesture.count(),0); QCOMPARE(gesture2->isActive(),true); QTRY_COMPARE(spy_gesture2.count(), 1); } void Tst_qsensorgestureTest::tst_sensorgesture_noid() { QScopedPointer gesture(new QSensorGesture(QStringList() << "QtSensors.noid")); QVERIFY(gesture->validIds().isEmpty()); QCOMPARE(gesture->invalidIds(), QStringList() << "QtSensors.noid"); QTest::ignoreMessage(QtWarningMsg, "QSignalSpy: No such signal: 'detected(QString)'"); QSignalSpy spy_gesture(gesture.data(), SIGNAL(detected(QString))); QCOMPARE(spy_gesture.count(),0); gesture->startDetection(); QCOMPARE(gesture->isActive(),false); QCOMPARE(spy_gesture.count(),0); gesture->stopDetection(); QCOMPARE(gesture->isActive(),false); QCOMPARE(spy_gesture.count(),0); QVERIFY(gesture->gestureSignals().isEmpty()); QCOMPARE(gesture->invalidIds() ,QStringList() << "QtSensors.noid"); QSensorGestureManager manager; QStringList recognizerSignalsList = manager.recognizerSignals( "QtSensors.noid"); QVERIFY(recognizerSignalsList.isEmpty()); QVERIFY(!recognizerSignalsList.contains("QtSensors.noid")); QSensorGestureRecognizer *fakeRecognizer = manager.sensorGestureRecognizer("QtSensors.noid"); QVERIFY(!fakeRecognizer); } void Tst_qsensorgestureTest::tst_sensor_gesture_multi() { QStringList ids; ids << "QtSensors.test"; ids <<"QtSensors.test2"; ids << "QtSensors.bogus"; QScopedPointer gesture(new QSensorGesture(ids)); QStringList gestureSignals = gesture->gestureSignals(); gestureSignals.removeDuplicates() ; QCOMPARE(gestureSignals, gesture->gestureSignals()); QCOMPARE(gesture->gestureSignals().count(), 4); QCOMPARE(gesture->invalidIds(), QStringList() << "QtSensors.bogus"); QCOMPARE(gesture->isActive(),false); QSignalSpy spy_gesture_detected(gesture.data(), SIGNAL(detected(QString))); gesture->startDetection(); QCOMPARE(gesture->isActive(),true); QCOMPARE(spy_gesture_detected.count(),2); QList arguments ; arguments = spy_gesture_detected.takeAt(0); QCOMPARE(arguments.at(0).toString(), QString("tested")); arguments = spy_gesture_detected.takeAt(0); QCOMPARE(arguments.at(0).toString(), QString("test2")); QTRY_COMPARE(spy_gesture_detected.count(),1); gesture->stopDetection(); QCOMPARE(gesture->isActive(),false); { QSensorGestureManager manager; QVERIFY(!manager.gestureIds().contains("QtSensors.bogus")); QSensorGestureRecognizer *recognizer = manager.sensorGestureRecognizer("QtSensors.bogus"); QVERIFY(recognizer == 0); } } void Tst_qsensorgestureTest::shakeDetected(const QString &type) { QCOMPARE(type,currentSignal); } void Tst_qsensorgestureTest::tst_sensor_gesture_notinitialized() { QTest::ignoreMessage(QtWarningMsg, "\"QtSensors.test.dup\" from the plugin \"TestGesturesDup\" is already known."); QSensorGestureManager manager; QSensorGestureRecognizer *recognizer = manager.sensorGestureRecognizer("QtSensors.test"); QTest::ignoreMessage(QtWarningMsg, "Not starting. Gesture Recognizer not initialized"); recognizer->startBackend(); QVERIFY(recognizer->isActive() == false); QTest::ignoreMessage(QtWarningMsg, "Not stopping. Gesture Recognizer not initialized"); recognizer->stopBackend(); QVERIFY(recognizer->isActive() == false); recognizer->createBackend(); QVERIFY(recognizer->isActive() == false); } QTEST_MAIN(Tst_qsensorgestureTest); #include "tst_qsensorgesturetest.moc"