Test metatype registration errors with non-metatypes.
[profile/ivi/qtdeclarative.git] / tests / auto / qml / qqmlecmascript / tst_qqmlecmascript.cpp
index 66ae27e..96c0ec1 100644 (file)
@@ -79,6 +79,7 @@ private slots:
     void boolPropertiesEvaluateAsBool();
     void methods();
     void signalAssignment();
+    void signalArguments();
     void bindingLoop();
     void basicExpressions();
     void basicExpressions_data();
@@ -150,8 +151,12 @@ private slots:
     void signalWithJSValueInVariant_twoEngines();
     void signalWithQJSValue_data();
     void signalWithQJSValue();
-    void moduleApi_data();
-    void moduleApi();
+    void singletonType_data();
+    void singletonType();
+    void singletonTypeCaching_data();
+    void singletonTypeCaching();
+    void singletonTypeImportOrder();
+    void singletonTypeResolution();
     void importScripts_data();
     void importScripts();
     void scarceResources();
@@ -186,6 +191,8 @@ private slots:
     void sequenceConversionBindings();
     void sequenceConversionCopy();
     void assignSequenceTypes();
+    void sequenceSort_data();
+    void sequenceSort();
     void qtbug_22464();
     void qtbug_21580();
     void singleV8BindingDestroyedDuringEvaluation();
@@ -274,6 +281,8 @@ private slots:
     void overrideDataAssert();
     void fallbackBindings_data();
     void fallbackBindings();
+    void propertyOverride();
+    void concatenatedStringPropertyAccess();
 
 private:
     static void propertyVarWeakRefCallback(v8::Persistent<v8::Value> object, void* parameter);
@@ -505,22 +514,42 @@ void tst_qqmlecmascript::signalAssignment()
 
     {
         QQmlComponent component(&engine, testFileUrl("signalAssignment.3.qml"));
+        QVERIFY(component.isError());
+        QString expectedErrorString = component.url().toString() + QLatin1String(":4 Signal uses unnamed parameter followed by named parameter.\n");
+        QCOMPARE(component.errorString(), expectedErrorString);
+    }
+
+    {
+        QQmlComponent component(&engine, testFileUrl("signalAssignment.4.qml"));
+        QVERIFY(component.isError());
+        QString expectedErrorString = component.url().toString() + QLatin1String(":5 Signal parameter \"parseInt\" hides global variable.\n");
+        QCOMPARE(component.errorString(), expectedErrorString);
+    }
+}
+
+void tst_qqmlecmascript::signalArguments()
+{
+    {
+        QQmlComponent component(&engine, testFileUrl("signalArguments.1.qml"));
         MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
         QVERIFY(object != 0);
         QCOMPARE(object->string(), QString());
-        emit object->unnamedArgumentSignal(19, 10.25, "Hello world!");
-        QEXPECT_FAIL("", "QTBUG-24481", Continue);
-        QCOMPARE(object->string(), QString("pass 19 Hello world!"));
+        emit object->basicSignal();
+        QCOMPARE(object->string(), QString("pass"));
+        QCOMPARE(object->property("argumentCount").toInt(), 0);
+        QCOMPARE(object->property("calleeCorrect").toBool(), true);
         delete object;
     }
 
     {
-        QQmlComponent component(&engine, testFileUrl("signalAssignment.4.qml"));
+        QQmlComponent component(&engine, testFileUrl("signalArguments.2.qml"));
         MyQmlObject *object = qobject_cast<MyQmlObject *>(component.create());
         QVERIFY(object != 0);
         QCOMPARE(object->string(), QString());
-        emit object->signalWithGlobalName(19);
-        QCOMPARE(object->string(), QString("pass 5"));
+        emit object->argumentSignal(19, "Hello world!", 10.25, MyQmlObject::EnumValue4, Qt::RightButton);
+        QCOMPARE(object->string(), QString("pass 19 Hello world! 10.25 3 2"));
+        QCOMPARE(object->property("argumentCount").toInt(), 5);
+        QCOMPARE(object->property("calleeCorrect").toBool(), true);
         delete object;
     }
 }
@@ -660,13 +689,13 @@ void tst_qqmlecmascript::arrayExpressions()
 
     MyExpression expr(&context, "[a, b, c, 10]");
     QVariant result = expr.evaluate();
-    QCOMPARE(result.userType(), qMetaTypeId<QList<QObject *> >());
-    QList<QObject *> list = qvariant_cast<QList<QObject *> >(result);
+    QCOMPARE(result.userType(), qMetaTypeId<QVariantList>());
+    QVariantList list = qvariant_cast<QVariantList>(result);
     QCOMPARE(list.count(), 4);
-    QCOMPARE(list.at(0), &obj1);
-    QCOMPARE(list.at(1), &obj2);
-    QCOMPARE(list.at(2), &obj3);
-    QCOMPARE(list.at(3), (QObject *)0);
+    QCOMPARE(list.at(0).value<QObject*>(), &obj1);
+    QCOMPARE(list.at(1).value<QObject*>(), &obj2);
+    QCOMPARE(list.at(2).value<QObject*>(), &obj3);
+    QCOMPARE(list.at(3).value<int>(), 10);
 }
 
 // Tests that modifying a context property will reevaluate expressions
@@ -1631,15 +1660,15 @@ void tst_qqmlecmascript::objectHasOwnProperty()
     QCOMPARE(child->property("enumTypeHasOwnProperty").toBool(), true);
     QCOMPARE(child->property("typenameHasOwnProperty").toBool(), true);
     QCOMPARE(child->property("typenameHasOwnProperty2").toBool(), true);
