summaryrefslogtreecommitdiffstats
path: root/tests/auto/testlib/qsignalspy
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/testlib/qsignalspy')
-rw-r--r--tests/auto/testlib/qsignalspy/CMakeLists.txt8
-rw-r--r--tests/auto/testlib/qsignalspy/tst_qsignalspy.cpp92
2 files changed, 70 insertions, 30 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 78f0c17762..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,12 +83,12 @@ 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.size(), 0);
@@ -96,7 +100,7 @@ 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.size(), 2);
@@ -124,7 +128,7 @@ 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.size(), 2);
@@ -155,14 +159,14 @@ void tst_QSignalSpy::spyWithBasicQtClasses()
QSignalSpy spy(&obj, SIGNAL(sig(QString)));
emit obj.sig(QString("bubu"));
- QCOMPARE(spy.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.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,7 +180,7 @@ void tst_QSignalSpy::spyWithQtClasses()
QSignalSpy spy(&obj, SIGNAL(sig2(QDateTime)));
QDateTime dt = QDateTime::currentDateTime();
emit obj.sig2(dt);
- QCOMPARE(spy.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);
@@ -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,12 +275,12 @@ 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.size(), 0);
@@ -288,7 +292,7 @@ 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.size(), 2);
@@ -316,7 +320,7 @@ 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.size(), 2);
@@ -330,14 +334,14 @@ void tst_QSignalSpy::spyFunctionPointerWithBasicQtClasses()
QSignalSpy spy(&obj, &QtTestObject2::sig);
emit obj.sig(QString("bubu"));
- QCOMPARE(spy.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.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,7 +354,7 @@ void tst_QSignalSpy::spyFunctionPointerWithQtClasses()
QSignalSpy spy(&obj, &QtTestObject2::sig2);
QDateTime dt = QDateTime::currentDateTime();
emit obj.sig2(dt);
- QCOMPARE(spy.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);
@@ -373,7 +377,7 @@ void tst_QSignalSpy::spyFunctionPointerWithCustomClass()
{
QSignalSpy spy(&obj, &QtTestObject2::sig6);
emit obj.sig6({});
- QCOMPARE(spy.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"