summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRhys Weatherley <rhys.weatherley@nokia.com>2010-12-08 09:09:44 +1000
committerRhys Weatherley <rhys.weatherley@nokia.com>2010-12-08 09:20:10 +1000
commit03f5c4bdc780ba621a2db09560db3bc50eec1444 (patch)
tree009c929dad14edbd4c1105f9c7b483a2cb866eb8 /src
parent57d28e9b0aff010f55bf465d27bb5c3e009d47ec (diff)
Add file/line information to fail messages
Diffstat (limited to 'src')
-rw-r--r--src/imports/testlib/TestCase.qml21
-rw-r--r--src/imports/testlib/main.cpp66
-rw-r--r--src/quicktestlib/qdeclarativetestresult.cpp39
-rw-r--r--src/quicktestlib/qdeclarativetestresult_p.h18
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);