-    QCOMPARE(child->property("moduleApiTypeHasOwnProperty").toBool(), true);
-    QCOMPARE(child->property("moduleApiPropertyTypeHasOwnProperty").toBool(), true);
+    QCOMPARE(child->property("singletonTypeTypeHasOwnProperty").toBool(), true);
+    QCOMPARE(child->property("singletonTypePropertyTypeHasOwnProperty").toBool(), true);
 
     QTest::ignoreMessage(QtWarningMsg, warning1.toLatin1().constData());
     QMetaObject::invokeMethod(child, "testHasOwnPropertyFailureOne");
     QCOMPARE(child->property("enumNonValueHasOwnProperty").toBool(), false);
     QTest::ignoreMessage(QtWarningMsg, warning2.toLatin1().constData());
     QMetaObject::invokeMethod(child, "testHasOwnPropertyFailureTwo");
-    QCOMPARE(child->property("moduleApiNonPropertyHasOwnProperty").toBool(), false);
+    QCOMPARE(child->property("singletonTypeNonPropertyHasOwnProperty").toBool(), false);
     QTest::ignoreMessage(QtWarningMsg, warning3.toLatin1().constData());
     QMetaObject::invokeMethod(child, "testHasOwnPropertyFailureThree");
     QCOMPARE(child->property("listAtInvalidHasOwnProperty").toBool(), false);
@@ -2210,7 +2239,9 @@ static inline v8::Handle<v8::Value> evaluate(QV8Engine *engine, v8::Handle<v8::O
 
 void tst_qqmlecmascript::callQtInvokables()
 {
-    MyInvokableObject o;
+    // This object has JS ownership, as the call to method_NoArgs_QObject() in this test will return
+    // it, which will set the indestructible flag to false.
+    MyInvokableObject *o = new MyInvokableObject();
 
     QQmlEngine qmlengine;
     QQmlEnginePrivate *ep = QQmlEnginePrivate::get(&qmlengine);
@@ -2220,548 +2251,548 @@ void tst_qqmlecmascript::callQtInvokables()
     v8::HandleScope handle_scope;
     v8::Context::Scope scope(engine->context());
 
-    v8::Local<v8::Object> object = engine->newQObject(&o)->ToObject();
+    v8::Local<v8::Object> object = engine->newQObject(o)->ToObject();
 
     // Non-existent methods
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_ERROR("object.method_nonexistent()"));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), -1);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), -1);
+    QCOMPARE(o->actuals().count(), 0);
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_ERROR("object.method_nonexistent(10, 11)"));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), -1);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), -1);
+    QCOMPARE(o->actuals().count(), 0);
 
     // Insufficient arguments
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_ERROR("object.method_int()"));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), -1);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), -1);
+    QCOMPARE(o->actuals().count(), 0);
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_ERROR("object.method_intint(10)"));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), -1);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), -1);
+    QCOMPARE(o->actuals().count(), 0);
 
     // Excessive arguments
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_int(10, 11)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 8);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(10));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 8);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(10));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_intint(10, 11, 12)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 9);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(10));
-    QCOMPARE(o.actuals().at(1), QVariant(11));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 9);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(10));
+    QCOMPARE(o->actuals().at(1), QVariant(11));
 
     // Test return types
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_NoArgs()", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 0);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 0);
+    QCOMPARE(o->actuals().count(), 0);
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_NoArgs_int()", v8::Integer::New(6)));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 1);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 1);
+    QCOMPARE(o->actuals().count(), 0);
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_NoArgs_real()", v8::Number::New(19.75)));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 2);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 2);
+    QCOMPARE(o->actuals().count(), 0);
 
-    o.reset();
+    o->reset();
     {
     v8::Handle<v8::Value> ret = EVALUATE("object.method_NoArgs_QPointF()");
     QVERIFY(!ret.IsEmpty());
     QCOMPARE(engine->toVariant(ret, -1), QVariant(QPointF(123, 4.5)));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 3);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 3);
+    QCOMPARE(o->actuals().count(), 0);
     }
 
-    o.reset();
+    o->reset();
     {
     v8::Handle<v8::Value> ret = EVALUATE("object.method_NoArgs_QObject()");
-    QCOMPARE(engine->toQObject(ret), (QObject *)&o);
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 4);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(engine->toQObject(ret), (QObject *)o);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 4);
+    QCOMPARE(o->actuals().count(), 0);
     }
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_ERROR("object.method_NoArgs_unknown()"));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), -1);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), -1);
+    QCOMPARE(o->actuals().count(), 0);
 
-    o.reset();
+    o->reset();
     {
     v8::Handle<v8::Value> ret = EVALUATE("object.method_NoArgs_QScriptValue()");
     QVERIFY(ret->IsString());
     QCOMPARE(engine->toString(ret), QString("Hello world"));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 6);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 6);
+    QCOMPARE(o->actuals().count(), 0);
     }
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_NoArgs_QVariant()", engine->toString("QML rocks")));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 7);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 7);
+    QCOMPARE(o->actuals().count(), 0);
 
     // Test arg types
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_int(94)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 8);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(94));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 8);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(94));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_int(\"94\")", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 8);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(94));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 8);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(94));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_int(\"not a number\")", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 8);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(0));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 8);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(0));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_int(null)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 8);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(0));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 8);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(0));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_int(undefined)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 8);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(0));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 8);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(0));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_int(object)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 8);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(0));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 8);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(0));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_intint(122, 9)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 9);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(122));
-    QCOMPARE(o.actuals().at(1), QVariant(9));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 9);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(122));
+    QCOMPARE(o->actuals().at(1), QVariant(9));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_real(94.3)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 10);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(94.3));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 10);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(94.3));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_real(\"94.3\")", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 10);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(94.3));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 10);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(94.3));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_real(\"not a number\")", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 10);
-    QCOMPARE(o.actuals().count(), 1);
-    QVERIFY(qIsNaN(o.actuals().at(0).toDouble()));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 10);
+    QCOMPARE(o->actuals().count(), 1);
+    QVERIFY(qIsNaN(o->actuals().at(0).toDouble()));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_real(null)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 10);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(0));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 10);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(0));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_real(undefined)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 10);
-    QCOMPARE(o.actuals().count(), 1);
-    QVERIFY(qIsNaN(o.actuals().at(0).toDouble()));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 10);
+    QCOMPARE(o->actuals().count(), 1);
+    QVERIFY(qIsNaN(o->actuals().at(0).toDouble()));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_real(object)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 10);
-    QCOMPARE(o.actuals().count(), 1);
-    QVERIFY(qIsNaN(o.actuals().at(0).toDouble()));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 10);
+    QCOMPARE(o->actuals().count(), 1);
+    QVERIFY(qIsNaN(o->actuals().at(0).toDouble()));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QString(\"Hello world\")", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 11);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant("Hello world"));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 11);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant("Hello world"));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QString(19)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 11);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant("19"));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 11);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant("19"));
 
