Clean up QJSEngine tests.
authorMitch Curtis <mitch.curtis@nokia.com>
Tue, 29 May 2012 07:40:58 +0000 (09:40 +0200)
committerQt by Nokia <qt-info@nokia.com>
Thu, 31 May 2012 08:40:03 +0000 (10:40 +0200)
Change-Id: Ia778f07a79c3354b639e25dbd847c0ff643b5418
Reviewed-by: Kent Hansen <kent.hansen@nokia.com>

tests/auto/qml/qjsengine/tst_qjsengine.cpp

index b0be3be..98db3b1 100644 (file)
@@ -84,148 +84,44 @@ public:
 
 private slots:
     void constructWithParent();
-#if 0 // FIXME: no QScriptContext
-    void currentContext();
-    void pushPopContext();
-#endif
-#if 0 // FIXME: No prototype API in QScriptEngine
-    void getSetDefaultPrototype_int();
-    void getSetDefaultPrototype_customType();
-#endif
-#if 0 // FIXME: no QScriptContext
-    void newFunction();
-    void newFunctionWithArg();
-    void newFunctionWithProto();
-#endif
     void newObject();
     void newArray();
     void newArray_HooliganTask218092();
     void newArray_HooliganTask233836();
     void newVariant();
-#if 0 // FIXME: No prototype API in QScriptEngine
-    void newVariant_defaultPrototype();
-#endif
-#if 0 // ###FIXME: No QVariant object promotion API
-    void newVariant_promoteObject();
-    void newVariant_replaceValue();
-#endif
     void newVariant_valueOfToString();
-#if 0 // ###FIXME: No QVariant object promotion API
-    void newVariant_promoteNonObject();
-    void newVariant_promoteNonQScriptObject();
-#endif
     void newRegExp();
     void jsRegExp();
     void newDate();
     void jsParseDate();
     void newQObject();
     void newQObject_ownership();
-    void newQObject_promoteObject();
-    void newQObject_sameQObject();
-#if 0 // FIXME: No prototype API in QScriptEngine
-    void newQObject_defaultPrototype();
-#endif
-    void newQObject_promoteNonObject();
-    void newQObject_promoteNonQScriptObject();
     void newQObject_deletedEngine();
-#if 0 // ### FIXME: No QScript Metaobject support right now
-    void newQMetaObject();
-    void newActivationObject();
-#endif
-#if 0 // ###FIXME: No setGlobalObject support - yay
-    void getSetGlobalObjectSimple();
-    void getSetGlobalObject();
-#endif
     void globalObjectProperties();
     void globalObjectEquals();
     void globalObjectProperties_enumerate();
     void createGlobalObjectProperty();
-    void globalObjectGetterSetterProperty();
-#if 0 // ###FIXME: No support for setting the global object
-    void customGlobalObjectWithPrototype();
-#endif
     void globalObjectWithCustomPrototype();
     void builtinFunctionNames_data();
     void builtinFunctionNames();
-#if 0 // ###FIXME: No syntax checking result
-    void checkSyntax_data();
-    void checkSyntax();
-#endif
-#if 0 // ###FIXME: No support for canEvaluate
-    void canEvaluate_data();
-    void canEvaluate();
-#endif
     void evaluate_data();
     void evaluate();
-#if 0 // ###FIXME: no support for c-style callbacks
-    void nestedEvaluate();
-#endif
-#if 0 // ### FIXME: No c-style callbacks
-    void uncaughtException();
-#endif
     void errorMessage_QT679();
     void valueConversion_basic();
-#if 0 // FIXME: No API for custom types
-    void valueConversion_customType();
-    void valueConversion_sequence();
-#endif
     void valueConversion_QVariant();
-#if 0 // FIXME: No support for custom types
-    void valueConversion_hooliganTask248802();
-#endif
     void valueConversion_basic2();
     void valueConversion_dateTime();
     void valueConversion_regExp();
-#if 0 // FIXME: No qScriptValueFromValue
-    void qScriptValueFromValue_noEngine();
-#endif
-#if 0 // ###FIXME: No QScriptContext
-    void importExtension();
-    void infiniteRecursion();
-#endif
-#if 0 // FIXME: No support for default prototypes
-    void castWithPrototypeChain();
-#endif
     void castWithMultipleInheritance();
     void collectGarbage();
-#if 0 // ###FIXME: no reportAdditionalMemoryCost API
-    void reportAdditionalMemoryCost();
-#endif
     void gcWithNestedDataStructure();
-#if 0 // ###FIXME: No processEvents handling
-    void processEventsWhileRunning();
-    void processEventsWhileRunning_function();
-    void throwErrorFromProcessEvents_data();
-    void throwErrorFromProcessEvents();
-    void disableProcessEventsInterval();
-#endif
     void stacktrace();
     void numberParsing_data();
     void numberParsing();
     void automaticSemicolonInsertion();
-#if 0 // ###FIXME: no abortEvaluation API
-    void abortEvaluation_notEvaluating();
-    void abortEvaluation_data();
-    void abortEvaluation();
-    void abortEvaluation_tryCatch();
-    void abortEvaluation_fromNative();
-    void abortEvaluation_QTBUG9433();
-#endif
-#if 0 // ###FIXME: no QScriptEngine::isEvaluating
-    void isEvaluating_notEvaluating();
-    void isEvaluating_fromNative();
-    void isEvaluating_fromEvent();
-#endif
-#if 0 // ###FIXME: depracated
-    void printFunctionWithCustomHandler();
-    void printThrowsException();
-#endif
     void errorConstructors();
     void argumentsProperty_globalContext();
     void argumentsProperty_JS();
-#if 0 // ###FIXME: no QScriptContext API
-    void argumentsProperty_evaluateInNativeFunction();
-#endif
     void jsNumberClass();
     void jsForInStatement_simple();
     void jsForInStatement_prototypeProperties();
@@ -238,9 +134,6 @@ private slots:
     void getterSetterThisObject_global();
     void getterSetterThisObject_plain();
     void getterSetterThisObject_prototypeChain();
-#if 0 // ###FIXME: no QScriptContext API
-    void getterSetterThisObject_activation();
-#endif
     void jsContinueInSwitch();
     void jsShadowReadOnlyPrototypeProperty();
     void jsReservedWords_data();
@@ -248,75 +141,13 @@ private slots:
     void jsFutureReservedWords_data();
     void jsFutureReservedWords();
     void jsThrowInsideWithStatement();
-#if 0 // ###FIXME: No QScriptEngineAgent API
-    void getSetAgent_ownership();
-    void getSetAgent_deleteAgent();
-    void getSetAgent_differentEngine();
-#endif
-#if 0 // ###FIXME: No QScriptString API
-    void reentrancy_stringHandles();
-#endif
-#if 0 // ###FIXME: No processEventsInterval API
-    void reentrancy_processEventsInterval();
-#endif
-#if 0 // FIXME: No support for custom types
-    void reentrancy_typeConversion();
-#endif
     void reentrancy_globalObjectProperties();
     void reentrancy_Array();
     void reentrancy_objectCreation();
     void jsIncDecNonObjectProperty();
-#if 0 // ###FIXME: no installTranslatorFunctions API
-    void installTranslatorFunctions();
-    void translateScript_data();
-    void translateScript();
-    void translateScript_crossScript();
-    void translateScript_callQsTrFromNative();
-    void translateScript_trNoOp();
-    void translateScript_callQsTrFromCpp();
-    void translateWithInvalidArgs_data();
-    void translateWithInvalidArgs();
-    void translationContext_data();
-    void translationContext();
-    void translateScriptIdBased();
-    void translateScriptUnicode_data();
-    void translateScriptUnicode();
-    void translateScriptUnicodeIdBased_data();
-    void translateScriptUnicodeIdBased();
-    void translateFromBuiltinCallback();
-#endif
-#if 0 // ###FIXME: No QScriptValue::scope API
-    void functionScopes();
-#endif
-#if 0 // ###FIXME: No QScriptContext API
-    void nativeFunctionScopes();
-#endif
-#if 0 // ###FIXME: No QScriptProgram API
-    void evaluateProgram();
-    void evaluateProgram_customScope();
-    void evaluateProgram_closure();
-    void evaluateProgram_executeLater();
-    void evaluateProgram_multipleEngines();
-    void evaluateProgram_empty();
-#endif
-#if 0 // ###FIXME: No QScriptContext API
-    void collectGarbageAfterConnect();
-    void collectGarbageAfterNativeArguments();
-    void promoteThisObjectToQObjectInConstructor();
-#endif
-#if 0 // ###FIXME: No QScript MetaObject API
-    void scriptValueFromQMetaObject();
-#endif
 
     void qRegExpInport_data();
     void qRegExpInport();
-#if 0 // ###FIXME: No QScriptContext API
-    void reentrency();
-#endif
-#if 0 // ###FIXME: No QSCriptDeclarativeClass API
-    void newFixedStaticScopeObject();
-    void newGrowingStaticScopeObject();
-#endif
     void dateRoundtripJSQtJS();
     void dateRoundtripQtJSQt();
     void dateConversionJSQt();
@@ -348,231 +179,6 @@ void tst_QJSEngine::constructWithParent()
     QVERIFY(ptr == 0);
 }
 
-#if 0 // FIXME: no QScriptContext
-void tst_QJSEngine::currentContext()
-{
-    QScriptEngine eng;
-    QScriptContext *globalCtx = eng.currentContext();
-    QVERIFY(globalCtx != 0);
-    QVERIFY(globalCtx->parentContext() == 0);
-    QCOMPARE(globalCtx->engine(), &eng);
-    QCOMPARE(globalCtx->argumentCount(), 0);
-    QCOMPARE(globalCtx->backtrace().size(), 1);
-    QVERIFY(!globalCtx->isCalledAsConstructor());
-    QVERIFY(globalCtx->callee().isUndefined());
-    QCOMPARE(globalCtx->state(), QScriptContext::NormalState);
-    QVERIFY(globalCtx->thisObject().strictlyEquals(eng.globalObject()));
-    QVERIFY(globalCtx->activationObject().strictlyEquals(eng.globalObject()));
-    QVERIFY(globalCtx->argumentsObject().isObject());
-}
-
-void tst_QJSEngine::pushPopContext()
-{
-    QScriptEngine eng;
-    QScriptContext *globalCtx = eng.currentContext();
-    QScriptContext *ctx = eng.pushContext();
-    QVERIFY(ctx != 0);
-    QCOMPARE(ctx->parentContext(), globalCtx);
-    QVERIFY(!ctx->isCalledAsConstructor());
-    QVERIFY(ctx->callee().isUndefined());
-    QVERIFY(ctx->thisObject().strictlyEquals(eng.globalObject()));
-    QCOMPARE(ctx->argumentCount(), 0);
-    QCOMPARE(ctx->backtrace().size(), 2);
-    QCOMPARE(ctx->engine(), &eng);
-    QCOMPARE(ctx->state(), QScriptContext::NormalState);
-    QVERIFY(ctx->activationObject().isObject());
-    QVERIFY(ctx->argumentsObject().isObject());
-
-    QScriptContext *ctx2 = eng.pushContext();
-    QVERIFY(ctx2 != 0);
-    QCOMPARE(ctx2->parentContext(), ctx);
-    QVERIFY(!ctx2->activationObject().strictlyEquals(ctx->activationObject()));
-    QVERIFY(!ctx2->argumentsObject().strictlyEquals(ctx->argumentsObject()));
-
-    eng.popContext();
-    eng.popContext();
-    QTest::ignoreMessage(QtWarningMsg, "QScriptEngine::popContext() doesn't match with pushContext()");
-    eng.popContext(); // ignored
-    QTest::ignoreMessage(QtWarningMsg, "QScriptEngine::popContext() doesn't match with pushContext()");
-    eng.popContext(); // ignored
-}
-
-static QScriptValue myFunction(QScriptContext *, QScriptEngine *eng)
-{
-    return eng->nullValue();
-}
-
-static QScriptValue myFunctionWithVoidArg(QScriptContext *, QScriptEngine *eng, void *)
-{
-    return eng->nullValue();
-}
-
-static QScriptValue myThrowingFunction(QScriptContext *ctx, QScriptEngine *)
-{
-    return ctx->throwError("foo");
-}
-
-static QScriptValue myFunctionThatReturns(QScriptContext *, QScriptEngine *eng)
-{
-    return QScriptValue(eng, 42);
-}
-
-static QScriptValue myFunctionThatReturnsWithoutEngine(QScriptContext *, QScriptEngine *)
-{
-    return QScriptValue(1024);
-}
-
-static QScriptValue myFunctionThatReturnsWrongEngine(QScriptContext *, QScriptEngine *, void *arg)
-{
-    QScriptEngine* wrongEngine = reinterpret_cast<QScriptEngine*>(arg);
-    return QScriptValue(wrongEngine, 42);
-}
-
-static QScriptValue sumFunction(QScriptContext *context, QScriptEngine *engine)
-{
-    int sum = 0;
-
-    for (int i = 0; i < context->argumentCount(); i++) {
-        QScriptValue n = context->argument(i);
-        if (n.isNumber())
-            sum += n.toInteger();
-    }
-
-    return QScriptValue(engine, sum);
-}
-
-void tst_QJSEngine::newFunction()
-{
-    QScriptEngine eng;
-    {
-        QScriptValue fun = eng.newFunction(myFunction);
-        QVERIFY(!fun.isUndefined());
-        QCOMPARE(fun.isCallable(), true);
-        QCOMPARE(fun.isObject(), true);
-        QCOMPARE(fun.scriptClass(), (QScriptClass*)0);
-        // a prototype property is automatically constructed
-        {
-            QScriptValue prot = fun.property("prototype", QScriptValue::ResolveLocal);
-            QVERIFY(prot.isObject());
-            QVERIFY(prot.property("constructor").strictlyEquals(fun));
-        }
-        // prototype should be Function.prototype
-        QVERIFY(!fun.prototype().isUndefined());
-        QCOMPARE(fun.prototype().isCallable(), true);
-        QCOMPARE(fun.prototype().strictlyEquals(eng.evaluate("Function.prototype")), true);
-
-        QCOMPARE(fun.call().isNull(), true);
-        QCOMPARE(fun.callAsConstructor().isObject(), true);
-    }
-}
-
-void tst_QJSEngine::newFunctionWithArg()
-{
-    QScriptEngine eng;
-    {
-        QScriptValue fun = eng.newFunction(myFunctionWithVoidArg, (void*)this);
-        QVERIFY(fun.isCallable());
-        QCOMPARE(fun.scriptClass(), (QScriptClass*)0);
-        // a prototype property is automatically constructed
-        {
-            QScriptValue prot = fun.property("prototype", QScriptValue::ResolveLocal);
-            QVERIFY(prot.isObject());
-            QVERIFY(prot.property("constructor").strictlyEquals(fun));
-        }
-        // prototype should be Function.prototype
-        QVERIFY(!fun.prototype().isUndefined());
-        QCOMPARE(fun.prototype().isCallable(), true);
-        QCOMPARE(fun.prototype().strictlyEquals(eng.evaluate("Function.prototype")), true);
-
-        QCOMPARE(fun.call().isNull(), true);
-        QCOMPARE(fun.callAsConstructor().isObject(), true);
-    }
-}
-
-void tst_QJSEngine::newFunctionWithProto()
-{
-    QScriptEngine eng;
-    {
-        QScriptValue proto = eng.newObject();
-        QScriptValue fun = eng.newFunction(myFunction, proto);
-        QVERIFY(!fun.isUndefined());
-        QCOMPARE(fun.isCallable(), true);
-        QCOMPARE(fun.isObject(), true);
-        // internal prototype should be Function.prototype
-        QVERIFY(!fun.prototype().isUndefined());
-        QCOMPARE(fun.prototype().isCallable(), true);
-        QCOMPARE(fun.prototype().strictlyEquals(eng.evaluate("Function.prototype")), true);
-        // public prototype should be the one we passed
-        QCOMPARE(fun.property("prototype").strictlyEquals(proto), true);
-        QCOMPARE(proto.property("constructor").strictlyEquals(fun), true);
-
-        QCOMPARE(fun.call().isNull(), true);
-        QCOMPARE(fun.callAsConstructor().isObject(), true);
-    }
-    // whether the return value is correct
-    {
-        QScriptValue fun = eng.newFunction(myFunctionThatReturns);
-        QVERIFY(!fun.isUndefined());
-        QCOMPARE(fun.isCallable(), true);
-        QCOMPARE(fun.isObject(), true);
-
-        QScriptValue result = fun.call();
-        QCOMPARE(result.isNumber(), true);
-        QCOMPARE(result.toInt(), 42);
-    }
-    // whether the return value is assigned to the correct engine
-    {
-        QScriptValue fun = eng.newFunction(myFunctionThatReturnsWithoutEngine);
-        QVERIFY(!fun.isUndefined());
-        QCOMPARE(fun.isCallable(), true);
-        QCOMPARE(fun.isObject(), true);
-
-        QScriptValue result = fun.call();
-        QCOMPARE(result.engine(), &eng);
-        QCOMPARE(result.isNumber(), true);
-        QCOMPARE(result.toInt(), 1024);
-    }
-    // whether the return value is undefined when returning a value with wrong engine
-    {
-        QScriptEngine wrongEngine;
-
-        QScriptValue fun = eng.newFunction(myFunctionThatReturnsWrongEngine, reinterpret_cast<void *>(&wrongEngine));
-        QVERIFY(!fun.isUndefined());
-        QCOMPARE(fun.isCallable(), true);
-        QCOMPARE(fun.isObject(), true);
-
-        QTest::ignoreMessage(QtWarningMsg, "QScriptValue::call(): Value from different engine returned from native function, returning undefined value instead.");
-        QScriptValue result = fun.call();
-        QCOMPARE(result.isUndefined(), true);
-    }
-    // checking if arguments are passed correctly
-    {
-        QScriptEngine wrongEngine;
-
-        QScriptValue fun = eng.newFunction(sumFunction);
-        QVERIFY(!fun.isUndefined());
-        QCOMPARE(fun.isCallable(), true);
-        QCOMPARE(fun.isObject(), true);
-
-        QScriptValue result = fun.call();
-        QCOMPARE(result.isNumber(), true);
-        QCOMPARE(result.toInt(), 0);
-
-        result = fun.call(QScriptValue(), QScriptValueList() << 1);
-        QCOMPARE(result.isNumber(), true);
-        QCOMPARE(result.toInt(), 1);
-
-        result = fun.call(QScriptValue(), QScriptValueList() << 1 << 2 << 3);
-        QCOMPARE(result.isNumber(), true);
-        QCOMPARE(result.toInt(), 6);
-
-        result = fun.call(QScriptValue(), QScriptValueList() << 1 << 2 << 3 << 4);
-        QCOMPARE(result.isNumber(), true);
-        QCOMPARE(result.toInt(), 10);
-    }
-}
-#endif
-
 void tst_QJSEngine::newObject()
 {
     QJSEngine eng;
@@ -580,7 +186,6 @@ void tst_QJSEngine::newObject()
     QVERIFY(!object.isUndefined());
     QCOMPARE(object.isObject(), true);
     QCOMPARE(object.isCallable(), false);
-// ###FIXME: No QScriptClass    QCOMPARE(object.scriptClass(), (QScriptClass*)0);
     // prototype should be Object.prototype
     QVERIFY(!object.prototype().isUndefined());
     QCOMPARE(object.prototype().isObject(), true);
@@ -595,7 +200,6 @@ void tst_QJSEngine::newArray()
     QCOMPARE(array.isArray(), true);
     QCOMPARE(array.isObject(), true);
     QVERIFY(!array.isCallable());
-// ###FIXME: No QScriptClass    QCOMPARE(array.scriptClass(), (QScriptClass*)0);
     // prototype should be Array.prototype
     QVERIFY(!array.prototype().isUndefined());
     QCOMPARE(array.prototype().isArray(), true);
@@ -671,67 +275,6 @@ void tst_QJSEngine::newVariant()
     }
 }
 
-#if 0 // FIXME: No prototype API in QScriptEngine
-void tst_QJSEngine::newVariant_defaultPrototype()
-{
-    // default prototype should be set automatically
-    QScriptEngine eng;
-    {
-        QScriptValue proto = eng.newObject();
-        eng.setDefaultPrototype(qMetaTypeId<QString>(), proto);
-        QScriptValue ret = eng.newVariant(QVariant(QString::fromLatin1("hello")));
-        QVERIFY(ret.isVariant());
-// ###FIXME: No QScriptClass        QCOMPARE(ret.scriptClass(), (QScriptClass*)0);
-        QVERIFY(ret.prototype().strictlyEquals(proto));
-        eng.setDefaultPrototype(qMetaTypeId<QString>(), QScriptValue());
-        QScriptValue ret2 = eng.newVariant(QVariant(QString::fromLatin1("hello")));
-        QVERIFY(ret2.isVariant());
-        QVERIFY(!ret2.prototype().strictlyEquals(proto));
-    }
-}
-#endif
-
-#if 0 // ###FIXME: No QVariant object promotion API
-void tst_QJSEngine::newVariant_promoteObject()
-{
-    // "promote" plain object to variant
-    QScriptEngine eng;
-    {
-        QScriptValue object = eng.newObject();
-        object.setProperty("foo", eng.newObject());
-        object.setProperty("bar", object.property("foo"));
-        QVERIFY(object.property("foo").isObject());
-        QVERIFY(!object.property("foo").isVariant());
-        QScriptValue originalProto = object.property("foo").prototype();
-        QSKIP("It is not possible to promote plain object to a wrapper");
-        QScriptValue ret = eng.newVariant(object.property("foo"), QVariant(123));
-        QVERIFY(ret.isObject());
-        QVERIFY(ret.strictlyEquals(object.property("foo")));
-        QVERIFY(ret.isVariant());
-        QVERIFY(object.property("foo").isVariant());
-        QVERIFY(object.property("bar").isVariant());
-        QCOMPARE(ret.toVariant(), QVariant(123));
-        QVERIFY(ret.prototype().strictlyEquals(originalProto));
-    }
-}
-
-void tst_QJSEngine::newVariant_replaceValue()
-{
-    // replace value of existing object
-    QScriptEngine eng;
-    {
-        QScriptValue object = eng.newVariant(QVariant(123));
-        for (int x = 0; x < 2; ++x) {
-            QScriptValue ret = eng.newVariant(object, QVariant(456));
-            QVERIFY(!ret.isUndefined());
-            QVERIFY(ret.strictlyEquals(object));
-            QVERIFY(ret.isVariant());
-            QCOMPARE(ret.toVariant(), QVariant(456));
-        }
-    }
-}
-#endif
-
 void tst_QJSEngine::newVariant_valueOfToString()
 {
     // valueOf() and toString()
@@ -745,30 +288,6 @@ void tst_QJSEngine::newVariant_valueOfToString()
     }
 }
 
