diff options
author | Friedemann Kleint <Friedemann.Kleint@nokia.com> | 2012-01-06 13:25:51 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-01-11 14:25:00 +0100 |
commit | 424d30275c0d70698cbdd349f8026c38eebc59b7 (patch) | |
tree | a8104e07be2f9ec0e234ee82a24c4216fe77fb95 /src/qmltest/quicktest.cpp | |
parent | 5daace87139ed4b36b756bcd51ddb6f8fe22897b (diff) |
QMLTest: Fix output of file names, make output more verbose.
- Check command line arguments thoroughly.
- Change all QuickTestResult functions taking file names to
accept QUrls and format them using QUrl::toLocalFile() in case
of local file names in order to display Windows drive
letters correctly.
- Introduce a template function (for QDeclarativeView, QQuickView)
that dumps out all available information when compilation goes
wrong.
- Skip 'Debug', 'Release' folders for Windows builds.
Change-Id: Ibdd92867870a2b05494de8a0adbe0910d4897ba2
Reviewed-by: Yunqiao Yin <charles.yin@nokia.com>
Diffstat (limited to 'src/qmltest/quicktest.cpp')
-rw-r--r-- | src/qmltest/quicktest.cpp | 121 |
1 files changed, 77 insertions, 44 deletions
diff --git a/src/qmltest/quicktest.cpp b/src/qmltest/quicktest.cpp index 2f0f7ef9bc..a1f06baa39 100644 --- a/src/qmltest/quicktest.cpp +++ b/src/qmltest/quicktest.cpp @@ -62,6 +62,7 @@ #include <QtCore/qfile.h> #include <QtCore/qdebug.h> #include <QtCore/qeventloop.h> +#include <QtCore/qtextstream.h> #include <QtGui/qtextdocument.h> #include <stdio.h> #include <QtGui/QGuiApplication> @@ -134,6 +135,51 @@ static inline QString stripQuotes(const QString &s) return s; } +template <class View> void handleCompileErrors(const QFileInfo &fi, const View &view) +{ + // Error compiling the test - flag failure in the log and continue. + const QList<QDeclarativeError> errors = view.errors(); + QuickTestResult results; + results.setTestCaseName(fi.baseName()); + results.startLogging(); + results.setFunctionName(QLatin1String("compile")); + results.setFunctionType(QuickTestResult::Func); + // Verbose warning output of all messages and relevant parameters + QString message; + QTextStream str(&message); + str << "\n " << QDir::toNativeSeparators(fi.absoluteFilePath()) << " produced " + << errors.size() << " error(s):\n"; + foreach (const QDeclarativeError &e, errors) { + str << " "; + if (e.url().isLocalFile()) { + str << e.url().toLocalFile(); + } else { + str << e.url().toString(); + } + if (e.line() > 0) + str << ':' << e.line() << ',' << e.column(); + str << ": " << e.description() << '\n'; + } + str << " Working directory: " << QDir::toNativeSeparators(QDir::current().absolutePath()) << '\n'; + if (QDeclarativeEngine *engine = view.engine()) { + str << " View: " << view.metaObject()->className() << ", import paths:\n"; + foreach (const QString &i, engine->importPathList()) + str << " '" << QDir::toNativeSeparators(i) << "'\n"; + const QStringList pluginPaths = engine->pluginPathList(); + str << " Plugin paths:\n"; + foreach (const QString &p, pluginPaths) + str << " '" << QDir::toNativeSeparators(p) << "'\n"; + } + qWarning("%s", qPrintable(message)); + // Fail with error 0. + results.fail(errors.at(0).description(), + errors.at(0).url(), errors.at(0).line()); + results.finishTestFunction(); + results.setFunctionName(QString()); + results.setFunctionType(QuickTestResult::NoWhere); + results.stopLogging(); +} + int quick_test_main(int argc, char **argv, const char *name, quick_test_viewport_create createViewport, const char *sourceDir) { QGuiApplication* app = 0; @@ -188,40 +234,52 @@ int quick_test_main(int argc, char **argv, const char *name, quick_test_viewport if (translator.load(translationFile)) { app->installTranslator(&translator); } else { - qWarning() << "Could not load the translation file" << translationFile; + qWarning("Could not load the translation file '%s'.", qPrintable(translationFile)); } } // Determine where to look for the test data. if (testPath.isEmpty() && sourceDir) testPath = QString::fromLocal8Bit(sourceDir); - if (testPath.isEmpty()) - testPath = QLatin1String("."); - + if (testPath.isEmpty()) { + QDir current = QDir::current(); +#ifdef Q_OS_WIN + // Skip release/debug subfolders + if (!current.dirName().compare(QLatin1String("Release"), Qt::CaseInsensitive) + || !current.dirName().compare(QLatin1String("Debug"), Qt::CaseInsensitive)) + current.cdUp(); +#endif // Q_OS_WIN + testPath = current.absolutePath(); + } QStringList files; - if (testPath.endsWith(QLatin1String(".qml")) && QFileInfo(testPath).isFile()) { + const QFileInfo testPathInfo(testPath); + if (testPathInfo.isFile()) { + if (!testPath.endsWith(QStringLiteral(".qml"))) { + qWarning("'%s' does not have the suffix '.qml'.", qPrintable(testPath)); + return 1; + } files << testPath; - } else { + } else if (testPathInfo.isDir()) { // Scan the test data directory recursively, looking for "tst_*.qml" files. - QStringList filters; - filters += QLatin1String("tst_*.qml"); - QDirIterator iter(testPath, filters, QDir::Files, + const QStringList filters(QStringLiteral("tst_*.qml")); + QDirIterator iter(testPathInfo.absoluteFilePath(), filters, QDir::Files, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks); while (iter.hasNext()) files += iter.next(); files.sort(); - } - - // Bail out if we didn't find any test cases. - if (files.isEmpty()) { - qWarning() << argv[0] << ": could not find any test cases under" - << testPath; + if (files.isEmpty()) { + qWarning("The directory '%s' does not contain any test files matching '%s'", + qPrintable(testPath), qPrintable(filters.front())); + return 1; + } + } else { + qWarning("'%s' does not exist under '%s'.", + qPrintable(testPath), qPrintable(QDir::currentPath())); return 1; } - // Scan through all of the "tst_*.qml" files and run each of them // in turn with a QDeclarativeView. #ifdef QUICK_TEST_SCENEGRAPH @@ -235,7 +293,7 @@ int quick_test_main(int argc, char **argv, const char *name, quick_test_viewport &eventLoop, SLOT(quit())); view.rootContext()->setContextProperty (QLatin1String("qtest"), &rootobj); - foreach (QString path, imports) + foreach (const QString &path, imports) view.engine()->addImportPath(path); foreach (QString file, files) { @@ -255,20 +313,7 @@ int quick_test_main(int argc, char **argv, const char *name, quick_test_viewport if (QTest::printAvailableFunctions) continue; if (view.status() == QQuickView::Error) { - // Error compiling the test - flag failure in the log and continue. - QList<QDeclarativeError> errors = view.errors(); - QuickTestResult results; - results.setTestCaseName(fi.baseName()); - results.startLogging(); - results.setFunctionName(QLatin1String("compile")); - results.setFunctionType(QuickTestResult::Func); - results.fail(errors.at(0).description(), - errors.at(0).url().toString(), - errors.at(0).line()); - results.finishTestFunction(); - results.setFunctionName(QString()); - results.setFunctionType(QuickTestResult::NoWhere); - results.stopLogging(); + handleCompileErrors(fi, view); continue; } if (!rootobj.hasQuit) { @@ -312,19 +357,7 @@ int quick_test_main(int argc, char **argv, const char *name, quick_test_viewport continue; if (view.status() == QDeclarativeView::Error) { // Error compiling the test - flag failure in the log and continue. - QList<QDeclarativeError> errors = view.errors(); - QuickTestResult results; - results.setTestCaseName(fi.baseName()); - results.startLogging(); - results.setFunctionName(QLatin1String("compile")); - results.setFunctionType(QuickTestResult::Func); - results.fail(errors.at(0).description(), - errors.at(0).url().toString(), - errors.at(0).line()); - results.finishTestFunction(); - results.setFunctionName(QString()); - results.setFunctionType(QuickTestResult::NoWhere); - results.stopLogging(); + handleCompileErrors(fi, view); continue; } if (!rootobj.hasQuit) { |