tests/auto/qobject/tst_qobject.cpp
changeset 7 f7bc934e204c
parent 3 41300fa6a67c
--- a/tests/auto/qobject/tst_qobject.cpp	Tue Feb 02 00:43:10 2010 +0200
+++ b/tests/auto/qobject/tst_qobject.cpp	Wed Mar 31 11:06:36 2010 +0300
@@ -1,6 +1,6 @@
 /****************************************************************************
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
 ** All rights reserved.
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
@@ -127,6 +127,7 @@
     void overloads();
     void isSignalConnected();
     void qMetaObjectConnect();
+    void qMetaObjectDisconnectOne();
 protected:
 };
 
@@ -2646,6 +2647,16 @@
     QVERIFY(spy.eventList().isEmpty());
 }
 
+class EmitThread : public QThread
+{   Q_OBJECT
+public:
+    void run(void) {
+        emit work();
+    }
+signals:
+    void work();
+};
+
 class DeleteObject : public QObject
 {
     Q_OBJECT
@@ -2711,6 +2722,16 @@
 
         QVERIFY(thread.wait(10000));
     }
+
+    {
+        EmitThread sender;
+        DeleteObject *receiver = new DeleteObject();
+        connect(&sender, SIGNAL(work()), receiver, SLOT(deleteSelf()), Qt::DirectConnection);
+        QPointer<DeleteObject> p = receiver;
+        sender.start();
+        QVERIFY(sender.wait(10000));
+        QVERIFY(p.isNull());
+    }
 }
 
 class DisconnectObject : public QObject
@@ -3269,5 +3290,77 @@
 
 }
 
+void tst_QObject::qMetaObjectDisconnectOne()
+{
+    SenderObject *s = new SenderObject;
+    ReceiverObject *r1 = new ReceiverObject;
+
+    int signal1Index = s->metaObject()->indexOfSignal("signal1()");
+    int signal3Index = s->metaObject()->indexOfSignal("signal3()");
+    int slot1Index = r1->metaObject()->indexOfSlot("slot1()");
+    int slot2Index = r1->metaObject()->indexOfSlot("slot2()");
+
+    QVERIFY(signal1Index > 0);
+    QVERIFY(signal3Index > 0);
+    QVERIFY(slot1Index > 0);
+    QVERIFY(slot2Index > 0);
+
+    QVERIFY( QMetaObject::connect(s, signal1Index, r1, slot1Index) );
+    QVERIFY( QMetaObject::connect(s, signal3Index, r1, slot2Index) );
+    QVERIFY( QMetaObject::connect(s, signal3Index, r1, slot2Index) );
+    QVERIFY( QMetaObject::connect(s, signal3Index, r1, slot2Index) );
+
+    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 );
+
+    r1->reset();
+    QVERIFY( QMetaObject::disconnectOne(s, signal1Index, r1, slot1Index) );
+    QVERIFY( QMetaObject::disconnectOne(s, signal3Index, r1, slot2Index) );
+
+    s->emitSignal1();
+    QCOMPARE( r1->count_slot1, 0 );
+    QCOMPARE( r1->count_slot2, 0 );
+
+    s->emitSignal3();
+    QCOMPARE( r1->count_slot1, 0 );
+    QCOMPARE( r1->count_slot2, 2 );
+
+    r1->reset();
+    QVERIFY( false == QMetaObject::disconnectOne(s, signal1Index, r1, slot1Index) );
+    QVERIFY( QMetaObject::disconnectOne(s, signal3Index, r1, slot2Index) );
+
+    s->emitSignal1();
+    QCOMPARE( r1->count_slot1, 0 );
+    QCOMPARE( r1->count_slot2, 0 );
+
+    s->emitSignal3();
+    QCOMPARE( r1->count_slot1, 0 );
+    QCOMPARE( r1->count_slot2, 1 );
+
+    r1->reset();
+    QVERIFY( false == QMetaObject::disconnectOne(s, signal1Index, r1, slot1Index) );
+    QVERIFY( QMetaObject::disconnectOne(s, signal3Index, r1, slot2Index) );
+
+    s->emitSignal1();
+    QCOMPARE( r1->count_slot1, 0 );
+    QCOMPARE( r1->count_slot2, 0 );
+
+    s->emitSignal3();
+    QCOMPARE( r1->count_slot1, 0 );
+    QCOMPARE( r1->count_slot2, 0 );
+
+    delete s;
+    delete r1;
+}
+
 QTEST_MAIN(tst_QObject)
 #include "tst_qobject.moc"