-#if 0 // ###FIXME: No QVariant object promotion API
-void tst_QJSEngine::newVariant_promoteNonObject()
-{
-    QScriptEngine eng;
-    {
-        QVariant var(456);
-        QScriptValue ret = eng.newVariant(123, var);
-        QVERIFY(ret.isVariant());
-        QCOMPARE(ret.toVariant(), var);
-    }
-}
-
-void tst_QJSEngine::newVariant_promoteNonQScriptObject()
-{
-    QSKIP("This test relay on limitation of QtScript JSC implementation");
-    QScriptEngine eng;
-    {
-        QTest::ignoreMessage(QtWarningMsg, "QScriptEngine::newVariant(): changing class of non-QScriptObject not supported");
-        QScriptValue ret = eng.newVariant(eng.newArray(), 123);
-        QVERIFY(ret.isUndefined());
-    }
-}
-#endif
-
 void tst_QJSEngine::newRegExp()
 {
     QSKIP("Test failing - QTBUG-22238");
@@ -930,7 +449,6 @@ void tst_QJSEngine::newQObject()
         QCOMPARE(qobject.prototype().isObject(), true);
         QEXPECT_FAIL("", "FIXME: newly created QObject's prototype is an JS Object", Continue);
         QCOMPARE(qobject.prototype().isQObject(), true);
-// ###FIXME: No QScriptClass        QCOMPARE(qobject.scriptClass(), (QScriptClass*)0);
     }
 }
 
@@ -993,145 +511,6 @@ void tst_QJSEngine::newQObject_ownership()
     }
 }
 
-void tst_QJSEngine::newQObject_promoteObject()
-{
-#if 0 // ### FIXME: object promotion is not supported
-    QScriptEngine eng;
-    // "promote" plain object to QObject
-    {
-        QScriptValue obj = eng.newObject();
-        QScriptValue originalProto = obj.prototype();
-        QScriptValue ret = eng.newQObject(obj, this);
-        QVERIFY(!ret.isUndefined());
-        QVERIFY(ret.isQObject());
-        QVERIFY(ret.strictlyEquals(obj));
-        QVERIFY(obj.isQObject());
-        QCOMPARE(ret.toQObject(), (QObject *)this);
-        QVERIFY(ret.prototype().strictlyEquals(originalProto));
-        QScriptValue val = ret.property("objectName");
-        QVERIFY(val.isString());
-    }
-    // "promote" variant object to QObject
-    {
-        QScriptValue obj = eng.newVariant(123);
-        QVERIFY(obj.isVariant());
-        QScriptValue originalProto = obj.prototype();
-        QScriptValue ret = eng.newQObject(obj, this);
-        QVERIFY(ret.isQObject());
-        QVERIFY(ret.strictlyEquals(obj));
-        QVERIFY(obj.isQObject());
-        QCOMPARE(ret.toQObject(), (QObject *)this);
-        QVERIFY(ret.prototype().strictlyEquals(originalProto));
-    }
-    // replace QObject* of existing object
-    {
-        QScriptValue object = eng.newVariant(123);
-        QScriptValue originalProto = object.prototype();
-        QObject otherQObject;
-        for (int x = 0; x < 2; ++x) {
-            QScriptValue ret = eng.newQObject(object, &otherQObject);
-            QVERIFY(!ret.isUndefined());
-            QVERIFY(ret.isQObject());
-            QVERIFY(ret.strictlyEquals(object));
-            QCOMPARE(ret.toQObject(), (QObject *)&otherQObject);
-            QVERIFY(ret.prototype().strictlyEquals(originalProto));
-        }
-    }
-#endif
-}
-
-void tst_QJSEngine::newQObject_sameQObject()
-{
-#if 0 // ###FIXME: No QObjectWrapOptions API
-    QSKIP("This test strongly relies on strictlyEquals feature that would change in near future");
-    QScriptEngine eng;
-    // calling newQObject() several times with same object
-    for (int x = 0; x < 2; ++x) {
-        QObject qobj;
-        // the default is to create a new wrapper object
-        QScriptValue obj1 = eng.newQObject(&qobj);
-        QScriptValue obj2 = eng.newQObject(&qobj);
-        QVERIFY(!obj2.strictlyEquals(obj1));
-
-        QScriptEngine::QObjectWrapOptions opt = 0;
-        bool preferExisting = (x != 0);
-        if (preferExisting)
-            opt |= QScriptEngine::PreferExistingWrapperObject;
-
-        QScriptValue obj3 = eng.newQObject(&qobj, QScriptEngine::AutoOwnership, opt);
-        QVERIFY(!obj3.strictlyEquals(obj2));
-        QScriptValue obj4 = eng.newQObject(&qobj, QScriptEngine::AutoOwnership, opt);
-        QCOMPARE(obj4.strictlyEquals(obj3), preferExisting);
-
-        QScriptValue obj5 = eng.newQObject(&qobj, QScriptEngine::ScriptOwnership, opt);
-        QVERIFY(!obj5.strictlyEquals(obj4));
-        QScriptValue obj6 = eng.newQObject(&qobj, QScriptEngine::ScriptOwnership, opt);
-        QCOMPARE(obj6.strictlyEquals(obj5), preferExisting);
-
-        QScriptValue obj7 = eng.newQObject(&qobj, QScriptEngine::ScriptOwnership,
-                                           QScriptEngine::ExcludeSuperClassMethods | opt);
-        QVERIFY(!obj7.strictlyEquals(obj6));
-        QScriptValue obj8 = eng.newQObject(&qobj, QScriptEngine::ScriptOwnership,
-                                           QScriptEngine::ExcludeSuperClassMethods | opt);
-        QCOMPARE(obj8.strictlyEquals(obj7), preferExisting);
-    }
-#endif
-}
-
-#if 0 // FIXME: No prototype API in QScriptEngine
-void tst_QJSEngine::newQObject_defaultPrototype()
-{
-    QObject temp;
-    QScriptEngine eng;
-    // newQObject() should set the default prototype, if one has been registered
-    {
-        QScriptValue oldQObjectProto = eng.defaultPrototype(qMetaTypeId<QObject*>());
-
-        QScriptValue qobjectProto = eng.newObject();
-        eng.setDefaultPrototype(qMetaTypeId<QObject*>(), qobjectProto);
-        {
-            QScriptValue ret = eng.newQObject(&temp);
-            QVERIFY(ret.prototype().equals(qobjectProto));
-        }
-        QScriptValue tstProto = eng.newObject();
-        int typeId = qRegisterMetaType<tst_QJSEngine*>("tst_QJSEngine*");
-        eng.setDefaultPrototype(typeId, tstProto);
-        {
-            QScriptValue ret = eng.newQObject(temp);
-            QVERIFY(ret.prototype().equals(tstProto));
-        }
-
-        eng.setDefaultPrototype(qMetaTypeId<QObject*>(), oldQObjectProto);
-        eng.setDefaultPrototype(typeId, QScriptValue());
-    }
-}
-#endif
-
-void tst_QJSEngine::newQObject_promoteNonObject()
-{
-#if 0 // ### FIXME: object promotion is not supported
-    QScriptEngine eng;
-    {
-        QScriptValue ret = eng.newQObject(123, this);
-        QVERIFY(ret.isQObject());
-        QCOMPARE(ret.toQObject(), this);
-    }
-#endif
-}
-
-void tst_QJSEngine::newQObject_promoteNonQScriptObject()
-{
-#if 0 // ### FIXME: object promotion is not supported
-    QSKIP("Promotion of non QScriptObjects kind of works (there is not difference between Object and Array, look at comments in newQObject implementation).");
-    QScriptEngine eng;
-    {
-        QTest::ignoreMessage(QtWarningMsg, "QScriptEngine::newQObject(): changing class of non-QScriptObject not supported");
-        QScriptValue ret = eng.newQObject(eng.newArray(), this);
-        QVERIFY(ret.isUndefined());
-    }
-#endif
-}
-
 void tst_QJSEngine::newQObject_deletedEngine()
 {
     QJSValue object;
@@ -1145,309 +524,6 @@ void tst_QJSEngine::newQObject_deletedEngine()
     QTRY_VERIFY(spy.count());
 }
 
-#if 0 // ### FIXME: No QScript Metaobject support right now
-QT_BEGIN_NAMESPACE
-Q_SCRIPT_DECLARE_QMETAOBJECT(QObject, QObject*)
-Q_SCRIPT_DECLARE_QMETAOBJECT(QWidget, QWidget*)
-QT_END_NAMESPACE
-
-static QScriptValue myConstructor(QScriptContext *ctx, QScriptEngine *eng)
-{
-    QScriptValue obj;
-    if (ctx->isCalledAsConstructor()) {
-        obj = ctx->thisObject();
-    } else {
-        obj = eng->newObject();
-        obj.setPrototype(ctx->callee().property("prototype"));
-    }
-    obj.setProperty("isCalledAsConstructor", QScriptValue(eng, ctx->isCalledAsConstructor()));
-    return obj;
-}
-
-static QScriptValue instanceofJS(const QScriptValue &inst, const QScriptValue &ctor)
-{
-    return inst.engine()->evaluate("(function(inst, ctor) { return inst instanceof ctor; })")
-        .call(QScriptValueList() << inst << ctor);
-}
-
-void tst_QJSEngine::newQMetaObject()
-{
-    QScriptEngine eng;
-#if 0
-    QScriptValue qclass = eng.newQMetaObject<QObject>();
-    QScriptValue qclass2 = eng.newQMetaObject<QWidget>();
-#else
-    QScriptValue qclass = qScriptValueFromQMetaObject<QObject>(&eng);
-    QScriptValue qclass2 = qScriptValueFromQMetaObject<QWidget>(&eng);
-#endif
-    QVERIFY(!qclass.isUndefined());
-    QCOMPARE(qclass.isQMetaObject(), true);
-    QCOMPARE(qclass.toQMetaObject(), &QObject::staticMetaObject);
-    QCOMPARE(qclass.isCallable(), true);
-    QVERIFY(qclass.property("prototype").isObject());
-
-    QVERIFY(!qclass2.isUndefined());
-    QCOMPARE(qclass2.isQMetaObject(), true);
-    QCOMPARE(qclass2.toQMetaObject(), &QWidget::staticMetaObject);
-    QCOMPARE(qclass2.isCallable(), true);
-    QVERIFY(qclass2.property("prototype").isObject());
-
-    // prototype should be QMetaObject.prototype
-    QCOMPARE(qclass.prototype().isObject(), true);
-    QCOMPARE(qclass2.prototype().isObject(), true);
-
-    QScriptValue instance = qclass.callAsConstructor();
-    QCOMPARE(instance.isQObject(), true);
-    QCOMPARE(instance.toQObject()->metaObject(), qclass.toQMetaObject());
-    QEXPECT_FAIL("", "FIXME:  newQMetaObject not implemented properly yet", Abort);
-    QVERIFY(instance.instanceOf(qclass));
-    QVERIFY(instanceofJS(instance, qclass).strictlyEquals(true));
-
-    QScriptValue instance2 = qclass2.callAsConstructor();
-    QCOMPARE(instance2.isQObject(), true);
-    QCOMPARE(instance2.toQObject()->metaObject(), qclass2.toQMetaObject());
-    QVERIFY(instance2.instanceOf(qclass2));
-    QVERIFY(instanceofJS(instance2, qclass2).strictlyEquals(true));
-    QVERIFY(!instance2.instanceOf(qclass));
-    QVERIFY(instanceofJS(instance2, qclass).strictlyEquals(false));
-
-    QScriptValueList args;
-    args << instance;
-    QScriptValue instance3 = qclass.callAsConstructor(args);
-    QCOMPARE(instance3.isQObject(), true);
-    QCOMPARE(instance3.toQObject()->parent(), instance.toQObject());
-    QVERIFY(instance3.instanceOf(qclass));
-    QVERIFY(instanceofJS(instance3, qclass).strictlyEquals(true));
-    QVERIFY(!instance3.instanceOf(qclass2));
-    QVERIFY(instanceofJS(instance3, qclass2).strictlyEquals(false));
-    args.clear();
-
-    QPointer<QObject> qpointer1 = instance.toQObject();
-    QPointer<QObject> qpointer2 = instance2.toQObject();
-    QPointer<QObject> qpointer3 = instance3.toQObject();
-
-    QVERIFY(qpointer1);
-    QVERIFY(qpointer2);
-    QVERIFY(qpointer3);
-
-    // verify that AutoOwnership is in effect
-    instance = QScriptValue();
-    collectGarbage_helper(eng);
-
-    QVERIFY(!qpointer1);
-    QVERIFY(qpointer2);
-    QVERIFY(!qpointer3); // was child of instance
-
-    QVERIFY(instance.toQObject() == 0);
-    QVERIFY(instance3.toQObject() == 0); // was child of instance
-    QVERIFY(instance2.toQObject() != 0);
-    instance2 = QScriptValue();
-    collectGarbage_helper(eng);
-    QVERIFY(instance2.toQObject() == 0);
-
-    // with custom constructor
-    QScriptValue ctor = eng.newFunction(myConstructor);
-    QScriptValue qclass3 = eng.newQMetaObject(&QObject::staticMetaObject, ctor);
-    QVERIFY(qclass3.property("prototype").equals(ctor.property("prototype")));
-    {
-        QScriptValue ret = qclass3.call();
-        QVERIFY(ret.isObject());
-        QVERIFY(ret.property("isCalledAsConstructor").isBool());
-        QVERIFY(!ret.property("isCalledAsConstructor").toBool());
-        QVERIFY(ret.instanceOf(qclass3));
-        QVERIFY(instanceofJS(ret, qclass3).strictlyEquals(true));
-        QVERIFY(!ret.instanceOf(qclass));
-        QVERIFY(instanceofJS(ret, qclass).strictlyEquals(false));
-    }
-    {
-        QScriptValue ret = qclass3.callAsConstructor();
-        QVERIFY(ret.isObject());
-        QVERIFY(ret.property("isCalledAsConstructor").isBool());
-        QVERIFY(ret.property("isCalledAsConstructor").toBool());
-        QVERIFY(ret.instanceOf(qclass3));
-        QVERIFY(instanceofJS(ret, qclass3).strictlyEquals(true));
-        QVERIFY(!ret.instanceOf(qclass2));
-        QVERIFY(instanceofJS(ret, qclass2).strictlyEquals(false));
-    }
-
-    // subclassing
-    qclass2.setProperty("prototype", qclass.callAsConstructor());
-    QVERIFY(qclass2.callAsConstructor().instanceOf(qclass));
-    QVERIFY(instanceofJS(qclass2.callAsConstructor(), qclass).strictlyEquals(true));
-
-    // with meta-constructor
-    QScriptValue qclass4 = eng.newQMetaObject(&QObject::staticMetaObject);
-    {
-        QScriptValue inst = qclass4.callAsConstructor();
-        QVERIFY(inst.isQObject());
-        QVERIFY(inst.toQObject() != 0);
-        QCOMPARE(inst.toQObject()->parent(), (QObject*)0);
-        QVERIFY(inst.instanceOf(qclass4));
-        QVERIFY(instanceofJS(inst, qclass4).strictlyEquals(true));
-        QVERIFY(!inst.instanceOf(qclass3));
-        QVERIFY(instanceofJS(inst, qclass3).strictlyEquals(false));
-    }
-    {
-        QObject temp;
-        QScriptValue inst = qclass4.callAsConstructor(QScriptValueList() << eng.newQObject(&temp));
-        QVERIFY(inst.isQObject());
-        QVERIFY(inst.toQObject() != 0);
-        QCOMPARE(inst.toQObject()->parent(), (QObject*)this);
-        QVERIFY(inst.instanceOf(qclass4));
-        QVERIFY(instanceofJS(inst, qclass4).strictlyEquals(true));
-        QVERIFY(!inst.instanceOf(qclass2));
-        QVERIFY(instanceofJS(inst, qclass2).strictlyEquals(false));
-    }
-}
-#endif
-
-#if 0 // ###FIXME: No activation object support
-void tst_QJSEngine::newActivationObject()
-{
-    QSKIP("internal function not implemented in JSC-based back-end");
-    QScriptEngine eng;
-    QScriptValue act = eng.newActivationObject();
-    QEXPECT_FAIL("", "", Continue);
-    QVERIFY(!act.isUndefined());
-    QEXPECT_FAIL("", "", Continue);
-    QCOMPARE(act.isObject(), true);
-    QVERIFY(!act.isCallable());
-    QScriptValue v(&eng, 123);
-    act.setProperty("prop", v);
-    QEXPECT_FAIL("", "", Continue);
-    QCOMPARE(act.property("prop").strictlyEquals(v), true);
-    QVERIFY(act.scope().isUndefined());
-    QEXPECT_FAIL("", "", Continue);
-    QVERIFY(act.prototype().isNull());
-}
-#endif
-
-#if 0 // ###FIXME: No setGlobalObject support - yay
-void tst_QJSEngine::getSetGlobalObjectSimple()
-{
-    QScriptEngine engine;
-    QScriptValue object = engine.newObject();
-    object.setProperty("foo", 123);
-    engine.evaluate("var bar = 100");
-    engine.setGlobalObject(object);
-    engine.evaluate("rab = 100");
-    QVERIFY(!engine.globalObject().property("rab").isUndefined());
-    QVERIFY(!engine.globalObject().property("foo").isUndefined());
-    QVERIFY(engine.globalObject().property("bar").isUndefined());
-}
-
-void tst_QJSEngine::getSetGlobalObject()
-{
-    QScriptEngine eng;
-    QScriptValue glob = eng.globalObject();
-    glob = QScriptValue(); // kill reference to old global object
-    collectGarbage_helper(eng);
-
-    glob = eng.globalObject();
-    QVERIFY(!glob.isUndefined());
-    QCOMPARE(glob.isObject(), true);
-    QVERIFY(!glob.isCallable());
-    QVERIFY(eng.currentContext()->thisObject().strictlyEquals(glob));
-    QVERIFY(eng.currentContext()->activationObject().strictlyEquals(glob));
-    QEXPECT_FAIL("", "FIXME: Do we really want to enforce this? ECMA standard says that it is implementation dependent, skipping for now", Continue);
-    QCOMPARE(glob.toString(), QString::fromLatin1("[object global]"));
-    // prototype should be Object.prototype
-    QVERIFY(!glob.prototype().isUndefined());
-    QCOMPARE(glob.prototype().isObject(), true);
-    QEXPECT_FAIL("", "FIXME: Do we really want to enforce this? ECMA standard says that it is implementation dependent, skipping for now", Continue);
-    QCOMPARE(glob.prototype().strictlyEquals(eng.evaluate("Object.prototype")), true);
-
-    eng.setGlobalObject(glob);
-    QVERIFY(eng.globalObject().equals(glob));
-    eng.setGlobalObject(123);
-    QVERIFY(eng.globalObject().equals(glob));
-
-    QScriptValue obj = eng.newObject();
-    eng.setGlobalObject(obj);
-    QVERIFY(eng.globalObject().strictlyEquals(obj));
-    QVERIFY(eng.currentContext()->thisObject().strictlyEquals(obj));
-    QVERIFY(eng.currentContext()->activationObject().strictlyEquals(obj));
-    QVERIFY(eng.evaluate("this").strictlyEquals(obj));
-    QEXPECT_FAIL("", "FIXME: Do we really want to enforce this? ECMA standard says that it is implementation dependent, skipping for now", Continue);
-    QCOMPARE(eng.globalObject().toString(), QString::fromLatin1("[object global]"));
-
-    collectGarbage_helper(eng);
-    glob = QScriptValue(); // kill reference to old global object
-    collectGarbage_helper(eng);
-    obj = eng.newObject();
-    eng.setGlobalObject(obj);
-    QVERIFY(eng.globalObject().strictlyEquals(obj));
-    QVERIFY(eng.currentContext()->thisObject().strictlyEquals(obj));
-    QVERIFY(eng.currentContext()->activationObject().strictlyEquals(obj));
-
-    collectGarbage_helper(eng);
-    QVERIFY(eng.globalObject().strictlyEquals(obj));
-    QVERIFY(eng.currentContext()->thisObject().strictlyEquals(obj));
-    QVERIFY(eng.currentContext()->activationObject().strictlyEquals(obj));
-
-    QVERIFY(obj.property("foo").isUndefined());
-    eng.evaluate("var foo = 123");
-    {
-        QScriptValue ret = obj.property("foo");
-        QVERIFY(ret.isNumber());
-        QCOMPARE(ret.toInt(), 123);
-    }
-
-    QVERIFY(obj.property("bar").isUndefined());
-    eng.evaluate("bar = 456");
-    {
-        QScriptValue ret = obj.property("bar");
-        QVERIFY(ret.isNumber());
-        QCOMPARE(ret.toInt(), 456);
-    }
-
-    QVERIFY(obj.property("baz").isUndefined());
-    eng.evaluate("this['baz'] = 789");
-    {
-        QScriptValue ret = obj.property("baz");
-        QVERIFY(ret.isNumber());
-        QCOMPARE(ret.toInt(), 789);
-    }
-
-    {
-        QScriptValue ret = eng.evaluate("(function() { return this; })()");
-        QVERIFY(ret.strictlyEquals(obj));
-    }
-
-    // Delete property.
-    {
-        QScriptValue ret = eng.evaluate("delete foo");
-        QVERIFY(ret.isBool());
-        QVERIFY(ret.toBool());
-        QVERIFY(obj.property("foo").isUndefined());
-    }
-
-    // Getter/setter property.
-    //the custom global object have an interceptor
-    QVERIFY(eng.evaluate("this.__defineGetter__('oof', function() { return this.bar; })").isUndefined());
-    QVERIFY(eng.evaluate("this.__defineSetter__('oof', function(v) { this.bar = v; })").isUndefined());
-    QVERIFY(eng.evaluate("this.__lookupGetter__('oof')").isCallable());
-    QVERIFY(eng.evaluate("this.__lookupSetter__('oof')").isCallable());
-    eng.evaluate("oof = 123");
-    QVERIFY(eng.evaluate("oof").equals(obj.property("bar")));
-
-    // Enumeration.
-    {
-        QScriptValue ret = eng.evaluate("a = []; for (var p in this) a.push(p); a");
-        QCOMPARE(ret.toString(), QString::fromLatin1("bar,baz,oof,p,a"));
-    }
-}
-#endif
-
-#if 0 // ###FIXME: no c-style callbacks
-static QScriptValue getSetFoo(QScriptContext *ctx, QScriptEngine *)
-{
-    if (ctx->argumentCount() > 0)
-        ctx->thisObject().setProperty("foo", ctx->argument(0));
-    return ctx->thisObject().property("foo");
-}
-#endif
-
 void tst_QJSEngine::globalObjectProperties()
 {
     QSKIP("Test failing - QTBUG-22238");
@@ -1587,131 +663,7 @@ void tst_QJSEngine::createGlobalObjectProperty()
         global.deleteProperty(name);
         QVERIFY(global.property(name).isUndefined());
     }