-    o.reset();
+    o->reset();
     {
-    QString expected = "MyInvokableObject(0x" + QString::number((quintptr)&o, 16) + ")";
+    QString expected = "MyInvokableObject(0x" + QString::number((quintptr)o, 16) + ")";
     QVERIFY(EVALUATE_VALUE("object.method_QString(object)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 11);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(expected));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 11);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(expected));
     }
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QString(null)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 11);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(QString()));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 11);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(QString()));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QString(undefined)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 11);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(QString()));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 11);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(QString()));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QPointF(0)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 12);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(QPointF()));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 12);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(QPointF()));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QPointF(null)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 12);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(QPointF()));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 12);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(QPointF()));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QPointF(undefined)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 12);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(QPointF()));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 12);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(QPointF()));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QPointF(object)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 12);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(QPointF()));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 12);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(QPointF()));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QPointF(object.method_get_QPointF())", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 12);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(QPointF(99.3, -10.2)));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 12);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(QPointF(99.3, -10.2)));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QPointF(object.method_get_QPoint())", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 12);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(QPointF(9, 12)));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 12);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(QPointF(9, 12)));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QObject(0)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 13);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), qVariantFromValue((QObject *)0));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 13);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), qVariantFromValue((QObject *)0));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QObject(\"Hello world\")", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 13);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), qVariantFromValue((QObject *)0));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 13);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), qVariantFromValue((QObject *)0));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QObject(null)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 13);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), qVariantFromValue((QObject *)0));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 13);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), qVariantFromValue((QObject *)0));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QObject(undefined)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 13);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), qVariantFromValue((QObject *)0));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 13);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), qVariantFromValue((QObject *)0));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QObject(object)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 13);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), qVariantFromValue((QObject *)&o));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 13);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), qVariantFromValue((QObject *)o));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QScriptValue(null)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 14);
-    QCOMPARE(o.actuals().count(), 1);
-    QVERIFY(qvariant_cast<QJSValue>(o.actuals().at(0)).isNull());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 14);
+    QCOMPARE(o->actuals().count(), 1);
+    QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(0)).isNull());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QScriptValue(undefined)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 14);
-    QCOMPARE(o.actuals().count(), 1);
-    QVERIFY(qvariant_cast<QJSValue>(o.actuals().at(0)).isUndefined());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 14);
+    QCOMPARE(o->actuals().count(), 1);
+    QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(0)).isUndefined());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QScriptValue(19)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 14);
-    QCOMPARE(o.actuals().count(), 1);
-    QVERIFY(qvariant_cast<QJSValue>(o.actuals().at(0)).strictlyEquals(QJSValue(19)));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 14);
+    QCOMPARE(o->actuals().count(), 1);
+    QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(0)).strictlyEquals(QJSValue(19)));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QScriptValue([19, 20])", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 14);
-    QCOMPARE(o.actuals().count(), 1);
-    QVERIFY(qvariant_cast<QJSValue>(o.actuals().at(0)).isArray());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 14);
+    QCOMPARE(o->actuals().count(), 1);
+    QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(0)).isArray());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_intQScriptValue(4, null)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 15);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(4));
-    QVERIFY(qvariant_cast<QJSValue>(o.actuals().at(1)).isNull());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 15);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(4));
+    QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(1)).isNull());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_intQScriptValue(8, undefined)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 15);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(8));
-    QVERIFY(qvariant_cast<QJSValue>(o.actuals().at(1)).isUndefined());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 15);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(8));
+    QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(1)).isUndefined());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_intQScriptValue(3, 19)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 15);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(3));
-    QVERIFY(qvariant_cast<QJSValue>(o.actuals().at(1)).strictlyEquals(QJSValue(19)));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 15);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(3));
+    QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(1)).strictlyEquals(QJSValue(19)));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_intQScriptValue(44, [19, 20])", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 15);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(44));
-    QVERIFY(qvariant_cast<QJSValue>(o.actuals().at(1)).isArray());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 15);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(44));
+    QVERIFY(qvariant_cast<QJSValue>(o->actuals().at(1)).isArray());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_ERROR("object.method_overload()"));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), -1);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), -1);
+    QCOMPARE(o->actuals().count(), 0);
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_overload(10)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 16);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(10));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 16);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(10));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_overload(10, 11)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 17);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(10));
-    QCOMPARE(o.actuals().at(1), QVariant(11));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 17);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(10));
+    QCOMPARE(o->actuals().at(1), QVariant(11));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_overload(\"Hello\")", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 18);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(QString("Hello")));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 18);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(QString("Hello")));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_with_enum(9)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 19);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(9));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 19);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(9));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_default(10)", v8::Integer::New(19)));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 20);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(10));
-    QCOMPARE(o.actuals().at(1), QVariant(19));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 20);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(10));
+    QCOMPARE(o->actuals().at(1), QVariant(19));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_default(10, 13)", v8::Integer::New(13)));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 20);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(10));
-    QCOMPARE(o.actuals().at(1), QVariant(13));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 20);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(10));
+    QCOMPARE(o->actuals().at(1), QVariant(13));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_inherited(9)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), -3);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(o.actuals().at(0), QVariant(9));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), -3);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(o->actuals().at(0), QVariant(9));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QVariant(9)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 21);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(9));
-    QCOMPARE(o.actuals().at(1), QVariant());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 21);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(9));
+    QCOMPARE(o->actuals().at(1), QVariant());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QVariant(\"Hello\", \"World\")", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 21);
-    QCOMPARE(o.actuals().count(), 2);
-    QCOMPARE(o.actuals().at(0), QVariant(QString("Hello")));
-    QCOMPARE(o.actuals().at(1), QVariant(QString("World")));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 21);
+    QCOMPARE(o->actuals().count(), 2);
+    QCOMPARE(o->actuals().at(0), QVariant(QString("Hello")));
+    QCOMPARE(o->actuals().at(1), QVariant(QString("World")));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QJsonObject({foo:123})", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 22);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonObject>(o.actuals().at(0)), QJsonDocument::fromJson("{\"foo\":123}").object());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 22);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonObject>(o->actuals().at(0)), QJsonDocument::fromJson("{\"foo\":123}").object());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QJsonArray([123])", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 23);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonArray>(o.actuals().at(0)), QJsonDocument::fromJson("[123]").array());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 23);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonArray>(o->actuals().at(0)), QJsonDocument::fromJson("[123]").array());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(123)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 24);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonValue>(o.actuals().at(0)), QJsonValue(123));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 24);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(123));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(42.35)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 24);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonValue>(o.actuals().at(0)), QJsonValue(42.35));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 24);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(42.35));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QJsonValue('ciao')", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 24);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonValue>(o.actuals().at(0)), QJsonValue(QStringLiteral("ciao")));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 24);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(QStringLiteral("ciao")));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(true)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 24);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonValue>(o.actuals().at(0)), QJsonValue(true));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 24);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(true));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(false)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 24);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonValue>(o.actuals().at(0)), QJsonValue(false));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 24);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(false));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(null)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 24);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonValue>(o.actuals().at(0)), QJsonValue(QJsonValue::Null));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 24);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(QJsonValue::Null));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_QJsonValue(undefined)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 24);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonValue>(o.actuals().at(0)), QJsonValue(QJsonValue::Undefined));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 24);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(QJsonValue::Undefined));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_overload({foo:123})", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 25);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonObject>(o.actuals().at(0)), QJsonDocument::fromJson("{\"foo\":123}").object());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 25);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonObject>(o->actuals().at(0)), QJsonDocument::fromJson("{\"foo\":123}").object());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_overload([123])", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 26);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonArray>(o.actuals().at(0)), QJsonDocument::fromJson("[123]").array());
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 26);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonArray>(o->actuals().at(0)), QJsonDocument::fromJson("[123]").array());
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_overload(null)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 27);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonValue>(o.actuals().at(0)), QJsonValue(QJsonValue::Null));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 27);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(QJsonValue::Null));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_VALUE("object.method_overload(undefined)", v8::Undefined()));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), 27);
-    QCOMPARE(o.actuals().count(), 1);
-    QCOMPARE(qvariant_cast<QJsonValue>(o.actuals().at(0)), QJsonValue(QJsonValue::Undefined));
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), 27);
+    QCOMPARE(o->actuals().count(), 1);
+    QCOMPARE(qvariant_cast<QJsonValue>(o->actuals().at(0)), QJsonValue(QJsonValue::Undefined));
 
