Remove "All rights reserved" line from license headers.
[profile/ivi/qtdeclarative.git] / tests / auto / declarative / qdeclarativeecmascript / tst_qdeclarativeecmascript.cpp
index a9e3808..9c84405 100644 (file)
@@ -1,7 +1,6 @@
 /****************************************************************************
 **
 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
 ** Contact: http://www.qt-project.org/
 **
 ** This file is part of the test suite of the Qt Toolkit.
@@ -35,6 +34,7 @@
 **
 **
 **
+**
 ** $QT_END_LICENSE$
 **
 ****************************************************************************/
@@ -1219,12 +1219,15 @@ void tst_qdeclarativeecmascript::dynamicDestruction()
 
     QMetaObject::invokeMethod(object, "killOther");
     QVERIFY(createdQmlObject);
-    QCoreApplication::instance()->processEvents(QEventLoop::DeferredDeletion);
+
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+    QCoreApplication::processEvents();
     QVERIFY(createdQmlObject);
     for (int ii = 0; createdQmlObject && ii < 50; ++ii) { // After 5 seconds we should give up
         if (createdQmlObject) {
             QTest::qWait(100);
-            QCoreApplication::instance()->processEvents(QEventLoop::DeferredDeletion);
+            QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+            QCoreApplication::processEvents();
         }
     }
     QVERIFY(!createdQmlObject);
@@ -1232,8 +1235,8 @@ void tst_qdeclarativeecmascript::dynamicDestruction()
     QDeclarativeEngine::setObjectOwnership(object, QDeclarativeEngine::JavaScriptOwnership);
     QMetaObject::invokeMethod(object, "killMe");
     QVERIFY(object);
-    QTest::qWait(0);
-    QCoreApplication::instance()->processEvents(QEventLoop::DeferredDeletion);
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+    QCoreApplication::processEvents();
     QVERIFY(!object);
     }
 
@@ -1250,7 +1253,8 @@ void tst_qdeclarativeecmascript::dynamicDestruction()
 
     QMetaObject::invokeMethod(o, "destroy");
 
-    QCoreApplication::instance()->processEvents(QEventLoop::DeferredDeletion);
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+    QCoreApplication::processEvents();
 
     QVERIFY(qvariant_cast<QObject*>(o->property("objectProperty")) == 0);
 
@@ -1765,24 +1769,38 @@ void tst_qdeclarativeecmascript::dynamicCreationOwnership()
                 QMetaObject::invokeMethod(object, "performGc");
             }
             if (i % 10 == 0) {
-                QCoreApplication::processEvents(QEventLoop::DeferredDeletion);
+                QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+                QCoreApplication::processEvents();
             }
         }
 
         delete object;
     }
-    QCoreApplication::processEvents(QEventLoop::DeferredDeletion);
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+    QCoreApplication::processEvents();
     QCOMPARE(dtorCount, expectedDtorCount);
 }
 
-//QTBUG-9367
 void tst_qdeclarativeecmascript::regExpBug()
 {
-    QDeclarativeComponent component(&engine, testFileUrl("regExp.qml"));
-    MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
-    QVERIFY(object != 0);
-    QCOMPARE(object->regExp().pattern(), QLatin1String("[a-zA-z]"));
-    delete object;
+    //QTBUG-9367
+    {
+        QDeclarativeComponent component(&engine, testFileUrl("regExp.qml"));
+        MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
+        QVERIFY(object != 0);
+        QCOMPARE(object->regExp().pattern(), QLatin1String("[a-zA-z]"));
+        delete object;
+    }
+
+    //QTBUG-23068
+    {
+        QString err = QString(QLatin1String("%1:6 Invalid property assignment: regular expression expected; use /pattern/ syntax\n")).arg(testFileUrl("regExp.2.qml").toString());
+        QDeclarativeComponent component(&engine, testFileUrl("regExp.2.qml"));
+        QTest::ignoreMessage(QtWarningMsg, "QDeclarativeComponent: Component is not ready");
+        MyQmlObject *object = qobject_cast<MyQmlObject*>(component.create());
+        QVERIFY(!object);
+        QCOMPARE(component.errorString(), err);
+    }
 }
 
 static inline bool evaluate_error(QV8Engine *engine, v8::Handle<v8::Object> o, const char *source)
