tests/auto/qobject/tst_qobject.cpp
changeset 7 f7bc934e204c
parent 3 41300fa6a67c
equal deleted inserted replaced
3:41300fa6a67c 7:f7bc934e204c
     1 /****************************************************************************
     1 /****************************************************************************
     2 **
     2 **
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     4 ** All rights reserved.
     4 ** All rights reserved.
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
     6 **
     6 **
     7 ** This file is part of the test suite of the Qt Toolkit.
     7 ** This file is part of the test suite of the Qt Toolkit.
     8 **
     8 **
   125     void interfaceIid();
   125     void interfaceIid();
   126     void deleteQObjectWhenDeletingEvent();
   126     void deleteQObjectWhenDeletingEvent();
   127     void overloads();
   127     void overloads();
   128     void isSignalConnected();
   128     void isSignalConnected();
   129     void qMetaObjectConnect();
   129     void qMetaObjectConnect();
       
   130     void qMetaObjectDisconnectOne();
   130 protected:
   131 protected:
   131 };
   132 };
   132 
   133 
   133 tst_QObject::tst_QObject()
   134 tst_QObject::tst_QObject()
   134 {
   135 {
  2644     object.installEventFilter(&spy);
  2645     object.installEventFilter(&spy);
  2645     QCoreApplication::sendEvent(&object, &event);
  2646     QCoreApplication::sendEvent(&object, &event);
  2646     QVERIFY(spy.eventList().isEmpty());
  2647     QVERIFY(spy.eventList().isEmpty());
  2647 }
  2648 }
  2648 
  2649 
       
  2650 class EmitThread : public QThread
       
  2651 {   Q_OBJECT
       
  2652 public:
       
  2653     void run(void) {
       
  2654         emit work();
       
  2655     }
       
  2656 signals:
       
  2657     void work();
       
  2658 };
       
  2659 
  2649 class DeleteObject : public QObject
  2660 class DeleteObject : public QObject
  2650 {
  2661 {
  2651     Q_OBJECT
  2662     Q_OBJECT
  2652 
  2663 
  2653 public slots:
  2664 public slots:
  2708         QPointer<DeleteObject> p = receiver;
  2719         QPointer<DeleteObject> p = receiver;
  2709         sender.emitSignal1();
  2720         sender.emitSignal1();
  2710         QVERIFY(p.isNull());
  2721         QVERIFY(p.isNull());
  2711 
  2722 
  2712         QVERIFY(thread.wait(10000));
  2723         QVERIFY(thread.wait(10000));
       
  2724     }
       
  2725 
       
  2726     {
       
  2727         EmitThread sender;
       
  2728         DeleteObject *receiver = new DeleteObject();
       
  2729         connect(&sender, SIGNAL(work()), receiver, SLOT(deleteSelf()), Qt::DirectConnection);
       
  2730         QPointer<DeleteObject> p = receiver;
       
  2731         sender.start();
       
  2732         QVERIFY(sender.wait(10000));
       
  2733         QVERIFY(p.isNull());
  2713     }
  2734     }
  2714 }
  2735 }
  2715 
  2736 
  2716 class DisconnectObject : public QObject
  2737 class DisconnectObject : public QObject
  2717 {
  2738 {
  3267     delete r1;
  3288     delete r1;
  3268     delete r2;
  3289     delete r2;
  3269 
  3290 
  3270 }
  3291 }
  3271 
  3292 
       
  3293 void tst_QObject::qMetaObjectDisconnectOne()
       
  3294 {
       
  3295     SenderObject *s = new SenderObject;
       
  3296     ReceiverObject *r1 = new ReceiverObject;
       
  3297 
       
  3298     int signal1Index = s->metaObject()->indexOfSignal("signal1()");
       
  3299     int signal3Index = s->metaObject()->indexOfSignal("signal3()");
       
  3300     int slot1Index = r1->metaObject()->indexOfSlot("slot1()");
       
  3301     int slot2Index = r1->metaObject()->indexOfSlot("slot2()");
       
  3302 
       
  3303     QVERIFY(signal1Index > 0);
       
  3304     QVERIFY(signal3Index > 0);
       
  3305     QVERIFY(slot1Index > 0);
       
  3306     QVERIFY(slot2Index > 0);
       
  3307 
       
  3308     QVERIFY( QMetaObject::connect(s, signal1Index, r1, slot1Index) );
       
  3309     QVERIFY( QMetaObject::connect(s, signal3Index, r1, slot2Index) );
       
  3310     QVERIFY( QMetaObject::connect(s, signal3Index, r1, slot2Index) );
       
  3311     QVERIFY( QMetaObject::connect(s, signal3Index, r1, slot2Index) );
       
  3312 
       
  3313     r1->reset();
       
  3314     QCOMPARE( r1->count_slot1, 0 );
       
  3315     QCOMPARE( r1->count_slot2, 0 );
       
  3316 
       
  3317     s->emitSignal1();
       
  3318     QCOMPARE( r1->count_slot1, 1 );
       
  3319     QCOMPARE( r1->count_slot2, 0 );
       
  3320 
       
  3321     s->emitSignal3();
       
  3322     QCOMPARE( r1->count_slot1, 1 );
       
  3323     QCOMPARE( r1->count_slot2, 3 );
       
  3324 
       
  3325     r1->reset();
       
  3326     QVERIFY( QMetaObject::disconnectOne(s, signal1Index, r1, slot1Index) );
       
  3327     QVERIFY( QMetaObject::disconnectOne(s, signal3Index, r1, slot2Index) );
       
  3328 
       
  3329     s->emitSignal1();
       
  3330     QCOMPARE( r1->count_slot1, 0 );
       
  3331     QCOMPARE( r1->count_slot2, 0 );
       
  3332 
       
  3333     s->emitSignal3();
       
  3334     QCOMPARE( r1->count_slot1, 0 );
       
  3335     QCOMPARE( r1->count_slot2, 2 );
       
  3336 
       
  3337     r1->reset();
       
  3338     QVERIFY( false == QMetaObject::disconnectOne(s, signal1Index, r1, slot1Index) );
       
  3339     QVERIFY( QMetaObject::disconnectOne(s, signal3Index, r1, slot2Index) );
       
  3340 
       
  3341     s->emitSignal1();
       
  3342     QCOMPARE( r1->count_slot1, 0 );
       
  3343     QCOMPARE( r1->count_slot2, 0 );
       
  3344 
       
  3345     s->emitSignal3();
       
  3346     QCOMPARE( r1->count_slot1, 0 );
       
  3347     QCOMPARE( r1->count_slot2, 1 );
       
  3348 
       
  3349     r1->reset();
       
  3350     QVERIFY( false == QMetaObject::disconnectOne(s, signal1Index, r1, slot1Index) );
       
  3351     QVERIFY( QMetaObject::disconnectOne(s, signal3Index, r1, slot2Index) );
       
  3352 
       
  3353     s->emitSignal1();
       
  3354     QCOMPARE( r1->count_slot1, 0 );
       
  3355     QCOMPARE( r1->count_slot2, 0 );
       
  3356 
       
  3357     s->emitSignal3();
       
  3358     QCOMPARE( r1->count_slot1, 0 );
       
  3359     QCOMPARE( r1->count_slot2, 0 );
       
  3360 
       
  3361     delete s;
       
  3362     delete r1;
       
  3363 }
       
  3364 
  3272 QTEST_MAIN(tst_QObject)
  3365 QTEST_MAIN(tst_QObject)
  3273 #include "tst_qobject.moc"
  3366 #include "tst_qobject.moc"