-    o.reset();
+    o->reset();
     QVERIFY(EVALUATE_ERROR("object.method_unknown(null)"));
-    QCOMPARE(o.error(), false);
-    QCOMPARE(o.invoked(), -1);
-    QCOMPARE(o.actuals().count(), 0);
+    QCOMPARE(o->error(), false);
+    QCOMPARE(o->invoked(), -1);
+    QCOMPARE(o->actuals().count(), 0);
 }
 
 // QTBUG-13047 (check that you can pass registered object types as args)
@@ -3425,6 +3456,11 @@ void tst_qqmlecmascript::signalWithUnknownTypes()
 
     QCOMPARE(result.value, type.value);
 
+    MyQmlObject::MyOtherType othertype;
+    othertype.value = 17;
+    emit object->signalWithCompletelyUnknownType(othertype);
+
+    QVERIFY(!object->variant().isValid());
 
     delete object;
 }
@@ -3526,7 +3562,7 @@ void tst_qqmlecmascript::signalWithQJSValue()
     QVERIFY(object->qjsvalue().strictlyEquals(value));
 }
 
-void tst_qqmlecmascript::moduleApi_data()
+void tst_qqmlecmascript::singletonType_data()
 {
     QTest::addColumn<QUrl>("testfile");
     QTest::addColumn<QString>("errorMessage");
@@ -3538,20 +3574,19 @@ void tst_qqmlecmascript::moduleApi_data()
     QTest::addColumn<QStringList>("readBackProperties");
     QTest::addColumn<QVariantList>("readBackExpectedValues");
 
-    QTest::newRow("qobject, register + read + method")
-            << testFileUrl("moduleapi/qobjectModuleApi.qml")
+    QTest::newRow("qobject, register + read + method [no qualifier]")
+            << testFileUrl("singletontype/qobjectSingletonTypeNoQualifier.qml")
             << QString()
             << QStringList()
-            << (QStringList() << "existingUriTest" << "qobjectTest" << "qobjectMethodTest"
-                   << "qobjectMinorVersionTest" << "qobjectMajorVersionTest" << "qobjectParentedTest")
-            << (QVariantList() << 20 << 20 << 1 << 20 << 20 << 26)
+            << (QStringList() << "qobjectPropertyTest" << "qobjectMethodTest")
+            << (QVariantList() << 20 << 1)
             << QStringList()
             << QVariantList()
             << QStringList()
             << QVariantList();
 
-    QTest::newRow("script, register + read")
-            << testFileUrl("moduleapi/scriptModuleApi.qml")
+    QTest::newRow("script, register + read [no qualifier]")
+            << testFileUrl("singletontype/scriptSingletonTypeNoQualifier.qml")
             << QString()
             << QStringList()
             << (QStringList() << "scriptTest")
@@ -3561,32 +3596,34 @@ void tst_qqmlecmascript::moduleApi_data()
             << QStringList()
             << QVariantList();
 
-    QTest::newRow("qobject, caching + read")
-            << testFileUrl("moduleapi/qobjectModuleApiCaching.qml")
+    QTest::newRow("qobject, register + read + method")
+            << testFileUrl("singletontype/qobjectSingletonType.qml")
             << QString()
             << QStringList()
-            << (QStringList() << "existingUriTest" << "qobjectParentedTest")
-            << (QVariantList() << 20 << 26) // 26, shouldn't have incremented to 27.
+            << (QStringList() << "existingUriTest" << "qobjectTest" << "qobjectMethodTest"
+                   << "qobjectMinorVersionMethodTest" << "qobjectMinorVersionTest"
+                   << "qobjectMajorVersionTest" << "qobjectParentedTest")
+            << (QVariantList() << 20 << 20 << 2 << 1 << 20 << 20 << 26)
             << QStringList()
             << QVariantList()
             << QStringList()
             << QVariantList();
 
-    QTest::newRow("script, caching + read")
-            << testFileUrl("moduleapi/scriptModuleApiCaching.qml")
+    QTest::newRow("script, register + read")
+            << testFileUrl("singletontype/scriptSingletonType.qml")
             << QString()
             << QStringList()
             << (QStringList() << "scriptTest")
-            << (QVariantList() << 13) // 13, shouldn't have incremented to 14.
+            << (QVariantList() << 14) // will have incremented, since we create a new engine each row in this test.
             << QStringList()
             << QVariantList()
             << QStringList()
             << QVariantList();
 
     QTest::newRow("qobject, writing + readonly constraints")
-            << testFileUrl("moduleapi/qobjectModuleApiWriting.qml")
+            << testFileUrl("singletontype/qobjectSingletonTypeWriting.qml")
             << QString()
-            << (QStringList() << QString(testFileUrl("moduleapi/qobjectModuleApiWriting.qml").toString() + QLatin1String(":15: Error: Cannot assign to read-only property \"qobjectTestProperty\"")))
+            << (QStringList() << QString(testFileUrl("singletontype/qobjectSingletonTypeWriting.qml").toString() + QLatin1String(":15: Error: Cannot assign to read-only property \"qobjectTestProperty\"")))
             << (QStringList() << "readOnlyProperty" << "writableProperty" << "writableFinalProperty")
             << (QVariantList() << 20 << 50 << 10)
             << (QStringList() << "firstProperty" << "secondProperty")
@@ -3595,18 +3632,18 @@ void tst_qqmlecmascript::moduleApi_data()
             << (QVariantList() << 20 << 30 << 30);
 
     QTest::newRow("script, writing + readonly constraints")
-            << testFileUrl("moduleapi/scriptModuleApiWriting.qml")
+            << testFileUrl("singletontype/scriptSingletonTypeWriting.qml")
             << QString()
-            << (QStringList() << QString(testFileUrl("moduleapi/scriptModuleApiWriting.qml").toString() + QLatin1String(":21: Error: Cannot assign to read-only property \"scriptTestProperty\"")))
+            << (QStringList() << QString(testFileUrl("singletontype/scriptSingletonTypeWriting.qml").toString() + QLatin1String(":21: Error: Cannot assign to read-only property \"scriptTestProperty\"")))
             << (QStringList() << "readBack" << "unchanged")
-            << (QVariantList() << 13 << 42)
+            << (QVariantList() << 15 << 42)
             << (QStringList() << "firstProperty" << "secondProperty")
             << (QVariantList() << 30 << 30)
             << (QStringList() << "readBack" << "unchanged")
             << (QVariantList() << 30 << 42);
 
-    QTest::newRow("qobject module API enum values in JS")
-            << testFileUrl("moduleapi/qobjectModuleApiEnums.qml")
+    QTest::newRow("qobject singleton Type enum values in JS")
+            << testFileUrl("singletontype/qobjectSingletonTypeEnums.qml")
             << QString()
             << QStringList()
             << (QStringList() << "enumValue" << "enumMethod")
@@ -3617,7 +3654,7 @@ void tst_qqmlecmascript::moduleApi_data()
             << QVariantList();
 
     QTest::newRow("qobject, invalid major version fail")
-            << testFileUrl("moduleapi/moduleApiMajorVersionFail.qml")
+            << testFileUrl("singletontype/singletonTypeMajorVersionFail.qml")
             << QString("QQmlComponent: Component is not ready")
             << QStringList()
             << QStringList()
@@ -3628,7 +3665,7 @@ void tst_qqmlecmascript::moduleApi_data()
             << QVariantList();
 
     QTest::newRow("qobject, invalid minor version fail")
-            << testFileUrl("moduleapi/moduleApiMinorVersionFail.qml")
+            << testFileUrl("singletontype/singletonTypeMinorVersionFail.qml")
             << QString("QQmlComponent: Component is not ready")
             << QStringList()
             << QStringList()
@@ -3637,9 +3674,20 @@ void tst_qqmlecmascript::moduleApi_data()
             << QVariantList()
             << QStringList()
             << QVariantList();
+
+    QTest::newRow("qobject, multiple in namespace")
+            << testFileUrl("singletontype/singletonTypeMultiple.qml")
+            << QString()
+            << QStringList()
+            << (QStringList() << "first" << "second")
+            << (QVariantList() << 35 << 42)
+            << QStringList()
+            << QVariantList()
+            << QStringList()
+            << QVariantList();
 }
 
