AutoTest: Handle direct usage of quick_test_main

If users need to register additional QML types before Qt5.12
they need to bend the Quick tests magic a bit and use
quick_test_main or quick_test_main_with_setup directly.
The plugin supports something similar for QTest::qExec, so
allow this for Quick tests as well.

Task-number: QTCREATORBUG-20746
Change-Id: I672f8410914c6cc77abc901998f419dda35755ae
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
This commit is contained in:
Christian Stenger
2018-07-09 10:43:31 +02:00
parent 0471fc0f46
commit 3a4592609c
3 changed files with 75 additions and 3 deletions

View File

@@ -25,6 +25,7 @@
#include "quicktestvisitors.h"
#include <cplusplus/Overview.h>
#include <qmljs/parser/qmljsast_p.h>
#include <qmljs/qmljsbind.h>
#include <qmljs/qmljslink.h>
@@ -161,5 +162,48 @@ bool TestQmlVisitor::visit(QmlJS::AST::StringLiteral *ast)
return false;
}
/************************************** QuickTestAstVisitor *************************************/
QuickTestAstVisitor::QuickTestAstVisitor(CPlusPlus::Document::Ptr doc,
const CPlusPlus::Snapshot &snapshot)
: ASTVisitor(doc->translationUnit())
, m_currentDoc(doc)
, m_snapshot(snapshot)
{
}
bool QuickTestAstVisitor::visit(CPlusPlus::CallAST *ast)
{
if (m_currentDoc.isNull())
return false;
if (const auto expressionAST = ast->base_expression) {
if (const auto idExpressionAST = expressionAST->asIdExpression()) {
if (const auto simpleNameAST = idExpressionAST->name->asSimpleName()) {
const CPlusPlus::Overview o;
const QString prettyName = o.prettyName(simpleNameAST->name);
if (prettyName == "quick_test_main" || prettyName == "quick_test_main_with_setup") {
if (auto expressionListAST = ast->expression_list) {
// third argument is the one we need, so skip current and next
expressionListAST = expressionListAST->next; // argv
expressionListAST = expressionListAST ? expressionListAST->next : nullptr; // testcase literal
if (expressionListAST && expressionListAST->value) {
const auto *stringLitAST = expressionListAST->value->asStringLiteral();
const auto *string
= translationUnit()->stringLiteral(stringLitAST->literal_token);
if (string) {
m_testBaseName = QString::fromUtf8(string->chars(),
int(string->size()));
}
}
}
}
}
}
}
return false;
}
} // namespace Internal
} // namespace Autotest