From 4f49b46eaa8ed5a87041cc2ce15f7da47b41f3eb Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 10 Jan 2018 12:38:41 +0100 Subject: [PATCH] Project: Add some basic tests Change-Id: I2b60c9df93700a8aa659adceee4e00cf46584a5b Reviewed-by: Eike Ziller --- src/plugins/projectexplorer/project.cpp | 196 ++++++++++++++++++ src/plugins/projectexplorer/projectexplorer.h | 6 + 2 files changed, 202 insertions(+) diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 1f82683dba6..eaabb566e93 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -903,4 +903,200 @@ void Project::setPreferredKitPredicate(const Kit::Predicate &predicate) d->m_preferredKitPredicate = predicate; } +#if defined(WITH_TESTS) + +} // namespace ProjectExplorer + +#include +#include + +namespace ProjectExplorer { + +const Utils::FileName TEST_PROJECT_PATH = Utils::FileName::fromString("/tmp/foobar/baz.project"); +const Utils::FileName TEST_PROJECT_NONEXISTING_FILE = Utils::FileName::fromString("/tmp/foobar/nothing.cpp"); +const Utils::FileName TEST_PROJECT_CPP_FILE = Utils::FileName::fromString("/tmp/foobar/main.cpp"); +const Utils::FileName TEST_PROJECT_GENERATED_FILE = Utils::FileName::fromString("/tmp/foobar/generated.foo"); +const QString TEST_PROJECT_MIMETYPE = "application/vnd.test.qmakeprofile"; +const QString TEST_PROJECT_DISPLAYNAME = "testProjectFoo"; +const char TEST_PROJECT_ID[] = "Test.Project.Id"; + +class TestProject : public Project +{ +public: + TestProject() : Project(TEST_PROJECT_MIMETYPE, TEST_PROJECT_PATH) + { + setId(TEST_PROJECT_ID); + setDisplayName(TEST_PROJECT_DISPLAYNAME); + } + + void testStartParsing() + { + emitParsingStarted(); + } + + void testParsingFinished(bool success) { + emitParsingFinished(success); + } +}; + +class TestProjectNode : public ProjectNode +{ +public: + TestProjectNode(const Utils::FileName &dir) : ProjectNode(dir) { } +}; + +void ProjectExplorerPlugin::testProject_setup() +{ + TestProject project; + + QCOMPARE(project.displayName(), TEST_PROJECT_DISPLAYNAME); + + QVERIFY(!project.rootProjectNode()); + QVERIFY(project.containerNode()); + + QVERIFY(project.macroExpander()); + + QVERIFY(project.document()); + QCOMPARE(project.document()->filePath(), TEST_PROJECT_PATH); + QCOMPARE(project.document()->mimeType(), TEST_PROJECT_MIMETYPE); + + QCOMPARE(project.mimeType(), TEST_PROJECT_MIMETYPE); + QCOMPARE(project.projectFilePath(), TEST_PROJECT_PATH); + QCOMPARE(project.projectDirectory(), TEST_PROJECT_PATH.parentDir()); + + QCOMPARE(project.isKnownFile(TEST_PROJECT_PATH), true); + QCOMPARE(project.isKnownFile(TEST_PROJECT_NONEXISTING_FILE), false); + QCOMPARE(project.isKnownFile(TEST_PROJECT_CPP_FILE), false); + + QCOMPARE(project.files(Project::AllFiles), {TEST_PROJECT_PATH}); + QCOMPARE(project.files(Project::GeneratedFiles), {}); + + QCOMPARE(project.id(), Core::Id(TEST_PROJECT_ID)); + + QVERIFY(!project.isParsing()); + QVERIFY(!project.hasParsingData()); +} + +void ProjectExplorerPlugin::testProject_changeDisplayName() +{ + TestProject project; + + QSignalSpy spy(&project, &Project::displayNameChanged); + + const QString newName = "other name"; + project.setDisplayName(newName); + QCOMPARE(spy.count(), 1); + QVariantList args = spy.takeFirst(); + QCOMPARE(args, {}); + + project.setDisplayName(newName); + QCOMPARE(spy.count(), 0); +} + +void ProjectExplorerPlugin::testProject_parsingSuccess() +{ + TestProject project; + + QSignalSpy startSpy(&project, &Project::parsingStarted); + QSignalSpy stopSpy(&project, &Project::parsingFinished); + + project.testStartParsing(); + QCOMPARE(startSpy.count(), 1); + QCOMPARE(stopSpy.count(), 0); + + QVERIFY(project.isParsing()); + QVERIFY(!project.hasParsingData()); + + project.testParsingFinished(true); + QCOMPARE(startSpy.count(), 1); + QCOMPARE(stopSpy.count(), 1); + QCOMPARE(stopSpy.at(0), {QVariant(true)}); + + QVERIFY(!project.isParsing()); + QVERIFY(project.hasParsingData()); +} + +void ProjectExplorerPlugin::testProject_parsingFail() +{ + TestProject project; + + QSignalSpy startSpy(&project, &Project::parsingStarted); + QSignalSpy stopSpy(&project, &Project::parsingFinished); + + project.testStartParsing(); + QCOMPARE(startSpy.count(), 1); + QCOMPARE(stopSpy.count(), 0); + + QVERIFY(project.isParsing()); + QVERIFY(!project.hasParsingData()); + + project.testParsingFinished(false); + QCOMPARE(startSpy.count(), 1); + QCOMPARE(stopSpy.count(), 1); + QCOMPARE(stopSpy.at(0), {QVariant(false)}); + + QVERIFY(!project.isParsing()); + QVERIFY(!project.hasParsingData()); +} + +std::unique_ptr createFileTree(Project *project) +{ + std::unique_ptr root = std::make_unique(project->projectDirectory()); + QList nodes; + nodes.append(new FileNode(TEST_PROJECT_PATH, FileType::Project, false)); + nodes.append(new FileNode(TEST_PROJECT_CPP_FILE, FileType::Source, false)); + nodes.append(new FileNode(TEST_PROJECT_GENERATED_FILE, FileType::Source, true)); + root->addNestedNodes(nodes); + + return root; +} + +void ProjectExplorerPlugin::testProject_projectTree() +{ + TestProject project; + QSignalSpy fileSpy(&project, &Project::fileListChanged); + + project.setRootProjectNode(nullptr); + QCOMPARE(fileSpy.count(), 0); + QCOMPARE(project.rootProjectNode(), nullptr); + + project.setRootProjectNode(new TestProjectNode(project.projectDirectory())); // will delete the fileNode... + QCOMPARE(fileSpy.count(), 0); + QCOMPARE(project.rootProjectNode(), nullptr); + + std::unique_ptr root = createFileTree(&project); + ProjectNode *rootNode = root.get(); + project.setRootProjectNode(root.release()); + QCOMPARE(fileSpy.count(), 1); + QCOMPARE(project.rootProjectNode(), rootNode); + + // Test known files: + QCOMPARE(project.isKnownFile(TEST_PROJECT_PATH), true); + QCOMPARE(project.isKnownFile(TEST_PROJECT_NONEXISTING_FILE), false); + QCOMPARE(project.isKnownFile(TEST_PROJECT_CPP_FILE), true); + QCOMPARE(project.isKnownFile(TEST_PROJECT_GENERATED_FILE), true); + + Utils::FileNameList allFiles = project.files(Project::AllFiles); + QCOMPARE(allFiles.count(), 3); + QVERIFY(allFiles.contains(TEST_PROJECT_PATH)); + QVERIFY(allFiles.contains(TEST_PROJECT_CPP_FILE)); + QVERIFY(allFiles.contains(TEST_PROJECT_GENERATED_FILE)); + + QCOMPARE(project.files(Project::GeneratedFiles), {TEST_PROJECT_GENERATED_FILE}); + Utils::FileNameList sourceFiles = project.files(Project::SourceFiles); + QCOMPARE(sourceFiles.count(), 2); + QVERIFY(sourceFiles.contains(TEST_PROJECT_PATH)); + QVERIFY(sourceFiles.contains(TEST_PROJECT_CPP_FILE)); + + project.setRootProjectNode(rootNode); + QCOMPARE(fileSpy.count(), 1); + QCOMPARE(project.rootProjectNode(), rootNode); + + project.setRootProjectNode(nullptr); + QCOMPARE(fileSpy.count(), 2); + QCOMPARE(project.rootProjectNode(), nullptr); +} + +#endif // WITH_TESTS + } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h index 3de6ccfffa0..c42efb72729 100644 --- a/src/plugins/projectexplorer/projectexplorer.h +++ b/src/plugins/projectexplorer/projectexplorer.h @@ -241,6 +241,12 @@ private slots: void testUserFileAccessor_mergeSettings(); void testUserFileAccessor_mergeSettingsEmptyUser(); void testUserFileAccessor_mergeSettingsEmptyShared(); + + void testProject_setup(); + void testProject_changeDisplayName(); + void testProject_parsingSuccess(); + void testProject_parsingFail(); + void testProject_projectTree(); #endif // WITH_TESTS };