-void tst_qqmlecmascript::moduleApi()
+void tst_qqmlecmascript::singletonType()
 {
     QFETCH(QUrl, testfile);
     QFETCH(QString, errorMessage);
@@ -3651,7 +3699,8 @@ void tst_qqmlecmascript::moduleApi()
     QFETCH(QStringList, readBackProperties);
     QFETCH(QVariantList, readBackExpectedValues);
 
-    QQmlComponent component(&engine, testfile);
+    QQmlEngine cleanEngine; // so tests don't interfere which each other, as singleton types are engine-singletons only.
+    QQmlComponent component(&cleanEngine, testfile);
 
     if (!errorMessage.isEmpty())
         QTest::ignoreMessage(QtWarningMsg, errorMessage.toLatin1().constData());
@@ -3675,6 +3724,63 @@ void tst_qqmlecmascript::moduleApi()
     }
 }
 
+void tst_qqmlecmascript::singletonTypeCaching_data()
+{
+    QTest::addColumn<QUrl>("testfile");
+    QTest::addColumn<QStringList>("readProperties");
+
+    QTest::newRow("qobject, caching + read")
+            << testFileUrl("singletontype/qobjectSingletonTypeCaching.qml")
+            << (QStringList() << "existingUriTest" << "qobjectParentedTest");
+
+    QTest::newRow("script, caching + read")
+            << testFileUrl("singletontype/scriptSingletonTypeCaching.qml")
+            << (QStringList() << "scriptTest");
+}
+
+void tst_qqmlecmascript::singletonTypeCaching()
+{
+    QFETCH(QUrl, testfile);
+    QFETCH(QStringList, readProperties);
+
+    // ensure that the singleton type instances are cached per-engine.
+
+    QQmlEngine cleanEngine;
+    QQmlComponent component(&cleanEngine, testfile);
+    QObject *object = component.create();
+    QVERIFY(object != 0);
+    QList<QVariant> firstValues;
+    QMetaObject::invokeMethod(object, "modifyValues");
+    for (int i = 0; i < readProperties.size(); ++i)
+        firstValues << object->property(readProperties.at(i).toLatin1().constData());
+    delete object;
+
+    QQmlComponent component2(&cleanEngine, testfile);
+    QObject *object2 = component2.create();
+    QVERIFY(object2 != 0);
+    for (int i = 0; i < readProperties.size(); ++i)
+        QCOMPARE(object2->property(readProperties.at(i).toLatin1().constData()), firstValues.at(i)); // cached, shouldn't have changed.
+    delete object2;
+}
+
+void tst_qqmlecmascript::singletonTypeImportOrder()
+{
+    QQmlComponent component(&engine, testFileUrl("singletontype/singletonTypeImportOrder.qml"));
+    QObject *object = component.create();
+    QVERIFY(object);
+    QVERIFY(object->property("v") == 1);
+    delete object;
+}
+
+void tst_qqmlecmascript::singletonTypeResolution()
+{
+    QQmlComponent component(&engine, testFileUrl("singletontype/singletonTypeResolution.qml"));
+    QObject *object = component.create();
+    QVERIFY(object);
+    QVERIFY(object->property("success") == true);
+    delete object;
+}
+
 void tst_qqmlecmascript::importScripts_data()
 {
     QTest::addColumn<QUrl>("testfile");
@@ -3766,8 +3872,8 @@ void tst_qqmlecmascript::importScripts_data()
             << (QStringList() << QLatin1String("testValue"))
             << (QVariantList() << QVariant(18));
 
-    QTest::newRow("import module api into js import")
-            << testFileUrl("jsimport/testImportModuleApi.qml")
+    QTest::newRow("import singleton type into js import")
+            << testFileUrl("jsimport/testImportSingletonType.qml")
             << QString()
             << QStringList()
             << (QStringList() << QLatin1String("testValue"))
@@ -3784,6 +3890,17 @@ void tst_qqmlecmascript::importScripts_data()
                                << QVariant(QString("Hello"))
                                << QVariant(QString("Hello")));
 
