summaryrefslogtreecommitdiffstats
path: root/tests/auto/tools/moc/tst_moc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/tools/moc/tst_moc.cpp')
-rw-r--r--tests/auto/tools/moc/tst_moc.cpp370
1 files changed, 370 insertions, 0 deletions
diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp
index d4602a6e77..a79a5f604b 100644
--- a/tests/auto/tools/moc/tst_moc.cpp
+++ b/tests/auto/tools/moc/tst_moc.cpp
@@ -543,6 +543,8 @@ private slots:
void cxx11Enums();
void returnRefs();
+ void privateSignalConnection();
+
signals:
void sigWithUnsignedArg(unsigned foo);
void sigWithSignedArg(signed foo);
@@ -1768,6 +1770,374 @@ void tst_Moc::returnRefs()
// they used to cause miscompilation of the moc generated file.
}
+class SignalConnectionTester : public QObject
+{
+ Q_OBJECT
+public:
+ SignalConnectionTester(QObject *parent = 0)
+ : QObject(parent), testPassed(false)
+ {
+
+ }
+
+public Q_SLOTS:
+ void testSlot()
+ {
+ testPassed = true;
+ }
+ void testSlotWith1Arg(int i)
+ {
+ testPassed = i == 42;
+ }
+ void testSlotWith2Args(int i, const QString &s)
+ {
+ testPassed = i == 42 && s == "Hello";
+ }
+
+public:
+ bool testPassed;
+};
+
+class ClassWithPrivateSignals : public QObject
+{
+ Q_OBJECT
+public:
+ ClassWithPrivateSignals(QObject *parent = 0)
+ : QObject(parent)
+ {
+
+ }
+
+ void emitPrivateSignals()
+ {
+ emit privateSignal1(QPrivateSignal());
+ emit privateSignalWith1Arg(42, QPrivateSignal());
+ emit privateSignalWith2Args(42, "Hello", QPrivateSignal());
+ }
+
+Q_SIGNALS:
+ void privateSignal1(QPrivateSignal);
+ void privateSignalWith1Arg(int arg1, QPrivateSignal);
+ void privateSignalWith2Args(int arg1, const QString &arg2, QPrivateSignal);
+};
+
+class SubClassFromPrivateSignals : public ClassWithPrivateSignals
+{
+ Q_OBJECT
+public:
+ SubClassFromPrivateSignals(QObject *parent = 0)
+ : ClassWithPrivateSignals(parent)
+ {
+
+ }
+
+ void emitProtectedSignals()
+ {
+ // Compile test: All of this intentionally does not compile:
+// emit privateSignal1();
+// emit privateSignalWith1Arg(42);
+// emit privateSignalWith2Args(42, "Hello");
+//
+// emit privateSignal1(QPrivateSignal());
+// emit privateSignalWith1Arg(42, QPrivateSignal());
+// emit privateSignalWith2Args(42, "Hello", QPrivateSignal());
+//
+// emit privateSignal1(ClassWithPrivateSignals::QPrivateSignal());
+// emit privateSignalWith1Arg(42, ClassWithPrivateSignals::QPrivateSignal());
+// emit privateSignalWith2Args(42, "Hello", ClassWithPrivateSignals::QPrivateSignal());
+ }
+};
+
+void tst_Moc::privateSignalConnection()
+{
+ // Function pointer connects. Matching signals and slots
+ {
+ ClassWithPrivateSignals classWithPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&classWithPrivateSignals, &ClassWithPrivateSignals::privateSignal1, &tester, &SignalConnectionTester::testSlot);
+
+ QVERIFY(!tester.testPassed);
+
+ classWithPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ tester.testPassed = false;
+ QMetaObject::invokeMethod(&classWithPrivateSignals, "privateSignal1");
+ QVERIFY(tester.testPassed);
+ }
+ {
+ SubClassFromPrivateSignals subClassFromPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&subClassFromPrivateSignals, &ClassWithPrivateSignals::privateSignal1, &tester, &SignalConnectionTester::testSlot);
+
+ QVERIFY(!tester.testPassed);
+
+ subClassFromPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ tester.testPassed = false;
+ QMetaObject::invokeMethod(&subClassFromPrivateSignals, "privateSignal1");
+ QVERIFY(tester.testPassed);
+ }
+ {
+ ClassWithPrivateSignals classWithPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&classWithPrivateSignals, &ClassWithPrivateSignals::privateSignalWith1Arg, &tester, &SignalConnectionTester::testSlotWith1Arg);
+
+ QVERIFY(!tester.testPassed);
+
+ classWithPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ tester.testPassed = false;
+ QMetaObject::invokeMethod(&classWithPrivateSignals, "privateSignalWith1Arg", Q_ARG(int, 42));
+ QVERIFY(tester.testPassed);
+ }
+ {
+ SubClassFromPrivateSignals subClassFromPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&subClassFromPrivateSignals, &ClassWithPrivateSignals::privateSignalWith1Arg, &tester, &SignalConnectionTester::testSlotWith1Arg);
+
+ QVERIFY(!tester.testPassed);
+
+ subClassFromPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ tester.testPassed = false;
+ QMetaObject::invokeMethod(&subClassFromPrivateSignals, "privateSignalWith1Arg", Q_ARG(int, 42));
+ QVERIFY(tester.testPassed);
+ }
+ {
+ ClassWithPrivateSignals classWithPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&classWithPrivateSignals, &ClassWithPrivateSignals::privateSignalWith2Args, &tester, &SignalConnectionTester::testSlotWith2Args);
+
+ QVERIFY(!tester.testPassed);
+
+ classWithPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ tester.testPassed = false;
+ QMetaObject::invokeMethod(&classWithPrivateSignals, "privateSignalWith2Args", Q_ARG(int, 42), Q_ARG(QString, "Hello"));
+ QVERIFY(tester.testPassed);
+ }
+ {
+ SubClassFromPrivateSignals subClassFromPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&subClassFromPrivateSignals, &ClassWithPrivateSignals::privateSignalWith2Args, &tester, &SignalConnectionTester::testSlotWith2Args);
+
+ QVERIFY(!tester.testPassed);
+
+ subClassFromPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ tester.testPassed = false;
+ QMetaObject::invokeMethod(&subClassFromPrivateSignals, "privateSignalWith2Args", Q_ARG(int, 42), Q_ARG(QString, "Hello"));
+ QVERIFY(tester.testPassed);
+ }
+
+
+ // String based connects. Matching signals and slots
+ {
+ ClassWithPrivateSignals classWithPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&classWithPrivateSignals, SIGNAL(privateSignal1()), &tester, SLOT(testSlot()));
+
+ QVERIFY(!tester.testPassed);
+
+ classWithPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ }
+ {
+ SubClassFromPrivateSignals subClassFromPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&subClassFromPrivateSignals, SIGNAL(privateSignal1()), &tester, SLOT(testSlot()));
+
+ QVERIFY(!tester.testPassed);
+
+ subClassFromPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ }
+ {
+ ClassWithPrivateSignals classWithPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&classWithPrivateSignals, SIGNAL(privateSignalWith1Arg(int)), &tester, SLOT(testSlotWith1Arg(int)));
+
+ QVERIFY(!tester.testPassed);
+
+ classWithPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ }
+ {
+ SubClassFromPrivateSignals subClassFromPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&subClassFromPrivateSignals, SIGNAL(privateSignalWith1Arg(int)), &tester, SLOT(testSlotWith1Arg(int)));
+
+ QVERIFY(!tester.testPassed);
+
+ subClassFromPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ }
+ {
+ ClassWithPrivateSignals classWithPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&classWithPrivateSignals, SIGNAL(privateSignalWith2Args(int,QString)), &tester, SLOT(testSlotWith2Args(int,QString)));
+ QVERIFY(!tester.testPassed);
+
+ classWithPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ }
+ {
+ SubClassFromPrivateSignals subClassFromPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&subClassFromPrivateSignals, SIGNAL(privateSignalWith2Args(int,QString)), &tester, SLOT(testSlotWith2Args(int,QString)));
+
+ QVERIFY(!tester.testPassed);
+
+ subClassFromPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ }
+
+ // Function pointer connects. Decayed slot arguments
+ {
+ ClassWithPrivateSignals classWithPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&classWithPrivateSignals, &ClassWithPrivateSignals::privateSignalWith1Arg, &tester, &SignalConnectionTester::testSlot);
+
+ QVERIFY(!tester.testPassed);
+
+ classWithPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ }
+ {
+ SubClassFromPrivateSignals subClassFromPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&subClassFromPrivateSignals, &ClassWithPrivateSignals::privateSignalWith1Arg, &tester, &SignalConnectionTester::testSlot);
+
+ QVERIFY(!tester.testPassed);
+
+ subClassFromPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ }
+ {
+ ClassWithPrivateSignals classWithPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&classWithPrivateSignals, &ClassWithPrivateSignals::privateSignalWith1Arg, &tester, &SignalConnectionTester::testSlotWith1Arg);
+ QVERIFY(!tester.testPassed);
+
+ classWithPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ }
+ {
+ SubClassFromPrivateSignals subClassFromPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&subClassFromPrivateSignals, &ClassWithPrivateSignals::privateSignalWith1Arg, &tester, &SignalConnectionTester::testSlotWith1Arg);
+
+ QVERIFY(!tester.testPassed);
+
+ subClassFromPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ }
+ {
+ ClassWithPrivateSignals classWithPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&classWithPrivateSignals, &ClassWithPrivateSignals::privateSignalWith1Arg, &tester, &SignalConnectionTester::testSlot);
+ QVERIFY(!tester.testPassed);
+
+ classWithPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ }
+ {
+ SubClassFromPrivateSignals subClassFromPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&subClassFromPrivateSignals, &ClassWithPrivateSignals::privateSignalWith1Arg, &tester, &SignalConnectionTester::testSlot);
+
+ QVERIFY(!tester.testPassed);
+
+ subClassFromPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ }
+
+ // String based connects. Decayed slot arguments
+ {
+ ClassWithPrivateSignals classWithPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&classWithPrivateSignals, SIGNAL(privateSignalWith1Arg(int)), &tester, SLOT(testSlot()));
+
+ QVERIFY(!tester.testPassed);
+
+ classWithPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ }
+ {
+ SubClassFromPrivateSignals subClassFromPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&subClassFromPrivateSignals, SIGNAL(privateSignalWith1Arg(int)), &tester, SLOT(testSlot()));
+
+ QVERIFY(!tester.testPassed);
+
+ subClassFromPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ }
+ {
+ ClassWithPrivateSignals classWithPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&classWithPrivateSignals, SIGNAL(privateSignalWith2Args(int,QString)), &tester, SLOT(testSlotWith1Arg(int)));
+ QVERIFY(!tester.testPassed);
+
+ classWithPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ }
+ {
+ SubClassFromPrivateSignals subClassFromPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&subClassFromPrivateSignals, SIGNAL(privateSignalWith2Args(int,QString)), &tester, SLOT(testSlotWith1Arg(int)));
+
+ QVERIFY(!tester.testPassed);
+
+ subClassFromPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ }
+ {
+ ClassWithPrivateSignals classWithPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&classWithPrivateSignals, SIGNAL(privateSignalWith2Args(int,QString)), &tester, SLOT(testSlot()));
+ QVERIFY(!tester.testPassed);
+
+ classWithPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ }
+ {
+ SubClassFromPrivateSignals subClassFromPrivateSignals;
+ SignalConnectionTester tester;
+ QObject::connect(&subClassFromPrivateSignals, SIGNAL(privateSignalWith2Args(int,QString)), &tester, SLOT(testSlot()));
+
+ QVERIFY(!tester.testPassed);
+
+ subClassFromPrivateSignals.emitPrivateSignals();
+
+ QVERIFY(tester.testPassed);
+ }
+}
+
+
QTEST_MAIN(tst_Moc)
#include "tst_moc.moc"