-    // create property with attributes
-#if 0 // ###FIXME: setProperty with flags is not supported
-    {
-        QString name = QString::fromLatin1("bar");
-        QVERIFY(global.property(name).isUndefined());
-        QScriptValue val(QString::fromLatin1("ciao"));
-        QScriptValue::PropertyFlags flags = QScriptValue::ReadOnly | QScriptValue::SkipInEnumeration;
-        global.setProperty(name, val, flags);
-        QVERIFY(global.property(name).equals(val));
-        //QEXPECT_FAIL("", "QTBUG-6134: custom Global Object properties don't retain attributes", Continue);
-        global.setProperty(name, QScriptValue());
-        QVERIFY(global.property(name).isUndefined());
-    }
-#endif
-}
-
-void tst_QJSEngine::globalObjectGetterSetterProperty()
-{
-#if 0 // ###FIXME: No c-style callbacks
-    QScriptEngine engine;
-    QScriptValue global = engine.globalObject();
-    global.setProperty("bar", engine.newFunction(getSetFoo),
-                       QScriptValue::PropertySetter | QScriptValue::PropertyGetter);
-    global.setProperty("foo", 123);
-    QVERIFY(global.property("bar").equals(global.property("foo")));
-    QVERIFY(engine.evaluate("bar").equals(global.property("foo")));
-    global.setProperty("bar", 456);
-    QVERIFY(global.property("bar").equals(global.property("foo")));
-
-    engine.evaluate("__defineGetter__('baz', function() { return 789; })");
-    QVERIFY(engine.evaluate("baz").equals(789));
-    QVERIFY(global.property("baz").equals(789));
-#endif
-}
-
-#if 0 // ###FIXME: No support for setting the global object
-void tst_QJSEngine::customGlobalObjectWithPrototype()
-{
-    for (int x = 0; x < 2; ++x) {
-        QScriptEngine engine;
-        QScriptValue wrap = engine.newObject();
-        QScriptValue global = engine.globalObject();
-        QScriptValue originalGlobalProto = global.prototype();
-        if (!x) {
-            // Set prototype before setting global object
-            wrap.setPrototype(global);
-            QVERIFY(wrap.prototype().strictlyEquals(global));
-            engine.setGlobalObject(wrap);
-        } else {
-            // Set prototype after setting global object
-            engine.setGlobalObject(wrap);
-            wrap.setPrototype(global);
-            QVERIFY(wrap.prototype().strictlyEquals(global));
-        }
-        {
-            QScriptValue ret = engine.evaluate("print");
-            QVERIFY(ret.isCallable());
-            QVERIFY(ret.strictlyEquals(wrap.property("print")));
-        }
-        {
-            QScriptValue ret = engine.evaluate("this.print");
-            QVERIFY(ret.isCallable());
-            QVERIFY(ret.strictlyEquals(wrap.property("print")));
-        }
-        {
-            QScriptValue ret = engine.evaluate("hasOwnProperty('print')");
-            QVERIFY(ret.isBool());
-            if (x) QEXPECT_FAIL("", "Why?", Continue);
-            QVERIFY(!ret.toBool());
-        }
-        {
-            QScriptValue ret = engine.evaluate("this.hasOwnProperty('print')");
-            QVERIFY(ret.isBool());
-            if (x) QEXPECT_FAIL("", "Why?", Continue);
-            QVERIFY(!ret.toBool());
-        }
-
-        QScriptValue anotherProto = engine.newObject();
-        anotherProto.setProperty("anotherProtoProperty", 123);
-        global.setPrototype(anotherProto);
-        {
-            QScriptValue ret = engine.evaluate("print");
-            QVERIFY(ret.isCallable());
-            QVERIFY(ret.strictlyEquals(wrap.property("print")));
-        }
-        {
-            QScriptValue ret = engine.evaluate("anotherProtoProperty");
-            QVERIFY(ret.isNumber());
-            QVERIFY(ret.strictlyEquals(wrap.property("anotherProtoProperty")));
-        }
-        {
-            QScriptValue ret = engine.evaluate("this.anotherProtoProperty");
-            QVERIFY(ret.isNumber());
-            QVERIFY(ret.strictlyEquals(wrap.property("anotherProtoProperty")));
-        }
-
-        wrap.setPrototype(anotherProto);
-        {
-            QScriptValue ret = engine.evaluate("print");
-            QVERIFY(ret.isError());
-            QCOMPARE(ret.toString(), QString::fromLatin1("ReferenceError: print is not defined"));
-        }
-        {
-            QScriptValue ret = engine.evaluate("anotherProtoProperty");
-            QVERIFY(ret.isNumber());
-            QVERIFY(ret.strictlyEquals(wrap.property("anotherProtoProperty")));
-        }
-        QVERIFY(global.prototype().strictlyEquals(anotherProto));
-
-        global.setPrototype(originalGlobalProto);
-        engine.setGlobalObject(global);
-        {
-            QScriptValue ret = engine.evaluate("anotherProtoProperty");
-            QVERIFY(ret.isError());
-            QVERIFY(ret.toString().startsWith("ReferenceError: "));
-        }
-        {
-            QScriptValue ret = engine.evaluate("print");
-            QVERIFY(ret.isCallable());
-            QVERIFY(ret.strictlyEquals(global.property("print")));
-        }
-        QVERIFY(anotherProto.property("print").isUndefined());
-    }
 }
-#endif
 
 void tst_QJSEngine::globalObjectWithCustomPrototype()
 {
@@ -1925,153 +877,23 @@ void tst_QJSEngine::builtinFunctionNames()
     QCOMPARE(ret.toString(), expectedName);
 }
 
-#if 0 // ###FIXME: No syntax checking result
-void tst_QJSEngine::checkSyntax_data()
+void tst_QJSEngine::evaluate_data()
 {
     QTest::addColumn<QString>("code");
-    QTest::addColumn<int>("expectedState");
-    QTest::addColumn<int>("errorLineNumber");
-    QTest::addColumn<int>("errorColumnNumber");
-    QTest::addColumn<QString>("errorMessage");
-
-    QTest::newRow("0")
-        << QString("0") << int(QScriptSyntaxCheckResult::Valid)
-        << -1 << -1 << "";
-    QTest::newRow("if (")
-        << QString("if (\n") << int(QScriptSyntaxCheckResult::Intermediate)
-        << 0 << -1 << "Uncaught SyntaxError: Unexpected end of input";
-    QTest::newRow("if else")
-        << QString("\nif else") << int(QScriptSyntaxCheckResult::Error)
-        << 2 << 3 << "Uncaught SyntaxError: Unexpected token else";
-    QTest::newRow("foo[")
-        << QString("foo[") << int(QScriptSyntaxCheckResult::Intermediate)
-        << 1 << 4 << "Uncaught SyntaxError: Unexpected end of input";
-    QTest::newRow("foo['bar']")
-        << QString("foo['bar']") << int(QScriptSyntaxCheckResult::Valid)
-        << -1 << -1 << "";
-
-    QTest::newRow("/*")
-        << QString("/*") << int(QScriptSyntaxCheckResult::Error)
-        << 1 << 0 << "Uncaught SyntaxError: Unexpected token ILLEGAL";
-    QTest::newRow("/*\nMy comment")
-        << QString("/*\nMy comment") << int(QScriptSyntaxCheckResult::Error)
-        << 1 << 0 << "Uncaught SyntaxError: Unexpected token ILLEGAL";
-    QTest::newRow("/*\nMy comment */\nfoo = 10")
-        << QString("/*\nMy comment */\nfoo = 10") << int(QScriptSyntaxCheckResult::Valid)
-        << -1 << -1 << "";
-    QTest::newRow("foo = 10 /*")
-        << QString("foo = 10 /*") << int(QScriptSyntaxCheckResult::Error)
-        << 1 << 9 << "Uncaught SyntaxError: Unexpected token ILLEGAL";
-    QTest::newRow("foo = 10; /*")
-        << QString("foo = 10; /*") << int(QScriptSyntaxCheckResult::Error)
-        << 1 << 10 << "Uncaught SyntaxError: Unexpected token ILLEGAL";
-    QTest::newRow("foo = 10 /* My comment */")
-        << QString("foo = 10 /* My comment */") << int(QScriptSyntaxCheckResult::Valid)
-        << -1 << -1 << "";
-
-    QTest::newRow("/=/")
-        << QString("/=/") << int(QScriptSyntaxCheckResult::Valid) << -1 << -1 << "";
-    QTest::newRow("/=/g")
-        << QString("/=/g") << int(QScriptSyntaxCheckResult::Valid) << -1 << -1 << "";
-    QTest::newRow("/a/")
-        << QString("/a/") << int(QScriptSyntaxCheckResult::Valid) << -1 << -1 << "";
-    QTest::newRow("/a/g")
-        << QString("/a/g") << int(QScriptSyntaxCheckResult::Valid) << -1 << -1 << "";
-}
-
-void tst_QJSEngine::checkSyntax()
-{
-    QFETCH(QString, code);
-    QFETCH(int, expectedState);
-    QFETCH(int, errorLineNumber);
-    QFETCH(int, errorColumnNumber);
-    QFETCH(QString, errorMessage);
+    QTest::addColumn<int>("lineNumber");
+    QTest::addColumn<bool>("expectHadError");
+    QTest::addColumn<int>("expectErrorLineNumber");
 
-    QScriptSyntaxCheckResult result = QScriptEngine::checkSyntax(code);
-    QCOMPARE(int(result.state()), expectedState);
-    QCOMPARE(result.errorLineNumber(), errorLineNumber);
-    QCOMPARE(result.errorColumnNumber(), errorColumnNumber);
-    QCOMPARE(result.errorMessage(), errorMessage);
-
-    // assignment
-    {
-        QScriptSyntaxCheckResult copy = result;
-        QCOMPARE(copy.state(), result.state());
-        QCOMPARE(copy.errorLineNumber(), result.errorLineNumber());
-        QCOMPARE(copy.errorColumnNumber(), result.errorColumnNumber());
-        QCOMPARE(copy.errorMessage(), result.errorMessage());
-    }
-    {
-        QScriptSyntaxCheckResult copy(result);
-        QCOMPARE(copy.state(), result.state());
-        QCOMPARE(copy.errorLineNumber(), result.errorLineNumber());
-        QCOMPARE(copy.errorColumnNumber(), result.errorColumnNumber());
-        QCOMPARE(copy.errorMessage(), result.errorMessage());
-    }
-}
-#endif
-
-#if 0 // ###FIXME: No support for canEvaluate
-void tst_QJSEngine::canEvaluate_data()
-{
-    QTest::addColumn<QString>("code");
-    QTest::addColumn<bool>("expectSuccess");
-
-    QTest::newRow("") << QString("") << true;
-    QTest::newRow("0") << QString("0") << true;
-    QTest::newRow("!") << QString("!\n") << false;
-    QTest::newRow("if (") << QString("if (\n") << false;
-    QTest::newRow("if (10) //") << QString("if (10) //\n") << false;
-    QTest::newRow("a = 1; if (") << QString("a = 1;\nif (\n") << false;
-    QTest::newRow("./test.js") << QString("./test.js\n") << true;
-    QTest::newRow("if (0) print(1)") << QString("if (0)\nprint(1)\n") << true;
-    QTest::newRow("0 = ") << QString("0 = \n") << false;
-    QTest::newRow("0 = 0") << QString("0 = 0\n") << true;
-    QTest::newRow("foo[") << QString("foo[") << false;
-    QTest::newRow("foo[") << QString("foo[\n") << false;
-    QTest::newRow("foo['bar']") << QString("foo['bar']") << true;
-
-    //v8 does thinks unterminated comments are error rather than unfinished
-//    QTest::newRow("/*") << QString("/*") << false;
-//    QTest::newRow("/*\nMy comment") << QString("/*\nMy comment") << false;
-    QTest::newRow("/*\nMy comment */\nfoo = 10") << QString("/*\nMy comment */\nfoo = 10") << true;
-//    QTest::newRow("foo = 10 /*") << QString("foo = 10 /*") << false;
-//    QTest::newRow("foo = 10; /*") << QString("foo = 10; /*") << false;
-    QTest::newRow("foo = 10 /* My comment */") << QString("foo = 10 /* My comment */") << true;
-
-    QTest::newRow("/=/") << QString("/=/") << true;
-    QTest::newRow("/=/g") << QString("/=/g") << true;
-    QTest::newRow("/a/") << QString("/a/") << true;
-    QTest::newRow("/a/g") << QString("/a/g") << true;
-}
-
-void tst_QJSEngine::canEvaluate()
-{
-    QFETCH(QString, code);
-    QFETCH(bool, expectSuccess);
-
-    QScriptEngine eng;
-    QCOMPARE(eng.canEvaluate(code), expectSuccess);
-}
-#endif
-
-void tst_QJSEngine::evaluate_data()
-{
-    QTest::addColumn<QString>("code");
-    QTest::addColumn<int>("lineNumber");
-    QTest::addColumn<bool>("expectHadError");
-    QTest::addColumn<int>("expectErrorLineNumber");
-
-    QTest::newRow("(newline)") << QString("\n") << -1 << false << -1;
-    QTest::newRow("0 //")   << QString("0 //") << -1 << false << -1;
-    QTest::newRow("/* */")   << QString("/* */") << -1 << false << -1;
-    QTest::newRow("//") << QString("//") << -1 << false << -1;
-    QTest::newRow("(spaces)")  << QString("  ") << -1 << false << -1;
-    QTest::newRow("(empty)")   << QString("") << -1 << false << -1;
-    QTest::newRow("0")     << QString("0")       << -1 << false << -1;
-    QTest::newRow("0=1")   << QString("\n0=1;\n") << -1 << true  << 2;
-    QTest::newRow("a=1")   << QString("a=1\n")   << -1 << false << -1;
-    QTest::newRow("a=1;K") << QString("a=1;\nK") << -1 << true  << 2;
+    QTest::newRow("(newline)") << QString("\n") << -1 << false << -1;
+    QTest::newRow("0 //")   << QString("0 //") << -1 << false << -1;
+    QTest::newRow("/* */")   << QString("/* */") << -1 << false << -1;
+    QTest::newRow("//") << QString("//") << -1 << false << -1;
+    QTest::newRow("(spaces)")  << QString("  ") << -1 << false << -1;
+    QTest::newRow("(empty)")   << QString("") << -1 << false << -1;
+    QTest::newRow("0")     << QString("0")       << -1 << false << -1;
+    QTest::newRow("0=1")   << QString("\n0=1;\n") << -1 << true  << 2;
+    QTest::newRow("a=1")   << QString("a=1\n")   << -1 << false << -1;
+    QTest::newRow("a=1;K") << QString("a=1;\nK") << -1 << true  << 2;
 
     QTest::newRow("f()") << QString("function f()\n"
                                     "{\n"
@@ -2126,124 +948,11 @@ void tst_QJSEngine::evaluate()
     else
         ret = eng.evaluate(code);
     QCOMPARE(ret.isError(), expectHadError);
-#if 0 // ###FIXME: No support for the line number of an uncaught exception
-    QEXPECT_FAIL("f()", "SyntaxError do not report line number", Continue);
-    QEXPECT_FAIL("duplicateLabel: { duplicateLabel: ; }", "SyntaxError do not report line number", Continue);
-    QCOMPARE(eng.uncaughtExceptionLineNumber(), expectErrorLineNumber);
-#endif
     if (ret.isError()) {
         QEXPECT_FAIL("", "we have no more lineNumber property ", Continue);
         QVERIFY(ret.property("lineNumber").strictlyEquals(eng.toScriptValue(expectErrorLineNumber)));
-    } else {
-#if 0 // ###FIXME: No support for the backtrace of an uncaught exception
-        QVERIFY(eng.uncaughtExceptionBacktrace().isEmpty());
-#endif
-    }
-}
-
-#if 0 // ###FIXME: no support for c-style callbacks
-static QScriptValue eval_nested(QScriptContext *ctx, QScriptEngine *eng)
-{
-    QScriptValue result = eng->newObject();
-    eng->evaluate("var bar = 'local';");
-    result.setProperty("thisObjectIdBefore", ctx->thisObject().property("id"));
-    QScriptValue evaluatedThisObject = eng->evaluate("this");
-    result.setProperty("thisObjectIdAfter", ctx->thisObject().property("id"));
-    result.setProperty("evaluatedThisObjectId", evaluatedThisObject.property("id"));
-    result.setProperty("local_bar", eng->evaluate("bar"));
-
-    return result;
-}
-
-// Tests that nested evaluate uses the "this" that was passed.
-void tst_QJSEngine::nestedEvaluate()
-{
-    QScriptEngine eng;
-    QScriptValue fun = eng.newFunction(eval_nested);
-    eng.globalObject().setProperty("fun", fun);
-    // From JS function call
-    {
-        QScriptValue result = eng.evaluate("o = { id:'foo'}; o.fun = fun; o.fun()");
-        QCOMPARE(result.property("local_bar").toString(), QString("local"));
-        QCOMPARE(result.property("thisObjectIdBefore").toString(), QString("foo"));
-        QCOMPARE(result.property("thisObjectIdAfter").toString(), QString("foo"));
-        QCOMPARE(result.property("evaluatedThisObjectId").toString(), QString("foo"));
-        QScriptValue bar = eng.evaluate("bar"); // Was introduced in local scope.
-        QVERIFY(bar.isError());
-        QVERIFY(bar.toString().contains(QString::fromLatin1("ReferenceError")));
-    }
-    // From QScriptValue::call()
-    {
-        QScriptValue result = fun.callWithInstance(eng.evaluate("p = { id:'foo' }") , QScriptValueList() );
-        QCOMPARE(result.property("local_bar").toString(), QString("local"));
-        QCOMPARE(result.property("thisObjectIdBefore").toString(), QString("foo"));
-        QCOMPARE(result.property("thisObjectIdAfter").toString(), QString("foo"));
-        QCOMPARE(result.property("evaluatedThisObjectId").toString(), QString("foo"));
-        QScriptValue bar = eng.evaluate("bar");
-        QVERIFY(bar.isError());
-        QVERIFY(bar.toString().contains(QString::fromLatin1("ReferenceError")));
-    }
-}
-#endif
-
-#if 0 // ### FIXME: No c-style callbacks
-void tst_QJSEngine::uncaughtException()
-{
-    QScriptEngine eng;
-    QScriptValue fun = eng.newFunction(myFunction);
-    QScriptValue throwFun = eng.newFunction(myThrowingFunction);
-    for (int x = -1; x < 2; ++x) {
-        {
-            QScriptValue ret = eng.evaluate("a = 10;\nb = 20;\n0 = 0;\n", /*fileName=*/QString(), /*lineNumber=*/x);
-            QVERIFY(eng.hasUncaughtException());
-            QCOMPARE(eng.uncaughtExceptionLineNumber(), x+2);
-            QVERIFY(eng.uncaughtException().strictlyEquals(ret));
-            (void)ret.toString();
-            QVERIFY(eng.hasUncaughtException());
-            QVERIFY(eng.uncaughtException().strictlyEquals(ret));
-            QVERIFY(fun.call().isNull());
-            QVERIFY(eng.hasUncaughtException());
-            QCOMPARE(eng.uncaughtExceptionLineNumber(), x+2);
-            QVERIFY(eng.uncaughtException().strictlyEquals(ret));
-            eng.clearExceptions();
-            QVERIFY(!eng.hasUncaughtException());
-            QCOMPARE(eng.uncaughtExceptionLineNumber(), -1);
-            QVERIFY(eng.uncaughtException().isUndefined());
-
-            eng.evaluate("2 = 3");
-            QVERIFY(eng.hasUncaughtException());
-            QScriptValue ret2 = throwFun.call();
-            QVERIFY(ret2.isError());
-            QVERIFY(eng.hasUncaughtException());
-            QVERIFY(eng.uncaughtException().strictlyEquals(ret2));
-            QCOMPARE(eng.uncaughtExceptionLineNumber(), 0);
-            eng.clearExceptions();
-            QVERIFY(!eng.hasUncaughtException());
-            eng.evaluate("1 + 2");
-            QVERIFY(!eng.hasUncaughtException());
-        }
-        {
-            QScriptValue ret = eng.evaluate("a = 10");
-            QVERIFY(!eng.hasUncaughtException());
-            QVERIFY(eng.uncaughtException().isUndefined());
-        }
-        {
-            QScriptValue ret = eng.evaluate("1 = 2");
-            QVERIFY(eng.hasUncaughtException());
-            eng.clearExceptions();
-            QVERIFY(!eng.hasUncaughtException());
-        }
-        {
-            eng.globalObject().setProperty("throwFun", throwFun);
-            eng.evaluate("1;\nthrowFun();");
-            QVERIFY(eng.hasUncaughtException());
-            QCOMPARE(eng.uncaughtExceptionLineNumber(), 2);
-            eng.clearExceptions();
-            QVERIFY(!eng.hasUncaughtException());
-        }
     }
 }
-#endif
 
 void tst_QJSEngine::errorMessage_QT679()
 {
@@ -2263,68 +972,6 @@ public:
 Q_DECLARE_METATYPE(Foo)
 Q_DECLARE_METATYPE(Foo*)
 
-#if 0 // FIXME: No prototype API in QScriptEngine
-void tst_QJSEngine::getSetDefaultPrototype_int()
-{
-    QScriptEngine eng;
-
-    QScriptValue object = eng.newObject();
-    QVERIFY(eng.defaultPrototype(qMetaTypeId<int>()).isUndefined());
-    eng.setDefaultPrototype(qMetaTypeId<int>(), object);
-    QCOMPARE(eng.defaultPrototype(qMetaTypeId<int>()).strictlyEquals(object), true);
-    QScriptValue value = eng.newVariant(int(123));
-    QCOMPARE(value.prototype().isObject(), true);
-    QCOMPARE(value.prototype().strictlyEquals(object), true);
-
-    eng.setDefaultPrototype(qMetaTypeId<int>(), QScriptValue());
-    QVERIFY(eng.defaultPrototype(qMetaTypeId<int>()).isUndefined());
-    QScriptValue value2 = eng.newVariant(int(123));
-    QCOMPARE(value2.prototype().strictlyEquals(object), false);
-}
-
-void tst_QJSEngine::getSetDefaultPrototype_customType()
-{
-    QScriptEngine eng;
-
-    QScriptValue object = eng.newObject();
-    QVERIFY(eng.defaultPrototype(qMetaTypeId<Foo>()).isUndefined());
-    eng.setDefaultPrototype(qMetaTypeId<Foo>(), object);
-    QCOMPARE(eng.defaultPrototype(qMetaTypeId<Foo>()).strictlyEquals(object), true);
-    QScriptValue value = eng.newVariant(qVariantFromValue(Foo()));
-    QCOMPARE(value.prototype().isObject(), true);
-    QCOMPARE(value.prototype().strictlyEquals(object), true);
-
-    eng.setDefaultPrototype(qMetaTypeId<Foo>(), QScriptValue());
-    QVERIFY(eng.defaultPrototype(qMetaTypeId<Foo>()).isUndefined());
-    QScriptValue value2 = eng.newVariant(qVariantFromValue(Foo()));
-    QCOMPARE(value2.prototype().strictlyEquals(object), false);
-}
-#endif
-
-static QJSValue fooToScriptValue(QJSEngine *eng, const Foo &foo)
-{
-    QJSValue obj = eng->newObject();
-    obj.setProperty("x", eng->toScriptValue(foo.x));
-    obj.setProperty("y", eng->toScriptValue(foo.y));
-    return obj;
-}
-
-static void fooFromScriptValue(const QJSValue &value, Foo &foo)
-{
-    foo.x = value.property("x").toInt();
-    foo.y = value.property("y").toInt();
-}
-
-static QJSValue fooToScriptValueV2(QJSEngine *eng, const Foo &foo)
-{
-    return eng->toScriptValue(foo.x);
-}
-
-static void fooFromScriptValueV2(const QJSValue &value, Foo &foo)
-{
-    foo.x = value.toInt();
-}
-
 Q_DECLARE_METATYPE(QLinkedList<QString>)
 Q_DECLARE_METATYPE(QList<Foo>)
 Q_DECLARE_METATYPE(QVector<QChar>)
@@ -2398,141 +1045,6 @@ void tst_QJSEngine::valueConversion_basic()
     QVERIFY(eng.toScriptValue(static_cast<void *>(0)).isNull());
 }
 
-#if 0 // FIXME: No API for custom types
-void tst_QJSEngine::valueConversion_customType()
-{
-    QScriptEngine eng;
-    {
-        // a type that we don't have built-in conversion of
-        // (it's stored as a variant)
-        QTime tm(1, 2, 3, 4);
-        QScriptValue val = eng.toScriptValue(tm);
-        QCOMPARE(eng.fromScriptValue<QTime>(val), tm);
-    }
-
-    {
-        Foo foo;
-        foo.x = 12;
-        foo.y = 34;
-        QScriptValue fooVal = eng.toScriptValue(foo);
-        QCOMPARE(fooVal.isVariant(), true);
-
-        Foo foo2 = eng.fromScriptValue<Foo>(fooVal);
-        QCOMPARE(foo2.x, foo.x);
-        QCOMPARE(foo2.y, foo.y);
-    }
-
-    qScriptRegisterMetaType<Foo>(&eng, fooToScriptValue, fooFromScriptValue);
-
-    {
-        Foo foo;
-        foo.x = 12;
-        foo.y = 34;
-        QScriptValue fooVal = eng.toScriptValue(foo);
-        QCOMPARE(fooVal.isObject(), true);
-        QVERIFY(fooVal.prototype().strictlyEquals(eng.evaluate("Object.prototype")));
-        QCOMPARE(fooVal.property("x").strictlyEquals(QScriptValue(&eng, 12)), true);
-        QCOMPARE(fooVal.property("y").strictlyEquals(QScriptValue(&eng, 34)), true);
-        fooVal.setProperty("x", QScriptValue(&eng, 56));
-        fooVal.setProperty("y", QScriptValue(&eng, 78));
-
-        Foo foo2 = eng.fromScriptValue<Foo>(fooVal);
-        QCOMPARE(foo2.x, 56);
-        QCOMPARE(foo2.y, 78);
-
-        QScriptValue fooProto = eng.newObject();
-        eng.setDefaultPrototype(qMetaTypeId<Foo>(), fooProto);
-        QScriptValue fooVal2 = eng.toScriptValue(foo2);
-        QVERIFY(fooVal2.prototype().strictlyEquals(fooProto));
-        QVERIFY(fooVal2.property("x").strictlyEquals(QScriptValue(&eng, 56)));
-        QVERIFY(fooVal2.property("y").strictlyEquals(QScriptValue(&eng, 78)));
-    }
-}
-
-void tst_QJSEngine::valueConversion_sequence()
-{
-    QScriptEngine eng;
-    qScriptRegisterSequenceMetaType<QLinkedList<QString> >(&eng);
-
-    {
-        QLinkedList<QString> lst;
-        lst << QLatin1String("foo") << QLatin1String("bar");
-        QScriptValue lstVal = eng.toScriptValue(lst);
-        QCOMPARE(lstVal.isArray(), true);
-        QCOMPARE(lstVal.property("length").toInt(), 2);
-        QCOMPARE(lstVal.property("0").isString(), true);
-        QCOMPARE(lstVal.property("0").toString(), QLatin1String("foo"));
-        QCOMPARE(lstVal.property("1").isString(), true);
-        QCOMPARE(lstVal.property("1").toString(), QLatin1String("bar"));
-    }
-
-    qScriptRegisterSequenceMetaType<QList<Foo> >(&eng);
-    qScriptRegisterSequenceMetaType<QStack<int> >(&eng);
-    qScriptRegisterSequenceMetaType<QVector<QChar> >(&eng);
-    qScriptRegisterSequenceMetaType<QQueue<char> >(&eng);
-    qScriptRegisterSequenceMetaType<QLinkedList<QStack<int> > >(&eng);
-
-    {
-        QLinkedList<QStack<int> > lst;
-        QStack<int> first; first << 13 << 49; lst << first;
-        QStack<int> second; second << 99999;lst << second;
-        QScriptValue lstVal = eng.toScriptValue(lst);
-        QCOMPARE(lstVal.isArray(), true);
-        QCOMPARE(lstVal.property("length").toInt(), 2);
-        QCOMPARE(lstVal.property("0").isArray(), true);
-        QCOMPARE(lstVal.property("0").property("length").toInt(), 2);
-        QCOMPARE(lstVal.property("0").property("0").toInt(), first.at(0));
-        QCOMPARE(lstVal.property("0").property("1").toInt(), first.at(1));
-        QCOMPARE(lstVal.property("1").isArray(), true);
-        QCOMPARE(lstVal.property("1").property("length").toInt(), 1);
-        QCOMPARE(lstVal.property("1").property("0").toInt(), second.at(0));
-        QCOMPARE(qscriptvalue_cast<QStack<int> >(lstVal.property("0")), first);
-        QCOMPARE(qscriptvalue_cast<QStack<int> >(lstVal.property("1")), second);
-        QCOMPARE(qscriptvalue_cast<QLinkedList<QStack<int> > >(lstVal), lst);
-    }
-
-    // pointers
-    {
-        Foo foo;
-        {
-            QScriptValue v = eng.toScriptValue(&foo);
-            Foo *pfoo = qscriptvalue_cast<Foo*>(v);
-            QCOMPARE(pfoo, &foo);
-        }
-        {
-            Foo *pfoo = 0;
-            QScriptValue v = eng.toScriptValue(pfoo);
-            QCOMPARE(v.isNull(), true);
-            QVERIFY(qscriptvalue_cast<Foo*>(v) == 0);
-        }
-    }
-
-    // QList<int> and QObjectList should be converted from/to arrays by default
-    {
-        QList<int> lst;
-        lst << 1 << 2 << 3;
-        QScriptValue val = eng.toScriptValue(lst);
-        QVERIFY(val.isArray());
-        QCOMPARE(val.property("length").toInt(), lst.size());
-        QCOMPARE(val.property(0).toInt(), lst.at(0));
-        QCOMPARE(val.property(1).toInt(), lst.at(1));
-        QCOMPARE(val.property(2).toInt(), lst.at(2));
-
-        QCOMPARE(qscriptvalue_cast<QList<int> >(val), lst);
-    }
-    {
-        QObjectList lst;
-        lst << this;
-        QScriptValue val = eng.toScriptValue(lst);
-        QVERIFY(val.isArray());
-        QCOMPARE(val.property("length").toInt(), lst.size());
-        QCOMPARE(val.property(0).toQObject(), (QObject *)this);
-
-        QCOMPARE(qscriptvalue_cast<QObjectList>(val), lst);
-    }
-}
-#endif
-
 void tst_QJSEngine::valueConversion_QVariant()
 {
     QJSEngine eng;
@@ -2619,30 +1131,6 @@ void tst_QJSEngine::valueConversion_QVariant()
     QVERIFY(eng.toScriptValue(QVariant(QMetaType::VoidStar, 0)).isNull());
 }
 
-#if 0 // FIXME: No support for custom types
-void tst_QJSEngine::valueConversion_hooliganTask248802()
-{
-    QScriptEngine eng;
-    qScriptRegisterMetaType<Foo>(&eng, fooToScriptValueV2, fooFromScriptValueV2);
-    {
-        QScriptValue num(&eng, 123);
-        Foo foo = eng.fromScriptValue<Foo>(num);
-        QCOMPARE(foo.x, 123);
-    }
-    {
-        QScriptValue num(123);
-        Foo foo = eng.fromScriptValue<Foo>(num);
-        QCOMPARE(foo.x, -1);
-    }
-    {
-        QScriptValue str(&eng, QLatin1String("123"));
-        Foo foo = eng.fromScriptValue<Foo>(str);
-        QCOMPARE(foo.x, 123);
-    }
-
-}
-#endif
-
 void tst_QJSEngine::valueConversion_basic2()
 {
     QJSEngine eng;
@@ -2731,303 +1219,10 @@ void tst_QJSEngine::valueConversion_regExp()
     }
 }
 
