summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/kernel
diff options
context:
space:
mode:
authorOlivier Goffart <ogoffart@woboq.com>2011-11-09 12:32:10 +0100
committerQt by Nokia <qt-info@nokia.com>2011-11-25 01:12:14 +0100
commit489a39aacc102e46a5b3fffd5839ed694bb7214f (patch)
tree2086606f928c55cc8e8702b89ed6c52b7379c7b4 /tests/auto/corelib/kernel
parent66b659c8a4a429b483b66fd1a1d1429a2c0d3b4a (diff)
More tests for the new connection syntax.
Those tests are the one from Thiago's C++0X implementation The rvalue references ones are commented out because moc do not understand them yet But supporting them may come later. Change-Id: I6b0720e7f2992be9f7e34770960fa58fa456a54b Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'tests/auto/corelib/kernel')
-rw-r--r--tests/auto/corelib/kernel/qobject/tst_qobject.cpp226
1 files changed, 226 insertions, 0 deletions
diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
index 91ad3928aa..77e9a9e42d 100644
--- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
+++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
@@ -124,6 +124,9 @@ private slots:
void pointerConnect();
void emitInDefinedOrderPointer();
void customTypesPointer();
+ void connectCxx0x();
+ void connectToStaticCxx0x();
+ void connectCxx0xTypeMatching();
void connectConvert();
void connectWithReference();
void connectManyArguments();
@@ -4204,6 +4207,229 @@ void tst_QObject::customTypesPointer()
QCOMPARE(instanceCount, 3);
}
+void tst_QObject::connectCxx0x()
+{
+ SenderObject *s = new SenderObject;
+ ReceiverObject *r1 = new ReceiverObject;
+
+ QObject::connect(s, &SenderObject::signal1, r1, &ReceiverObject::slot1);
+ QObject::connect(s, &SenderObject::signal3, r1, &ReceiverObject::slot2);
+ QObject::connect(s, &SenderObject::signal3, r1, &ReceiverObject::slot2);
+ QObject::connect(s, &SenderObject::signal3, r1, &ReceiverObject::slot2);
+
+ r1->reset();
+ QCOMPARE( r1->count_slot1, 0 );
+ QCOMPARE( r1->count_slot2, 0 );
+
+ s->emitSignal1();
+ QCOMPARE( r1->count_slot1, 1 );
+ QCOMPARE( r1->count_slot2, 0 );
+
+ s->emitSignal3();
+ QCOMPARE( r1->count_slot1, 1 );
+ QCOMPARE( r1->count_slot2, 3 );
+
+ // connect signal to signal
+ QObject::connect(s, &SenderObject::signal2, s, &SenderObject::signal1);
+
+ r1->reset();
+ s->emitSignal2();
+ QCOMPARE( r1->count_slot1, 1 );
+
+ delete s;
+ delete r1;
+}
+
+int receivedCount;
+void receiverFunction() { ++receivedCount; }
+
+void tst_QObject::connectToStaticCxx0x()
+{
+ SenderObject *s = new SenderObject;
+
+ void (*receiver)() = receiverFunction;
+
+ QObject::connect(s, &SenderObject::signal1, receiver);
+ receivedCount = 0;
+ s->emitSignal1();
+ QCOMPARE(receivedCount, 1);
+
+ QObject::connect(s, &SenderObject::signal1, receiver);
+ receivedCount = 0;
+ s->emitSignal1();
+ QCOMPARE(receivedCount, 2);
+
+ delete s;
+}
+
+class LotsOfSignalsAndSlots: public QObject
+{
+ Q_OBJECT
+ typedef void (*fptr)();
+
+ public slots:
+ void slot_v() {}
+ void slot_vi(int) {}
+ void slot_vii(int, int) {}
+ void slot_viii(int, int, int) {}
+ int slot_i() { return 0; }
+ int slot_ii(int) { return 0; }
+ int slot_iii(int, int) { return 0; }
+ int slot_iiii(int, int, int) { return 0; }
+ void slot_vRi(int &) {}
+ void slot_vs(short) {}
+ void slot_vRs(short&) {}
+ /* #ifdef Q_COMPILER_RVALUE_REFS
+ void slot_vOi(int &&) {}
+ void slot_vOs(short &&) {}
+ #endif*/
+ void slot_vPFvvE(fptr) {}
+
+ static void static_slot_v() {}
+ static void static_slot_vi(int) {}
+ static void static_slot_vii(int, int) {}
+ static void static_slot_viii(int, int, int) {}
+ static int static_slot_i() { return 0; }
+ static int static_slot_ii(int) { return 0; }
+ static int static_slot_iii(int, int) { return 0; }
+ static int static_slot_iiii(int, int, int) { return 0; }
+ static void static_slot_vRi(int &) {}
+ static void static_slot_vs(short) {}
+ static void static_slot_vRs(short&) {}
+/* #if defined(Q_COMPILER_RVALUE_REFS) || defined(QT_ENABLE_CXX0X)
+ static void static_slot_vOi(int &&) {}
+ static void static_slot_vOs(short &&) {}
+ #endif*/
+ static void static_slot_vPFvvE(fptr) {}
+
+ signals:
+ void signal_v();
+ void signal_vi(int);
+ void signal_vii(int, int);
+ void signal_viii(int, int, int);
+ void signal_vRi(int &);
+ void signal_vs(short);
+ void signal_vRs(short &);
+/* #if defined(Q_COMPILER_RVALUE_REFS) || defined(QT_ENABLE_CXX0X)
+ void signal_vOi(int &&);
+ void signal_vOs(short &&);
+ #endif*/
+ void signal_vPFvvE(fptr);
+
+ void signal(short&, short, long long, short);
+ void otherSignal(const char *);
+};
+
+void tst_QObject::connectCxx0xTypeMatching()
+{
+ // this is just about connecting the signals to the slots
+ // if this fails, this will be a compiler failure
+ typedef LotsOfSignalsAndSlots Foo;
+ Foo obj;
+
+ // member connects
+ QObject::connect(&obj, &Foo::signal_v, &obj, &Foo::slot_v);
+ QObject::connect(&obj, &Foo::signal_v, &obj, &Foo::slot_i);
+
+ QObject::connect(&obj, &Foo::signal_vi, &obj, &Foo::slot_v);
+ QObject::connect(&obj, &Foo::signal_vi, &obj, &Foo::slot_i);
+ QObject::connect(&obj, &Foo::signal_vi, &obj, &Foo::slot_vi);
+ QObject::connect(&obj, &Foo::signal_vi, &obj, &Foo::slot_ii);
+
+ QObject::connect(&obj, &Foo::signal_vii, &obj, &Foo::slot_v);
+ QObject::connect(&obj, &Foo::signal_vii, &obj, &Foo::slot_i);
+ QObject::connect(&obj, &Foo::signal_vii, &obj, &Foo::slot_vi);
+ QObject::connect(&obj, &Foo::signal_vii, &obj, &Foo::slot_ii);
+ QObject::connect(&obj, &Foo::signal_vii, &obj, &Foo::slot_vii);
+ QObject::connect(&obj, &Foo::signal_vii, &obj, &Foo::slot_iii);
+
+ QObject::connect(&obj, &Foo::signal_viii, &obj, &Foo::slot_v);
+ QObject::connect(&obj, &Foo::signal_viii, &obj, &Foo::slot_i);
+ QObject::connect(&obj, &Foo::signal_viii, &obj, &Foo::slot_vi);
+ QObject::connect(&obj, &Foo::signal_viii, &obj, &Foo::slot_ii);
+ QObject::connect(&obj, &Foo::signal_viii, &obj, &Foo::slot_vii);
+ QObject::connect(&obj, &Foo::signal_viii, &obj, &Foo::slot_iii);
+ QObject::connect(&obj, &Foo::signal_viii, &obj, &Foo::slot_viii);
+ QObject::connect(&obj, &Foo::signal_viii, &obj, &Foo::slot_iiii);
+
+ QObject::connect(&obj, &Foo::signal_vi, &obj, &Foo::slot_vi); // repeated from above
+ QObject::connect(&obj, &Foo::signal_vRi, &obj, &Foo::slot_vi);
+ QObject::connect(&obj, &Foo::signal_vRi, &obj, &Foo::slot_vRi);
+/*#if defined(Q_COMPILER_RVALUE_REFS) || defined(QT_ENABLE_CXX0X)
+ QObject::connect(&obj, &Foo::signal_vOi, &obj, &Foo::slot_vi);
+ QObject::connect(&obj, &Foo::signal_vi, &obj, &Foo::slot_vOi);
+ QObject::connect(&obj, &Foo::signal_vRi, &obj, &Foo::slot_vOi);
+ QObject::connect(&obj, &Foo::signal_vOi, &obj, &Foo::slot_vOi);
+#endif*/
+ // these are not supposed to compile:
+ //QObject::connect(&obj, &Foo::signal_vi, &obj, &Foo::slot_vRi);
+ //QObject::connect(&obj, &Foo::signal_vOi, &obj, &Foo::slot_vRi);
+
+ QObject::connect(&obj, &Foo::signal_vs, &obj, &Foo::slot_vi);
+ QObject::connect(&obj, &Foo::signal_vRs, &obj, &Foo::slot_vi);
+/*#if defined(Q_COMPILER_RVALUE_REFS) || defined(QT_ENABLE_CXX0X)
+ QObject::connect(&obj, &Foo::signal_vOs, &obj, &Foo::slot_vi);
+ QObject::connect(&obj, &Foo::signal_vRs, &obj, &Foo::slot_vOi);
+ QObject::connect(&obj, &Foo::signal_vOs, &obj, &Foo::slot_vOi);
+ // these are not supposed to compile:
+ //QObject::connect(&obj, &Foo::signal_vOs, &obj, &Foo::slot_vRi);
+ //QObject::connect(&obj, &Foo::signal_vRs, &obj, &Foo::slot_vRi);
+#endif*/
+
+ QObject::connect(&obj, &Foo::signal_vPFvvE, &obj, &Foo::slot_v);
+ QObject::connect(&obj, &Foo::signal_vPFvvE, &obj, &Foo::slot_i);
+ QObject::connect(&obj, &Foo::signal_vPFvvE, &obj, &Foo::slot_vPFvvE);
+
+ QObject::connect(&obj, &Foo::signal_v, &Foo::static_slot_v);
+ QObject::connect(&obj, &Foo::signal_v, &Foo::static_slot_i);
+
+ QObject::connect(&obj, &Foo::signal_vi, &Foo::static_slot_v);
+ QObject::connect(&obj, &Foo::signal_vi, &Foo::static_slot_i);
+ QObject::connect(&obj, &Foo::signal_vi, &Foo::static_slot_vi);
+ QObject::connect(&obj, &Foo::signal_vi, &Foo::static_slot_ii);
+
+ QObject::connect(&obj, &Foo::signal_vii, &Foo::static_slot_v);
+ QObject::connect(&obj, &Foo::signal_vii, &Foo::static_slot_i);
+ QObject::connect(&obj, &Foo::signal_vii, &Foo::static_slot_vi);
+ QObject::connect(&obj, &Foo::signal_vii, &Foo::static_slot_ii);
+ QObject::connect(&obj, &Foo::signal_vii, &Foo::static_slot_vii);
+ QObject::connect(&obj, &Foo::signal_vii, &Foo::static_slot_iii);
+
+ QObject::connect(&obj, &Foo::signal_viii, &Foo::static_slot_v);
+ QObject::connect(&obj, &Foo::signal_viii, &Foo::static_slot_i);
+ QObject::connect(&obj, &Foo::signal_viii, &Foo::static_slot_vi);
+ QObject::connect(&obj, &Foo::signal_viii, &Foo::static_slot_ii);
+ QObject::connect(&obj, &Foo::signal_viii, &Foo::static_slot_vii);
+ QObject::connect(&obj, &Foo::signal_viii, &Foo::static_slot_iii);
+ QObject::connect(&obj, &Foo::signal_viii, &Foo::static_slot_viii);
+ QObject::connect(&obj, &Foo::signal_viii, &Foo::static_slot_iiii);
+
+/*#if defined(Q_COMPILER_RVALUE_REFS) && defined(QT_ENABLE_CXX0X)
+ QObject::connect(&obj, &Foo::signal_vi, &Foo::static_slot_vOi);
+ QObject::connect(&obj, &Foo::signal_vRi, &Foo::static_slot_vi);
+ QObject::connect(&obj, &Foo::signal_vRi, &Foo::static_slot_vRi);
+ QObject::connect(&obj, &Foo::signal_vRi, &Foo::static_slot_vOi);
+ QObject::connect(&obj, &Foo::signal_vOi, &Foo::static_slot_vi);
+ QObject::connect(&obj, &Foo::signal_vOi, &Foo::static_slot_vOi);
+ //QObject::connect(&obj, &Foo::signal_vi, &Foo::static_slot_vRi);
+ //QObject::connect(&obj, &Foo::signal_vOi, &Foo::static_slot_vRi);
+#endif*/
+
+ QObject::connect(&obj, &Foo::signal_vs, &Foo::static_slot_vi);
+ QObject::connect(&obj, &Foo::signal_vRs, &Foo::static_slot_vi);
+/*#if defined(Q_COMPILER_RVALUE_REFS) && defined(QT_ENABLE_CXX0X)
+ QObject::connect(&obj, &Foo::signal_vOs, &Foo::static_slot_vi);
+ QObject::connect(&obj, &Foo::signal_vRs, &Foo::static_slot_vOi);
+ QObject::connect(&obj, &Foo::signal_vOs, &Foo::static_slot_vOi);
+ //QObject::connect(&obj, &Foo::signal_vOs, &Foo::static_slot_vRi);
+ //QObject::connect(&obj, &Foo::signal_vRs, &Foo::static_slot_vRi);
+#endif*/
+ QObject::connect(&obj, &Foo::signal_vPFvvE, &Foo::static_slot_v);
+ QObject::connect(&obj, &Foo::signal_vPFvvE, &Foo::static_slot_i);
+ QObject::connect(&obj, &Foo::signal_vPFvvE, &Foo::static_slot_vPFvvE);
+ QVERIFY(true); //compilation only test
+}
+
class StringVariant : public QObject
{ Q_OBJECT
signals: