summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/cpplocalsymbols_test.cpp
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@digia.com>2014-06-26 15:01:42 -0400
committerNikolai Kosjar <nikolai.kosjar@digia.com>2014-07-04 12:35:05 +0200
commit995d1f777f3dd0481a676815ea7622461da6f92f (patch)
tree971cf8685d271741dcecef0c01ad2aaa38e25442 /src/plugins/cpptools/cpplocalsymbols_test.cpp
parentd4ce510974da6a4a2161c525edb76ea07185bc1d (diff)
downloadqt-creator-995d1f777f3dd0481a676815ea7622461da6f92f.tar.gz
C++: Add basic LocalSymbols test
Change-Id: I199e912203f329ec9b8bed2eb105e4a56f729e7d Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'src/plugins/cpptools/cpplocalsymbols_test.cpp')
-rw-r--r--src/plugins/cpptools/cpplocalsymbols_test.cpp186
1 files changed, 186 insertions, 0 deletions
diff --git a/src/plugins/cpptools/cpplocalsymbols_test.cpp b/src/plugins/cpptools/cpplocalsymbols_test.cpp
new file mode 100644
index 0000000000..eb986b8430
--- /dev/null
+++ b/src/plugins/cpptools/cpplocalsymbols_test.cpp
@@ -0,0 +1,186 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "cpptoolsplugin.h"
+
+#include "cpplocalsymbols.h"
+#include "cppsemanticinfo.h"
+
+#include <cplusplus/Overview.h>
+#include <utils/algorithm.h>
+
+#include <QtTest>
+
+namespace {
+
+class FindFirstFunctionDefinition: protected CPlusPlus::ASTVisitor
+{
+public:
+ FindFirstFunctionDefinition(CPlusPlus::TranslationUnit *translationUnit)
+ : ASTVisitor(translationUnit)
+ , m_definition(0)
+ {}
+
+ CPlusPlus::FunctionDefinitionAST *operator()()
+ {
+ accept(translationUnit()->ast());
+ return m_definition;
+ }
+
+private:
+ bool preVisit(CPlusPlus::AST *ast)
+ {
+ if (CPlusPlus::FunctionDefinitionAST *f = ast->asFunctionDefinition()) {
+ m_definition = f;
+ return false;
+ }
+ return true;
+ }
+
+private:
+ CPlusPlus::FunctionDefinitionAST *m_definition;
+};
+
+struct Result
+{
+ Result() : line(0), column(0), length(0) {}
+ Result(const QByteArray &name, unsigned line, unsigned column, unsigned length)
+ : name(name), line(line), column(column), length(length)
+ {}
+
+ QByteArray name;
+ unsigned line;
+ unsigned column;
+ unsigned length;
+
+ bool operator==(const Result &other) const
+ {
+ return name == other.name
+ && line == other.line
+ && column == other.column
+ && length == other.length;
+ }
+
+ static Result fromHighlightingResult(const CPlusPlus::Symbol *symbol,
+ TextEditor::HighlightingResult result)
+ {
+ const QByteArray name = CPlusPlus::Overview().prettyName(symbol->name()).toLatin1();
+ return Result(name, result.line, result.column, result.length);
+ }
+
+ static QList<Result> fromLocalUses(CppTools::SemanticInfo::LocalUseMap localUses)
+ {
+ QList<Result> result;
+
+ CppTools::SemanticInfo::LocalUseIterator it(localUses);
+ while (it.hasNext()) {
+ it.next();
+ const CPlusPlus::Symbol *symbol = it.key();
+ const QList<CppTools::SemanticInfo::Use> &uses = it.value();
+ foreach (const CppTools::SemanticInfo::Use &use, uses)
+ result << fromHighlightingResult(symbol, use);
+ }
+
+ Utils::sort(result, [](const Result &r1, const Result &r2) {
+ if (r1.line == r2.line)
+ return r1.column < r2.column;
+ return r1.line < r2.line;
+ });
+ return result;
+ }
+};
+
+} // anonymous namespace
+
+Q_DECLARE_METATYPE(Result)
+Q_DECLARE_METATYPE(QList<Result>)
+
+namespace QTest {
+ template<>
+ char *toString(const Result &result)
+ {
+ QByteArray ba = "Result(";
+ ba += "_(\"" + result.name + "\"), ";
+ ba += QByteArray::number(result.line) + ", ";
+ ba += QByteArray::number(result.column) + ", ";
+ ba += QByteArray::number(result.length) + ")";
+ return qstrdup(ba.data());
+ }
+}
+
+namespace CppTools {
+namespace Internal {
+
+void CppToolsPlugin::test_cpplocalsymbols_data()
+{
+ QTest::addColumn<QByteArray>("source");
+ QTest::addColumn<QList<Result>>("expectedUses");
+
+ typedef QByteArray _;
+
+ QTest::newRow("basic")
+ << _("int f(int arg)\n"
+ "{\n"
+ " int local;\n"
+ " g(&local);\n"
+ " return local + arg;\n"
+ "}\n")
+ << (QList<Result>()
+ << Result(_("arg"), 0, 10, 3)
+ << Result(_("local"), 2, 9, 5)
+ << Result(_("local"), 3, 8, 5)
+ << Result(_("local"), 4, 12, 5)
+ << Result(_("arg"), 4, 20, 3));
+}
+
+void CppToolsPlugin::test_cpplocalsymbols()
+{
+ QFETCH(QByteArray, source);
+ QFETCH(QList<Result>, expectedUses);
+
+ CPlusPlus::Document::Ptr document = CPlusPlus::Document::create(QLatin1String("test.cpp"));
+ document->setUtf8Source(source);
+ document->check();
+ QVERIFY(document->diagnosticMessages().isEmpty());
+ QVERIFY(document->translationUnit());
+ QVERIFY(document->translationUnit()->ast());
+ QVERIFY(document->globalNamespace());
+ FindFirstFunctionDefinition find(document->translationUnit());
+ CPlusPlus::DeclarationAST *functionDefinition = find();
+
+ LocalSymbols localSymbols(document, functionDefinition);
+
+ const QList<Result> actualUses = Result::fromLocalUses(localSymbols.uses);
+// foreach (const Result &result, actualUses)
+// qDebug() << QTest::toString(result);
+ QCOMPARE(actualUses, expectedUses);
+}
+
+} // namespace Internal
+} // namespace CppTools