-#if 0 // FIXME: No qScriptValueFromValue
-void tst_QJSEngine::qScriptValueFromValue_noEngine()
-{
-    QVERIFY(qScriptValueFromValue(0, 123).isUndefined());
-    QVERIFY(qScriptValueFromValue(0, QVariant(123)).isUndefined());
-}
-#endif
-
-#if 0 // ###FIXME: No QScriptContext
-static QScriptValue __import__(QScriptContext *ctx, QScriptEngine *eng)
-{
-    return eng->importExtension(ctx->argument(0).toString());
-}
-
-void tst_QJSEngine::importExtension()
-{
-    QStringList libPaths = QCoreApplication::instance()->libraryPaths();
-    QCoreApplication::instance()->setLibraryPaths(QStringList() << SRCDIR);
-
-    QStringList availableExtensions;
-    {
-        QScriptEngine eng;
-        QVERIFY(eng.importedExtensions().isEmpty());
-        QStringList ret = eng.availableExtensions();
-        QCOMPARE(ret.size(), 4);
-        QCOMPARE(ret.at(0), QString::fromLatin1("com"));
-        QCOMPARE(ret.at(1), QString::fromLatin1("com.trolltech"));
-        QCOMPARE(ret.at(2), QString::fromLatin1("com.trolltech.recursive"));
-        QCOMPARE(ret.at(3), QString::fromLatin1("com.trolltech.syntaxerror"));
-        availableExtensions = ret;
-    }
-
-    // try to import something that doesn't exist
-    {
-        QScriptEngine eng;
-        QScriptValue ret = eng.importExtension("this.extension.does.not.exist");
-        QCOMPARE(eng.hasUncaughtException(), true);
-        QCOMPARE(ret.isError(), true);
-        QCOMPARE(ret.toString(), QString::fromLatin1("Error: Unable to import this.extension.does.not.exist: no such extension"));
-    }
-
-    {
-        QScriptEngine eng;
-        for (int x = 0; x < 2; ++x) {
-            QCOMPARE(!eng.globalObject().property("com").isUndefined(), x == 1);
-            QScriptValue ret = eng.importExtension("com.trolltech");
-            QCOMPARE(eng.hasUncaughtException(), false);
-            QVERIFY(ret.isUndefined());
-
-            QScriptValue com = eng.globalObject().property("com");
-            QCOMPARE(com.isObject(), true);
-            QCOMPARE(com.property("wasDefinedAlready")
-                     .strictlyEquals(QScriptValue(&eng, false)), true);
-            QCOMPARE(com.property("name")
-                     .strictlyEquals(QScriptValue(&eng, "com")), true);
-            QCOMPARE(com.property("level")
-                     .strictlyEquals(QScriptValue(&eng, 1)), true);
-            QVERIFY(com.property("originalPostInit").isUndefined());
-            QVERIFY(com.property("postInitCallCount").strictlyEquals(1));
-
-            QScriptValue trolltech = com.property("trolltech");
-            QCOMPARE(trolltech.isObject(), true);
-            QCOMPARE(trolltech.property("wasDefinedAlready")
-                     .strictlyEquals(QScriptValue(&eng, false)), true);
-            QCOMPARE(trolltech.property("name")
-                     .strictlyEquals(QScriptValue(&eng, "com.trolltech")), true);
-            QCOMPARE(trolltech.property("level")
-                     .strictlyEquals(QScriptValue(&eng, 2)), true);
-            QVERIFY(trolltech.property("originalPostInit").isUndefined());
-            QVERIFY(trolltech.property("postInitCallCount").strictlyEquals(1));
-        }
-        QStringList imp = eng.importedExtensions();
-        QCOMPARE(imp.size(), 2);
-        QCOMPARE(imp.at(0), QString::fromLatin1("com"));
-        QCOMPARE(imp.at(1), QString::fromLatin1("com.trolltech"));
-        QCOMPARE(eng.availableExtensions(), availableExtensions);
-    }
-
-    // recursive import should throw an error
-    {
-        QScriptEngine eng;
-        QVERIFY(eng.importedExtensions().isEmpty());
-        eng.globalObject().setProperty("__import__", eng.newFunction(__import__));
-        QScriptValue ret = eng.importExtension("com.trolltech.recursive");
-        QCOMPARE(eng.hasUncaughtException(), true);
-        QVERIFY(ret.isError());
-        QCOMPARE(ret.toString(), QString::fromLatin1("Error: recursive import of com.trolltech.recursive"));
-        QStringList imp = eng.importedExtensions();
-        QCOMPARE(imp.size(), 2);
-        QCOMPARE(imp.at(0), QString::fromLatin1("com"));
-        QCOMPARE(imp.at(1), QString::fromLatin1("com.trolltech"));
-        QCOMPARE(eng.availableExtensions(), availableExtensions);
-    }
-
-    {
-        QScriptEngine eng;
-        eng.globalObject().setProperty("__import__", eng.newFunction(__import__));
-        for (int x = 0; x < 2; ++x) {
-            if (x == 0)
-                QVERIFY(eng.importedExtensions().isEmpty());
-            QScriptValue ret = eng.importExtension("com.trolltech.syntaxerror");
-            QVERIFY(eng.hasUncaughtException());
-            QEXPECT_FAIL("", "JSC throws syntax error eagerly", Continue);
-            QCOMPARE(eng.uncaughtExceptionLineNumber(), 4);
-            QVERIFY(ret.isError());
-            QVERIFY(ret.toString().contains(QLatin1String("SyntaxError")));
-        }
-        QStringList imp = eng.importedExtensions();
-        QCOMPARE(imp.size(), 2);
-        QCOMPARE(imp.at(0), QString::fromLatin1("com"));
-        QCOMPARE(imp.at(1), QString::fromLatin1("com.trolltech"));
-        QCOMPARE(eng.availableExtensions(), availableExtensions);
-    }
-
-    QCoreApplication::instance()->setLibraryPaths(libPaths);
-}
-
-static QScriptValue recurse(QScriptContext *ctx, QScriptEngine *eng)
-{
-    Q_UNUSED(eng);
-    return ctx->callee().call();
-}
-
-static QScriptValue recurse2(QScriptContext *ctx, QScriptEngine *eng)
-{
-    Q_UNUSED(eng);
-    return ctx->callee().callAsConstructor();
-}
-
-void tst_QJSEngine::infiniteRecursion()
-{
-    // Infinite recursion in JS should cause the VM to throw an error
-    // when the JS stack is exhausted.
-    // The exact error is back-end specific and subject to change.
-    const QString stackOverflowError = QString::fromLatin1("RangeError: Maximum call stack size exceeded");
-    QScriptEngine eng;
-    {
-        QScriptValue ret = eng.evaluate("function foo() { foo(); }; foo();");
-        QCOMPARE(ret.isError(), true);
-        QVERIFY(ret.toString().startsWith(stackOverflowError));
-    }
-#if 0 //The native C++ stack overflow before the JS stack
-    {
-        QScriptValue fun = eng.newFunction(recurse);
-        QScriptValue ret = fun.call();
-        QCOMPARE(ret.isError(), true);
-        QCOMPARE(ret.toString(), stackOverflowError);
-    }
-    {
-        QScriptValue fun = eng.newFunction(recurse2);
-        QScriptValue ret = fun.callAsConstructor();
-        QCOMPARE(ret.isError(), true);
-        QCOMPARE(ret.toString(), stackOverflowError);
-    }
-#endif
-}
-#endif
-
-struct Bar {
-    int a;
-};
-
-struct Baz : public Bar {
-    int b;
-};
-
-Q_DECLARE_METATYPE(Bar*)
-Q_DECLARE_METATYPE(Baz*)
-
 Q_DECLARE_METATYPE(QGradient)
 Q_DECLARE_METATYPE(QGradient*)
 Q_DECLARE_METATYPE(QLinearGradient)
 
-#if 0 // FIXME: No support for default prototypes
-class Zoo : public QObject
-{
-    Q_OBJECT
-public:
-    Zoo() { }
-public slots:
-    Baz *toBaz(Bar *b) { return reinterpret_cast<Baz*>(b); }
-};
-
-void tst_QJSEngine::castWithPrototypeChain()
-{
-    QScriptEngine eng;
-    Bar bar;
-    Baz baz;
-    QObject temp;
-    QScriptValue barProto = eng.toScriptValue(&bar);
-    QScriptValue bazProto = eng.toScriptValue(&baz);
-    eng.setDefaultPrototype(qMetaTypeId<Bar*>(), barProto);
-    eng.setDefaultPrototype(qMetaTypeId<Baz*>(), bazProto);
-
-    Baz baz2;
-    baz2.a = 123;
-    baz2.b = 456;
-    QScriptValue baz2Value = eng.toScriptValue(&baz2);
-    {
-        // qscriptvalue_cast() does magic; if the QScriptValue contains
-        // t of type T, and the target type is T*, &t is returned.
-        Baz *pbaz = qscriptvalue_cast<Baz*>(baz2Value);
-        QVERIFY(pbaz != 0);
-        QCOMPARE(pbaz->b, baz2.b);
-
-        Zoo zoo;
-        QScriptValue scriptZoo = eng.newQObject(&zoo);
-        QScriptValue toBaz = scriptZoo.property("toBaz");
-        QVERIFY(toBaz.isCallable());
-
-        // no relation between Bar and Baz's proto --> casting fails
-        {
-            Bar *pbar = qscriptvalue_cast<Bar*>(baz2Value);
-            QVERIFY(pbar == 0);
-        }
-
-        {
-            QScriptValue ret = toBaz.callWithInstance(scriptZoo, QScriptValueList() << baz2Value);
-            QVERIFY(ret.isError());
-            QCOMPARE(ret.toString(), QLatin1String("TypeError: incompatible type of argument(s) in call to toBaz(); candidates were\n    toBaz(Bar*)"));
-        }
-
-        // establish chain -- now casting should work
-        // Why? because qscriptvalue_cast() does magic again.
-        // It the instance itself is not of type T, qscriptvalue_cast()
-        // searches the prototype chain for T, and if it finds one, it infers
-        // that the instance can also be casted to that type. This cast is
-        // _not_ safe and thus relies on the developer doing the right thing.
-        // This is an undocumented feature to enable qscriptvalue_cast() to
-        // be used by prototype functions to cast the JS this-object to C++.
-        bazProto.setPrototype(barProto);
-
-        {
-            Bar *pbar = qscriptvalue_cast<Bar*>(baz2Value);
-            QVERIFY(pbar != 0);
-            QCOMPARE(pbar->a, baz2.a);
-        }
-
-        {
-            QScriptValue ret = toBaz.callWithInstance(scriptZoo, QScriptValueList() << baz2Value);
-            QEXPECT_FAIL("", "Cannot convert Baz* to Bar*", Continue);
-            QVERIFY(!ret.isError());
-            QEXPECT_FAIL("", "Cannot convert Baz* to Bar*", Continue);
-            QCOMPARE(qscriptvalue_cast<Baz*>(ret), pbaz);
-        }
-    }
-
-    bazProto.setPrototype(barProto.prototype()); // kill chain
-    {
-        Baz *pbaz = qscriptvalue_cast<Baz*>(baz2Value);
-        QVERIFY(pbaz != 0);
-        // should not work anymore
-        Bar *pbar = qscriptvalue_cast<Bar*>(baz2Value);
-        QVERIFY(pbar == 0);
-    }
-
-    bazProto.setPrototype(eng.newQObject(&temp));
-    {
-        Baz *pbaz = qscriptvalue_cast<Baz*>(baz2Value);
-        QVERIFY(pbaz != 0);
-        // should not work now either
-        Bar *pbar = qscriptvalue_cast<Bar*>(baz2Value);
-        QVERIFY(pbar == 0);
-    }
-
-    {
-        QScriptValue b = eng.toScriptValue(QBrush());
-        b.setPrototype(barProto);
-        // this shows that a "wrong" cast is possible, if you
-        // don't play by the rules (the pointer is actually a QBrush*)...
-        Bar *pbar = qscriptvalue_cast<Bar*>(b);
-        QVERIFY(pbar != 0);
-    }
-
-    {
-        QScriptValue gradientProto = eng.toScriptValue(QGradient());
-        QScriptValue linearGradientProto = eng.toScriptValue(QLinearGradient());
-        linearGradientProto.setPrototype(gradientProto);
-        QLinearGradient lg(10, 20, 30, 40);
-        QScriptValue linearGradient = eng.toScriptValue(lg);
-        {
-            QGradient *pgrad = qscriptvalue_cast<QGradient*>(linearGradient);
-            QVERIFY(pgrad == 0);
-        }
-        linearGradient.setPrototype(linearGradientProto);
-        {
-            QGradient *pgrad = qscriptvalue_cast<QGradient*>(linearGradient);
-            QVERIFY(pgrad != 0);
-            QCOMPARE(pgrad->type(), QGradient::LinearGradient);
-            QLinearGradient *plingrad = static_cast<QLinearGradient*>(pgrad);
-            QCOMPARE(plingrad->start(), lg.start());
-            QCOMPARE(plingrad->finalStop(), lg.finalStop());
-        }
-    }
-}
-#endif
-
 class Klazz : public QWidget,
               public QStandardItem,
               public QGraphicsItem
