int tst_Suite::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QObject::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { QString name = testNames.at(_id); QString path = testsDir.absoluteFilePath(name + ".js"); QString excludeMessage; if (isExcludedTest(name, &excludeMessage)) { QTest::qSkip(excludeMessage.toLatin1(), QTest::SkipAll, path.toLatin1(), -1); } else { QScriptEngine engine; engine.evaluate(mjsunitContents).toString(); if (engine.hasUncaughtException()) { QStringList bt = engine.uncaughtExceptionBacktrace(); QString err = engine.uncaughtException().toString(); qWarning("%s\n%s", qPrintable(err), qPrintable(bt.join("\n"))); } else { QScriptValue fakeFail = engine.newFunction(qscript_fail); fakeFail.setData(engine.globalObject().property("fail")); engine.globalObject().setProperty("fail", fakeFail); QString contents = readFile(path); QScriptValue ret = engine.evaluate(contents); if (engine.hasUncaughtException()) { if (!ret.isError()) { Q_ASSERT(ret.instanceOf(engine.globalObject().property("MjsUnitAssertionError"))); QString actual = ret.property("actual").toString(); QString expected = ret.property("expected").toString(); int lineNumber = ret.property("lineNumber").toInt32(); QString failMessage; if (isExpectedFailure(name, actual, expected, &failMessage)) { QTest::qExpectFail("", failMessage.toLatin1(), QTest::Continue, path.toLatin1(), lineNumber); } #ifdef GENERATE_ADDEXPECTEDFAILURE_CODE else { generatedAddExpectedFailureCode.append( " addExpectedFailure(\"" + name + "\", \"" + actual + "\", \"" + expected + "\", willFixInNextReleaseMessage);\n"); } #endif QTest::qCompare(actual, expected, "actual", "expect", path.toLatin1(), lineNumber); } else { int lineNumber = ret.property("lineNumber").toInt32(); QTest::qExpectFail("", ret.toString().toLatin1(), QTest::Continue, path.toLatin1(), lineNumber); QTest::qVerify(false, ret.toString().toLatin1(), "", path.toLatin1(), lineNumber); } } } } _id -= testNames.size(); } return _id; }
void tst_QScriptV8TestSuite::runTestFunction(int testIndex) { QString name = testNames.at(testIndex); QString path = testsDir.absoluteFilePath(name + ".js"); QString excludeMessage; if (isExcludedTest(name, &excludeMessage)) { QTest::qSkip(excludeMessage.toLatin1(), path.toLatin1(), -1); return; } QScriptEngine engine; engine.evaluate(mjsunitContents); if (engine.hasUncaughtException()) { QStringList bt = engine.uncaughtExceptionBacktrace(); QString err = engine.uncaughtException().toString(); qWarning("%s\n%s", qPrintable(err), qPrintable(bt.join("\n"))); } else { // Prepare to intercept calls to mjsunit's fail() function. QScriptValue fakeFail = engine.newFunction(qscript_fail); fakeFail.setData(engine.globalObject().property("fail")); engine.globalObject().setProperty("fail", fakeFail); QString contents = readFile(path); QScriptValue ret = engine.evaluate(contents); if (engine.hasUncaughtException()) { if (!ret.isError()) { int lineNumber = ret.property("lineNumber").toInt32(); QTest::qVerify(ret.instanceOf(engine.globalObject().property("MjsUnitAssertionError")), ret.toString().toLatin1(), "", path.toLatin1(), lineNumber); QString actual = ret.property("actual").toString(); QString expected = ret.property("expected").toString(); QString failMessage; if (shouldGenerateExpectedFailures) { if (ret.property("message").isString()) failMessage = ret.property("message").toString(); addExpectedFailure(name, actual, expected, failMessage); } else if (isExpectedFailure(name, actual, expected, &failMessage)) { QTest::qExpectFail("", failMessage.toLatin1(), QTest::Continue, path.toLatin1(), lineNumber); } QTest::qCompare(actual, expected, "actual", "expect", path.toLatin1(), lineNumber); } else { int lineNumber = ret.property("lineNumber").toInt32(); QTest::qExpectFail("", ret.toString().toLatin1(), QTest::Continue, path.toLatin1(), lineNumber); QTest::qVerify(false, ret.toString().toLatin1(), "", path.toLatin1(), lineNumber); } } } }