Commit 0b527de5 authored by Christian Stenger's avatar Christian Stenger

AutoTest: Fix parsing for QuickTests

If the scan for quick tests was triggered just by a change of a
qml file (including indexing by the respective modelmanager) we
might find tests that won't be able to execute.
If we have already found quick tests we know their respective
project files. If we cannot find the files to be scanned inside the
already found ignore scan requests for such files.

This patch is kind of a continuation of b570ee1b
(Fix initial parsing when loading session)

Change-Id: Ic1228641f60abf127134acbd4232a0ddd30ef159
Reviewed-by: Nikolai Kosjar's avatarNikolai Kosjar <nikolai.kosjar@qt.io>
Reviewed-by: Christian Stenger's avatarChristian Stenger <christian.stenger@qt.io>
parent e51443ce
......@@ -25,6 +25,10 @@
#pragma once
#include "../testframeworkmanager.h"
#include <utils/qtcassert.h>
#include <QByteArrayList>
namespace Autotest {
......@@ -38,6 +42,36 @@ public:
static const QByteArrayList valid = {"QUICK_TEST_MAIN", "QUICK_TEST_OPENGL_MAIN"};
return valid.contains(macro);
}
static QHash<QString, QString> proFilesForQmlFiles(const Core::Id &id, const QStringList &files)
{
QHash<QString, QString> result;
TestTreeItem *rootNode = TestFrameworkManager::instance()->rootNodeForTestFramework(id);
QTC_ASSERT(rootNode, return result);
if (files.isEmpty())
return result;
for (int row = 0, rootCount = rootNode->childCount(); row < rootCount; ++row) {
const TestTreeItem *child = rootNode->childItem(row);
const QString &file = child->filePath();
if (!file.isEmpty() && files.contains(file)) {
const QString &proFile = child->proFile();
if (!proFile.isEmpty())
result.insert(file, proFile);
}
for (int subRow = 0, subCount = child->childCount(); subRow < subCount; ++subRow) {
const TestTreeItem *grandChild = child->childItem(subRow);
const QString &file = grandChild->filePath();
if (!file.isEmpty() && files.contains(file)) {
const QString &proFile = grandChild->proFile();
if (!proFile.isEmpty())
result.insert(file, proFile);
}
}
}
return result;
}
};
} // namespace Internal
......
......@@ -220,6 +220,7 @@ static bool handleQtQuickTest(QFutureInterface<TestParseResultPtr> futureInterfa
void QuickTestParser::init(const QStringList &filesToParse)
{
m_qmlSnapshot = QmlJSTools::Internal::ModelManager::instance()->snapshot();
m_proFilesForQmlFiles = QuickTestUtils::proFilesForQmlFiles(id(), filesToParse);
CppParser::init(filesToParse);
}
......@@ -227,8 +228,11 @@ bool QuickTestParser::processDocument(QFutureInterface<TestParseResultPtr> futur
const QString &fileName)
{
if (fileName.endsWith(".qml")) {
const QString &proFile = m_proFilesForQmlFiles.value(fileName);
if (proFile.isEmpty())
return false;
QmlJS::Document::Ptr qmlJSDoc = m_qmlSnapshot.document(fileName);
return checkQmlDocumentForQuickTestCode(futureInterface, qmlJSDoc, id());
return checkQmlDocumentForQuickTestCode(futureInterface, qmlJSDoc, id(), proFile);
}
if (!m_cppSnapshot.contains(fileName) || !selectedForBuilding(fileName))
return false;
......
......@@ -47,6 +47,7 @@ public:
const QString &fileName) override;
private:
QmlJS::Snapshot m_qmlSnapshot;
QHash<QString, QString> m_proFilesForQmlFiles;
};
} // namespace Internal
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment