tests/auto/qobject/tst_qobject.cpp
changeset 3 41300fa6a67c
parent 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
2:56cd8111b7f7 3:41300fa6a67c
    58 #include <QMutex>
    58 #include <QMutex>
    59 #include <QWaitCondition>
    59 #include <QWaitCondition>
    60 #include <QProcess>
    60 #include <QProcess>
    61 
    61 
    62 #include "qobject.h"
    62 #include "qobject.h"
       
    63 #ifdef QT_BUILD_INTERNAL
       
    64 #include <private/qobject_p.h>
       
    65 #endif
       
    66 
    63 
    67 
    64 #include <math.h>
    68 #include <math.h>
    65 
    69 
    66 //TESTED_CLASS=
    70 //TESTED_CLASS=
    67 //TESTED_FILES=
    71 //TESTED_FILES=
   119     void qobjectConstCast();
   123     void qobjectConstCast();
   120     void uniqConnection();
   124     void uniqConnection();
   121     void interfaceIid();
   125     void interfaceIid();
   122     void deleteQObjectWhenDeletingEvent();
   126     void deleteQObjectWhenDeletingEvent();
   123     void overloads();
   127     void overloads();
       
   128     void isSignalConnected();
       
   129     void qMetaObjectConnect();
   124 protected:
   130 protected:
   125 };
   131 };
   126 
   132 
   127 tst_QObject::tst_QObject()
   133 tst_QObject::tst_QObject()
   128 {
   134 {
  3014     QCOMPARE(obj2.o2_obj, &obj3);
  3020     QCOMPARE(obj2.o2_obj, &obj3);
  3015     QCOMPARE(obj2.o3_obj, (QObject *)0); //default arg of the signal
  3021     QCOMPARE(obj2.o3_obj, (QObject *)0); //default arg of the signal
  3016     QCOMPARE(obj2.o4_obj, qApp); //default arg of the slot
  3022     QCOMPARE(obj2.o4_obj, qApp); //default arg of the slot
  3017 }
  3023 }
  3018 
  3024 
       
  3025 class ManySignals : public QObject
       
  3026 {   Q_OBJECT
       
  3027     friend class tst_QObject;
       
  3028 signals:
       
  3029     void sig00(); void sig01(); void sig02(); void sig03(); void sig04();
       
  3030     void sig05(); void sig06(); void sig07(); void sig08(); void sig09();
       
  3031     void sig10(); void sig11(); void sig12(); void sig13(); void sig14();
       
  3032     void sig15(); void sig16(); void sig17(); void sig18(); void sig19();
       
  3033     void sig20(); void sig21(); void sig22(); void sig23(); void sig24();
       
  3034     void sig25(); void sig26(); void sig27(); void sig28(); void sig29();
       
  3035     void sig30(); void sig31(); void sig32(); void sig33(); void sig34();
       
  3036     void sig35(); void sig36(); void sig37(); void sig38(); void sig39();
       
  3037     void sig40(); void sig41(); void sig42(); void sig43(); void sig44();
       
  3038     void sig45(); void sig46(); void sig47(); void sig48(); void sig49();
       
  3039     void sig50(); void sig51(); void sig52(); void sig53(); void sig54();
       
  3040     void sig55(); void sig56(); void sig57(); void sig58(); void sig59();
       
  3041     void sig60(); void sig61(); void sig62(); void sig63(); void sig64();
       
  3042     void sig65(); void sig66(); void sig67(); void sig68(); void sig69();
       
  3043 
       
  3044 public slots:
       
  3045     void received() { rec++; }
       
  3046 public:
       
  3047     int rec;
       
  3048 };
       
  3049 
       
  3050 
       
  3051 void tst_QObject::isSignalConnected()
       
  3052 {
       
  3053     ManySignals o;
       
  3054     o.rec = 0;
       
  3055 #ifdef QT_BUILD_INTERNAL
       
  3056     QObjectPrivate *priv = QObjectPrivate::get(&o);
       
  3057     QVERIFY(!priv->isSignalConnected(priv->signalIndex("destroyed()")));
       
  3058     QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig00()")));
       
  3059     QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig05()")));
       
  3060     QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig15()")));
       
  3061     QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig29()")));
       
  3062     QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig60()")));
       
  3063     QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig61()")));
       
  3064 #endif
       
  3065 
       
  3066     QObject::connect(&o, SIGNAL(sig00()), &o, SIGNAL(sig69()));
       
  3067     QObject::connect(&o, SIGNAL(sig34()), &o, SIGNAL(sig03()));
       
  3068     QObject::connect(&o, SIGNAL(sig69()), &o, SIGNAL(sig34()));
       
  3069     QObject::connect(&o, SIGNAL(sig03()), &o, SIGNAL(sig18()));
       
  3070 
       
  3071 #ifdef QT_BUILD_INTERNAL
       
  3072     QVERIFY(!priv->isSignalConnected(priv->signalIndex("destroyed()")));
       
  3073     QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig05()")));
       
  3074     QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig15()")));
       
  3075     QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig29()")));
       
  3076 
       
  3077     QVERIFY(priv->isSignalConnected(priv->signalIndex("sig00()")));
       
  3078     QVERIFY(priv->isSignalConnected(priv->signalIndex("sig03()")));
       
  3079     QVERIFY(priv->isSignalConnected(priv->signalIndex("sig34()")));
       
  3080     QVERIFY(priv->isSignalConnected(priv->signalIndex("sig69()")));
       
  3081     QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig18()")));
       
  3082 #endif
       
  3083 
       
  3084     QObject::connect(&o, SIGNAL(sig18()), &o, SIGNAL(sig29()));
       
  3085     QObject::connect(&o, SIGNAL(sig29()), &o, SIGNAL(sig62()));
       
  3086     QObject::connect(&o, SIGNAL(sig62()), &o, SIGNAL(sig28()));
       
  3087     QObject::connect(&o, SIGNAL(sig28()), &o, SIGNAL(sig27()));
       
  3088 
       
  3089 #ifdef QT_BUILD_INTERNAL
       
  3090     QVERIFY(priv->isSignalConnected(priv->signalIndex("sig18()")));
       
  3091     QVERIFY(priv->isSignalConnected(priv->signalIndex("sig62()")));
       
  3092     QVERIFY(priv->isSignalConnected(priv->signalIndex("sig28()")));
       
  3093     QVERIFY(priv->isSignalConnected(priv->signalIndex("sig69()")));
       
  3094     QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig27()")));
       
  3095 #endif
       
  3096 
       
  3097     QCOMPARE(o.rec, 0);
       
  3098     emit o.sig01();
       
  3099     emit o.sig34();
       
  3100     QCOMPARE(o.rec, 0);
       
  3101 
       
  3102     QObject::connect(&o, SIGNAL(sig27()), &o, SLOT(received()));
       
  3103 
       
  3104 #ifdef QT_BUILD_INTERNAL
       
  3105     QVERIFY(priv->isSignalConnected(priv->signalIndex("sig00()")));
       
  3106     QVERIFY(priv->isSignalConnected(priv->signalIndex("sig03()")));
       
  3107     QVERIFY(priv->isSignalConnected(priv->signalIndex("sig34()")));
       
  3108     QVERIFY(priv->isSignalConnected(priv->signalIndex("sig18()")));
       
  3109     QVERIFY(priv->isSignalConnected(priv->signalIndex("sig62()")));
       
  3110     QVERIFY(priv->isSignalConnected(priv->signalIndex("sig28()")));
       
  3111     QVERIFY(priv->isSignalConnected(priv->signalIndex("sig69()")));
       
  3112     QVERIFY(priv->isSignalConnected(priv->signalIndex("sig27()")));
       
  3113 
       
  3114     QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig04()")));
       
  3115     QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig21()")));
       
  3116     QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig25()")));
       
  3117     QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig55()")));
       
  3118     QVERIFY(!priv->isSignalConnected(priv->signalIndex("sig61()")));
       
  3119 #endif
       
  3120 
       
  3121     emit o.sig00();
       
  3122     QCOMPARE(o.rec, 1);
       
  3123     emit o.sig69();
       
  3124     QCOMPARE(o.rec, 2);
       
  3125     emit o.sig36();
       
  3126     QCOMPARE(o.rec, 2);
       
  3127 }
       
  3128 
       
  3129 void tst_QObject::qMetaObjectConnect()
       
  3130 {
       
  3131     SenderObject *s = new SenderObject;
       
  3132     ReceiverObject *r1 = new ReceiverObject;
       
  3133     ReceiverObject *r2 = new ReceiverObject;
       
  3134     r1->reset();
       
  3135     r2->reset();
       
  3136     ReceiverObject::sequence = 0;
       
  3137 
       
  3138     int signal1Index = s->metaObject()->indexOfSignal("signal1()");
       
  3139     int signal3Index = s->metaObject()->indexOfSignal("signal3()");
       
  3140     int slot1Index = r1->metaObject()->indexOfSlot("slot1()");
       
  3141     int slot2Index = r1->metaObject()->indexOfSlot("slot2()");
       
  3142     int slot3Index = r1->metaObject()->indexOfSlot("slot3()");
       
  3143 
       
  3144     QVERIFY(slot1Index > 0);
       
  3145     QVERIFY(slot2Index > 0);
       
  3146     QVERIFY(slot3Index > 0);
       
  3147 
       
  3148     QVERIFY( QMetaObject::connect( s, signal1Index, r1, slot1Index) );
       
  3149     QVERIFY( QMetaObject::connect( s, signal3Index, r2, slot3Index) );
       
  3150     QVERIFY( QMetaObject::connect( s, -1, r2, slot2Index) );
       
  3151 
       
  3152     QCOMPARE( r1->count_slot1, 0 );
       
  3153     QCOMPARE( r1->count_slot2, 0 );
       
  3154     QCOMPARE( r1->count_slot3, 0 );
       
  3155     QCOMPARE( r2->count_slot1, 0 );
       
  3156     QCOMPARE( r2->count_slot2, 0 );
       
  3157     QCOMPARE( r2->count_slot3, 0 );
       
  3158 
       
  3159     s->emitSignal1();
       
  3160 
       
  3161     QCOMPARE( r1->count_slot1, 1 );
       
  3162     QCOMPARE( r1->count_slot2, 0 );
       
  3163     QCOMPARE( r1->count_slot3, 0 );
       
  3164     QCOMPARE( r2->count_slot1, 0 );
       
  3165     QCOMPARE( r2->count_slot2, 1 );
       
  3166     QCOMPARE( r2->count_slot3, 0 );
       
  3167 
       
  3168     s->emitSignal2();
       
  3169     s->emitSignal3();
       
  3170     s->emitSignal4();
       
  3171 
       
  3172     QCOMPARE( r1->count_slot1, 1 );
       
  3173     QCOMPARE( r1->count_slot2, 0 );
       
  3174     QCOMPARE( r1->count_slot3, 0 );
       
  3175     QCOMPARE( r2->count_slot1, 0 );
       
  3176     QCOMPARE( r2->count_slot2, 4 );
       
  3177     QCOMPARE( r2->count_slot3, 1 );
       
  3178 
       
  3179     QVERIFY( QMetaObject::disconnect( s, signal1Index, r1, slot1Index) );
       
  3180     QVERIFY( QMetaObject::disconnect( s, signal3Index, r2, slot3Index) );
       
  3181     QVERIFY( QMetaObject::disconnect( s, -1, r2, slot2Index) );
       
  3182 
       
  3183     s->emitSignal1();
       
  3184     s->emitSignal2();
       
  3185     s->emitSignal3();
       
  3186     s->emitSignal4();
       
  3187 
       
  3188     QCOMPARE( r1->count_slot1, 1 );
       
  3189     QCOMPARE( r1->count_slot2, 0 );
       
  3190     QCOMPARE( r1->count_slot3, 0 );
       
  3191     QCOMPARE( r2->count_slot1, 0 );
       
  3192     QCOMPARE( r2->count_slot2, 4 );
       
  3193     QCOMPARE( r2->count_slot3, 1 );
       
  3194 
       
  3195     //some "dynamic" signal
       
  3196     QVERIFY( QMetaObject::connect( s, s->metaObject()->methodOffset() + 20, r1, slot3Index) );
       
  3197     QVERIFY( QMetaObject::connect( s, s->metaObject()->methodOffset() + 35, r2, slot1Index) );
       
  3198     QVERIFY( QMetaObject::connect( s, -1, r1, slot2Index) );
       
  3199 
       
  3200     r1->reset();
       
  3201     r2->reset();
       
  3202 
       
  3203     void *args[] = { 0 , 0 };
       
  3204     QMetaObject::activate(s, s->metaObject()->methodOffset() + 20, args);
       
  3205     QMetaObject::activate(s, s->metaObject()->methodOffset() + 48, args);
       
  3206     QCOMPARE( r1->count_slot1, 0 );
       
  3207     QCOMPARE( r1->count_slot2, 2 );
       
  3208     QCOMPARE( r1->count_slot3, 1 );
       
  3209     QCOMPARE( r2->count_slot1, 0 );
       
  3210     QCOMPARE( r2->count_slot2, 0 );
       
  3211     QCOMPARE( r2->count_slot3, 0 );
       
  3212 
       
  3213     QMetaObject::activate(s, s->metaObject()->methodOffset() + 35, args);
       
  3214     s->emitSignal1();
       
  3215     s->emitSignal2();
       
  3216 
       
  3217     QCOMPARE( r1->count_slot1, 0 );
       
  3218     QCOMPARE( r1->count_slot2, 5 );
       
  3219     QCOMPARE( r1->count_slot3, 1 );
       
  3220     QCOMPARE( r2->count_slot1, 1 );
       
  3221     QCOMPARE( r2->count_slot2, 0 );
       
  3222     QCOMPARE( r2->count_slot3, 0 );
       
  3223 
       
  3224     delete s;
       
  3225     r1->reset();
       
  3226     r2->reset();
       
  3227 
       
  3228 #define SIGNAL_INDEX(S)  obj1.metaObject()->indexOfSignal(QMetaObject::normalizedSignature(#S))
       
  3229     OverloadObject obj1;
       
  3230     QObject obj2, obj3;
       
  3231 
       
  3232     QMetaObject::connect(&obj1, SIGNAL_INDEX(sig(int)) , r1, slot1Index);
       
  3233     QMetaObject::connect(&obj1, SIGNAL_INDEX(sig(QObject *, QObject *, QObject *)) , r2, slot1Index);
       
  3234 
       
  3235     QMetaObject::connect(&obj1, SIGNAL_INDEX(sig(QObject *, QObject *, QObject *, QObject *)) , r1, slot2Index);
       
  3236     QMetaObject::connect(&obj1, SIGNAL_INDEX(sig(QObject *)) , r2, slot2Index);
       
  3237     QMetaObject::connect(&obj1, SIGNAL_INDEX(sig(int, int)) , r1, slot3Index);
       
  3238 
       
  3239     emit obj1.sig(0.5); //connected to nothing
       
  3240     emit obj1.sig(1, 'a'); //connected to nothing
       
  3241     QCOMPARE( r1->count_slot1, 0 );
       
  3242     QCOMPARE( r1->count_slot2, 0 );
       
  3243     QCOMPARE( r1->count_slot3, 0 );
       
  3244     QCOMPARE( r2->count_slot1, 0 );
       
  3245     QCOMPARE( r2->count_slot2, 0 );
       
  3246     QCOMPARE( r2->count_slot3, 0 );
       
  3247 
       
  3248     emit obj1.sig(1); //this signal is connected
       
  3249     emit obj1.sig(&obj2);
       
  3250 
       
  3251     QCOMPARE( r1->count_slot1, 1 );
       
  3252     QCOMPARE( r1->count_slot2, 0 );
       
  3253     QCOMPARE( r1->count_slot3, 1 );
       
  3254     QCOMPARE( r2->count_slot1, 0 );
       
  3255     QCOMPARE( r2->count_slot2, 1 );
       
  3256     QCOMPARE( r2->count_slot3, 0 );
       
  3257 
       
  3258     emit obj1.sig(&obj2, &obj3); //this signal is connected
       
  3259 
       
  3260     QCOMPARE( r1->count_slot1, 1 );
       
  3261     QCOMPARE( r1->count_slot2, 1 );
       
  3262     QCOMPARE( r1->count_slot3, 1 );
       
  3263     QCOMPARE( r2->count_slot1, 1 );
       
  3264     QCOMPARE( r2->count_slot2, 1 );
       
  3265     QCOMPARE( r2->count_slot3, 0 );
       
  3266 
       
  3267     delete r1;
       
  3268     delete r2;
       
  3269 
       
  3270 }
       
  3271 
  3019 QTEST_MAIN(tst_QObject)
  3272 QTEST_MAIN(tst_QObject)
  3020 #include "tst_qobject.moc"
  3273 #include "tst_qobject.moc"