aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/autotest/testcodeparser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/autotest/testcodeparser.cpp')
-rw-r--r--plugins/autotest/testcodeparser.cpp62
1 files changed, 62 insertions, 0 deletions
diff --git a/plugins/autotest/testcodeparser.cpp b/plugins/autotest/testcodeparser.cpp
index 6f32e8dc582..bf1aab0399b 100644
--- a/plugins/autotest/testcodeparser.cpp
+++ b/plugins/autotest/testcodeparser.cpp
@@ -18,6 +18,7 @@
****************************************************************************/
#include "autotestconstants.h"
+#include "autotest_utils.h"
#include "testcodeparser.h"
#include "testinfo.h"
#include "testvisitor.h"
@@ -223,6 +224,26 @@ static bool includesQtQuickTest(const CPlusPlus::Document::Ptr &doc,
return false;
}
+static bool includesGTest(const CPlusPlus::Document::Ptr &doc,
+ const CppTools::CppModelManager *cppMM)
+{
+ const QString gtestH = QLatin1String("gtest/gtest.h");
+ foreach (const CPlusPlus::Document::Include &inc, doc->resolvedIncludes()) {
+ if (inc.resolvedFileName().endsWith(gtestH))
+ return true;
+ }
+
+ if (cppMM) {
+ const CPlusPlus::Snapshot snapshot = cppMM->snapshot();
+ foreach (const QString &include, snapshot.allIncludesForDocument(doc->fileName())) {
+ if (include.endsWith(gtestH))
+ return true;
+ }
+ }
+
+ return false;
+}
+
static bool qtTestLibDefined(const CppTools::CppModelManager *cppMM,
const QString &fileName)
{
@@ -298,6 +319,24 @@ static QString quickTestName(const CPlusPlus::Document::Ptr &doc)
return QString();
}
+static QSet<QString> testNames(CPlusPlus::Document::Ptr &document)
+{
+ QSet<QString> result;
+ foreach (const CPlusPlus::Document::MacroUse &macro, document->macroUses()) {
+ if (!macro.isFunctionLike())
+ continue;
+ if (AutoTest::Internal::isGTestMacro(QLatin1String(macro.macro().name()))) {
+ const QVector<CPlusPlus::Document::Block> args = macro.arguments();
+ if (args.size() != 2)
+ continue;
+ const CPlusPlus::Document::Block name = args.first();
+ result.insert(QLatin1String(getFileContent(document->fileName())
+ .mid(name.bytesBegin(), name.bytesEnd() - name.bytesBegin())));
+ }
+ }
+ return result;
+}
+
static QList<QmlJS::Document::Ptr> scanDirectoryForQuickTestQmlFiles(const QString &srcDir)
{
QStringList dirs(srcDir);
@@ -494,6 +533,15 @@ void TestCodeParser::checkDocumentForTestCode(CPlusPlus::Document::Ptr document)
return;
}
}
+
+ if (includesGTest(document, modelManager)) {
+ const QSet<QString> &names = testNames(document);
+ if (!names.isEmpty()) {
+ handleGTest(document->fileName(), names);
+ return;
+ }
+ }
+
// could not find the class to test, or QTest is not included and QT_TESTLIB_LIB defined
// maybe file is only a referenced file
if (m_cppDocMap.contains(fileName)) {
@@ -547,6 +595,20 @@ void TestCodeParser::handleQtQuickTest(CPlusPlus::Document::Ptr document)
}
}
+void TestCodeParser::handleGTest(const QString &filePath, const QSet<QString> &names)
+{
+ const QByteArray &fileContent = getFileContent(filePath);
+ const CPlusPlus::Snapshot snapshot = CPlusPlus::CppModelManagerBase::instance()->snapshot();
+ CPlusPlus::Document::Ptr document = snapshot.preprocessedDocument(fileContent, filePath);
+ document->check();
+ CPlusPlus::AST *ast = document->translationUnit()->ast();
+ GTestVisitor visitor(document);
+ visitor.accept(ast);
+
+ QMap<QString, TestCodeLocationList> result = visitor.gtestFunctions();
+ QTC_CHECK(names.contains(result.keys().toSet()));
+}
+
void TestCodeParser::onCppDocumentUpdated(const CPlusPlus::Document::Ptr &document)
{
if (m_codeModelParsing) {