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>
This commit is contained in:
Olivier Goffart 2012-01-12 21:53:56 +01:00 committed by Qt by Nokia
parent d584292aa2
commit c0323cfbaf

View File

@ -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"