diff options
author | Rhys Weatherley <rhys.weatherley@nokia.com> | 2010-12-08 09:09:44 +1000 |
---|---|---|
committer | Rhys Weatherley <rhys.weatherley@nokia.com> | 2010-12-08 09:20:10 +1000 |
commit | 03f5c4bdc780ba621a2db09560db3bc50eec1444 (patch) | |
tree | 009c929dad14edbd4c1105f9c7b483a2cb866eb8 /src | |
parent | 57d28e9b0aff010f55bf465d27bb5c3e009d47ec (diff) |
Add file/line information to fail messages
Diffstat (limited to 'src')
-rw-r--r-- | src/imports/testlib/TestCase.qml | 21 | ||||
-rw-r--r-- | src/imports/testlib/main.cpp | 66 | ||||
-rw-r--r-- | src/quicktestlib/qdeclarativetestresult.cpp | 39 | ||||
-rw-r--r-- | src/quicktestlib/qdeclarativetestresult_p.h | 18 |
4 files changed, 114 insertions, 30 deletions
diff --git a/src/imports/testlib/TestCase.qml b/src/imports/testlib/TestCase.qml index 5adee9c..0cce266 100644 --- a/src/imports/testlib/TestCase.qml +++ b/src/imports/testlib/TestCase.qml @@ -73,14 +73,14 @@ Item { function fail(msg) { if (!msg) msg = ""; - results.fail(msg) + results.fail(msg, Qt.qtest_caller_file(), Qt.qtest_caller_line()) throw new Error("QtTest::fail") } function verify(cond, msg) { if (!msg) msg = ""; - if (!results.verify(cond, msg)) + if (!results.verify(cond, msg, Qt.qtest_caller_file(), Qt.qtest_caller_line())) throw new Error("QtTest::fail") } @@ -123,7 +123,7 @@ Item { var success = compareInternal(actual, expected) if (!msg) msg = "" - if (!results.compare(success, msg, act, exp)) + if (!results.compare(success, msg, act, exp, Qt.qtest_caller_file(), Qt.qtest_caller_line())) throw new Error("QtTest::fail") } @@ -137,20 +137,25 @@ Item { wait(50) i += 50 } - compare(obj[prop], value, "property " + prop) + var actual = obj[prop] + var act = formatValue(actual) + var exp = formatValue(value) + var success = compareInternal(actual, value) + if (!results.compare(success, "property " + prop, act, exp, Qt.qtest_caller_file(), Qt.qtest_caller_line())) + throw new Error("QtTest::fail") } function skip(msg) { if (!msg) msg = "" - results.skipSingle(msg) + results.skipSingle(msg, Qt.qtest_caller_file(), Qt.qtest_caller_line()) throw new Error("QtTest::skip") } function skipAll(msg) { if (!msg) msg = "" - results.skipAll(msg) + results.skipAll(msg, Qt.qtest_caller_file(), Qt.qtest_caller_line()) throw new Error("QtTest::skip") } @@ -159,7 +164,7 @@ Item { tag = "" if (!msg) msg = "" - if (!results.expectFail(tag, msg)) + if (!results.expectFail(tag, msg, Qt.qtest_caller_file(), Qt.qtest_caller_line())) throw new Error("QtTest::expectFail") } @@ -168,7 +173,7 @@ Item { tag = "" if (!msg) msg = "" - if (!results.expectFailContinue(tag, msg)) + if (!results.expectFailContinue(tag, msg, Qt.qtest_caller_file(), Qt.qtest_caller_line())) throw new Error("QtTest::expectFail") } diff --git a/src/imports/testlib/main.cpp b/src/imports/testlib/main.cpp index f599d2c..0d65027 100644 --- a/src/imports/testlib/main.cpp +++ b/src/imports/testlib/main.cpp @@ -41,12 +41,62 @@ #include <QtDeclarative/qdeclarativeextensionplugin.h> #include <QtDeclarative/qdeclarative.h> +#include <QtScript/qscriptvalue.h> +#include <QtScript/qscriptcontext.h> +#include <QtScript/qscriptcontextinfo.h> +#include <QtScript/qscriptengine.h> #include "qdeclarativetestresult_p.h" QT_BEGIN_NAMESPACE QML_DECLARE_TYPE(QDeclarativeTestResult) +// Copied from qdeclarativedebughelper_p.h in Qt, to avoid a dependency +// on a private header from Qt. +class Q_DECLARATIVE_EXPORT QDeclarativeDebugHelper +{ +public: + static QScriptEngine *getScriptEngine(QDeclarativeEngine *engine); + static void setAnimationSlowDownFactor(qreal factor); + static void enableDebugging(); +}; + +static QScriptContext *qtest_find_frame(QScriptContext *ctx) +{ + qint32 frame = 1; + if (ctx->argumentCount() > 0) + frame = ctx->argument(0).toInt32(); + ++frame; // Exclude the native function; start at its caller. + while (ctx) { + if (frame-- <= 0) + break; + ctx = ctx->parentContext(); + } + return ctx; +} + +static QScriptValue qtest_caller_file + (QScriptContext *ctx, QScriptEngine *engine) +{ + ctx = qtest_find_frame(ctx); + if (ctx) { + QScriptContextInfo info(ctx); + return engine->newVariant(info.fileName()); + } + return engine->newVariant(QLatin1String("")); +} + +static QScriptValue qtest_caller_line + (QScriptContext *ctx, QScriptEngine *engine) +{ + ctx = qtest_find_frame(ctx); + if (ctx) { + QScriptContextInfo info(ctx); + return engine->newVariant(info.lineNumber()); + } + return engine->newVariant(qint32(0)); +} + class QTestQmlModule : public QDeclarativeExtensionPlugin { Q_OBJECT @@ -56,6 +106,22 @@ public: Q_ASSERT(QLatin1String(uri) == QLatin1String("QtTest")); qmlRegisterType<QDeclarativeTestResult>(uri,1,0,"TestResult"); } + void initializeEngine(QDeclarativeEngine *engine, const char *) + { + // Install some helper functions in the global "Qt" object + // for walking the stack and finding a caller's location. + // Normally we would use an exception's backtrace, but JSC + // only provides the top-most frame in the backtrace. + QScriptEngine *eng = QDeclarativeDebugHelper::getScriptEngine(engine); + QScriptValue qtObject + = eng->globalObject().property(QLatin1String("Qt")); + qtObject.setProperty + (QLatin1String("qtest_caller_file"), + eng->newFunction(qtest_caller_file)); + qtObject.setProperty + (QLatin1String("qtest_caller_line"), + eng->newFunction(qtest_caller_line)); + } }; QT_END_NAMESPACE diff --git a/src/quicktestlib/qdeclarativetestresult.cpp b/src/quicktestlib/qdeclarativetestresult.cpp index 3de9588..e5e8a70 100644 --- a/src/quicktestlib/qdeclarativetestresult.cpp +++ b/src/quicktestlib/qdeclarativetestresult.cpp @@ -364,61 +364,70 @@ void QDeclarativeTestResult::finishTestFunction() QTestResult::finishedCurrentTestFunction(); } -void QDeclarativeTestResult::fail(const QString &message) +void QDeclarativeTestResult::fail + (const QString &message, const QString &file, int line) { - QTestResult::addFailure(message.toLatin1().constData(), "", 0); + QTestResult::addFailure(message.toLatin1().constData(), + file.toLatin1().constData(), line); } -bool QDeclarativeTestResult::verify(bool success, const QString &message) +bool QDeclarativeTestResult::verify + (bool success, const QString &message, const QString &file, int line) { if (message.isEmpty()) { - return QTestResult::verify(success, "verify()", "", "", 0); + return QTestResult::verify + (success, "verify()", "", file.toLatin1().constData(), line); } else { return QTestResult::verify - (success, message.toLatin1().constData(), "", "", 0); + (success, message.toLatin1().constData(), "", + file.toLatin1().constData(), line); } } bool QDeclarativeTestResult::compare (bool success, const QString &message, - const QString &val1, const QString &val2) + const QString &val1, const QString &val2, + const QString &file, int line) { return QTestResult::compare (success, message.toLocal8Bit().constData(), QTest::toString(val1.toLatin1().constData()), QTest::toString(val2.toLatin1().constData()), - "", "", "", 0); + "", "", + file.toLatin1().constData(), line); } -void QDeclarativeTestResult::skipSingle(const QString &message) +void QDeclarativeTestResult::skipSingle + (const QString &message, const QString &file, int line) { QTestResult::addSkip(message.toLatin1().constData(), - QTest::SkipSingle, "", 0); + QTest::SkipSingle, file.toLatin1().constData(), line); } -void QDeclarativeTestResult::skipAll(const QString &message) +void QDeclarativeTestResult::skipAll + (const QString &message, const QString &file, int line) { QTestResult::addSkip(message.toLatin1().constData(), - QTest::SkipAll, "", 0); + QTest::SkipAll, file.toLatin1().constData(), line); QTestResult::setSkipCurrentTest(true); } bool QDeclarativeTestResult::expectFail - (const QString &tag, const QString &comment) + (const QString &tag, const QString &comment, const QString &file, int line) { return QTestResult::expectFail (tag.toLatin1().constData(), QTest::toString(comment.toLatin1().constData()), - QTest::Abort, "", 0); + QTest::Abort, file.toLatin1().constData(), line); } bool QDeclarativeTestResult::expectFailContinue - (const QString &tag, const QString &comment) + (const QString &tag, const QString &comment, const QString &file, int line) { return QTestResult::expectFail (tag.toLatin1().constData(), QTest::toString(comment.toLatin1().constData()), - QTest::Continue, "", 0); + QTest::Continue, file.toLatin1().constData(), line); } void QDeclarativeTestResult::warn(const QString &message) diff --git a/src/quicktestlib/qdeclarativetestresult_p.h b/src/quicktestlib/qdeclarativetestresult_p.h index 679196c..bb55a78 100644 --- a/src/quicktestlib/qdeclarativetestresult_p.h +++ b/src/quicktestlib/qdeclarativetestresult_p.h @@ -112,14 +112,18 @@ public Q_SLOTS: void finishTestFunction(); - void fail(const QString &message); - bool verify(bool success, const QString &message); + void fail(const QString &message, const QString &file, int line); + bool verify(bool success, const QString &message, + const QString &file, int line); bool compare(bool success, const QString &message, - const QString &val1, const QString &val2); - void skipSingle(const QString &message); - void skipAll(const QString &message); - bool expectFail(const QString &tag, const QString &comment); - bool expectFailContinue(const QString &tag, const QString &comment); + const QString &val1, const QString &val2, + const QString &file, int line); + void skipSingle(const QString &message, const QString &file, int line); + void skipAll(const QString &message, const QString &file, int line); + bool expectFail(const QString &tag, const QString &comment, + const QString &file, int line); + bool expectFailContinue(const QString &tag, const QString &comment, + const QString &file, int line); void warn(const QString &message); void ignoreWarning(const QString &message); |