diff options
Diffstat (limited to 'tests/auto/testlib/qsignalspy')
-rw-r--r-- | tests/auto/testlib/qsignalspy/CMakeLists.txt | 8 | ||||
-rw-r--r-- | tests/auto/testlib/qsignalspy/tst_qsignalspy.cpp | 122 |
2 files changed, 85 insertions, 45 deletions
diff --git a/tests/auto/testlib/qsignalspy/CMakeLists.txt b/tests/auto/testlib/qsignalspy/CMakeLists.txt index f957782853..3c62050de5 100644 --- a/tests/auto/testlib/qsignalspy/CMakeLists.txt +++ b/tests/auto/testlib/qsignalspy/CMakeLists.txt @@ -1,12 +1,16 @@ # Copyright (C) 2022 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause -# Generated from qsignalspy.pro. - ##################################################################### ## tst_qsignalspy Test: ##################################################################### +if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_qsignalspy LANGUAGES CXX) + find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST) +endif() + qt_internal_add_test(tst_qsignalspy SOURCES tst_qsignalspy.cpp diff --git a/tests/auto/testlib/qsignalspy/tst_qsignalspy.cpp b/tests/auto/testlib/qsignalspy/tst_qsignalspy.cpp index ac7336e8e3..66f8b00505 100644 --- a/tests/auto/testlib/qsignalspy/tst_qsignalspy.cpp +++ b/tests/auto/testlib/qsignalspy/tst_qsignalspy.cpp @@ -1,14 +1,16 @@ // Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QTest> #include <QSignalSpy> #include <QTimer> - #include <qdatetime.h> +using namespace std::chrono_literals; +using namespace Qt::StringLiterals; + class tst_QSignalSpy : public QObject { Q_OBJECT @@ -48,6 +50,8 @@ private slots: void spyOnMetaMethod_invalid(); void spyOnMetaMethod_invalid_data(); + + void signalSpyDoesNotRaceOnCrossThreadSignal(); }; struct CustomType {}; @@ -79,15 +83,15 @@ void tst_QSignalSpy::spyWithoutArgs() QtTestObject obj; QSignalSpy spy(&obj, SIGNAL(sig0())); - QCOMPARE(spy.count(), 0); + QCOMPARE(spy.size(), 0); emit obj.sig0(); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); emit obj.sig0(); - QCOMPARE(spy.count(), 2); + QCOMPARE(spy.size(), 2); QList<QVariant> args = spy.takeFirst(); - QCOMPARE(args.count(), 0); + QCOMPARE(args.size(), 0); } void tst_QSignalSpy::spyWithBasicArgs() @@ -96,10 +100,10 @@ void tst_QSignalSpy::spyWithBasicArgs() QSignalSpy spy(&obj, SIGNAL(sig1(int,int))); emit obj.sig1(1, 2); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); QList<QVariant> args = spy.takeFirst(); - QCOMPARE(args.count(), 2); + QCOMPARE(args.size(), 2); QCOMPARE(args.at(0).toInt(), 1); QCOMPARE(args.at(1).toInt(), 2); @@ -107,7 +111,7 @@ void tst_QSignalSpy::spyWithBasicArgs() emit obj.sigLong(1l, 2l); args = spyl.takeFirst(); - QCOMPARE(args.count(), 2); + QCOMPARE(args.size(), 2); QCOMPARE(qvariant_cast<long>(args.at(0)), 1l); QCOMPARE(qvariant_cast<long>(args.at(1)), 2l); } @@ -124,10 +128,10 @@ void tst_QSignalSpy::spyWithPointers() int i2 = 2; emit obj.sig2(&i1, &i2); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); QList<QVariant> args = spy.takeFirst(); - QCOMPARE(args.count(), 2); + QCOMPARE(args.size(), 2); QCOMPARE(*static_cast<int * const *>(args.at(0).constData()), &i1); QCOMPARE(*static_cast<int * const *>(args.at(1).constData()), &i2); } @@ -155,15 +159,15 @@ void tst_QSignalSpy::spyWithBasicQtClasses() QSignalSpy spy(&obj, SIGNAL(sig(QString))); emit obj.sig(QString("bubu")); - QCOMPARE(spy.count(), 1); - QCOMPARE(spy.at(0).count(), 1); + QCOMPARE(spy.size(), 1); + QCOMPARE(spy.at(0).size(), 1); QCOMPARE(spy.at(0).at(0).toString(), QString("bubu")); QSignalSpy spy2(&obj, SIGNAL(sig5(QVariant))); QVariant val(45); emit obj.sig5(val); - QCOMPARE(spy2.count(), 1); - QCOMPARE(spy2.at(0).count(), 1); + QCOMPARE(spy2.size(), 1); + QCOMPARE(spy2.at(0).size(), 1); QCOMPARE(spy2.at(0).at(0), val); QCOMPARE(qvariant_cast<QVariant>(spy2.at(0).at(0)), val); } @@ -176,8 +180,8 @@ void tst_QSignalSpy::spyWithQtClasses() QSignalSpy spy(&obj, SIGNAL(sig2(QDateTime))); QDateTime dt = QDateTime::currentDateTime(); emit obj.sig2(dt); - QCOMPARE(spy.count(), 1); - QCOMPARE(spy.at(0).count(), 1); + QCOMPARE(spy.size(), 1); + QCOMPARE(spy.at(0).size(), 1); QCOMPARE(spy.at(0).at(0).typeName(), "QDateTime"); QCOMPARE(*static_cast<const QDateTime *>(spy.at(0).at(0).constData()), dt); QCOMPARE(spy.at(0).at(0).toDateTime(), dt); @@ -248,7 +252,7 @@ void tst_QSignalSpy::wait_signalEmittedTooLate() QTimer::singleShot(500, this, SIGNAL(sigFoo())); QSignalSpy spy(this, SIGNAL(sigFoo())); QVERIFY(!spy.wait(200)); - QTRY_COMPARE(spy.count(), 1); + QTRY_COMPARE(spy.size(), 1); } void tst_QSignalSpy::wait_signalEmittedMultipleTimes() @@ -257,13 +261,13 @@ void tst_QSignalSpy::wait_signalEmittedMultipleTimes() QTimer::singleShot(800, this, SIGNAL(sigFoo())); QSignalSpy spy(this, SIGNAL(sigFoo())); QVERIFY(spy.wait()); - QCOMPARE(spy.count(), 1); // we don't wait for the second signal... + QCOMPARE(spy.size(), 1); // we don't wait for the second signal... QVERIFY(spy.wait()); - QCOMPARE(spy.count(), 2); + QCOMPARE(spy.size(), 2); QVERIFY(!spy.wait(1)); QTimer::singleShot(10, this, SIGNAL(sigFoo())); QVERIFY(spy.wait()); - QCOMPARE(spy.count(), 3); + QCOMPARE(spy.size(), 3); } void tst_QSignalSpy::spyFunctionPointerWithoutArgs() @@ -271,15 +275,15 @@ void tst_QSignalSpy::spyFunctionPointerWithoutArgs() QtTestObject obj; QSignalSpy spy(&obj, &QtTestObject::sig0); - QCOMPARE(spy.count(), 0); + QCOMPARE(spy.size(), 0); emit obj.sig0(); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); emit obj.sig0(); - QCOMPARE(spy.count(), 2); + QCOMPARE(spy.size(), 2); QList<QVariant> args = spy.takeFirst(); - QCOMPARE(args.count(), 0); + QCOMPARE(args.size(), 0); } void tst_QSignalSpy::spyFunctionPointerWithBasicArgs() @@ -288,10 +292,10 @@ void tst_QSignalSpy::spyFunctionPointerWithBasicArgs() QSignalSpy spy(&obj, &QtTestObject::sig1); emit obj.sig1(1, 2); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); QList<QVariant> args = spy.takeFirst(); - QCOMPARE(args.count(), 2); + QCOMPARE(args.size(), 2); QCOMPARE(args.at(0).toInt(), 1); QCOMPARE(args.at(1).toInt(), 2); @@ -299,7 +303,7 @@ void tst_QSignalSpy::spyFunctionPointerWithBasicArgs() emit obj.sigLong(1l, 2l); args = spyl.takeFirst(); - QCOMPARE(args.count(), 2); + QCOMPARE(args.size(), 2); QCOMPARE(qvariant_cast<long>(args.at(0)), 1l); QCOMPARE(qvariant_cast<long>(args.at(1)), 2l); } @@ -316,10 +320,10 @@ void tst_QSignalSpy::spyFunctionPointerWithPointers() int i2 = 2; emit obj.sig2(&i1, &i2); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); QList<QVariant> args = spy.takeFirst(); - QCOMPARE(args.count(), 2); + QCOMPARE(args.size(), 2); QCOMPARE(*static_cast<int * const *>(args.at(0).constData()), &i1); QCOMPARE(*static_cast<int * const *>(args.at(1).constData()), &i2); } @@ -330,15 +334,15 @@ void tst_QSignalSpy::spyFunctionPointerWithBasicQtClasses() QSignalSpy spy(&obj, &QtTestObject2::sig); emit obj.sig(QString("bubu")); - QCOMPARE(spy.count(), 1); - QCOMPARE(spy.at(0).count(), 1); + QCOMPARE(spy.size(), 1); + QCOMPARE(spy.at(0).size(), 1); QCOMPARE(spy.at(0).at(0).toString(), QString("bubu")); QSignalSpy spy2(&obj, &QtTestObject2::sig5); QVariant val(45); emit obj.sig5(val); - QCOMPARE(spy2.count(), 1); - QCOMPARE(spy2.at(0).count(), 1); + QCOMPARE(spy2.size(), 1); + QCOMPARE(spy2.at(0).size(), 1); QCOMPARE(spy2.at(0).at(0), val); QCOMPARE(qvariant_cast<QVariant>(spy2.at(0).at(0)), val); } @@ -350,8 +354,8 @@ void tst_QSignalSpy::spyFunctionPointerWithQtClasses() QSignalSpy spy(&obj, &QtTestObject2::sig2); QDateTime dt = QDateTime::currentDateTime(); emit obj.sig2(dt); - QCOMPARE(spy.count(), 1); - QCOMPARE(spy.at(0).count(), 1); + QCOMPARE(spy.size(), 1); + QCOMPARE(spy.at(0).size(), 1); QCOMPARE(spy.at(0).at(0).typeName(), "QDateTime"); QCOMPARE(*static_cast<const QDateTime *>(spy.at(0).at(0).constData()), dt); QCOMPARE(spy.at(0).at(0).toDateTime(), dt); @@ -373,8 +377,8 @@ void tst_QSignalSpy::spyFunctionPointerWithCustomClass() { QSignalSpy spy(&obj, &QtTestObject2::sig6); emit obj.sig6({}); - QCOMPARE(spy.count(), 1); - QCOMPARE(spy.at(0).count(), 1); + QCOMPARE(spy.size(), 1); + QCOMPARE(spy.at(0).size(), 1); QCOMPARE(spy.at(0).at(0).typeName(), "CustomType"); } @@ -420,7 +424,7 @@ void tst_QSignalSpy::waitFunctionPointer_signalEmittedTooLate() QSignalSpy spy(this, &tst_QSignalSpy::sigFoo); QVERIFY(!spy.wait(200)); QTest::qWait(400); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); } void tst_QSignalSpy::waitFunctionPointer_signalEmittedMultipleTimes() @@ -429,13 +433,13 @@ void tst_QSignalSpy::waitFunctionPointer_signalEmittedMultipleTimes() QTimer::singleShot(800, this, SIGNAL(sigFoo())); QSignalSpy spy(this, &tst_QSignalSpy::sigFoo); QVERIFY(spy.wait()); - QCOMPARE(spy.count(), 1); // we don't wait for the second signal... + QCOMPARE(spy.size(), 1); // we don't wait for the second signal... QVERIFY(spy.wait()); - QCOMPARE(spy.count(), 2); + QCOMPARE(spy.size(), 2); QVERIFY(!spy.wait(1)); QTimer::singleShot(10, this, SIGNAL(sigFoo())); QVERIFY(spy.wait()); - QCOMPARE(spy.count(), 3); + QCOMPARE(spy.size(), 3); } void tst_QSignalSpy::spyOnMetaMethod() @@ -454,36 +458,68 @@ void tst_QSignalSpy::spyOnMetaMethod() QVERIFY(spy.isValid()); obj.setObjectName("A new object name"); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); } Q_DECLARE_METATYPE(QMetaMethod); void tst_QSignalSpy::spyOnMetaMethod_invalid() { + QFETCH(const QByteArray, message); QFETCH(QObject*, object); QFETCH(QMetaMethod, signal); + QTest::ignoreMessage(QtWarningMsg, message.data()); QSignalSpy spy(object, signal); QVERIFY(!spy.isValid()); } void tst_QSignalSpy::spyOnMetaMethod_invalid_data() { + QTest::addColumn<QByteArray>("message"); QTest::addColumn<QObject*>("object"); QTest::addColumn<QMetaMethod>("signal"); QTest::addRow("Invalid object") + << "QSignalSpy: Cannot spy on a null object"_ba << static_cast<QObject*>(nullptr) << QMetaMethod(); QTest::addRow("Empty signal") + << "QSignalSpy: Null signal is not valid"_ba << new QObject(this) << QMetaMethod(); QTest::addRow("Method is not a signal") + << "QSignalSpy: Not a signal: 'deleteLater()'"_ba << new QObject(this) << QObject::staticMetaObject.method(QObject::staticMetaObject.indexOfMethod("deleteLater()")); } +class EmitSignal_Thread : public QThread +{ + Q_OBJECT +public: + void run() override + { + emit valueChanged(42, u"is the answer"_s); + } + +Q_SIGNALS: + void valueChanged(int value, const QString &str); +}; + +void tst_QSignalSpy::signalSpyDoesNotRaceOnCrossThreadSignal() +{ + EmitSignal_Thread thread; + QSignalSpy valueChangedSpy(&thread, &EmitSignal_Thread::valueChanged); + QVERIFY(valueChangedSpy.isValid()); + + thread.start(); + QVERIFY(valueChangedSpy.wait(5s)); + QCOMPARE(valueChangedSpy[0][0].toInt(), 42); + QCOMPARE(valueChangedSpy[0][1].toString(), u"is the answer"_s); + QVERIFY(thread.wait(5s)); +} + QTEST_MAIN(tst_QSignalSpy) #include "tst_qsignalspy.moc" |