@@ -3072,29 +1267,6 @@ void tst_QJSEngine::collectGarbage()
     QVERIFY(ptr == 0);
 }
 
-#if 0 // ###FIXME: no reportAdditionalMemoryCost API
-void tst_QJSEngine::reportAdditionalMemoryCost()
-{
-    QScriptEngine eng;
-    // There isn't any reliable way to test whether calling
-    // this function affects garbage collection responsiveness;
-    // the best we can do is call it with a few different values.
-    for (int x = 0; x < 100; ++x) {
-        eng.reportAdditionalMemoryCost(0);
-        eng.reportAdditionalMemoryCost(10);
-        eng.reportAdditionalMemoryCost(1000);
-        eng.reportAdditionalMemoryCost(10000);
-        eng.reportAdditionalMemoryCost(100000);
-        eng.reportAdditionalMemoryCost(1000000);
-        eng.reportAdditionalMemoryCost(10000000);
-        eng.reportAdditionalMemoryCost(-1);
-        eng.reportAdditionalMemoryCost(-1000);
-        QScriptValue obj = eng.newObject();
-        eng.collectGarbage();
-    }
-}
-#endif
-
 void tst_QJSEngine::gcWithNestedDataStructure()
 {
     // The GC must be able to traverse deeply nested objects, otherwise this
@@ -3128,154 +1300,6 @@ void tst_QJSEngine::gcWithNestedDataStructure()
     }
 }
 
-#if 0 // ###FIXME: No processEvents handling
-class EventReceiver : public QObject
-{
-public:
-    EventReceiver() {
-        received = false;
-    }
-
-    bool event(QEvent *e) {
-        received |= (e->type() == QEvent::User + 1);
-        return QObject::event(e);
-    }
-
-    bool received;
-};
-
-void tst_QJSEngine::processEventsWhileRunning()
-{
-    for (int x = 0; x < 2; ++x) {
-        QScriptEngine eng;
-        if (x == 0)
-            eng.pushContext();
-
-        // This is running for a silly amount of time just to make sure
-        // the script doesn't finish before event processing is triggered.
-        QString script = QString::fromLatin1(
-            "var end = Number(new Date()) + 2000;"
-            "var x = 0;"
-            "while (Number(new Date()) < end) {"
-            "    ++x;"
-            "}");
-
-        EventReceiver receiver;
-        QCoreApplication::postEvent(&receiver, new QEvent(QEvent::Type(QEvent::User+1)));
-
-        eng.evaluate(script);
-        QVERIFY(!eng.hasUncaughtException());
-        QVERIFY(!receiver.received);
-
-        QCOMPARE(eng.processEventsInterval(), -1);
-        eng.setProcessEventsInterval(100);
-        eng.evaluate(script);
-        QVERIFY(!eng.hasUncaughtException());
-        QVERIFY(receiver.received);
-
-        if (x == 0)
-            eng.popContext();
-    }
-}
-
-void tst_QJSEngine::processEventsWhileRunning_function()
-{
-    QScriptEngine eng;
-    QScriptValue script = eng.evaluate(QString::fromLatin1(
-        "(function() { var end = Number(new Date()) + 2000;"
-        "var x = 0;"
-        "while (Number(new Date()) < end) {"
-        "    ++x;"
-        "} })"));
-
-    eng.setProcessEventsInterval(100);
-
-    for (int x = 0; x < 2; ++x) {
-        EventReceiver receiver;
-        QCoreApplication::postEvent(&receiver, new QEvent(QEvent::Type(QEvent::User+1)));
-        QVERIFY(!eng.hasUncaughtException());
-        QVERIFY(!receiver.received);
-        QCOMPARE(eng.processEventsInterval(), 100);
-
-        if (x) script.call();
-        else script.callAsConstructor();
-
-        QVERIFY(!eng.hasUncaughtException());
-        QVERIFY(receiver.received);
-    }
-}
-
-
-class EventReceiver2 : public QObject
-{
-public:
-    EventReceiver2(QScriptEngine *eng) {
-        engine = eng;
-    }
-
-    bool event(QEvent *e) {
-        if (e->type() == QEvent::User + 1) {
-            engine->currentContext()->throwError("Killed");
-        }
-        return QObject::event(e);
-    }
-
-    QScriptEngine *engine;
-};
-
-void tst_QJSEngine::throwErrorFromProcessEvents_data()
-{
-    QTest::addColumn<QString>("script");
-    QTest::addColumn<QString>("error");
-
-    QTest::newRow("while (1)")
-        << QString::fromLatin1("while (1) { }")
-        << QString::fromLatin1("Error: Killed");
-    QTest::newRow("while (1) i++")
-        << QString::fromLatin1("i = 0; while (1) { i++; }")
-        << QString::fromLatin1("Error: Killed");
-    // Unlike abortEvaluation(), scripts should be able to catch the
-    // exception.
-    QTest::newRow("try catch")
-        << QString::fromLatin1("try {"
-                               "    while (1) { }"
-                               "} catch(e) {"
-                               "    throw new Error('Caught');"
-                               "}")
-        << QString::fromLatin1("Error: Caught");
-}
-
-void tst_QJSEngine::throwErrorFromProcessEvents()
-{
-    QFETCH(QString, script);
-    QFETCH(QString, error);
-
-    QScriptEngine eng;
-
-    EventReceiver2 receiver(&eng);
-    QCoreApplication::postEvent(&receiver, new QEvent(QEvent::Type(QEvent::User+1)));
-
-    eng.setProcessEventsInterval(100);
-    QScriptValue ret = eng.evaluate(script);
-    QVERIFY(ret.isError());
-    QCOMPARE(ret.toString(), error);
-}
-
-void tst_QJSEngine::disableProcessEventsInterval()
-{
-    QScriptEngine eng;
-    eng.setProcessEventsInterval(100);
-    QCOMPARE(eng.processEventsInterval(), 100);
-    eng.setProcessEventsInterval(0);
-    QCOMPARE(eng.processEventsInterval(), 0);
-    eng.setProcessEventsInterval(-1);
-    QCOMPARE(eng.processEventsInterval(), -1);
-    eng.setProcessEventsInterval(-100);
-    QCOMPARE(eng.processEventsInterval(), -100);
-}
-#endif
-
-
 void tst_QJSEngine::stacktrace()
 {
     QString script = QString::fromLatin1(
@@ -3307,16 +1331,8 @@ void tst_QJSEngine::stacktrace()
     QJSValue result = eng.evaluate(script, fileName);
     QVERIFY(result.isError());
 
-    // FIXME? it is not standard.
-    //QCOMPARE(result.property("fileName").toString(), fileName);
-    //QCOMPARE(result.property("lineNumber").toInt(), 9);
-
     QJSValue stack = result.property("stack");
 
-    // FIXME? it is not standard.
-    // QVERIFY(stack.isArray());
-    //QCOMPARE(stack.property("length").toInt(), 7);
-
     QJSValueIterator it(stack);
     int counter = 5;
     while (it.hasNext()) {
@@ -3342,12 +1358,6 @@ void tst_QJSEngine::stacktrace()
         --counter;
     }
 
-//    FIXME? it is not standard.
-//    {
-//        QJSValue bt = result.property("backtrace").call(result);
-//        QCOMPARE(qjsvalue_cast<QStringList>(bt), backtrace);
-//    }
-
     // throw something that isn't an Error object
     // ###FIXME: No uncaughtExceptionBacktrace: QVERIFY(eng.uncaughtExceptionBacktrace().isEmpty());
     QString script2 = QString::fromLatin1(
@@ -3604,332 +1614,7 @@ void tst_QJSEngine::automaticSemicolonInsertion()
     }
 }
 
-#if 0 // ###FIXME: no abortEvaluation API
-class EventReceiver3 : public QObject
-{
-public:
-    enum AbortionResult {
-        None = 0,
-        String = 1,
-        Error = 2,
-        Number = 3
-    };
-
-    EventReceiver3(QScriptEngine *eng) {
-        engine = eng;
-        resultType = None;
-    }
-
-    bool event(QEvent *e) {
-        if (e->type() == QEvent::User + 1) {
-            switch (resultType) {
-            case None:
-                engine->abortEvaluation();
-                break;
-            case String:
-                engine->abortEvaluation(QScriptValue(engine, QString::fromLatin1("Aborted")));
-                break;
-            case Error:
-                engine->abortEvaluation(engine->currentContext()->throwError("AbortedWithError"));
-                break;
-            case Number:
-                engine->abortEvaluation(QScriptValue(1234));
-            }
-        }
-        return QObject::event(e);
-    }
-
-    AbortionResult resultType;
-    QScriptEngine *engine;
-};
-
-static QScriptValue myFunctionAbortingEvaluation(QScriptContext *, QScriptEngine *eng)
-{
-    eng->abortEvaluation();
-    return eng->nullValue(); // should be ignored
-}
-
-void tst_QJSEngine::abortEvaluation_notEvaluating()
-{
-    QScriptEngine eng;
-
-    eng.abortEvaluation();
-    QVERIFY(!eng.hasUncaughtException());
-
-    eng.abortEvaluation(123);
-    {
-        QScriptValue ret = eng.evaluate("'ciao'");
-        QVERIFY(ret.isString());
-        QCOMPARE(ret.toString(), QString::fromLatin1("ciao"));
-    }
-}
-
-void tst_QJSEngine::abortEvaluation_data()
-{
-    QTest::addColumn<QString>("script");
-
-    QTest::newRow("while (1)")
-        << QString::fromLatin1("while (1) { }");
-    QTest::newRow("while (1) i++")
-        << QString::fromLatin1("i = 0; while (1) { i++; }");
-    QTest::newRow("try catch")
-        << QString::fromLatin1("try {"
-                               "    while (1) { }"
-                               "} catch(e) {"
-                               "    throw new Error('Caught');"
-                               "}");
-}
-
-void tst_QJSEngine::abortEvaluation()
-{
-    QFETCH(QString, script);
-
-    QScriptEngine eng;
-    EventReceiver3 receiver(&eng);
-
-    eng.setProcessEventsInterval(100);
-    for (int x = 0; x < 4; ++x) {
-        QCoreApplication::postEvent(&receiver, new QEvent(QEvent::Type(QEvent::User+1)));
-        receiver.resultType = EventReceiver3::AbortionResult(x);
-        QScriptValue ret = eng.evaluate(script);
-        switch (receiver.resultType) {
-        case EventReceiver3::None:
-            QVERIFY(!eng.hasUncaughtException());
-            QVERIFY(ret.isUndefined());
-            break;
-        case EventReceiver3::Number:
-            QVERIFY(!eng.hasUncaughtException());
-            QVERIFY(ret.isNumber());
-            QCOMPARE(ret.toInt(), 1234);
-            break;
-        case EventReceiver3::String:
-            QVERIFY(!eng.hasUncaughtException());
-            QVERIFY(ret.isString());
-            QCOMPARE(ret.toString(), QString::fromLatin1("Aborted"));
-            break;
-        case EventReceiver3::Error:
-            QVERIFY(eng.hasUncaughtException());
-            QVERIFY(ret.isError());
-            QCOMPARE(ret.toString(), QString::fromLatin1("Error: AbortedWithError"));
-            break;
-        }
-    }
-
-}
-
-void tst_QJSEngine::abortEvaluation_tryCatch()
-{
-    QSKIP("It crashes");
-    QScriptEngine eng;
-    EventReceiver3 receiver(&eng);
-    eng.setProcessEventsInterval(100);
-    // scripts cannot intercept the abortion with try/catch
-    for (int y = 0; y < 4; ++y) {
-        QCoreApplication::postEvent(&receiver, new QEvent(QEvent::Type(QEvent::User+1)));
-        receiver.resultType = EventReceiver3::AbortionResult(y);
-        QScriptValue ret = eng.evaluate(QString::fromLatin1(
-                                            "while (1) {\n"
-                                            "  try {\n"
-                                            "    (function() { while (1) { } })();\n"
-                                            "  } catch (e) {\n"
-                                            "    ;\n"
-                                            "  }\n"
-                                            "}"));
-        switch (receiver.resultType) {
-        case EventReceiver3::None:
-            QVERIFY(!eng.hasUncaughtException());
-            QVERIFY(ret.isUndefined());
-            break;
-        case EventReceiver3::Number:
-            QVERIFY(!eng.hasUncaughtException());
-            QVERIFY(ret.isNumber());
-            QCOMPARE(ret.toInt(), 1234);
-            break;
-        case EventReceiver3::String:
-            QVERIFY(!eng.hasUncaughtException());
-            QVERIFY(ret.isString());
-            QCOMPARE(ret.toString(), QString::fromLatin1("Aborted"));
-            break;
-        case EventReceiver3::Error:
-            QVERIFY(eng.hasUncaughtException());
-            QVERIFY(ret.isError());
-            break;
-        }
-    }
-}
-
-void tst_QJSEngine::abortEvaluation_fromNative()
-{
-    QScriptEngine eng;
-    QScriptValue fun = eng.newFunction(myFunctionAbortingEvaluation);
-    eng.globalObject().setProperty("myFunctionAbortingEvaluation", fun);
-    QScriptValue ret = eng.evaluate("myFunctionAbortingEvaluation()");
-    QVERIFY(ret.isUndefined());
-}
-
-class ThreadedEngine : public QThread {
-    Q_OBJECT;
-
-private:
-    QScriptEngine* m_engine;
-protected:
-    void run() {
-        QObject temp;
-        m_engine = new QScriptEngine();
-        m_engine->setGlobalObject(m_engine->newQObject(&temp));
-        m_engine->evaluate("while (1) { sleep(); }");
-        delete m_engine;
-    }
-
-public slots:
-    void sleep()
-    {
-        QTest::qSleep(25);
-        m_engine->abortEvaluation();
-    }
-};
-
-void tst_QJSEngine::abortEvaluation_QTBUG9433()
-{
-    ThreadedEngine engine;
-    engine.start();
-    QVERIFY(engine.isRunning());
-    QTest::qSleep(50);
-    for (uint i = 0; i < 50; ++i) { // up to ~2500 ms
-        if (engine.isFinished())
-            return;
-        QTest::qSleep(50);
-    }
-    if (!engine.isFinished()) {
-        engine.terminate();
-        engine.wait(7000);
-        QFAIL("abortEvaluation doesn't work");
-    }
-
-}
-#endif
-
-#if 0 // ###FIXME: no QScriptEngine::isEvaluating
-static QScriptValue myFunctionReturningIsEvaluating(QScriptContext *, QScriptEngine *eng)
-{
-    return QScriptValue(eng, eng->isEvaluating());
-}
-
-class EventReceiver4 : public QObject
-{
-public:
-    EventReceiver4(QScriptEngine *eng) {
-        engine = eng;
-        wasEvaluating = false;
-    }
-
-    bool event(QEvent *e) {
-        if (e->type() == QEvent::User + 1) {
-            wasEvaluating = engine->isEvaluating();
-        }
-        return QObject::event(e);
-    }
-
-    QScriptEngine *engine;
-    bool wasEvaluating;
-};
-
-void tst_QJSEngine::isEvaluating_notEvaluating()
-{
-    QScriptEngine eng;
-
-    QVERIFY(!eng.isEvaluating());
-
-    eng.evaluate("");
-    QVERIFY(!eng.isEvaluating());
-    eng.evaluate("123");
-    QVERIFY(!eng.isEvaluating());
-    eng.evaluate("0 = 0");
-    QVERIFY(!eng.isEvaluating());
-}
-
-void tst_QJSEngine::isEvaluating_fromNative()
-{
-    QScriptEngine eng;
-    QScriptValue fun = eng.newFunction(myFunctionReturningIsEvaluating);
-    eng.globalObject().setProperty("myFunctionReturningIsEvaluating", fun);
-    QScriptValue ret = eng.evaluate("myFunctionReturningIsEvaluating()");
-    QVERIFY(ret.isBool());
-    QVERIFY(ret.toBool());
-    ret = fun.call();
-    QVERIFY(ret.isBool());
-    QVERIFY(ret.toBool());
-    ret = myFunctionReturningIsEvaluating(eng.currentContext(), &eng);
-    QVERIFY(ret.isBool());
-    QVERIFY(!ret.toBool());
-}
-
-void tst_QJSEngine::isEvaluating_fromEvent()
-{
-    QScriptEngine eng;
-    EventReceiver4 receiver(&eng);
-    QCoreApplication::postEvent(&receiver, new QEvent(QEvent::Type(QEvent::User+1)));
-
-    QString script = QString::fromLatin1(
-        "var end = Number(new Date()) + 1000;"
-        "var x = 0;"
-        "while (Number(new Date()) < end) {"
-        "    ++x;"
-        "}");
-
-    eng.setProcessEventsInterval(100);
-    eng.evaluate(script);
-    QVERIFY(receiver.wasEvaluating);
-}
-#endif
-
-static QtMsgType theMessageType;
-static QString theMessage;
-
-static void myMsgHandler(QtMsgType type, const char *msg)
-{
-    theMessageType = type;
-    theMessage = QString::fromLatin1(msg);
-}
-
-#if 0
-void tst_QJSEngine::printFunctionWithCustomHandler()
-{
-    // The built-in print() function passes the output to Qt's message
-    // handler. By installing a custom message handler, the output can be
-    // redirected without changing the print() function itself.
-    // This behavior is not documented.
-    QJSEngine eng;
-    QtMsgHandler oldHandler = qInstallMsgHandler(myMsgHandler);
-    QVERIFY(eng.globalObject().property("print").isCallable());
-
-    theMessageType = QtSystemMsg;
-    QVERIFY(theMessage.isEmpty());
-    QVERIFY(eng.evaluate("print('test')").isUndefined());
-    QCOMPARE(theMessageType, QtDebugMsg);
-    QCOMPARE(theMessage, QString::fromLatin1("test"));
-
-    theMessageType = QtSystemMsg;
-    theMessage.clear();
-    QVERIFY(eng.evaluate("print(3, true, 'little pigs')").isUndefined());
-    QCOMPARE(theMessageType, QtDebugMsg);
-    QCOMPARE(theMessage, QString::fromLatin1("3 true little pigs"));
-
-    qInstallMsgHandler(oldHandler);
-}
-
-void tst_QJSEngine::printThrowsException()
-{
-    // If an argument to print() causes an exception to be thrown when
-    // it's converted to a string, print() should propagate the exception.
-    QJSEngine eng;
-    QJSValue ret = eng.evaluate("print({ toString: function() { throw 'foo'; } });");
-    QVERIFY(eng.hasUncaughtException());
-    QVERIFY(ret.strictlyEquals(eng.toScriptValue(QLatin1String("foo"))));
-}
-#endif
-
-void tst_QJSEngine::errorConstructors()
+void tst_QJSEngine::errorConstructors()
 {
     QJSEngine eng;
     QStringList prefixes;
@@ -3994,28 +1679,6 @@ void tst_QJSEngine::argumentsProperty_JS()
     }
 }
 
-#if 0 // ###FIXME: no QScriptContext API
-static QScriptValue argumentsProperty_fun(QScriptContext *, QScriptEngine *eng)
-{
-    // Since evaluate() is done in the current context, "arguments" should
-    // refer to currentContext()->argumentsObject().
-    // This is for consistency with the built-in JS eval() function.
-    eng->evaluate("var a = arguments[0];");
-    eng->evaluate("arguments[0] = 200;");
-    return eng->evaluate("a + arguments[0]");
-}
-
-void tst_QJSEngine::argumentsProperty_evaluateInNativeFunction()
-{
-    QScriptEngine eng;
-    QScriptValue fun = eng.newFunction(argumentsProperty_fun);
-    eng.globalObject().setProperty("fun", eng.newFunction(argumentsProperty_fun));
-    QScriptValue result = eng.evaluate("fun(18)");
-    QVERIFY(result.isNumber());
-    QCOMPARE(result.toInt(), 200+18);
-}
-#endif
-
 void tst_QJSEngine::jsNumberClass()
 {
     // See ECMA-262 Section 15.7, "Number Objects".
@@ -4489,34 +2152,6 @@ void tst_QJSEngine::getterSetterThisObject_prototypeChain()
     }
 }
 