+    QTest::newRow("import module which exports a script which imports a remote module")
+            << testFileUrl("jsimport/testJsRemoteImport.qml")
+            << QString()
+            << QStringList()
+            << (QStringList() << QLatin1String("importedScriptStringValue")
+                              << QLatin1String("renamedScriptStringValue")
+                              << QLatin1String("reimportedScriptStringValue"))
+            << (QVariantList() << QVariant(QString("Hello"))
+                               << QVariant(QString("Hello"))
+                               << QVariant(QString("Hello")));
+
     QTest::newRow("malformed import statement")
             << testFileUrl("jsimportfail/malformedImport.qml")
             << QString()
@@ -3794,70 +3911,70 @@ void tst_qqmlecmascript::importScripts_data()
     QTest::newRow("malformed file name")
             << testFileUrl("jsimportfail/malformedFile.qml")
             << QString()
-            << (QStringList() << testFileUrl("jsimportfail/malformedFile.js").toString() + QLatin1String(":0:1: Imported file must be a script"))
+            << (QStringList() << testFileUrl("jsimportfail/malformedFile.js").toString() + QLatin1String(":1:9: Imported file must be a script"))
             << QStringList()
             << QVariantList();
 
     QTest::newRow("missing file qualifier")
             << testFileUrl("jsimportfail/missingFileQualifier.qml")
             << QString()
-            << (QStringList() << testFileUrl("jsimportfail/missingFileQualifier.js").toString() + QLatin1String(":0:1: File import requires a qualifier"))
+            << (QStringList() << testFileUrl("jsimportfail/missingFileQualifier.js").toString() + QLatin1String(":1:1: File import requires a qualifier"))
             << QStringList()
             << QVariantList();
 
     QTest::newRow("malformed file qualifier")
             << testFileUrl("jsimportfail/malformedFileQualifier.qml")
             << QString()