@@ -2612,7 +2630,8 @@ void tst_qdeclarativeecmascript::ownership()
 
         engine.collectGarbage();
 
-        QCoreApplication::processEvents(QEventLoop::DeferredDeletion);
+        QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+        QCoreApplication::processEvents();
 
         QVERIFY(own.object == 0);
 
@@ -2630,7 +2649,8 @@ void tst_qdeclarativeecmascript::ownership()
         
         engine.collectGarbage();
 
-        QCoreApplication::processEvents(QEventLoop::DeferredDeletion);
+        QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+        QCoreApplication::processEvents();
 
         QVERIFY(own.object != 0);
 
@@ -2685,7 +2705,8 @@ void tst_qdeclarativeecmascript::cppOwnershipReturnValue()
     delete object;
     }
 
-    QCoreApplication::instance()->processEvents(QEventLoop::DeferredDeletion);
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+    QCoreApplication::processEvents();
 
     QVERIFY(source.value != 0);
 }
@@ -2713,7 +2734,8 @@ void tst_qdeclarativeecmascript::ownershipCustomReturnValue()
     }
 
     engine.collectGarbage();
-    QCoreApplication::instance()->processEvents(QEventLoop::DeferredDeletion);
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+    QCoreApplication::processEvents();
 
     QVERIFY(source.value == 0);
 }
@@ -3750,7 +3772,8 @@ void tst_qdeclarativeecmascript::propertyVarCpp()
 static void gc(QDeclarativeEngine &engine)
 {
     engine.collectGarbage();
-    QCoreApplication::processEvents(QEventLoop::DeferredDeletion);
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+    QCoreApplication::processEvents();
 }
 
 void tst_qdeclarativeecmascript::propertyVarOwnership()
@@ -3829,7 +3852,8 @@ void tst_qdeclarativeecmascript::propertyVarImplicitOwnership()
     QObject *object = component.create();
     QVERIFY(object != 0);
     QMetaObject::invokeMethod(object, "assignCircular");
-    QCoreApplication::processEvents(QEventLoop::DeferredDeletion); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::processEvents();
     QObject *rootObject = object->property("vp").value<QObject*>();
     QVERIFY(rootObject != 0);
     QObject *childObject = rootObject->findChild<QObject*>("text");
@@ -3839,10 +3863,12 @@ void tst_qdeclarativeecmascript::propertyVarImplicitOwnership()
     QMetaObject::invokeMethod(childObject, "constructQObject");    // creates a reference to a constructed QObject.
     QWeakPointer<QObject> qobjectGuard(childObject->property("vp").value<QObject*>()); // get the pointer prior to processing deleteLater events.
     QVERIFY(!qobjectGuard.isNull());
-    QCoreApplication::processEvents(QEventLoop::DeferredDeletion); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::processEvents();
     QVERIFY(!qobjectGuard.isNull());
     QMetaObject::invokeMethod(object, "deassignCircular");
-    QCoreApplication::processEvents(QEventLoop::DeferredDeletion); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::processEvents();
     QVERIFY(qobjectGuard.isNull());                                // should have been collected now.
     delete object;
 }
@@ -3854,7 +3880,8 @@ void tst_qdeclarativeecmascript::propertyVarReparent()
     QObject *object = component.create();
     QVERIFY(object != 0);
     QMetaObject::invokeMethod(object, "assignVarProp");
-    QCoreApplication::processEvents(QEventLoop::DeferredDeletion); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::processEvents();
     QObject *rect = object->property("vp").value<QObject*>();
     QObject *text = rect->findChild<QObject*>("textOne");
     QObject *text2 = rect->findChild<QObject*>("textTwo");