-#if 0 // ###FIXME: no QScriptContext API
-void tst_QJSEngine::getterSetterThisObject_activation()
-{
-    {
-        QScriptEngine eng;
-        QScriptContext *ctx = eng.pushContext();
-        QVERIFY(ctx != 0);
-        QScriptValue act = ctx->activationObject();
-        act.setProperty("act", act);
-        // read
-        eng.evaluate("act.__defineGetter__('x', function() { return this; })");
-        QVERIFY(eng.evaluate("x === act").toBool());
-        QEXPECT_FAIL("", "QTBUG-17605: Not possible to implement local variables as getter/setter properties", Abort);
-        QVERIFY(!eng.hasUncaughtException());
-        QVERIFY(eng.evaluate("with (act) x").equals("foo"));
-        QVERIFY(eng.evaluate("(function() { with (act) return x; })() === act").toBool());
-        eng.evaluate("q = {}; with (act) with (q) x").equals(eng.evaluate("act"));
-        eng.evaluate("with (q) with (act) x").equals(eng.evaluate("act"));
-        // write
-        eng.evaluate("act.__defineSetter__('x', function() { return this; });");
-        QVERIFY(eng.evaluate("(x = 'foo') === 'foo'").toBool());
-        QVERIFY(eng.evaluate("with (act) x = 'foo'").equals("foo"));
-        QVERIFY(eng.evaluate("with (act) with (q) x = 'foo'").equals("foo"));
-        eng.popContext();
-    }
-}
-#endif
-
 void tst_QJSEngine::jsContinueInSwitch()
 {
     // This is testing ECMA-262 compliance, not C++ API.
@@ -4817,115 +2452,6 @@ void tst_QJSEngine::jsThrowInsideWithStatement()
     }
 }
 
-#if 0 // ###FIXME: No QScriptEngineAgent API
-class TestAgent : public QScriptEngineAgent
-{
-public:
-    TestAgent(QScriptEngine *engine) : QScriptEngineAgent(engine) {}
-};
-
-void tst_QJSEngine::getSetAgent_ownership()
-{
-    // engine deleted before agent --> agent deleted too
-    QScriptEngine *eng = new QScriptEngine;
-    QCOMPARE(eng->agent(), (QScriptEngineAgent*)0);
-    TestAgent *agent = new TestAgent(eng);
-    eng->setAgent(agent);
-    QCOMPARE(eng->agent(), (QScriptEngineAgent*)agent);
-    eng->setAgent(0); // the engine maintains ownership of the old agent
-    QCOMPARE(eng->agent(), (QScriptEngineAgent*)0);
-    delete eng;
-}
-
-void tst_QJSEngine::getSetAgent_deleteAgent()
-{
-    // agent deleted before engine --> engine's agent should become 0
-    QScriptEngine *eng = new QScriptEngine;
-    TestAgent *agent = new TestAgent(eng);
-    eng->setAgent(agent);
-    QCOMPARE(eng->agent(), (QScriptEngineAgent*)agent);
-    delete agent;
-    QCOMPARE(eng->agent(), (QScriptEngineAgent*)0);
-    eng->evaluate("(function(){ return 123; })()");
-    delete eng;
-}
-
-void tst_QJSEngine::getSetAgent_differentEngine()
-{
-    QScriptEngine eng;
-    QScriptEngine eng2;
-    TestAgent *agent = new TestAgent(&eng);
-    QTest::ignoreMessage(QtWarningMsg, "QScriptEngine::setAgent(): cannot set agent belonging to different engine");
-    eng2.setAgent(agent);
-    QCOMPARE(eng2.agent(), (QScriptEngineAgent*)0);
-}
-#endif
-
-#if 0 // ###FIXME: No QScriptString API
-void tst_QJSEngine::reentrancy_stringHandles()
-{
-    QScriptEngine eng1;
-    QScriptEngine eng2;
-    QScriptString s1 = eng1.toStringHandle("foo");
-    QScriptString s2 = eng2.toStringHandle("foo");
-    QVERIFY(s1 != s2);
-}
-#endif
-
-#if 0 // ###FIXME: No processEventsInterval API
-void tst_QJSEngine::reentrancy_processEventsInterval()
-{
-    QScriptEngine eng1;
-    QScriptEngine eng2;
-    eng1.setProcessEventsInterval(123);
-    QCOMPARE(eng2.processEventsInterval(), -1);
-    eng2.setProcessEventsInterval(456);
-    QCOMPARE(eng1.processEventsInterval(), 123);
-}
-#endif
-
-#if 0 // FIXME: No support for custom types
-void tst_QJSEngine::reentrancy_typeConversion()
-{
-    QScriptEngine eng1;
-    QScriptEngine eng2;
-    qScriptRegisterMetaType<Foo>(&eng1, fooToScriptValue, fooFromScriptValue);
-    Foo foo;
-    foo.x = 12;
-    foo.y = 34;
-    {
-        QScriptValue fooVal = qScriptValueFromValue(&eng1, foo);
-        QVERIFY(fooVal.isObject());
-        QVERIFY(!fooVal.isVariant());
-        QCOMPARE(fooVal.property("x").toInt(), 12);
-        QCOMPARE(fooVal.property("y").toInt(), 34);
-        fooVal.setProperty("x", 56);
-        fooVal.setProperty("y", 78);
-
-        Foo foo2 = eng.fromScriptValue<Foo>(fooVal);
-        QCOMPARE(foo2.x, 56);
-        QCOMPARE(foo2.y, 78);
-    }
-    {
-        QScriptValue fooVal = qScriptValueFromValue(&eng2, foo);
-        QVERIFY(fooVal.isVariant());
-
-        Foo foo2 = eng.fromScriptValue<Foo>(fooVal);
-        QCOMPARE(foo2.x, 12);
-        QCOMPARE(foo2.y, 34);
-    }
-    QVERIFY(eng1.defaultPrototype(qMetaTypeId<Foo>()).isUndefined());
-    QVERIFY(eng2.defaultPrototype(qMetaTypeId<Foo>()).isUndefined());
-    QScriptValue proto1 = eng1.newObject();
-    eng1.setDefaultPrototype(qMetaTypeId<Foo>(), proto1);
-    QVERIFY(eng2.defaultPrototype(qMetaTypeId<Foo>()).isUndefined());
-    QScriptValue proto2 = eng2.newObject();
-    eng2.setDefaultPrototype(qMetaTypeId<Foo>(), proto2);
-    QVERIFY(!eng2.defaultPrototype(qMetaTypeId<Foo>()).isUndefined());
-    QVERIFY(eng1.defaultPrototype(qMetaTypeId<Foo>()).strictlyEquals(proto1));
-}
-#endif
-
 void tst_QJSEngine::reentrancy_globalObjectProperties()
 {
     QJSEngine eng1;
@@ -4978,14 +2504,6 @@ void tst_QJSEngine::reentrancy_objectCreation()
         QCOMPARE(o1.toQObject(), o2.toQObject());
         QCOMPARE(o2.toQObject(), o1.toQObject());
     }
-#if 0 // ###FIXME: No QScriptEngine::newQMetaObject API
-    {
-        QScriptValue mo1 = eng1.newQMetaObject(&staticMetaObject);
-        QScriptValue mo2 = eng2.newQMetaObject(&staticMetaObject);
-        QCOMPARE(mo1.toQMetaObject(), mo2.toQMetaObject());
-        QCOMPARE(mo2.toQMetaObject(), mo1.toQMetaObject());
-    }
-#endif
 }
 
 void tst_QJSEngine::jsIncDecNonObjectProperty()
@@ -5055,846 +2573,6 @@ void tst_QJSEngine::jsIncDecNonObjectProperty()
     }
 }
 