-            << (QStringList() << testFileUrl("jsimportfail/malformedFileQualifier.js").toString() + QLatin1String(":0:1: File import requires a qualifier"))
+            << (QStringList() << testFileUrl("jsimportfail/malformedFileQualifier.js").toString() + QLatin1String(":1:20: File import requires a qualifier"))
             << QStringList()
             << QVariantList();
 
     QTest::newRow("malformed module qualifier 2")
             << testFileUrl("jsimportfail/malformedFileQualifier.2.qml")
             << QString()
-            << (QStringList() << testFileUrl("jsimportfail/malformedFileQualifier.2.js").toString() + QLatin1String(":0:1: Invalid import qualifier"))
+            << (QStringList() << testFileUrl("jsimportfail/malformedFileQualifier.2.js").toString() + QLatin1String(":1:1: Invalid import qualifier"))
             << QStringList()
             << QVariantList();
 
     QTest::newRow("malformed module uri")
             << testFileUrl("jsimportfail/malformedModule.qml")
             << QString()
-            << (QStringList() << testFileUrl("jsimportfail/malformedModule.js").toString() + QLatin1String(":0:1: Invalid module URI"))
+            << (QStringList() << testFileUrl("jsimportfail/malformedModule.js").toString() + QLatin1String(":1:17: Invalid module URI"))
             << QStringList()
             << QVariantList();
 
     QTest::newRow("missing module version")
             << testFileUrl("jsimportfail/missingModuleVersion.qml")
             << QString()
-            << (QStringList() << testFileUrl("jsimportfail/missingModuleVersion.js").toString() + QLatin1String(":0:1: Module import requires a version"))
+            << (QStringList() << testFileUrl("jsimportfail/missingModuleVersion.js").toString() + QLatin1String(":1:17: Module import requires a version"))
             << QStringList()
             << QVariantList();
 
     QTest::newRow("malformed module version")
             << testFileUrl("jsimportfail/malformedModuleVersion.qml")
             << QString()
-            << (QStringList() << testFileUrl("jsimportfail/malformedModuleVersion.js").toString() + QLatin1String(":0:1: Module import requires a version"))
+            << (QStringList() << testFileUrl("jsimportfail/malformedModuleVersion.js").toString() + QLatin1String(":1:17: Module import requires a version"))
             << QStringList()
             << QVariantList();
 
     QTest::newRow("missing module qualifier")
             << testFileUrl("jsimportfail/missingModuleQualifier.qml")
             << QString()
-            << (QStringList() << testFileUrl("jsimportfail/missingModuleQualifier.js").toString() + QLatin1String(":0:1: Module import requires a qualifier"))
+            << (QStringList() << testFileUrl("jsimportfail/missingModuleQualifier.js").toString() + QLatin1String(":1:1: Module import requires a qualifier"))
             << QStringList()
             << QVariantList();
 
     QTest::newRow("malformed module qualifier")
             << testFileUrl("jsimportfail/malformedModuleQualifier.qml")
             << QString()
-            << (QStringList() << testFileUrl("jsimportfail/malformedModuleQualifier.js").toString() + QLatin1String(":0:1: Module import requires a qualifier"))
+            << (QStringList() << testFileUrl("jsimportfail/malformedModuleQualifier.js").toString() + QLatin1String(":1:21: Module import requires a qualifier"))
             << QStringList()
             << QVariantList();
 
     QTest::newRow("malformed module qualifier 2")
             << testFileUrl("jsimportfail/malformedModuleQualifier.2.qml")
             << QString()
-            << (QStringList() << testFileUrl("jsimportfail/malformedModuleQualifier.2.js").toString() + QLatin1String(":0:1: Invalid import qualifier"))
+            << (QStringList() << testFileUrl("jsimportfail/malformedModuleQualifier.2.js").toString() + QLatin1String(":1:1: Invalid import qualifier"))
             << QStringList()
             << QVariantList();
 }
@@ -3870,6 +3987,15 @@ void tst_qqmlecmascript::importScripts()
     QFETCH(QStringList, propertyNames);
     QFETCH(QVariantList, propertyValues);
 
+    TestHTTPServer server(8111);
+    QVERIFY(server.isValid());
+    server.serveDirectory(dataDirectory() + "/remote");
+
+    QStringList importPathList = engine.importPathList();
+
+    QString remotePath(QLatin1String("http://127.0.0.1:8111/"));
+    engine.addImportPath(remotePath);
+
     QQmlComponent component(&engine, testfile);
 
     if (!errorMessage.isEmpty())
@@ -3879,6 +4005,8 @@ void tst_qqmlecmascript::importScripts()
         foreach (const QString &warning, warningMessages)
             QTest::ignoreMessage(QtWarningMsg, warning.toLatin1().constData());
 
+    QTRY_VERIFY(component.isReady());
+
     QObject *object = component.create();
     if (!errorMessage.isEmpty()) {
         QVERIFY(object == 0);
@@ -3888,6 +4016,8 @@ void tst_qqmlecmascript::importScripts()
             QCOMPARE(object->property(propertyNames.at(i).toLatin1().constData()), propertyValues.at(i));
         delete object;
     }
+
+    engine.setImportPathList(importPathList);
 }
 
 void tst_qqmlecmascript::scarceResources_other()
@@ -5252,19 +5382,19 @@ void tst_qqmlecmascript::sequenceConversionRead()
         MySequenceConversionObject *seq = object->findChild<MySequenceConversionObject*>("msco");
         QVERIFY(seq != 0);
 