@@ -3875,13 +3902,15 @@ void tst_qdeclarativeecmascript::propertyVarReparent()
     // now reparent the "Image" object (currently, it has JS ownership)
     image->setParent(text);                                        // shouldn't be collected after deassignVp now, since has a parent.
     QMetaObject::invokeMethod(text2, "deassignVp");
-    QCoreApplication::processEvents(QEventLoop::DeferredDeletion); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::processEvents();
     QCOMPARE(text->property("textCanary").toInt(), 11);
     QCOMPARE(text2->property("textCanary").toInt(), 22);
     QVERIFY(!imageGuard.isNull());                                 // should still be alive.
     QCOMPARE(image->property("imageCanary").toInt(), 13);          // still able to access var properties
     QMetaObject::invokeMethod(object, "deassignVarProp");          // now deassign the root-object's vp, causing gc of rect+text+text2
-    QCoreApplication::processEvents(QEventLoop::DeferredDeletion); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::processEvents();
     QVERIFY(imageGuard.isNull());                                  // should now have been deleted, due to parent being deleted.
     delete object;
 }
@@ -3895,7 +3924,8 @@ void tst_qdeclarativeecmascript::propertyVarReparentNullContext()
     QObject *object = component.create();
     QVERIFY(object != 0);
     QMetaObject::invokeMethod(object, "assignVarProp");
-    QCoreApplication::processEvents(QEventLoop::DeferredDeletion); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::processEvents();
     QObject *rect = object->property("vp").value<QObject*>();
     QObject *text = rect->findChild<QObject*>("textOne");
     QObject *text2 = rect->findChild<QObject*>("textTwo");
@@ -3916,7 +3946,8 @@ void tst_qdeclarativeecmascript::propertyVarReparentNullContext()
     // now reparent the "Image" object (currently, it has JS ownership)
     image->setParent(object);                                      // reparented to base object.  after deassignVarProp, the ctxt will be invalid.
     QMetaObject::invokeMethod(object, "deassignVarProp");          // now deassign the root-object's vp, causing gc of rect+text+text2
-    QCoreApplication::processEvents(QEventLoop::DeferredDeletion); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::processEvents();
     QVERIFY(!imageGuard.isNull());                                 // should still be alive.
     QVERIFY(!image->property("imageCanary").isValid());            // but varProperties won't be available (null context).
     delete object;
@@ -3930,17 +3961,20 @@ void tst_qdeclarativeecmascript::propertyVarCircular()
     QObject *object = component.create();
     QVERIFY(object != 0);
     QMetaObject::invokeMethod(object, "assignCircular");           // cause assignment and gc
-    QCoreApplication::processEvents(QEventLoop::DeferredDeletion); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::processEvents();
     QCOMPARE(object->property("canaryInt"), QVariant(5));
     QVariant canaryResourceVariant = object->property("canaryResource");
     QVERIFY(canaryResourceVariant.isValid());
     QPixmap canaryResourcePixmap = canaryResourceVariant.value<QPixmap>();
     canaryResourceVariant = QVariant();                            // invalidate it to remove one copy of the pixmap from memory.
     QMetaObject::invokeMethod(object, "deassignCanaryResource");   // remove one copy of the pixmap from memory
-    QCoreApplication::processEvents(QEventLoop::DeferredDeletion); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::processEvents();
     QVERIFY(!canaryResourcePixmap.isDetached());                   // two copies extant - this and the propertyVar.vp.vp.vp.vp.memoryHog.
     QMetaObject::invokeMethod(object, "deassignCircular");         // cause deassignment and gc
-    QCoreApplication::processEvents(QEventLoop::DeferredDeletion); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::processEvents();
     QCOMPARE(object->property("canaryInt"), QVariant(2));
     QCOMPARE(object->property("canaryResource"), QVariant(1));
     QVERIFY(canaryResourcePixmap.isDetached());                    // now detached, since orig copy was member of qdvmemo which was deleted.
