aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/cpptools/cpplocatorfilter_test.cpp
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@digia.com>2013-08-16 11:31:59 +0200
committerNikolai Kosjar <nikolai.kosjar@digia.com>2013-08-19 14:43:58 +0200
commitdcf618469d44f317db2343e47135187bac39a64a (patch)
tree704ad81426bcd51f517ba9ba43d040ca0ce10769 /src/plugins/cpptools/cpplocatorfilter_test.cpp
parenta9e737b0fe00b17af62bd3012e84cc71506eca98 (diff)
CppTools: Tests: Add basic tests for locator filters
Change-Id: Ie71aa8a39f4584a024a4f104841ad8e57947e489 Reviewed-by: David Schulz <david.schulz@digia.com>
Diffstat (limited to 'src/plugins/cpptools/cpplocatorfilter_test.cpp')
-rw-r--r--src/plugins/cpptools/cpplocatorfilter_test.cpp283
1 files changed, 283 insertions, 0 deletions
diff --git a/src/plugins/cpptools/cpplocatorfilter_test.cpp b/src/plugins/cpptools/cpplocatorfilter_test.cpp
new file mode 100644
index 00000000000..19f9a7a4ac6
--- /dev/null
+++ b/src/plugins/cpptools/cpplocatorfilter_test.cpp
@@ -0,0 +1,283 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 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 "cppclassesfilter.h"
+#include "cppcurrentdocumentfilter.h"
+#include "cppfunctionsfilter.h"
+#include "cpplocatorfilter.h"
+#include "cppmodelmanager.h"
+
+#include <coreplugin/editormanager/editormanager.h>
+#include <extensionsystem/pluginmanager.h>
+#include <locator/locatorfiltertest.h>
+#include <utils/fileutils.h>
+
+#include <QDebug>
+#include <QFileInfo>
+#include <QtTest>
+
+using namespace Core;
+using namespace CppTools::Internal;
+using namespace ExtensionSystem;
+using namespace Locator;
+using namespace Locator::Internal;
+using namespace Locator::Internal::Tests;
+using namespace Utils;
+
+Q_DECLARE_METATYPE(ILocatorFilter *)
+
+namespace {
+
+class TestDataDirectory
+{
+public:
+ TestDataDirectory(const QString &testDataDirectory)
+ : m_testDataDirectory(QLatin1String(SRCDIR "/../../../tests/cpplocators/")
+ + testDataDirectory)
+ {
+ maybeAppendSlash(&m_testDataDirectory);
+ QFileInfo testDataDir(m_testDataDirectory);
+ QVERIFY(testDataDir.exists());
+ QVERIFY(testDataDir.isDir());
+ }
+
+ /// File from the test data directory (top level)
+ QString file(const QString &fileName) const
+ {
+ return testDataDir() + fileName;
+ }
+
+private:
+ QString testDataDir(const QString& subdir = QString(), bool clean = true) const
+ {
+ QString path = m_testDataDirectory;
+ if (!subdir.isEmpty())
+ path += QLatin1String("/") + subdir;
+ if (clean)
+ path = QDir::cleanPath(path);
+ maybeAppendSlash(&path);
+ return path;
+ }
+
+ static void maybeAppendSlash(QString *string)
+ {
+ const QChar slash = QLatin1Char('/');
+ if (!string->endsWith(slash))
+ string->append(slash);
+ }
+
+private:
+ QString m_testDataDirectory;
+};
+
+class CppLocatorFilterTest : public BasicLocatorFilterTest
+{
+public:
+ CppLocatorFilterTest(ILocatorFilter *filter, const QString &fileName)
+ : BasicLocatorFilterTest(filter)
+ , m_modelManager(CppModelManager::instance())
+ , m_fileName(fileName)
+ {
+ QVERIFY(!m_fileName.isEmpty());
+ m_modelManager->GC();
+ QVERIFY(m_modelManager->snapshot().isEmpty());
+ }
+
+private:
+ virtual void doBeforeLocatorRun()
+ {
+ m_modelManager->updateSourceFiles(QStringList() << m_fileName).waitForFinished();
+ QVERIFY(m_modelManager->snapshot().contains(m_fileName));
+ QCoreApplication::processEvents();
+ }
+
+ virtual void doAfterLocatorRun()
+ {
+ m_modelManager->GC();
+ QVERIFY(m_modelManager->snapshot().isEmpty());
+ }
+
+ CppModelManager *m_modelManager;
+ const QString m_fileName;
+};
+
+class CppCurrentDocumentFilterTest : public BasicLocatorFilterTest
+{
+public:
+ CppCurrentDocumentFilterTest(const QString &fileName)
+ : BasicLocatorFilterTest(PluginManager::getObject<CppCurrentDocumentFilter>())
+ , m_modelManager(CppModelManager::instance())
+ , m_editor(0)
+ , m_fileName(fileName)
+ {
+ QVERIFY(!m_fileName.isEmpty());
+ m_modelManager->GC();
+ QVERIFY(m_modelManager->snapshot().isEmpty());
+ }
+
+private:
+ virtual void doBeforeLocatorRun()
+ {
+ QVERIFY(EditorManager::documentModel()->openedDocuments().isEmpty());
+ m_modelManager->GC();
+ QVERIFY(m_modelManager->snapshot().isEmpty());
+
+ m_editor = EditorManager::openEditor(m_fileName);
+ QVERIFY(m_editor);
+ while (!m_modelManager->snapshot().contains(m_fileName))
+ QCoreApplication::processEvents();
+ }
+
+ virtual void doAfterLocatorRun()
+ {
+ EditorManager::instance()->closeEditor(m_editor, /*askAboutModifiedEditors=*/ false);
+ QCoreApplication::processEvents();
+ QVERIFY(EditorManager::documentModel()->openedDocuments().isEmpty());
+ m_modelManager->GC();
+ QVERIFY(m_modelManager->snapshot().isEmpty());
+ }
+
+ CppModelManager *m_modelManager;
+ IEditor *m_editor;
+ const QString m_fileName;
+};
+
+inline QString _(const QByteArray &ba) { return QString::fromLatin1(ba, ba.size()); }
+
+} // anonymous namespace
+
+void CppToolsPlugin::test_cpplocatorfilters_CppLocatorFilter()
+{
+ QFETCH(QString, testFile);
+ QFETCH(ILocatorFilter *, filter);
+ QFETCH(QString, searchText);
+ QFETCH(ResultDataList, expectedResults);
+
+ CppLocatorFilterTest test(filter, testFile);
+ ResultDataList results = ResultData::fromFilterEntryList(test.matchesFor(searchText));
+// ResultData::printFilterEntries(results);
+ QVERIFY(!results.isEmpty());
+ QCOMPARE(expectedResults, results);
+}
+
+void CppToolsPlugin::test_cpplocatorfilters_CppLocatorFilter_data()
+{
+ QTest::addColumn<QString>("testFile");
+ QTest::addColumn<ILocatorFilter *>("filter");
+ QTest::addColumn<QString>("searchText");
+ QTest::addColumn<ResultDataList>("expectedResults");
+
+ ILocatorFilter *cppFunctionsFilter = PluginManager::getObject<CppFunctionsFilter>();
+ ILocatorFilter *cppClassesFilter = PluginManager::getObject<CppClassesFilter>();
+ ILocatorFilter *cppLocatorFilter = PluginManager::getObject<CppLocatorFilter>();
+
+ TestDataDirectory testDirectory(QLatin1String("testdata_basic"));
+ const QString testFile = testDirectory.file(QLatin1String("file1.cpp"));
+ const QString testFileShort = FileUtils::shortNativePath(FileName::fromString(testFile));
+
+ QTest::newRow("CppFunctionsFilter")
+ << testFile
+ << cppFunctionsFilter
+ << QString::fromLatin1("myfunction")
+ << (QList<ResultData>()
+ << ResultData(_("myFunction(bool, int)"), testFileShort)
+ << ResultData(_("myFunction(bool, int)"), _("MyNamespace"))
+ << ResultData(_("myFunction(bool, int)"), _("<anonymous namespace>"))
+ );
+
+ QTest::newRow("CppClassesFilter")
+ << testFile
+ << cppClassesFilter
+ << _("myclass")
+ << (QList<ResultData>()
+ << ResultData(_("MyClass"), testFileShort)
+ << ResultData(_("MyClass"), _("MyNamespace"))
+ << ResultData(_("MyClass"), _("<anonymous namespace>"))
+ );
+
+ QTest::newRow("CppLocatorFilter")
+ << testFile
+ << cppLocatorFilter
+ << _("myclass")
+ << (QList<ResultData>()
+ << ResultData(_("<anonymous namespace>::MyClass"), testFileShort)
+ << ResultData(_("<anonymous namespace>::MyClass::MyClass"), _("()"))
+ << ResultData(_("<anonymous namespace>::MyClass::function2"), _("(bool, int)"))
+ << ResultData(_("MyClass"), testFileShort)
+ << ResultData(_("MyClass::MyClass"), _("()"))
+ << ResultData(_("MyClass::function2"), _("(bool, int)"))
+ << ResultData(_("MyNamespace::MyClass"), testFileShort)
+ << ResultData(_("MyNamespace::MyClass::MyClass"), _("()"))
+ << ResultData(_("MyNamespace::MyClass::function2"), _("(bool, int)"))
+ );
+}
+
+void CppToolsPlugin::test_cpplocatorfilters_CppCurrentDocumentFilter()
+{
+ TestDataDirectory testDirectory(QLatin1String("testdata_basic"));
+ const QString testFile = testDirectory.file(QLatin1String("file1.cpp"));
+
+ QList<ResultData> expectedResults = QList<ResultData>()
+ << ResultData(_("int myVariable"), _(""))
+ << ResultData(_("myFunction(bool, int)"), _(""))
+ << ResultData(_("MyEnum"), _(""))
+ << ResultData(_("int V1"), _("MyEnum"))
+ << ResultData(_("int V2"), _("MyEnum"))
+ << ResultData(_("MyClass"), _(""))
+ << ResultData(_("MyClass()"), _("MyClass"))
+ << ResultData(_("function1()"), _("MyClass"))
+ << ResultData(_("function2(bool, int)"), _("MyClass"))
+ << ResultData(_("int myVariable"), _("MyNamespace"))
+ << ResultData(_("myFunction(bool, int)"), _("MyNamespace"))
+ << ResultData(_("MyEnum"), _("MyNamespace"))
+ << ResultData(_("int V1"), _("MyNamespace::MyEnum"))
+ << ResultData(_("int V2"), _("MyNamespace::MyEnum"))
+ << ResultData(_("MyClass"), _("MyNamespace"))
+ << ResultData(_("MyClass()"), _("MyNamespace::MyClass"))
+ << ResultData(_("function1()"), _("MyNamespace::MyClass"))
+ << ResultData(_("function2(bool, int)"), _("MyNamespace::MyClass"))
+ << ResultData(_("int myVariable"), _("<anonymous namespace>"))
+ << ResultData(_("myFunction(bool, int)"), _("<anonymous namespace>"))
+ << ResultData(_("MyEnum"), _("<anonymous namespace>"))
+ << ResultData(_("int V1"), _("<anonymous namespace>::MyEnum"))
+ << ResultData(_("int V2"), _("<anonymous namespace>::MyEnum"))
+ << ResultData(_("MyClass"), _("<anonymous namespace>"))
+ << ResultData(_("MyClass()"), _("<anonymous namespace>::MyClass"))
+ << ResultData(_("function1()"), _("<anonymous namespace>::MyClass"))
+ << ResultData(_("function2(bool, int)"), _("<anonymous namespace>::MyClass"))
+ ;
+
+ CppCurrentDocumentFilterTest test(testFile);
+ ResultDataList results = ResultData::fromFilterEntryList(test.matchesFor());
+// ResultData::printFilterEntries(results);
+ QVERIFY(!results.isEmpty());
+ QCOMPARE(expectedResults, results);
+}