-        // we haven't registered QList<QPoint> as a sequence type.
-        QString warningOne = QLatin1String("QMetaProperty::read: Unable to handle unregistered datatype 'QList<QPoint>' for property 'MySequenceConversionObject::pointListProperty'");
+        // we haven't registered QList<NonRegisteredType> as a sequence type.
+        QString warningOne = QLatin1String("QMetaProperty::read: Unable to handle unregistered datatype 'QList<NonRegisteredType>' for property 'MySequenceConversionObject::typeListProperty'");
         QString warningTwo = qmlFile.toString() + QLatin1String(":18: TypeError: Cannot read property 'length' of undefined");
         QTest::ignoreMessage(QtWarningMsg, warningOne.toLatin1().constData());
         QTest::ignoreMessage(QtWarningMsg, warningTwo.toLatin1().constData());
 
         QMetaObject::invokeMethod(object, "performTest");
 
-        // QList<QPoint> has not been registered as a sequence type.
+        // QList<NonRegisteredType> has not been registered as a sequence type.
         QCOMPARE(object->property("pointListLength").toInt(), 0);
         QVERIFY(!object->property("pointList").isValid());
-        QTest::ignoreMessage(QtWarningMsg, "QMetaProperty::read: Unable to handle unregistered datatype 'QList<QPoint>' for property 'MySequenceConversionObject::pointListProperty'");
-        QQmlProperty seqProp(seq, "pointListProperty", &engine);
+        QTest::ignoreMessage(QtWarningMsg, "QMetaProperty::read: Unable to handle unregistered datatype 'QList<NonRegisteredType>' for property 'MySequenceConversionObject::typeListProperty'");
+        QQmlProperty seqProp(seq, "typeListProperty", &engine);
         QVERIFY(!seqProp.read().isValid()); // not a valid/known sequence type
 
         delete object;
@@ -5433,6 +5563,10 @@ void tst_qqmlecmascript::sequenceConversionCopy()
     QCOMPARE(object->property("success").toBool(), true);
     QMetaObject::invokeMethod(object, "testEqualitySemantics");
     QCOMPARE(object->property("success").toBool(), true);
+    QMetaObject::invokeMethod(object, "testCopyParameters");
+    QCOMPARE(object->property("success").toBool(), true);
+    QMetaObject::invokeMethod(object, "testReferenceParameters");
+    QCOMPARE(object->property("success").toBool(), true);
     delete object;
 }
 
@@ -7081,10 +7215,12 @@ void tst_qqmlecmascript::fallbackBindings_data()
 
     QTest::newRow("Property without fallback") << "fallbackBindings.1.qml";
     QTest::newRow("Property fallback") << "fallbackBindings.2.qml";
-    QTest::newRow("ModuleAPI without fallback") << "fallbackBindings.3.qml";
-    QTest::newRow("ModuleAPI fallback") << "fallbackBindings.4.qml";
+    QTest::newRow("SingletonType without fallback") << "fallbackBindings.3.qml";
+    QTest::newRow("SingletonType fallback") << "fallbackBindings.4.qml";
     QTest::newRow("Attached without fallback") << "fallbackBindings.5.qml";
     QTest::newRow("Attached fallback") << "fallbackBindings.6.qml";
+    QTest::newRow("Subproperty without fallback") << "fallbackBindings.7.qml";
+    QTest::newRow("Subproperty fallback") << "fallbackBindings.8.qml";
 }
 
 void tst_qqmlecmascript::fallbackBindings()
@@ -7098,6 +7234,66 @@ void tst_qqmlecmascript::fallbackBindings()
     QCOMPARE(object->property("success").toBool(), true);
 }
 
+void tst_qqmlecmascript::propertyOverride()
+{
+    QQmlComponent component(&engine, testFileUrl("propertyOverride.qml"));
+    QScopedPointer<QObject> object(component.create());
+    QVERIFY(object != 0);
+
+    QCOMPARE(object->property("success").toBool(), true);
+}
+
+void tst_qqmlecmascript::sequenceSort_data()
+{
+    QTest::addColumn<QString>("function");
+    QTest::addColumn<bool>("useComparer");
+
+    QTest::newRow("qtbug_25269") << "test_qtbug_25269" << false;
+
+    const char *types[] = { "alphabet", "numbers", "reals" };
+    const char *sort[] = { "insertionSort", "quickSort" };
+
+    for (size_t t=0 ; t < sizeof(types)/sizeof(types[0]) ; ++t) {
+        for (size_t s=0 ; s < sizeof(sort)/sizeof(sort[0]) ; ++s) {
+            for (int c=0 ; c < 2 ; ++c) {
+                QString testName = QLatin1String(types[t]) + QLatin1String("_") + QLatin1String(sort[s]);
+                QString fnName = QLatin1String("test_") + testName;
+                bool useComparer = c != 0;
+                testName += useComparer ? QLatin1String("[custom]") : QLatin1String("[default]");
+                QTest::newRow(testName.toAscii().constData()) << fnName << useComparer;
+            }
+        }
+    }
+}
+
+void tst_qqmlecmascript::sequenceSort()
+{
+    QFETCH(QString, function);
+    QFETCH(bool, useComparer);
+
+    QQmlComponent component(&engine, testFileUrl("sequenceSort.qml"));
+
+    QObject *object = component.create();
+    if (object == 0)
+        qDebug() << component.errorString();
+    QVERIFY(object != 0);
+
+    QVariant q;
+    QMetaObject::invokeMethod(object, function.toAscii().constData(), Q_RETURN_ARG(QVariant, q), Q_ARG(QVariant, useComparer));
+    QVERIFY(q.toBool() == true);
+
+    delete object;
+}
+
+void tst_qqmlecmascript::concatenatedStringPropertyAccess()
+{
+    QQmlComponent component(&engine, testFileUrl("concatenatedStringPropertyAccess.qml"));
+    QObject *object = component.create();
+    QVERIFY(object);
+    QVERIFY(object->property("success").toBool());
+    delete object;
+}
+
 QTEST_MAIN(tst_qqmlecmascript)
 
 #include "tst_qqmlecmascript.moc"