@@ -3955,7 +3989,8 @@ void tst_qdeclarativeecmascript::propertyVarCircular2()
     QObject *object = component.create();
     QVERIFY(object != 0);
     QMetaObject::invokeMethod(object, "assignCircular");
-    QCoreApplication::processEvents(QEventLoop::DeferredDeletion); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::processEvents();
     QObject *rootObject = object->property("vp").value<QObject*>();
     QVERIFY(rootObject != 0);
     QObject *childObject = rootObject->findChild<QObject*>("text");
@@ -3968,7 +4003,8 @@ void tst_qdeclarativeecmascript::propertyVarCircular2()
     QCOMPARE(rootObject->property("rectCanary").toInt(), 5);
     QCOMPARE(childObject->property("textCanary").toInt(), 10);
     QMetaObject::invokeMethod(object, "deassignCircular");
-    QCoreApplication::processEvents(QEventLoop::DeferredDeletion); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::processEvents();
     QVERIFY(rootObjectTracker.isNull());                           // should have been collected
     QVERIFY(childObjectTracker.isNull());                          // should have been collected
     delete object;
@@ -3990,7 +4026,8 @@ void tst_qdeclarativeecmascript::propertyVarInheritance()
     QObject *object = component.create();
     QVERIFY(object != 0);
     QMetaObject::invokeMethod(object, "assignCircular");           // cause assignment and gc
-    QCoreApplication::processEvents(QEventLoop::DeferredDeletion); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::processEvents();
     // we want to be able to track when the varProperties array of the last metaobject is disposed
     QObject *cco5 = object->property("varProperty").value<QObject*>()->property("vp").value<QObject*>()->property("vp").value<QObject*>()->property("vp").value<QObject*>()->property("vp").value<QObject*>();
     QObject *ico5 = object->property("varProperty").value<QObject*>()->property("inheritanceVarProperty").value<QObject*>()->property("vp").value<QObject*>()->property("vp").value<QObject*>()->property("vp").value<QObject*>()->property("vp").value<QObject*>();
@@ -4013,7 +4050,8 @@ void tst_qdeclarativeecmascript::propertyVarInheritance()
     }
     // now we deassign the var prop, which should trigger collection of item subtrees.
     QMetaObject::invokeMethod(object, "deassignCircular");         // cause deassignment and gc
-    QCoreApplication::processEvents(QEventLoop::DeferredDeletion); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::processEvents();
     // ensure that there are only weak handles to the underlying varProperties array remaining.
     gc(engine);
     QCOMPARE(propertyVarWeakRefCallbackCount, 2);                  // should have been called for both, since all refs should be weak.
@@ -4032,7 +4070,8 @@ void tst_qdeclarativeecmascript::propertyVarInheritance2()
     QObject *object = component.create();
     QVERIFY(object != 0);
     QMetaObject::invokeMethod(object, "assignCircular");
-    QCoreApplication::processEvents(QEventLoop::DeferredDeletion); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::processEvents();
     QObject *rootObject = object->property("vp").value<QObject*>();
     QVERIFY(rootObject != 0);
     QObject *childObject = rootObject->findChild<QObject*>("text");
@@ -4051,7 +4090,8 @@ void tst_qdeclarativeecmascript::propertyVarInheritance2()
         QCOMPARE(childObject->property("textCanary").toInt(), 10);
     }
     QMetaObject::invokeMethod(object, "deassignCircular");
-    QCoreApplication::processEvents(QEventLoop::DeferredDeletion); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); // process deleteLater() events from QV8QObjectWrapper.
+    QCoreApplication::processEvents();
     QVERIFY(propertyVarWeakRefCallbackCount == 1);                 // should have been collected now.
     delete object;
 }
