genericprojectplugin_test.cpp 6.62 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
/****************************************************************************
**
** 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
Eike Ziller's avatar
Eike Ziller committed
13 14
** conditions see http://www.qt.io/licensing.  For further information
** use the contact form at http://www.qt.io/contact-us.
15 16 17
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
Eike Ziller's avatar
Eike Ziller committed
18 19 20 21 22 23
** General Public License version 2.1 or version 3 as published by the Free
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
** LICENSE.LGPLv3 included in the packaging of this file.  Please review the
** following information to ensure the GNU Lesser General Public License
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 25 26 27 28 29 30 31 32 33 34 35 36
**
** 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 "genericprojectplugin.h"

#include <projectexplorer/project.h>
#include <projectexplorer/projectexplorer.h>
#include <projectexplorer/session.h>

37 38 39
#include <cpptools/cppmodelmanager.h>
#include <cpptools/cpptoolstestcase.h>

40 41 42 43
#include <QFileInfo>
#include <QTest>

using namespace CppTools;
44
using namespace CppTools::Tests;
45 46 47 48
using namespace GenericProjectManager;
using namespace GenericProjectManager::Internal;
using namespace ProjectExplorer;

49 50 51 52
namespace {

inline QString _(const QByteArray &ba) { return QString::fromLatin1(ba, ba.size()); }
inline QString sourceProjectPath(const QString &project)
53 54 55 56 57 58 59
{
    const QString fileName(_(SRCDIR "/../../../tests/genericprojectmanager/") + project);
    return QFileInfo(fileName).absoluteFilePath();
}

} // anonymous namespace

60 61
void GenericProjectPlugin::test_simple()
{
62 63
    Tests::VerifyCleanCppModelManager verify;

64 65 66 67
    TemporaryCopiedDir temporaryDir(sourceProjectPath(_("testdata_simpleproject")));
    QVERIFY(temporaryDir.isValid());
    const QString mainFile = temporaryDir.absolutePath("main.cpp");
    const QString projectFile = temporaryDir.absolutePath("simpleproject.creator");
68

69 70
    ProjectOpenerAndCloser projects;
    const ProjectInfo pInfo = projects.open(projectFile);
71
    QVERIFY(pInfo.isValid());
72 73 74 75 76
    QCOMPARE(pInfo.projectParts().size(), 1);

    ProjectPart::Ptr pPart = pInfo.projectParts().first();
    QVERIFY(pPart);
    QCOMPARE(pPart->files.size(), 1);
77
    QCOMPARE(pPart->files.first().path, mainFile);
78 79
    QCOMPARE(pPart->files.first().kind, ProjectFile::CXXSource);
}
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96

static QStringList simplify(const QList<CppTools::ProjectFile> &files, const QString &prefix)
{
    QStringList result;

    foreach (const CppTools::ProjectFile &file, files) {
        if (file.path.startsWith(prefix))
            result.append(file.path.mid(prefix.size()));
        else
            result.append(file.path);
    }

    return result;
}

void GenericProjectPlugin::test_mixed1()
{
97 98
    Tests::VerifyCleanCppModelManager verify;

99 100 101 102 103 104
    TemporaryCopiedDir temporaryDir(sourceProjectPath(_("testdata_mixedproject1/")));
    QVERIFY(temporaryDir.isValid());
    const QString projectFile = temporaryDir.absolutePath("mixedproject1.creator");

    ProjectOpenerAndCloser projects;
    const ProjectInfo pInfo = projects.open(projectFile);
105
    QVERIFY(pInfo.isValid());
106 107 108 109 110 111 112 113
    QCOMPARE(pInfo.projectParts().size(), 3);

    QList<ProjectPart::Ptr> parts = pInfo.projectParts();
    std::sort(parts.begin(), parts.end(), [](const ProjectPart::Ptr &p1,
                                             const ProjectPart::Ptr &p2) {
        return p1->displayName < p2->displayName;
    });

114 115 116 117
    const QString dirPathWithSlash = temporaryDir.path() + QLatin1Char('/');
    const QStringList part0files = simplify(parts[0]->files, dirPathWithSlash);
    const QStringList part1files = simplify(parts[1]->files, dirPathWithSlash);
    const QStringList part2files = simplify(parts[2]->files, dirPathWithSlash);
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145

    QCOMPARE(parts[0]->displayName, _("mixedproject1 (C++11)"));
    QCOMPARE(parts[0]->files.size(), 4);
    QVERIFY(part0files.contains(_("main.cpp")));
    QVERIFY(part0files.contains(_("header.h")));
    QVERIFY(part0files.contains(_("MyViewController.h")));
    QVERIFY(part0files.contains(_("Glue.h")));

    QCOMPARE(parts[1]->displayName, _("mixedproject1 (Obj-C++11)"));
    QCOMPARE(parts[1]->files.size(), 4);
    QVERIFY(part1files.contains(_("Glue.mm")));
    QVERIFY(part1files.contains(_("header.h")));
    QVERIFY(part1files.contains(_("MyViewController.h")));
    QVERIFY(part1files.contains(_("Glue.h")));

    QCOMPARE(parts[2]->displayName, _("mixedproject1 (Obj-C11)"));
    QCOMPARE(parts[2]->files.size(), 1);
    QVERIFY(part2files.contains(_("MyViewController.m")));
    // No .h files here, because the mime-type for .h files is.....
    //
    // wait for it...
    //
    // C++!
    // (See 1c7da3d83c9bb35064ae6b9052cbf1c6bff1395e.)
}

void GenericProjectPlugin::test_mixed2()
{
146 147
    Tests::VerifyCleanCppModelManager verify;

148 149 150 151 152 153
    TemporaryCopiedDir temporaryDir(sourceProjectPath(_("testdata_mixedproject2/")));
    QVERIFY(temporaryDir.isValid());
    const QString projectFile = temporaryDir.absolutePath("mixedproject2.creator");

    ProjectOpenerAndCloser projects;
    const ProjectInfo pInfo = projects.open(projectFile);
154
    QVERIFY(pInfo.isValid());
155 156 157 158 159 160 161 162
    QCOMPARE(pInfo.projectParts().size(), 2);

    QList<ProjectPart::Ptr> parts = pInfo.projectParts();
    std::sort(parts.begin(), parts.end(), [](const ProjectPart::Ptr &p1,
                                             const ProjectPart::Ptr &p2) {
        return p1->displayName < p2->displayName;
    });

163 164 165
    const QString dirPathWithSlash = temporaryDir.path() + QLatin1Char('/');
    const QStringList part0files = simplify(parts[0]->files, dirPathWithSlash);
    const QStringList part1files = simplify(parts[1]->files, dirPathWithSlash);
166 167 168 169 170 171 172 173 174 175

    QCOMPARE(parts[0]->displayName, _("mixedproject2 (C++11)"));
    QCOMPARE(parts[0]->files.size(), 2);
    QVERIFY(part0files.contains(_("main.cpp")));
    QVERIFY(part0files.contains(_("header.hpp")));

    QCOMPARE(parts[1]->displayName, _("mixedproject2 (C11)"));
    QCOMPARE(parts[1]->files.size(), 1);
    QVERIFY(part1files.contains(_("impl.c")));
}