-#if 0 // ###FIXME: no installTranslatorFunctions API
-void tst_QJSEngine::installTranslatorFunctions()
-{
-    QScriptEngine eng;
-    QScriptValue global = eng.globalObject();
-    QVERIFY(global.property("qsTranslate").isUndefined());
-    QVERIFY(global.property("QT_TRANSLATE_NOOP").isUndefined());
-    QVERIFY(global.property("qsTr").isUndefined());
-    QVERIFY(global.property("QT_TR_NOOP").isUndefined());
-    QVERIFY(global.property("qsTrId").isUndefined());
-    QVERIFY(global.property("QT_TRID_NOOP").isUndefined());
-    QVERIFY(global.property("String").property("prototype").property("arg").isUndefined());
-
-    eng.installTranslatorFunctions();
-    QVERIFY(global.property("qsTranslate").isCallable());
-    QVERIFY(global.property("QT_TRANSLATE_NOOP").isCallable());
-    QVERIFY(global.property("qsTr").isCallable());
-    QVERIFY(global.property("QT_TR_NOOP").isCallable());
-    QVERIFY(global.property("qsTrId").isCallable());
-    QVERIFY(global.property("QT_TRID_NOOP").isCallable());
-    QVERIFY(global.property("String").property("prototype").property("arg").isCallable());
-
-    {
-        QScriptValue ret = eng.evaluate("qsTr('foo')");
-        QVERIFY(ret.isString());
-        QCOMPARE(ret.toString(), QString::fromLatin1("foo"));
-    }
-    {
-        QScriptValue ret = eng.evaluate("qsTranslate('foo', 'bar')");
-        QVERIFY(ret.isString());
-        QCOMPARE(ret.toString(), QString::fromLatin1("bar"));
-    }
-    {
-        QScriptValue ret = eng.evaluate("QT_TR_NOOP('foo')");
-        QVERIFY(ret.isString());
-        QCOMPARE(ret.toString(), QString::fromLatin1("foo"));
-    }
-    {
-        QScriptValue ret = eng.evaluate("QT_TRANSLATE_NOOP('foo', 'bar')");
-        QVERIFY(ret.isString());
-        QCOMPARE(ret.toString(), QString::fromLatin1("bar"));
-    }
-    {
-        QScriptValue ret = eng.evaluate("'foo%0'.arg('bar')");
-        QEXPECT_FAIL("Custom global object", "FIXME: why we expect that String prototype exists?", Abort);
-        QVERIFY(ret.isString());
-        QCOMPARE(ret.toString(), QString::fromLatin1("foobar"));
-    }
-    {
-        QScriptValue ret = eng.evaluate("'foo%0'.arg(123)");
-        QVERIFY(ret.isString());
-        QCOMPARE(ret.toString(), QString::fromLatin1("foo123"));
-    }
-    {
-        // Maybe this should throw an error?
-        QScriptValue ret = eng.evaluate("'foo%0'.arg()");
-        QVERIFY(ret.isString());
-        QCOMPARE(ret.toString(), QString());
-    }
-
-    {
-        QScriptValue ret = eng.evaluate("qsTrId('foo')");
-        QVERIFY(ret.isString());
-        QCOMPARE(ret.toString(), QString::fromLatin1("foo"));
-    }
-    {
-        QScriptValue ret = eng.evaluate("QT_TRID_NOOP('foo')");
-        QVERIFY(ret.isString());
-        QCOMPARE(ret.toString(), QString::fromLatin1("foo"));
-    }
-    QVERIFY(eng.evaluate("QT_TRID_NOOP()").isUndefined());
-}
-
-class TranslationScope
-{
-public:
-    TranslationScope(const QString &fileName)
-    {
-        translator.load(fileName);
-        QCoreApplication::instance()->installTranslator(&translator);
-    }
-    ~TranslationScope()
-    {
-        QCoreApplication::instance()->removeTranslator(&translator);
-    }
-
-private:
-    QTranslator translator;
-};
-
-void tst_QJSEngine::translateScript_data()
-{
-    QTest::addColumn<QString>("expression");
-    QTest::addColumn<QString>("fileName");
-    QTest::addColumn<QString>("expectedTranslation");
-
-    QString fileName = QString::fromLatin1("translatable.js");
-    // Top-level
-    QTest::newRow("qsTr('One')@translatable.js")
-            << QString::fromLatin1("qsTr('One')") << fileName << QString::fromLatin1("En");
-    QTest::newRow("qsTr('Hello')@translatable.js")
-            << QString::fromLatin1("qsTr('Hello')") << fileName << QString::fromLatin1("Hallo");
-    // From function
-    QTest::newRow("(function() { return qsTr('One'); })()@translatable.js")
-            << QString::fromLatin1("(function() { return qsTr('One'); })()") << fileName << QString::fromLatin1("En");
-    QTest::newRow("(function() { return qsTr('Hello'); })()@translatable.js")
-            << QString::fromLatin1("(function() { return qsTr('Hello'); })()") << fileName << QString::fromLatin1("Hallo");
-    // From eval
-    QTest::newRow("eval('qsTr(\\'One\\')')@translatable.js")
-            << QString::fromLatin1("eval('qsTr(\\'One\\')')") << fileName << QString::fromLatin1("En");
-    QTest::newRow("eval('qsTr(\\'Hello\\')')@translatable.js")
-            << QString::fromLatin1("eval('qsTr(\\'Hello\\')')") << fileName << QString::fromLatin1("Hallo");
-    // Plural
-    QTest::newRow("qsTr('%n message(s) saved', '', 1)@translatable.js")
-            << QString::fromLatin1("qsTr('%n message(s) saved', '', 1)") << fileName << QString::fromLatin1("1 melding lagret");
-    QTest::newRow("qsTr('%n message(s) saved', '', 3).arg@translatable.js")
-            << QString::fromLatin1("qsTr('%n message(s) saved', '', 3)") << fileName << QString::fromLatin1("3 meldinger lagret");
-
-    // Top-level
-    QTest::newRow("qsTranslate('FooContext', 'Two')@translatable.js")
-            << QString::fromLatin1("qsTranslate('FooContext', 'Two')") << fileName << QString::fromLatin1("To");
-    QTest::newRow("qsTranslate('FooContext', 'Goodbye')@translatable.js")
-            << QString::fromLatin1("qsTranslate('FooContext', 'Goodbye')") << fileName << QString::fromLatin1("Farvel");
-    // From eval
-    QTest::newRow("eval('qsTranslate(\\'FooContext\\', \\'Two\\')')@translatable.js")
-            << QString::fromLatin1("eval('qsTranslate(\\'FooContext\\', \\'Two\\')')") << fileName << QString::fromLatin1("To");
-    QTest::newRow("eval('qsTranslate(\\'FooContext\\', \\'Goodbye\\')')@translatable.js")
-            << QString::fromLatin1("eval('qsTranslate(\\'FooContext\\', \\'Goodbye\\')')") << fileName << QString::fromLatin1("Farvel");
-
-    QTest::newRow("qsTranslate('FooContext', 'Goodbye', '', 'UnicodeUTF8')@translatable.js")
-            << QString::fromLatin1("qsTranslate('FooContext', 'Goodbye', '', 'UnicodeUTF8')") << fileName << QString::fromLatin1("Farvel");
-    QTest::newRow("qsTranslate('FooContext', 'Goodbye', '', 'CodecForTr')@translatable.js")
-            << QString::fromLatin1("qsTranslate('FooContext', 'Goodbye', '', 'CodecForTr')") << fileName << QString::fromLatin1("Farvel");
-
-    QTest::newRow("qsTranslate('FooContext', 'Goodbye', '', 'UnicodeUTF8', 42)@translatable.js")
-            << QString::fromLatin1("qsTranslate('FooContext', 'Goodbye', '', 'UnicodeUTF8', 42)") << fileName << QString::fromLatin1("Goodbye");
-
-    QTest::newRow("qsTr('One', 'not the same one')@translatable.js")
-            << QString::fromLatin1("qsTr('One', 'not the same one')") << fileName << QString::fromLatin1("Enda en");
-
-    QTest::newRow("qsTr('One', 'not the same one', 42)@translatable.js")
-            << QString::fromLatin1("qsTr('One', 'not the same one', 42)") << fileName << QString::fromLatin1("One");
-
-    // Plural
-    QTest::newRow("qsTranslate('FooContext', '%n fooish bar(s) found', '', 'UnicodeUTF8', 1)@translatable.js")
-            << QString::fromLatin1("qsTranslate('FooContext', '%n fooish bar(s) found', '', 'UnicodeUTF8', 1)") << fileName << QString::fromLatin1("1 fooaktig bar funnet");
-    QTest::newRow("qsTranslate('FooContext', '%n fooish bar(s) found', '', 'UnicodeUTF8', 2)@translatable.js")
-            << QString::fromLatin1("qsTranslate('FooContext', '%n fooish bar(s) found', '', 'UnicodeUTF8', 2)") << fileName << QString::fromLatin1("2 fooaktige barer funnet");
-
-    // Don't exist in translation
-    QTest::newRow("qsTr('Three')@translatable.js")
-            << QString::fromLatin1("qsTr('Three')") << fileName << QString::fromLatin1("Three");
-    QTest::newRow("qsTranslate('FooContext', 'So long')@translatable.js")
-            << QString::fromLatin1("qsTranslate('FooContext', 'So long')") << fileName << QString::fromLatin1("So long");
-    QTest::newRow("qsTranslate('BarContext', 'Goodbye')@translatable.js")
-            << QString::fromLatin1("qsTranslate('BarContext', 'Goodbye')") << fileName << QString::fromLatin1("Goodbye");
-
-    // Translate strings from the second script (translatable2.js)
-
-    QString fileName2 = QString::fromLatin1("translatable2.js");
-    QTest::newRow("qsTr('Three')@translatable2.js")
-            << QString::fromLatin1("qsTr('Three')") << fileName2 << QString::fromLatin1("Tre");
-    QTest::newRow("qsTr('Happy birthday!')@translatable2.js")
-            << QString::fromLatin1("qsTr('Happy birthday!')") << fileName2 << QString::fromLatin1("Gratulerer med dagen!");
-
-    // Not translated because translation is only in translatable.js
-    QTest::newRow("qsTr('One')@translatable2.js")
-            << QString::fromLatin1("qsTr('One')") << fileName2 << QString::fromLatin1("One");
-    QTest::newRow("(function() { return qsTr('One'); })()@translatable2.js")
-            << QString::fromLatin1("(function() { return qsTr('One'); })()") << fileName2 << QString::fromLatin1("One");
-
-    // For qsTranslate() the filename shouldn't matter
-    QTest::newRow("qsTranslate('FooContext', 'Two')@translatable2.js")
-            << QString::fromLatin1("qsTranslate('FooContext', 'Two')") << fileName2 << QString::fromLatin1("To");
-    QTest::newRow("qsTranslate('BarContext', 'Congratulations!')@translatable.js")
-            << QString::fromLatin1("qsTranslate('BarContext', 'Congratulations!')") << fileName << QString::fromLatin1("Gratulerer!");
-}
-
-void tst_QJSEngine::translateScript()
-{
-    QFETCH(QString, expression);
-    QFETCH(QString, fileName);
-    QFETCH(QString, expectedTranslation);
-
-    QScriptEngine engine;
-
-    TranslationScope tranScope(":/translations/translatable_la");
-    engine.installTranslatorFunctions();
-
-    QCOMPARE(engine.evaluate(expression, fileName).toString(), expectedTranslation);
-    QVERIFY(!engine.hasUncaughtException());
-}
-
-void tst_QJSEngine::translateScript_crossScript()
-{
-    QScriptEngine engine;
-    TranslationScope tranScope(":/translations/translatable_la");
-    engine.installTranslatorFunctions();
-
-    QString fileName = QString::fromLatin1("translatable.js");
-    QString fileName2 = QString::fromLatin1("translatable2.js");
-    // qsTr() should use the innermost filename as context
-    engine.evaluate("function foo(s) { return bar(s); }", fileName);
-    engine.evaluate("function bar(s) { return qsTr(s); }", fileName2);
-    QCOMPARE(engine.evaluate("bar('Three')", fileName2).toString(), QString::fromLatin1("Tre"));
-    QCOMPARE(engine.evaluate("bar('Three')", fileName).toString(), QString::fromLatin1("Tre"));
-    QCOMPARE(engine.evaluate("bar('One')", fileName2).toString(), QString::fromLatin1("One"));
-
-    engine.evaluate("function foo(s) { return bar(s); }", fileName2);
-    engine.evaluate("function bar(s) { return qsTr(s); }", fileName);
-    QCOMPARE(engine.evaluate("bar('Three')", fileName2).toString(), QString::fromLatin1("Three"));
-    QCOMPARE(engine.evaluate("bar('One')", fileName).toString(), QString::fromLatin1("En"));
-    QCOMPARE(engine.evaluate("bar('One')", fileName2).toString(), QString::fromLatin1("En"));
-}
-
-static QScriptValue callQsTr(QScriptContext *ctx, QScriptEngine *eng)
-{
-    return eng->globalObject().property("qsTr").callWithInstance(ctx->thisObject(), ctx->argumentsObject());
-}
-
-void tst_QJSEngine::translateScript_callQsTrFromNative()
-{
-    QScriptEngine engine;
-    TranslationScope tranScope(":/translations/translatable_la");
-    engine.installTranslatorFunctions();
-
-    QString fileName = QString::fromLatin1("translatable.js");
-    QString fileName2 = QString::fromLatin1("translatable2.js");
-    // Calling qsTr() from a native function
-    engine.globalObject().setProperty("qsTrProxy", engine.newFunction(callQsTr));
-    QCOMPARE(engine.evaluate("qsTrProxy('One')", fileName).toString(), QString::fromLatin1("En"));
-    QCOMPARE(engine.evaluate("qsTrProxy('One')", fileName2).toString(), QString::fromLatin1("One"));
-    QCOMPARE(engine.evaluate("qsTrProxy('Three')", fileName).toString(), QString::fromLatin1("Three"));
-    QCOMPARE(engine.evaluate("qsTrProxy('Three')", fileName2).toString(), QString::fromLatin1("Tre"));
-}
-
-void tst_QJSEngine::translateScript_trNoOp()
-{
-    QScriptEngine engine;
-    TranslationScope tranScope(":/translations/translatable_la");
-    engine.installTranslatorFunctions();
-
-    QVERIFY(engine.evaluate("QT_TR_NOOP()").isUndefined());
-    QCOMPARE(engine.evaluate("QT_TR_NOOP('One')").toString(), QString::fromLatin1("One"));
-
-    QVERIFY(engine.evaluate("QT_TRANSLATE_NOOP()").isUndefined());
-    QVERIFY(engine.evaluate("QT_TRANSLATE_NOOP('FooContext')").isUndefined());
-    QCOMPARE(engine.evaluate("QT_TRANSLATE_NOOP('FooContext', 'Two')").toString(), QString::fromLatin1("Two"));
-}
-
-void tst_QJSEngine::translateScript_callQsTrFromCpp()
-{
-    QScriptEngine engine;
-    TranslationScope tranScope(":/translations/translatable_la");
-    engine.installTranslatorFunctions();
-
-    // There is no context, but it shouldn't crash
-    QCOMPARE(engine.globalObject().property("qsTr").call(
-             QScriptValueList() << "One").toString(), QString::fromLatin1("One"));
-}
-
-void tst_QJSEngine::translateWithInvalidArgs_data()
-{
-    QTest::addColumn<QString>("expression");
-    QTest::addColumn<QString>("expectedError");
-
-    QTest::newRow("qsTr()")  << "qsTr()" << "Error: qsTr() requires at least one argument";
-    QTest::newRow("qsTr(123)")  << "qsTr(123)" << "Error: qsTr(): first argument (text) must be a string";
-    QTest::newRow("qsTr('foo', 123)")  << "qsTr('foo', 123)" << "Error: qsTr(): second argument (comment) must be a string";
-    QTest::newRow("qsTr('foo', 'bar', 'baz')")  << "qsTr('foo', 'bar', 'baz')" << "Error: qsTr(): third argument (n) must be a number";
-    QTest::newRow("qsTr('foo', 'bar', true)")  << "qsTr('foo', 'bar', true)" << "Error: qsTr(): third argument (n) must be a number";
-
-    QTest::newRow("qsTranslate()")  << "qsTranslate()" << "Error: qsTranslate() requires at least two arguments";
-    QTest::newRow("qsTranslate('foo')")  << "qsTranslate('foo')" << "Error: qsTranslate() requires at least two arguments";
-    QTest::newRow("qsTranslate(123, 'foo')")  << "qsTranslate(123, 'foo')" << "Error: qsTranslate(): first argument (context) must be a string";
-    QTest::newRow("qsTranslate('foo', 123)")  << "qsTranslate('foo', 123)" << "Error: qsTranslate(): second argument (text) must be a string";
-    QTest::newRow("qsTranslate('foo', 'bar', 123)")  << "qsTranslate('foo', 'bar', 123)" << "Error: qsTranslate(): third argument (comment) must be a string";
-    QTest::newRow("qsTranslate('foo', 'bar', 'baz', 123)")  << "qsTranslate('foo', 'bar', 'baz', 123)" << "Error: qsTranslate(): fourth argument (encoding) must be a string";
-    QTest::newRow("qsTranslate('foo', 'bar', 'baz', 'zab', 'rab')")  << "qsTranslate('foo', 'bar', 'baz', 'zab', 'rab')" << "Error: qsTranslate(): fifth argument (n) must be a number";
-    QTest::newRow("qsTranslate('foo', 'bar', 'baz', 'zab', 123)")  << "qsTranslate('foo', 'bar', 'baz', 'zab', 123)" << "Error: qsTranslate(): invalid encoding 'zab'";
-
-    QTest::newRow("qsTrId()")  << "qsTrId()" << "Error: qsTrId() requires at least one argument";
-    QTest::newRow("qsTrId(123)")  << "qsTrId(123)" << "TypeError: qsTrId(): first argument (id) must be a string";
-    QTest::newRow("qsTrId('foo', 'bar')")  << "qsTrId('foo', 'bar')" << "TypeError: qsTrId(): second argument (n) must be a number";
-}
-
-void tst_QJSEngine::translateWithInvalidArgs()
-{
-    QFETCH(QString, expression);
-    QFETCH(QString, expectedError);
-    QScriptEngine engine;
-    engine.installTranslatorFunctions();
-    QScriptValue result = engine.evaluate(expression);
-    QVERIFY(result.isError());
-    QCOMPARE(result.toString(), expectedError);
-}
-
-void tst_QJSEngine::translationContext_data()
-{
-    QTest::addColumn<QString>("path");
-    QTest::addColumn<QString>("text");
-    QTest::addColumn<QString>("expectedTranslation");
-
-    QTest::newRow("translatable.js")  << "translatable.js" << "One" << "En";
-    QTest::newRow("/translatable.js")  << "/translatable.js" << "One" << "En";
-    QTest::newRow("/foo/translatable.js")  << "/foo/translatable.js" << "One" << "En";
-    QTest::newRow("/foo/bar/translatable.js")  << "/foo/bar/translatable.js" << "One" << "En";
-    QTest::newRow("./translatable.js")  << "./translatable.js" << "One" << "En";
-    QTest::newRow("../translatable.js")  << "../translatable.js" << "One" << "En";
-    QTest::newRow("foo/translatable.js")  << "foo/translatable.js" << "One" << "En";
-    QTest::newRow("file:///home/qt/translatable.js")  << "file:///home/qt/translatable.js" << "One" << "En";
-    QTest::newRow(":/resources/translatable.js")  << ":/resources/translatable.js" << "One" << "En";
-    QTest::newRow("/translatable.js.foo")  << "/translatable.js.foo" << "One" << "En";
-    QTest::newRow("/translatable.txt")  << "/translatable.txt" << "One" << "En";
-    QTest::newRow("translatable")  << "translatable" << "One" << "En";
-    QTest::newRow("foo/translatable")  << "foo/translatable" << "One" << "En";
-
-    QTest::newRow("native separators")
-        << (QDir::toNativeSeparators(QDir::currentPath()) + QDir::separator() + "translatable.js")
-        << "One" << "En";
-
-    QTest::newRow("translatable.js/")  << "translatable.js/" << "One" << "One";
-    QTest::newRow("nosuchscript.js")  << "" << "One" << "One";
-    QTest::newRow("(empty)")  << "" << "One" << "One";
-}
-
-void tst_QJSEngine::translationContext()
-{
-    TranslationScope tranScope(":/translations/translatable_la");
-
-    QScriptEngine engine;
-    engine.installTranslatorFunctions();
-
-    QFETCH(QString, path);
-    QFETCH(QString, text);
-    QFETCH(QString, expectedTranslation);
-    QScriptValue ret = engine.evaluate(QString::fromLatin1("qsTr('%0')").arg(text), path);
-    QVERIFY(ret.isString());
-    QCOMPARE(ret.toString(), expectedTranslation);
-}
-
-void tst_QJSEngine::translateScriptIdBased()
-{
-    QScriptEngine engine;
-
-    TranslationScope tranScope(":/translations/idtranslatable_la");
-    engine.installTranslatorFunctions();
-
-    QString fileName = QString::fromLatin1("idtranslatable.js");
-
-    QHash<QString, QString> expectedTranslations;
-    expectedTranslations["qtn_foo_bar"] = "First string";
-    expectedTranslations["qtn_needle"] = "Second string";
-    expectedTranslations["qtn_haystack"] = "Third string";
-    expectedTranslations["qtn_bar_baz"] = "Fourth string";
-
-    QHash<QString, QString>::const_iterator it;
-    for (it = expectedTranslations.constBegin(); it != expectedTranslations.constEnd(); ++it) {
-        for (int x = 0; x < 2; ++x) {
-            QString fn;
-            if (x)
-                fn = fileName;
-            // Top-level
-            QCOMPARE(engine.evaluate(QString::fromLatin1("qsTrId('%0')")
-                                     .arg(it.key()), fn).toString(),
-                     it.value());
-            QCOMPARE(engine.evaluate(QString::fromLatin1("QT_TRID_NOOP('%0')")
-                                     .arg(it.key()), fn).toString(),
-                     it.key());
-            // From function
-            QCOMPARE(engine.evaluate(QString::fromLatin1("(function() { return qsTrId('%0'); })()")
-                                     .arg(it.key()), fn).toString(),
-                     it.value());
-            QCOMPARE(engine.evaluate(QString::fromLatin1("(function() { return QT_TRID_NOOP('%0'); })()")
-                                     .arg(it.key()), fn).toString(),
-                     it.key());
-        }
-    }
-
-    // Plural form
-    QCOMPARE(engine.evaluate("qsTrId('qtn_bar_baz', 10)").toString(),
-             QString::fromLatin1("10 fooish bar(s) found"));
-    QCOMPARE(engine.evaluate("qsTrId('qtn_foo_bar', 10)").toString(),
-             QString::fromLatin1("qtn_foo_bar")); // Doesn't have plural
-}
-
-// How to add a new test row:
-// - Find a nice list of Unicode characters to choose from
-// - Write source string/context/comment in .js using Unicode escape sequences (\uABCD)
-// - Update corresponding .ts file (e.g. lupdate foo.js -ts foo.ts -codecfortr UTF-8)
-// - Enter translation in Linguist
-// - Update corresponding .qm file (e.g. lrelease foo.ts)
-// - Evaluate script that performs translation; make sure the correct result is returned
-//   (e.g. by setting the resulting string as the text of a QLabel and visually verifying
-//   that it looks the same as what you entered in Linguist :-) )
-// - Generate the expectedTranslation column data using toUtf8().toHex()
-void tst_QJSEngine::translateScriptUnicode_data()
-{
-    QTest::addColumn<QString>("expression");
-    QTest::addColumn<QString>("fileName");
-    QTest::addColumn<QString>("expectedTranslation");
-
-    QString fileName = QString::fromLatin1("translatable-unicode.js");
-    QTest::newRow("qsTr('H\\u2082O')@translatable-unicode.js")
-            << QString::fromLatin1("qsTr('H\\u2082O')") << fileName << QString::fromUtf8("\xcd\xbb\xcd\xbc\xcd\xbd");
-    QTest::newRow("qsTranslate('\\u010C\\u0101\\u011F\\u0115', 'CO\\u2082')@translatable-unicode.js")
-            << QString::fromLatin1("qsTranslate('\\u010C\\u0101\\u011F\\u0115', 'CO\\u2082')") << fileName << QString::fromUtf8("\xd7\x91\xd7\x9a\xd7\xa2");
-    QTest::newRow("qsTr('\\u0391\\u0392\\u0393')@translatable-unicode.js")
-            << QString::fromLatin1("qsTr('\\u0391\\u0392\\u0393')") << fileName << QString::fromUtf8("\xd3\x9c\xd2\xb4\xd1\xbc");
-    QTest::newRow("qsTranslate('\\u010C\\u0101\\u011F\\u0115', '\\u0414\\u0415\\u0416')@translatable-unicode.js")
-            << QString::fromLatin1("qsTranslate('\\u010C\\u0101\\u011F\\u0115', '\\u0414\\u0415\\u0416')") << fileName << QString::fromUtf8("\xd8\xae\xd8\xb3\xd8\xb3");
-    QTest::newRow("qsTr('H\\u2082O', 'not the same H\\u2082O')@translatable-unicode.js")
-            << QString::fromLatin1("qsTr('H\\u2082O', 'not the same H\\u2082O')") << fileName << QString::fromUtf8("\xd4\xb6\xd5\x8a\xd5\x92");
-    QTest::newRow("qsTr('H\\u2082O')")
-            << QString::fromLatin1("qsTr('H\\u2082O')") << QString() << QString::fromUtf8("\x48\xe2\x82\x82\x4f");
-    QTest::newRow("qsTranslate('\\u010C\\u0101\\u011F\\u0115', 'CO\\u2082')")
-            << QString::fromLatin1("qsTranslate('\\u010C\\u0101\\u011F\\u0115', 'CO\\u2082')") << QString() << QString::fromUtf8("\xd7\x91\xd7\x9a\xd7\xa2");
-}
-
-void tst_QJSEngine::translateScriptUnicode()
-{
-    QFETCH(QString, expression);
-    QFETCH(QString, fileName);
-    QFETCH(QString, expectedTranslation);
-
-    QScriptEngine engine;
-
-    TranslationScope tranScope(":/translations/translatable-unicode");
-    engine.installTranslatorFunctions();
-
-    QCOMPARE(engine.evaluate(expression, fileName).toString(), expectedTranslation);
-    QVERIFY(!engine.hasUncaughtException());
-}
-
-void tst_QJSEngine::translateScriptUnicodeIdBased_data()
-{
-    QTest::addColumn<QString>("expression");
-    QTest::addColumn<QString>("expectedTranslation");
-
-    QTest::newRow("qsTrId('\\u01F8\\u01D2\\u0199\\u01D0\\u01E1'')")
-            << QString::fromLatin1("qsTrId('\\u01F8\\u01D2\\u0199\\u01D0\\u01E1')") << QString::fromUtf8("\xc6\xa7\xc6\xb0\xc6\x88\xc8\xbc\xc8\x9d\xc8\xbf\xc8\x99");
-    QTest::newRow("qsTrId('\\u0191\\u01CE\\u0211\\u0229\\u019C\\u018E\\u019A\\u01D0')")
-            << QString::fromLatin1("qsTrId('\\u0191\\u01CE\\u0211\\u0229\\u019C\\u018E\\u019A\\u01D0')") << QString::fromUtf8("\xc7\xa0\xc8\xa1\xc8\x8b\xc8\x85\xc8\x95");
-    QTest::newRow("qsTrId('\\u0181\\u01A1\\u0213\\u018F\\u018C', 10)")
-            << QString::fromLatin1("qsTrId('\\u0181\\u01A1\\u0213\\u018F\\u018C', 10)") << QString::fromUtf8("\x31\x30\x20\xc6\x92\xc6\xa1\xc7\x92\x28\xc8\x99\x29");
-    QTest::newRow("qsTrId('\\u0181\\u01A1\\u0213\\u018F\\u018C')")
-            << QString::fromLatin1("qsTrId('\\u0181\\u01A1\\u0213\\u018F\\u018C')") << QString::fromUtf8("\xc6\x91\xc6\xb0\xc7\xb9");
-    QTest::newRow("qsTrId('\\u01CD\\u0180\\u01A8\\u0190\\u019E\\u01AB')")
-            << QString::fromLatin1("qsTrId('\\u01CD\\u0180\\u01A8\\u0190\\u019E\\u01AB')") << QString::fromUtf8("\xc7\x8d\xc6\x80\xc6\xa8\xc6\x90\xc6\x9e\xc6\xab");
-}
-
-void tst_QJSEngine::translateScriptUnicodeIdBased()
-{
-    QFETCH(QString, expression);
-    QFETCH(QString, expectedTranslation);
-
-    QScriptEngine engine;
-
-    TranslationScope tranScope(":/translations/idtranslatable-unicode");
-    engine.installTranslatorFunctions();
-
-    QCOMPARE(engine.evaluate(expression).toString(), expectedTranslation);
-    QVERIFY(!engine.hasUncaughtException());
-}
-
-void tst_QJSEngine::translateFromBuiltinCallback()
-{
-    QScriptEngine eng;
-    eng.installTranslatorFunctions();
-
-    // Callback has no translation context.
-    eng.evaluate("function foo() { qsTr('foo'); }");
-
-    // Stack at translation time will be:
-    // qsTr, foo, forEach, global
-    // qsTr() needs to walk to the outer-most (global) frame before it finds
-    // a translation context, and this should not crash.
-    eng.evaluate("[10,20].forEach(foo)", "script.js");
-}
-#endif
-
-#if 0 // ###FIXME: No QScriptValue::scope API
-void tst_QJSEngine::functionScopes()
-{
-    QScriptEngine eng;
-    {
-        // top-level functions have only the global object in their scope
-        QScriptValue fun = eng.evaluate("(function() {})");
-        QVERIFY(fun.isCallable());
-        QEXPECT_FAIL("", "QScriptValue::scope() is internal, not implemented", Abort);
-        QVERIFY(fun.scope().isObject());
-        QVERIFY(fun.scope().strictlyEquals(eng.globalObject()));
-        QVERIFY(eng.globalObject().scope().isUndefined());
-    }
-    {
-        QScriptValue fun = eng.globalObject().property("Object");
-        QVERIFY(fun.isCallable());
-        // native built-in functions don't have scope
-        QVERIFY(fun.scope().isUndefined());
-    }
-    {
-        // closure
-        QScriptValue fun = eng.evaluate("(function(arg) { var foo = arg; return function() { return foo; }; })(123)");
-        QVERIFY(fun.isCallable());
-        {
-            QScriptValue ret = fun.call();
-            QVERIFY(ret.isNumber());
-            QCOMPARE(ret.toInt(), 123);
-        }
-        QScriptValue scope = fun.scope();
-        QVERIFY(scope.isObject());
-        {
-            QScriptValue ret = scope.property("foo");
-            QVERIFY(ret.isNumber());
-            QCOMPARE(ret.toInt(), 123);
-        }
-        {
-            QScriptValue ret = scope.property("arg");
-            QVERIFY(ret.isNumber());
-            QCOMPARE(ret.toInt(), 123);
-        }
-
-        scope.setProperty("foo", 456);
-        {
-            QScriptValue ret = fun.call();
-            QVERIFY(ret.isNumber());
-            QCOMPARE(ret.toInt(), 456);
-        }
-
-        scope = scope.scope();
-        QVERIFY(scope.isObject());
-        QVERIFY(scope.strictlyEquals(eng.globalObject()));
-    }
-}
-#endif
-
-#if 0 // ###FIXME: No QScriptContext API
-static QScriptValue counter_inner(QScriptContext *ctx, QScriptEngine *)
-{
-     QScriptValue outerAct = ctx->callee().scope();
-     double count = outerAct.property("count").toNumber();
-     outerAct.setProperty("count", count+1);
-     return count;
-}
-
-static QScriptValue counter(QScriptContext *ctx, QScriptEngine *eng)
-{
-     QScriptValue act = ctx->activationObject();
-     act.setProperty("count", ctx->argument(0).toInt());
-     QScriptValue result = eng->newFunction(counter_inner);
-     result.setScope(act);
-     return result;
-}
-
-static QScriptValue counter_hybrid(QScriptContext *ctx, QScriptEngine *eng)
-{
-     QScriptValue act = ctx->activationObject();
-     act.setProperty("count", ctx->argument(0).toInt());
-     return eng->evaluate("(function() { return count++; })");
-}
-
-void tst_QJSEngine::nativeFunctionScopes()
-{
-    QScriptEngine eng;
-    {
-        QScriptValue fun = eng.newFunction(counter);
-        QScriptValue cnt = fun.call(QScriptValueList() << 123);
-        QVERIFY(cnt.isCallable());
-        {
-            QScriptValue ret = cnt.call();
-            QVERIFY(ret.isNumber());
-            QEXPECT_FAIL("", "QScriptValue::setScope not implemented", Continue);
-            QCOMPARE(ret.toInt(), 123);
-        }
-    }
-    {
-        QScriptValue fun = eng.newFunction(counter_hybrid);
-        QScriptValue cnt = fun.call(QScriptValueList() << 123);
-        QVERIFY(cnt.isCallable());
-        {
-            QScriptValue ret = cnt.call();
-            QVERIFY(ret.isNumber());
-            QCOMPARE(ret.toInt(), 123);
-        }
-    }
-
-    //from http://doc.trolltech.com/latest/qtscript.html#nested-functions-and-the-scope-chain
-    {
-        QScriptEngine eng;
-        eng.evaluate("function counter() { var count = 0; return function() { return count++; } }\n"
-                     "var c1 = counter();  var c2 = counter(); ");
-        QCOMPARE(eng.evaluate("c1()").toString(), QString::fromLatin1("0"));
-        QCOMPARE(eng.evaluate("c1()").toString(), QString::fromLatin1("1"));
-        QCOMPARE(eng.evaluate("c2()").toString(), QString::fromLatin1("0"));
-        QCOMPARE(eng.evaluate("c2()").toString(), QString::fromLatin1("1"));
-        QVERIFY(!eng.hasUncaughtException());
-    }
-    {
-        QScriptEngine eng;
-        eng.globalObject().setProperty("counter", eng.newFunction(counter));
-        eng.evaluate("var c1 = counter();  var c2 = counter(); ");
-        QCOMPARE(eng.evaluate("c1()").toString(), QString::fromLatin1("0"));
-        QEXPECT_FAIL("", "QScriptValue::setScope not implemented", Continue);
-        QCOMPARE(eng.evaluate("c1()").toString(), QString::fromLatin1("1"));
-        QCOMPARE(eng.evaluate("c2()").toString(), QString::fromLatin1("0"));
-        QEXPECT_FAIL("", "QScriptValue::setScope not implemented", Continue);
-        QCOMPARE(eng.evaluate("c2()").toString(), QString::fromLatin1("1"));
-        QVERIFY(!eng.hasUncaughtException());
-    }
-    {
-        QScriptEngine eng;
-        eng.globalObject().setProperty("counter", eng.newFunction(counter_hybrid));
-        eng.evaluate("var c1 = counter();  var c2 = counter(); ");
-        QCOMPARE(eng.evaluate("c1()").toString(), QString::fromLatin1("0"));
-        QCOMPARE(eng.evaluate("c1()").toString(), QString::fromLatin1("1"));
-        QCOMPARE(eng.evaluate("c2()").toString(), QString::fromLatin1("0"));
-        QCOMPARE(eng.evaluate("c2()").toString(), QString::fromLatin1("1"));
-        QVERIFY(!eng.hasUncaughtException());
-    }
-}
-#endif
-
-#if 0 // ###FIXME: No QScriptProgram API
-static QScriptValue createProgram(QScriptContext *ctx, QScriptEngine *eng)
-{
-    QString code = ctx->argument(0).toString();
-    QScriptProgram result(code);
-    return qScriptValueFromValue(eng, result);
-}
-
-void tst_QJSEngine::evaluateProgram()
-{
-    QScriptEngine eng;
-
-    {
-        QString code("1 + 2");
-        QString fileName("hello.js");
-        int lineNumber(123);
-        QScriptProgram program(code, fileName, lineNumber);
-        QVERIFY(!program.isNull());
-        QCOMPARE(program.sourceCode(), code);
-        QCOMPARE(program.fileName(), fileName);
-        QCOMPARE(program.firstLineNumber(), lineNumber);
-
-        QScriptValue expected = eng.evaluate(code);
-        for (int x = 0; x < 10; ++x) {
-            QScriptValue ret = eng.evaluate(program);
-            QVERIFY(ret.equals(expected));
-        }
-
-        // operator=
-        QScriptProgram sameProgram = program;
-        QVERIFY(sameProgram == program);
-        QVERIFY(eng.evaluate(sameProgram).equals(expected));
-
-        // copy constructor
-        QScriptProgram sameProgram2(program);
-        QVERIFY(sameProgram2 == program);
-        QVERIFY(eng.evaluate(sameProgram2).equals(expected));
-
-        QScriptProgram differentProgram("2 + 3");
-        QVERIFY(differentProgram != program);
-        QVERIFY(!eng.evaluate(differentProgram).equals(expected));
-    }
-}
-
-void tst_QJSEngine::evaluateProgram_customScope()
-{
-    QScriptEngine eng;
-    {
-        QScriptProgram program("a");
-        QVERIFY(!program.isNull());
-        {
-            QScriptValue ret = eng.evaluate(program);
-            QVERIFY(ret.isError());
-            QCOMPARE(ret.toString(), QString::fromLatin1("ReferenceError: a is not defined"));
-        }
-
-        QScriptValue obj = eng.newObject();
-        obj.setProperty("a", 123);
-        QScriptContext *ctx = eng.currentContext();
-        ctx->pushScope(obj);
-        {
-            QScriptValue ret = eng.evaluate(program);
-            QVERIFY(!ret.isError());
-            QVERIFY(ret.equals(obj.property("a")));
-        }
-
-        obj.setProperty("a", QScriptValue());
-        {
-            QScriptValue ret = eng.evaluate(program);
-            QVERIFY(ret.isError());
-        }
-
-        QScriptValue obj2 = eng.newObject();
-        obj2.setProperty("a", 456);
-        ctx->pushScope(obj2);
-        {
-            QScriptValue ret = eng.evaluate(program);
-            QVERIFY(!ret.isError());
-            QVERIFY(ret.equals(obj2.property("a")));
-        }
-
-        ctx->popScope();
-    }
-}
-
-void tst_QJSEngine::evaluateProgram_closure()
-{
-    QScriptEngine eng;
-    {
-        QScriptProgram program("(function() { var count = 0; return function() { return count++; }; })");
-        QVERIFY(!program.isNull());
-        QScriptValue createCounter = eng.evaluate(program);
-        QVERIFY(createCounter.isCallable());
-        QScriptValue counter = createCounter.call();
-        QVERIFY(counter.isCallable());
-        {
-            QScriptValue ret = counter.call();
-            QVERIFY(ret.isNumber());
-        }
-        QScriptValue counter2 = createCounter.call();
-        QVERIFY(counter2.isCallable());
-        QVERIFY(!counter2.equals(counter));
-        {
-            QScriptValue ret = counter2.call();
-            QVERIFY(ret.isNumber());
-        }
-    }
-}
-
-void tst_QJSEngine::evaluateProgram_executeLater()
-{
-    QScriptEngine eng;
-    // Program created in a function call, then executed later
-    {
-        QScriptValue fun = eng.newFunction(createProgram);
-        QScriptProgram program = qscriptvalue_cast<QScriptProgram>(
-            fun.call(QScriptValueList() << "a + 1"));
-        QVERIFY(!program.isNull());
-        eng.globalObject().setProperty("a", QScriptValue());
-        {
-            QScriptValue ret = eng.evaluate(program);
-            QVERIFY(ret.isError());
-            QCOMPARE(ret.toString(), QString::fromLatin1("ReferenceError: a is not defined"));
-        }
-        eng.globalObject().setProperty("a", 122);
-        {
-            QScriptValue ret = eng.evaluate(program);
-            QVERIFY(!ret.isError());
-            QVERIFY(ret.isNumber());
-            QCOMPARE(ret.toInt(), 123);
-        }
-    }
-}
-
-void tst_QJSEngine::evaluateProgram_multipleEngines()
-{
-    QScriptEngine eng;
-    {
-        QString code("1 + 2");
-        QScriptProgram program(code);
-        QVERIFY(!program.isNull());
-        double expected = eng.evaluate(program).toNumber();
-        for (int x = 0; x < 2; ++x) {
-            QScriptEngine eng2;
-            for (int y = 0; y < 2; ++y) {
-                double ret = eng2.evaluate(program).toNumber();
-                QCOMPARE(ret, expected);
-            }
-        }
-    }
-}
-
-void tst_QJSEngine::evaluateProgram_empty()
-{
-    QScriptEngine eng;
-    {
-        QScriptProgram program;
-        QVERIFY(program.isNull());
-        QScriptValue ret = eng.evaluate(program);
-        QVERIFY(ret.isUndefined());
-    }
-}
-#endif
-
-#if 0 // ###FIXME: No ScriptOwnership API
-void tst_QJSEngine::collectGarbageAfterConnect()
-{
-    // QTBUG-6366
-    QScriptEngine engine;
-    QPointer<QWidget> widget = new QWidget;
-    engine.globalObject().setProperty(
-        "widget", engine.newQObject(widget, QScriptEngine::ScriptOwnership));
-    QVERIFY(engine.evaluate("widget.customContextMenuRequested.connect(\n"
-                            "  function() { print('hello'); }\n"
-                            ");")
-            .isUndefined());
-    QVERIFY(widget != 0);
-    engine.evaluate("widget = null;");
-    // The connection should not keep the widget alive.
-    collectGarbage_helper(engine);
-    QVERIFY(widget == 0);
-}
-#endif
-
-#if 0 // ###FIXME: No QScriptContext API
-void tst_QJSEngine::collectGarbageAfterNativeArguments()
-{
-    // QTBUG-17788
-    QScriptEngine eng;
-    QScriptContext *ctx = eng.pushContext();
-    QScriptValue arguments = ctx->argumentsObject();
-    // Shouldn't crash when marking the arguments object.
-    collectGarbage_helper(eng);
-}
-
-static QScriptValue constructQObjectFromThisObject(QScriptContext *ctx, QScriptEngine *eng)
-{
-    if (!ctx->isCalledAsConstructor()) {
-        qWarning("%s: ctx->isCalledAsConstructor() returned false", Q_FUNC_INFO);
-        return QScriptValue();
-    }
-    return eng->newQObject(ctx->thisObject(), new QObject, QScriptEngine::ScriptOwnership);
-}
-
-void tst_QJSEngine::promoteThisObjectToQObjectInConstructor()
-{
-    QScriptEngine engine;
-    QScriptValue ctor = engine.newFunction(constructQObjectFromThisObject);
-    engine.globalObject().setProperty("Ctor", ctor);
-    QScriptValue object = engine.evaluate("new Ctor");
-    QVERIFY(!object.isError());
-    QVERIFY(object.isQObject());
-    QVERIFY(object.toQObject() != 0);
-    QVERIFY(object.property("objectName").isString());
-    QVERIFY(object.property("deleteLater").isCallable());
-}
-#endif
-
 static QRegExp minimal(QRegExp r) { r.setMinimal(true); return r; }
 
 void tst_QJSEngine::qRegExpInport_data()