@@ -4136,7 +4176,8 @@ void tst_qdeclarativeecmascript::handleReferenceManagement()
         QCOMPARE(dtorCount, 0); // second has JS ownership, kept alive by first's reference
         delete object;
         hrmEngine.collectGarbage();
-        QCoreApplication::processEvents(QEventLoop::DeferredDeletion);
+        QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+        QCoreApplication::processEvents();
         QCOMPARE(dtorCount, 3);
     }
 
@@ -4155,7 +4196,8 @@ void tst_qdeclarativeecmascript::handleReferenceManagement()
         QCOMPARE(dtorCount, 2); // both should be cleaned up, since circular references shouldn't keep alive.
         delete object;
         hrmEngine.collectGarbage();
-        QCoreApplication::processEvents(QEventLoop::DeferredDeletion);
+        QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+        QCoreApplication::processEvents();
         QCOMPARE(dtorCount, 3);
     }
 
@@ -4183,7 +4225,8 @@ void tst_qdeclarativeecmascript::handleReferenceManagement()
         QCOMPARE(dtorCount, 0); // due to reference from first to second, second shouldn't be collected.
         delete object;
         hrmEngine.collectGarbage();
-        QCoreApplication::processEvents(QEventLoop::DeferredDeletion);
+        QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+        QCoreApplication::processEvents();
         QCOMPARE(dtorCount, 3);
     }
 
@@ -4214,7 +4257,8 @@ void tst_qdeclarativeecmascript::handleReferenceManagement()
         QCOMPARE(dtorCount, 2); // despite circular references, both will be collected.
         delete object;
         hrmEngine.collectGarbage();
-        QCoreApplication::processEvents(QEventLoop::DeferredDeletion);
+        QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+        QCoreApplication::processEvents();
         QCOMPARE(dtorCount, 3);
     }
 
@@ -4252,13 +4296,15 @@ void tst_qdeclarativeecmascript::handleReferenceManagement()
         second2->setParent(0);
         QDeclarativeEngine::setObjectOwnership(second2, QDeclarativeEngine::JavaScriptOwnership);
         gc(engine);
-        QCoreApplication::processEvents(QEventLoop::DeferredDeletion);
+        QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+        QCoreApplication::processEvents();
         QCOMPARE(dtorCount, 0); // due to reference from first1 to second2, second2 shouldn't be collected.
         delete object1;
         delete object2;
         hrmEngine1.collectGarbage();
         hrmEngine2.collectGarbage();
-        QCoreApplication::processEvents(QEventLoop::DeferredDeletion);
+        QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+        QCoreApplication::processEvents();
         QCOMPARE(dtorCount, 6);
     }
 
@@ -4305,13 +4351,15 @@ void tst_qdeclarativeecmascript::handleReferenceManagement()
         QDeclarativeEngine::setObjectOwnership(first2, QDeclarativeEngine::JavaScriptOwnership);
         QDeclarativeEngine::setObjectOwnership(second2, QDeclarativeEngine::JavaScriptOwnership);
         gc(engine);
-        QCoreApplication::processEvents(QEventLoop::DeferredDeletion);
+        QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+        QCoreApplication::processEvents();
         QCOMPARE(dtorCount, 4); // circular references shouldn't keep them alive.
         delete object1;
         delete object2;
         hrmEngine1.collectGarbage();
         hrmEngine2.collectGarbage();
-        QCoreApplication::processEvents(QEventLoop::DeferredDeletion);
+        QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+        QCoreApplication::processEvents();
         QCOMPARE(dtorCount, 6);
     }
 
@@ -4363,7 +4411,8 @@ void tst_qdeclarativeecmascript::handleReferenceManagement()
         delete object1;
         delete object2;
         hrmEngine1->collectGarbage();
-        QCoreApplication::processEvents(QEventLoop::DeferredDeletion);
+        QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+        QCoreApplication::processEvents();
         QCOMPARE(dtorCount, 6);
         delete hrmEngine1;
     }