diff options
author | Olivier Goffart <ogoffart@woboq.com> | 2012-01-12 21:53:56 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-01-24 01:13:01 +0100 |
commit | c0323cfbaf198afe15f8eec60d5e0323be91f0d5 (patch) | |
tree | 31be4c31056408a064da96c19496a85d1f10264a /tests | |
parent | d584292aa2e17dbb7cdfee24b442cd9cb66e5aac (diff) |
Test connecting to virtual function pointer
The C++ standard says that the comparison between pointer to virtual
function is unspecified (C++11 $5.10.2)
But we still may rely on it for the Qt::UniqueConnection and the
disconnection
So test if it works while using the same function.
Using function from different classes works for me, but we should
probably not assume it works. I left it commented in the test for
reference.
Change-Id: I1d9b91d4cc1a424d4f43ef2ee4981b8573f1e86f
Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/corelib/kernel/qobject/tst_qobject.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp index 15353a3764..9628bb3faa 100644 --- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp +++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp @@ -134,6 +134,7 @@ private slots: void returnValue(); void returnValue2_data(); void returnValue2(); + void connectVirtualSlots(); }; class SenderObject : public QObject @@ -5150,6 +5151,52 @@ void tst_QObject::returnValue2() } } +class VirtualSlotsObjectBase : public QObject { + Q_OBJECT +public slots: + virtual void slot1() { + base_counter1++; + } +public: + VirtualSlotsObjectBase() : base_counter1(0) {} + int base_counter1; +signals: + void signal1(); +}; + +class VirtualSlotsObject : public VirtualSlotsObjectBase { + Q_OBJECT +public slots: + virtual void slot1() { + derived_counter1++; + } +public: + VirtualSlotsObject() : derived_counter1(0) {} + int derived_counter1; +}; + +void tst_QObject::connectVirtualSlots() +{ + VirtualSlotsObject obj; + QVERIFY( QObject::connect(&obj, &VirtualSlotsObjectBase::signal1, &obj, &VirtualSlotsObjectBase::slot1, Qt::UniqueConnection)); + QVERIFY(!QObject::connect(&obj, &VirtualSlotsObjectBase::signal1, &obj, &VirtualSlotsObjectBase::slot1, Qt::UniqueConnection)); + + emit obj.signal1(); + QCOMPARE(obj.base_counter1, 0); + QCOMPARE(obj.derived_counter1, 1); + + QVERIFY(QObject::disconnect(&obj, &VirtualSlotsObjectBase::signal1, &obj, &VirtualSlotsObjectBase::slot1)); + QVERIFY(!QObject::disconnect(&obj, &VirtualSlotsObjectBase::signal1, &obj, &VirtualSlotsObjectBase::slot1)); + + emit obj.signal1(); + QCOMPARE(obj.base_counter1, 0); + QCOMPARE(obj.derived_counter1, 1); + + /* the C++ standard say the comparison between pointer to virtual member function is unspecified + QVERIFY( QObject::connect(&obj, &VirtualSlotsObjectBase::signal1, &obj, &VirtualSlotsObjectBase::slot1, Qt::UniqueConnection)); + QVERIFY(!QObject::connect(&obj, &VirtualSlotsObjectBase::signal1, &obj, &VirtualSlotsObject::slot1, Qt::UniqueConnection)); + */ +} QTEST_MAIN(tst_QObject) #include "tst_qobject.moc" |