@@ -5909,8 +2587,6 @@ void tst_QJSEngine::qRegExpInport_data()
     QTest::newRow("case insensitive2)")  << QRegExp("(Test|Foo)", Qt::CaseInsensitive) << "test _ foo _ test _ Foo";
     QTest::newRow("b(a*)(b*)")  << QRegExp("b(a*)(b*)", Qt::CaseInsensitive) << "aaabbBbaAabaAaababaaabbaaab";
     QTest::newRow("greedy")  << QRegExp("a*(a*)", Qt::CaseInsensitive, QRegExp::RegExp2) << "aaaabaaba";
-    // this one will fail because we do not support the QRegExp::RegExp in JSC
-    //QTest::newRow("not_greedy")  << QRegExp("a*(a*)", Qt::CaseInsensitive, QRegExp::RegExp) << "aaaabaaba";
     QTest::newRow("willcard")  << QRegExp("*.txt", Qt::CaseSensitive, QRegExp::Wildcard) << "file.txt";
     QTest::newRow("willcard 2")  << QRegExp("a?b.txt", Qt::CaseSensitive, QRegExp::Wildcard) << "ab.txt abb.rtc acb.txt";
     QTest::newRow("slash")  << QRegExp("g/.*/s", Qt::CaseInsensitive, QRegExp::RegExp2) << "string/string/string";
@@ -6013,311 +2689,6 @@ void tst_QJSEngine::dateConversionQtJS()
     }
 }
 
-#if 0 // ###FIXME: No QScriptContext API
-static QScriptValue createAnotherEngine(QScriptContext *, QScriptEngine *)
-{
-    QScriptEngine eng;
-    eng.evaluate("function foo(x, y) { return x + y; }" );
-    eng.evaluate("hello = 5; world = 6" );
-    return eng.evaluate("foo(hello,world)").toInt();
-}
-
-
-void tst_QJSEngine::reentrency()
-{
-    QScriptEngine eng;
-    eng.globalObject().setProperty("foo", eng.newFunction(createAnotherEngine));
-    eng.evaluate("function bar() { return foo(); }  hello = 9; function getHello() { return hello; }");
-    QCOMPARE(eng.evaluate("foo() + getHello() + foo()").toInt(), 5+6 + 9 + 5+6);
-    QCOMPARE(eng.evaluate("foo").call().toInt(), 5+6);
-    QCOMPARE(eng.evaluate("hello").toInt(), 9);
-    QCOMPARE(eng.evaluate("foo() + hello").toInt(), 5+6+9);
-}
-#endif
-
-#if 0 // ###FIXME: No QSCriptDeclarativeClass API
-void tst_QJSEngine::newFixedStaticScopeObject()
-{
-    // "Static scope objects" is an optimization we do for QML.
-    // It enables the creation of JS objects that can guarantee to the
-    // compiler that no properties will be added or removed. This enables
-    // the compiler to generate a very simple (fast) property access, as
-    // opposed to a full virtual lookup. Due to the inherent use of scope
-    // chains in QML, this can make a huge difference (10x improvement for
-    // benchmark in QTBUG-8576).
-    // Ideally we would not need a special object type for this, and the
-    // VM would dynamically optimize it to be fast...
-    // See also QScriptEngine benchmark.
-
-    QScriptEngine eng;
-    static const int propertyCount = 4;
-    QString names[] = { "foo", "bar", "baz", "Math" };
-    QScriptValue values[] = { 123, "ciao", true, false };
-    QScriptValue::PropertyFlags flags[] = { QScriptValue::Undeletable,
-                                            QScriptValue::ReadOnly | QScriptValue::Undeletable,
-                                            QScriptValue::SkipInEnumeration | QScriptValue::Undeletable,
-                                            QScriptValue::Undeletable };
-    QScriptValue scope = QScriptDeclarativeClass::newStaticScopeObject(&eng, propertyCount, names, values, flags);
-
-    // Query property.
-    for (int i = 0; i < propertyCount; ++i) {
-        for (int x = 0; x < 2; ++x) {
-            if (x) {
-                // Properties can't be deleted.
-                scope.setProperty(names[i], QScriptValue());
-            }
-            QVERIFY(scope.property(names[i]).equals(values[i]));
-        }
-    }
-
-    // Property that doesn't exist.
-    QVERIFY(scope.property("noSuchProperty").isUndefined());
-
-    // Write to writable property.
-    {
-        QScriptValue oldValue = scope.property("foo");
-        QVERIFY(oldValue.isNumber());
-        QScriptValue newValue = oldValue.toNumber() * 2;
-        scope.setProperty("foo", newValue);
-        QVERIFY(scope.property("foo").equals(newValue));
-        scope.setProperty("foo", oldValue);
-        QVERIFY(scope.property("foo").equals(oldValue));
-    }
-
-    // Write to read-only property.
-    scope.setProperty("bar", 456);
-    QVERIFY(scope.property("bar").equals("ciao"));
-
-    // Iterate.
-    {
-        QScriptValueIterator it(scope);
-        QSet<QString> iteratedNames;
-        while (it.hasNext()) {
-            it.next();
-            iteratedNames.insert(it.name());
-        }
-        for (int i = 0; i < propertyCount; ++i)
-            QVERIFY(iteratedNames.contains(names[i]));
-    }
-
-    // Push it on the scope chain of a new context.
-    QScriptContext *ctx = eng.pushContext();
-    ctx->pushScope(scope);
-    QCOMPARE(ctx->scopeChain().size(), 3); // Global Object, native activation, custom scope
-    QEXPECT_FAIL("", "activationObject has not been implemented yet", Continue);
-    QVERIFY(ctx->activationObject().equals(scope));
-
-    // Read property from JS.
-    for (int i = 0; i < propertyCount; ++i) {
-        for (int x = 0; x < 2; ++x) {
-            if (x) {
-                // Property can't be deleted from JS.
-                QScriptValue ret = eng.evaluate(QString::fromLatin1("delete %0").arg(names[i]));
-                QVERIFY(ret.equals(false));
-            }
-            QVERIFY(eng.evaluate(names[i]).equals(values[i]));
-        }
-    }
-
-    // Property that doesn't exist.
-    QVERIFY(eng.evaluate("noSuchProperty").equals("ReferenceError: noSuchProperty is not defined"));
-
-    // Write property from JS.
-    {
-        QScriptValue oldValue = eng.evaluate("foo");
-        QVERIFY(oldValue.isNumber());
-        QScriptValue newValue = oldValue.toNumber() * 2;
-        QVERIFY(eng.evaluate("foo = foo * 2; foo").equals(newValue));
-        scope.setProperty("foo", oldValue);
-        QVERIFY(eng.evaluate("foo").equals(oldValue));
-    }
-
-    // Write to read-only property.
-    QVERIFY(eng.evaluate("bar = 456; bar").equals("ciao"));
-
-    // Create a closure and return properties from there.
-    {
-        QScriptValue props = eng.evaluate("(function() { var baz = 'shadow'; return [foo, bar, baz, Math, Array]; })()");
-        QVERIFY(props.isArray());
-        // "foo" and "bar" come from scope object.
-        QVERIFY(props.property(0).equals(scope.property("foo")));
-        QVERIFY(props.property(1).equals(scope.property("bar")));
-        // "baz" shadows property in scope object.
-        QVERIFY(props.property(2).equals("shadow"));
-        // "Math" comes from scope object, and shadows Global Object's "Math".
-        QVERIFY(props.property(3).equals(scope.property("Math")));
-        QVERIFY(!props.property(3).equals(eng.globalObject().property("Math")));
-        // "Array" comes from Global Object.
-        QVERIFY(props.property(4).equals(eng.globalObject().property("Array")));
-    }
-
-    // As with normal JS, assigning to an undefined variable will create
-    // the property on the Global Object, not the inner scope.
-    QVERIFY(eng.globalObject().property("newProperty").isUndefined());
-    QVERIFY(eng.evaluate("(function() { newProperty = 789; })()").isUndefined());
-    QVERIFY(!scope.property("newProperty").isUndefined());
-    QVERIFY(eng.globalObject().property("newProperty").isNumber());
-
-    // Nested static scope.
-    {
-        static const int propertyCount2 = 2;
-        QString names2[] = { "foo", "hum" };
-        QScriptValue values2[] = { 321, "hello" };
-        QScriptValue::PropertyFlags flags2[] = { QScriptValue::Undeletable,
-                                                 QScriptValue::ReadOnly | QScriptValue::Undeletable };
-        QScriptValue scope2 = QScriptDeclarativeClass::newStaticScopeObject(&eng, propertyCount2, names2, values2, flags2);
-        ctx->pushScope(scope2);
-
-        // "foo" shadows scope.foo.
-        QVERIFY(eng.evaluate("foo").equals(scope2.property("foo")));
-        QVERIFY(!eng.evaluate("foo").equals(scope.property("foo")));
-        // "hum" comes from scope2.
-        QVERIFY(eng.evaluate("hum").equals(scope2.property("hum")));
-        // "Array" comes from Global Object.
-        QVERIFY(eng.evaluate("Array").equals(eng.globalObject().property("Array")));
-
-        ctx->popScope();
-    }
-
-    QScriptValue fun = eng.evaluate("(function() { return foo; })");
-    QVERIFY(fun.isCallable());
-    eng.popContext();
-    // Function's scope chain persists after popContext().
-    QVERIFY(fun.call().equals(scope.property("foo")));
-}
-
-void tst_QJSEngine::newGrowingStaticScopeObject()
-{
-    // The main use case for a growing static scope object is to set it as
-    // the activation object of a QScriptContext, so that all JS variable
-    // declarations end up in that object. It needs to be "growable" since
-    // we don't know in advance how many variables a script will declare.
-
-    QScriptEngine eng;
-    QScriptValue scope = QScriptDeclarativeClass::newStaticScopeObject(&eng);
-
-    // Initially empty.
-    QVERIFY(!QScriptValueIterator(scope).hasNext());
-    QVERIFY(scope.property("foo").isUndefined());
-
-    // Add a static property.
-    scope.setProperty("foo", 123);
-    QVERIFY(scope.property("foo").equals(123));
-    QEXPECT_FAIL("", "FIXME: newStaticScopeObject not properly implemented", Abort);
-
-    // Modify existing property.
-    scope.setProperty("foo", 456);
-    QVERIFY(scope.property("foo").equals(456));
-
-    // Add a read-only property.
-    scope.setProperty("bar", "ciao", QScriptValue::ReadOnly);
-    QVERIFY(scope.property("bar").equals("ciao"));
-
-    // Attempt to modify read-only property.
-    scope.setProperty("bar", "hello");
-    QVERIFY(scope.property("bar").equals("ciao"));
-
-    // Properties can't be deleted.
-    scope.setProperty("foo", QScriptValue());
-    QVERIFY(scope.property("foo").equals(456));
-    scope.setProperty("bar", QScriptValue());
-    QVERIFY(scope.property("bar").equals("ciao"));
-
-    // Iterate.
-    {
-        QScriptValueIterator it(scope);
-        QSet<QString> iteratedNames;
-        while (it.hasNext()) {
-            it.next();
-            iteratedNames.insert(it.name());
-        }
-        QCOMPARE(iteratedNames.size(), 2);
-        QVERIFY(iteratedNames.contains("foo"));
-        QVERIFY(iteratedNames.contains("bar"));
-    }
-
-    // Push it on the scope chain of a new context.
-    QScriptContext *ctx = eng.pushContext();
-    ctx->pushScope(scope);
-    QCOMPARE(ctx->scopeChain().size(), 3); // Global Object, native activation, custom scope
-    QVERIFY(ctx->activationObject().equals(scope));
-
-    // Read property from JS.
-    QVERIFY(eng.evaluate("foo").equals(scope.property("foo")));
-    QVERIFY(eng.evaluate("bar").equals(scope.property("bar")));
-
-    // Write property from JS.
-    {
-        QScriptValue oldValue = eng.evaluate("foo");
-        QVERIFY(oldValue.isNumber());
-        QScriptValue newValue = oldValue.toNumber() * 2;
-        QVERIFY(eng.evaluate("foo = foo * 2; foo").equals(newValue));
-        scope.setProperty("foo", oldValue);
-        QVERIFY(eng.evaluate("foo").equals(oldValue));
-    }
-
-    // Write to read-only property.
-    QVERIFY(eng.evaluate("bar = 456; bar").equals("ciao"));
-
-    // Shadow property.
-    QVERIFY(eng.evaluate("Math").equals(eng.globalObject().property("Math")));
-    scope.setProperty("Math", "fake Math");
-    QVERIFY(eng.evaluate("Math").equals(scope.property("Math")));
-
-    // Variable declarations will create properties on the scope.
-    eng.evaluate("var baz = 456");
-    QVERIFY(scope.property("baz").equals(456));
-
-    // Function declarations will create properties on the scope.
-    eng.evaluate("function fun() { return baz; }");
-    QVERIFY(scope.property("fun").isCallable());
-    QVERIFY(scope.property("fun").call().equals(scope.property("baz")));
-
-    // Demonstrate the limitation of a growable static scope: Once a function that
-    // uses the scope has been compiled, it won't pick up properties that are added
-    // to the scope later.
-    {
-        QScriptValue fun = eng.evaluate("(function() { return futureProperty; })");
-        QVERIFY(fun.isCallable());
-        QVERIFY(fun.call().toString().contains(QString::fromLatin1("ReferenceError")));
-        scope.setProperty("futureProperty", "added after the function was compiled");
-        // If scope were dynamic, this would return the new property.
-        QVERIFY(fun.call().toString().contains(QString::fromLatin1("ReferenceError")));
-    }
-
-    eng.popContext();
-}
-#endif
-
-#if 0 // ###FIXME: No QScript MetaObject API
-QT_BEGIN_NAMESPACE
-Q_SCRIPT_DECLARE_QMETAOBJECT(QStandardItemModel, QObject*)
-QT_END_NAMESPACE
-
-void tst_QJSEngine::scriptValueFromQMetaObject()
-{
-    QScriptEngine eng;
-    {
-        QScriptValue meta = eng.scriptValueFromQMetaObject<QScriptEngine>();
-        QVERIFY(meta.isQMetaObject());
-        QCOMPARE(meta.toQMetaObject(), &QScriptEngine::staticMetaObject);
-        // Because of missing Q_SCRIPT_DECLARE_QMETAOBJECT() for QScriptEngine.
-        QEXPECT_FAIL("", "FIXME: because construct never returns invalid values", Continue);
-        QVERIFY(meta.callAsConstructor().isUndefined());
-    }
-    {
-        QScriptValue meta = eng.scriptValueFromQMetaObject<QStandardItemModel>();
-        QVERIFY(meta.isQMetaObject());
-        QCOMPARE(meta.toQMetaObject(), &QStandardItemModel::staticMetaObject);
-        QScriptValue obj = meta.callAsConstructor(QScriptValueList() << eng.newQObject(&eng));
-        QVERIFY(obj.isQObject());
-        QStandardItemModel *model = qobject_cast<QStandardItemModel*>(obj.toQObject());
-        QVERIFY(model != 0);
-        QCOMPARE(model->parent(), (QObject*)&eng);
-    }
-}
-#endif
-
 void tst_QJSEngine::functionPrototypeExtensions()
 {
     // QJS adds connect and disconnect properties to Function.prototype.