2014-01-23 07:53:24 +02:00
|
|
|
/****************************************************************************
|
|
|
|
|
**
|
2016-01-15 14:57:40 +01:00
|
|
|
** Copyright (C) 2016 The Qt Company Ltd.
|
|
|
|
|
** Contact: https://www.qt.io/licensing/
|
2014-01-23 07:53:24 +02:00
|
|
|
**
|
|
|
|
|
** 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
|
2016-01-15 14:57:40 +01:00
|
|
|
** a written agreement between you and The Qt Company. For licensing terms
|
|
|
|
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
|
|
|
|
** information use the contact form at https://www.qt.io/contact-us.
|
2014-01-23 07:53:24 +02:00
|
|
|
**
|
2016-01-15 14:57:40 +01:00
|
|
|
** GNU General Public License Usage
|
|
|
|
|
** Alternatively, this file may be used under the terms of the GNU
|
|
|
|
|
** General Public License version 3 as published by the Free Software
|
|
|
|
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
|
|
|
|
** included in the packaging of this file. Please review the following
|
|
|
|
|
** information to ensure the GNU General Public License requirements will
|
|
|
|
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
2014-01-23 07:53:24 +02:00
|
|
|
**
|
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
|
|
#include "cppeditortestcase.h"
|
2018-09-03 16:10:43 +02:00
|
|
|
#include "cppquickfix.h"
|
2014-01-23 07:53:24 +02:00
|
|
|
|
2018-09-03 16:10:43 +02:00
|
|
|
#include <projectexplorer/headerpath.h>
|
2015-03-05 08:22:48 +01:00
|
|
|
|
2014-01-23 07:53:24 +02:00
|
|
|
#include <QByteArray>
|
|
|
|
|
#include <QList>
|
2021-08-25 17:34:11 +02:00
|
|
|
#include <QObject>
|
2014-01-23 07:53:24 +02:00
|
|
|
#include <QSharedPointer>
|
|
|
|
|
#include <QStringList>
|
|
|
|
|
|
|
|
|
|
namespace CppTools { class CppCodeStylePreferences; }
|
|
|
|
|
namespace TextEditor { class QuickFixOperation; }
|
|
|
|
|
|
|
|
|
|
namespace CppEditor {
|
|
|
|
|
namespace Internal {
|
|
|
|
|
namespace Tests {
|
|
|
|
|
|
2014-11-27 15:48:11 +01:00
|
|
|
///
|
|
|
|
|
/// Represents a test document before and after applying the quick fix.
|
|
|
|
|
///
|
|
|
|
|
/// A TestDocument's source may contain an '@' character to denote
|
2015-03-12 16:25:45 +01:00
|
|
|
/// the cursor position. For selections the markers "@{start}" and
|
|
|
|
|
/// "@{end}" can be used. The markers are removed before the editor
|
|
|
|
|
/// reads the document.
|
2014-11-27 15:48:11 +01:00
|
|
|
///
|
|
|
|
|
|
2021-08-27 13:15:46 +02:00
|
|
|
class QuickFixTestDocument : public GenericCppTestDocument
|
2014-01-23 07:53:24 +02:00
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
typedef QSharedPointer<QuickFixTestDocument> Ptr;
|
|
|
|
|
|
|
|
|
|
QuickFixTestDocument(const QByteArray &fileName, const QByteArray &source,
|
|
|
|
|
const QByteArray &expectedSource);
|
|
|
|
|
|
|
|
|
|
static Ptr create(const QByteArray &fileName, const QByteArray &source,
|
2014-11-27 15:48:11 +01:00
|
|
|
const QByteArray &expectedSource);
|
2014-01-23 07:53:24 +02:00
|
|
|
|
2015-03-12 16:25:45 +01:00
|
|
|
private:
|
|
|
|
|
void removeMarkers();
|
|
|
|
|
|
2014-01-23 07:53:24 +02:00
|
|
|
public:
|
2014-05-08 13:21:42 -04:00
|
|
|
QString m_expectedSource;
|
2014-01-23 07:53:24 +02:00
|
|
|
};
|
|
|
|
|
|
2014-11-27 15:48:11 +01:00
|
|
|
class BaseQuickFixTestCase : public TestCase
|
2014-01-23 07:53:24 +02:00
|
|
|
{
|
|
|
|
|
public:
|
2015-03-12 16:25:45 +01:00
|
|
|
/// Exactly one QuickFixTestDocument must contain the cursor position marker '@'
|
|
|
|
|
/// or "@{start}" and "@{end}"
|
2014-11-27 15:48:11 +01:00
|
|
|
BaseQuickFixTestCase(const QList<QuickFixTestDocument::Ptr> &testDocuments,
|
2018-09-03 16:10:43 +02:00
|
|
|
const ProjectExplorer::HeaderPaths &headerPaths
|
|
|
|
|
= ProjectExplorer::HeaderPaths());
|
2014-01-23 07:53:24 +02:00
|
|
|
|
2014-11-27 15:48:11 +01:00
|
|
|
~BaseQuickFixTestCase();
|
2014-01-23 07:53:24 +02:00
|
|
|
|
2014-11-27 15:48:11 +01:00
|
|
|
protected:
|
|
|
|
|
QuickFixTestDocument::Ptr m_documentWithMarker;
|
|
|
|
|
QList<QuickFixTestDocument::Ptr> m_testDocuments;
|
|
|
|
|
|
|
|
|
|
private:
|
2014-12-10 17:03:49 +01:00
|
|
|
QScopedPointer<CppTools::Tests::TemporaryDir> m_temporaryDirectory;
|
|
|
|
|
|
2014-01-23 07:53:24 +02:00
|
|
|
CppTools::CppCodeStylePreferences *m_cppCodeStylePreferences;
|
|
|
|
|
QByteArray m_cppCodeStylePreferencesOriginalDelegateId;
|
|
|
|
|
|
2018-09-03 16:10:43 +02:00
|
|
|
ProjectExplorer::HeaderPaths m_headerPathsToRestore;
|
2014-06-25 17:23:19 +02:00
|
|
|
bool m_restoreHeaderPaths;
|
2014-01-23 07:53:24 +02:00
|
|
|
};
|
|
|
|
|
|
2014-11-27 15:48:11 +01:00
|
|
|
/// Tests a concrete QuickFixOperation of a given CppQuickFixFactory
|
|
|
|
|
class QuickFixOperationTest : public BaseQuickFixTestCase
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
QuickFixOperationTest(const QList<QuickFixTestDocument::Ptr> &testDocuments,
|
|
|
|
|
CppQuickFixFactory *factory,
|
2018-09-03 16:10:43 +02:00
|
|
|
const ProjectExplorer::HeaderPaths &headerPaths
|
|
|
|
|
= ProjectExplorer::HeaderPaths(),
|
2014-11-27 15:48:11 +01:00
|
|
|
int operationIndex = 0,
|
|
|
|
|
const QByteArray &expectedFailMessage = QByteArray());
|
|
|
|
|
|
|
|
|
|
static void run(const QList<QuickFixTestDocument::Ptr> &testDocuments,
|
|
|
|
|
CppQuickFixFactory *factory,
|
|
|
|
|
const QString &headerPath,
|
|
|
|
|
int operationIndex = 0);
|
|
|
|
|
};
|
|
|
|
|
|
2014-01-23 07:53:24 +02:00
|
|
|
QList<QuickFixTestDocument::Ptr> singleDocument(const QByteArray &original,
|
|
|
|
|
const QByteArray &expected);
|
|
|
|
|
|
2021-08-25 17:34:11 +02:00
|
|
|
class QuickfixTest : public QObject
|
|
|
|
|
{
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
|
|
private slots:
|
|
|
|
|
void testGeneric_data();
|
|
|
|
|
void testGeneric();
|
|
|
|
|
|
|
|
|
|
void testGenerateGetterSetterNamespaceHandlingCreate_data();
|
|
|
|
|
void testGenerateGetterSetterNamespaceHandlingCreate();
|
|
|
|
|
void testGenerateGetterSetterNamespaceHandlingAddUsing_data();
|
|
|
|
|
void testGenerateGetterSetterNamespaceHandlingAddUsing();
|
|
|
|
|
void testGenerateGetterSetterNamespaceHandlingFullyQualify_data();
|
|
|
|
|
void testGenerateGetterSetterNamespaceHandlingFullyQualify();
|
|
|
|
|
void testGenerateGetterSetterCustomNames_data();
|
|
|
|
|
void testGenerateGetterSetterCustomNames();
|
|
|
|
|
void testGenerateGetterSetterValueTypes_data();
|
|
|
|
|
void testGenerateGetterSetterValueTypes();
|
|
|
|
|
void testGenerateGetterSetterCustomTemplate();
|
|
|
|
|
void testGenerateGetterSetterNeedThis();
|
|
|
|
|
void testGenerateGetterSetterOfferedFixes_data();
|
|
|
|
|
void testGenerateGetterSetterOfferedFixes();
|
|
|
|
|
void testGenerateGetterSetterGeneralTests_data();
|
|
|
|
|
void testGenerateGetterSetterGeneralTests();
|
|
|
|
|
void testGenerateGetterSetterOnlyGetter();
|
|
|
|
|
void testGenerateGetterSetterOnlySetter();
|
|
|
|
|
void testGenerateGetterSetterInlineInHeaderFile();
|
|
|
|
|
void testGenerateGetterSetterOnlySetterHeaderFileWithIncludeGuard();
|
|
|
|
|
void testGenerateGettersSetters_data();
|
|
|
|
|
void testGenerateGettersSetters();
|
|
|
|
|
|
|
|
|
|
void testInsertQtPropertyMembers_data();
|
|
|
|
|
void testInsertQtPropertyMembers();
|
|
|
|
|
|
|
|
|
|
void testInsertMemberFromInitialization_data();
|
|
|
|
|
void testInsertMemberFromInitialization();
|
|
|
|
|
|
|
|
|
|
void testConvertQt4ConnectConnectOutOfClass();
|
|
|
|
|
void testConvertQt4ConnectConnectWithinClass_data();
|
|
|
|
|
void testConvertQt4ConnectConnectWithinClass();
|
|
|
|
|
void testConvertQt4ConnectDifferentNamespace();
|
|
|
|
|
|
|
|
|
|
void testInsertDefFromDeclAfterClass();
|
|
|
|
|
void testInsertDefFromDeclHeaderSourceBasic1();
|
|
|
|
|
void testInsertDefFromDeclHeaderSourceBasic2();
|
|
|
|
|
void testInsertDefFromDeclHeaderSourceBasic3();
|
|
|
|
|
void testInsertDefFromDeclHeaderSourceNamespace1();
|
|
|
|
|
void testInsertDefFromDeclHeaderSourceNamespace2();
|
|
|
|
|
void testInsertDefFromDeclInsideClass();
|
|
|
|
|
void testInsertDefFromDeclNotTriggeringWhenDefinitionExists();
|
|
|
|
|
void testInsertDefFromDeclFindRightImplementationFile();
|
|
|
|
|
void testInsertDefFromDeclIgnoreSurroundingGeneratedDeclarations();
|
|
|
|
|
void testInsertDefFromDeclRespectWsInOperatorNames1();
|
|
|
|
|
void testInsertDefFromDeclRespectWsInOperatorNames2();
|
|
|
|
|
void testInsertDefFromDeclNoexceptSpecifier();
|
|
|
|
|
void testInsertDefFromDeclMacroUsesAtEndOfFile1();
|
|
|
|
|
void testInsertDefFromDeclMacroUsesAtEndOfFile2();
|
|
|
|
|
void testInsertDefFromDeclErroneousStatementAtEndOfFile();
|
|
|
|
|
void testInsertDefFromDeclRvalueReference();
|
|
|
|
|
void testInsertDefFromDeclFunctionTryBlock();
|
|
|
|
|
void testInsertDefFromDeclUsingDecl();
|
|
|
|
|
void testInsertDefFromDeclFindImplementationFile();
|
|
|
|
|
void testInsertDefFromDeclUnicodeIdentifier();
|
|
|
|
|
void testInsertDefFromDeclTemplateClass();
|
|
|
|
|
void testInsertDefFromDeclTemplateClassWithValueParam();
|
|
|
|
|
void testInsertDefFromDeclTemplateFunction();
|
|
|
|
|
void testInsertDefFromDeclNotTriggeredForFriendFunc();
|
|
|
|
|
void testInsertDefFromDeclMinimalFunctionParameterType();
|
|
|
|
|
void testInsertDefsFromDecls_data();
|
|
|
|
|
void testInsertDefsFromDecls();
|
|
|
|
|
|
|
|
|
|
void testInsertDeclFromDef();
|
|
|
|
|
void testInsertDeclFromDefTemplateFuncTypename();
|
|
|
|
|
void testInsertDeclFromDefTemplateFuncInt();
|
|
|
|
|
void testInsertDeclFromDefNotTriggeredForTemplateFunc();
|
|
|
|
|
|
|
|
|
|
void testAddIncludeForUndefinedIdentifier_data();
|
|
|
|
|
void testAddIncludeForUndefinedIdentifier();
|
|
|
|
|
void testAddIncludeForUndefinedIdentifierNoDoubleQtHeaderInclude();
|
|
|
|
|
|
|
|
|
|
void testAddForwardDeclForUndefinedIdentifier_data();
|
|
|
|
|
void testAddForwardDeclForUndefinedIdentifier();
|
|
|
|
|
|
|
|
|
|
void testMoveFuncDefOutsideMemberFuncToCpp();
|
|
|
|
|
void testMoveFuncDefOutsideMemberFuncToCppInsideNS();
|
|
|
|
|
void testMoveFuncDefOutsideMemberFuncOutside1();
|
|
|
|
|
void testMoveFuncDefOutsideMemberFuncOutside2();
|
|
|
|
|
void testMoveFuncDefOutsideMemberFuncToCppNS();
|
|
|
|
|
void testMoveFuncDefOutsideMemberFuncToCppNSUsing();
|
|
|
|
|
void testMoveFuncDefOutsideMemberFuncOutsideWithNs();
|
|
|
|
|
void testMoveFuncDefOutsideFreeFuncToCpp();
|
|
|
|
|
void testMoveFuncDefOutsideFreeFuncToCppNS();
|
|
|
|
|
void testMoveFuncDefOutsideCtorWithInitialization1();
|
|
|
|
|
void testMoveFuncDefOutsideCtorWithInitialization2();
|
|
|
|
|
void testMoveFuncDefOutsideAfterClass();
|
|
|
|
|
void testMoveFuncDefOutsideRespectWsInOperatorNames1();
|
|
|
|
|
void testMoveFuncDefOutsideRespectWsInOperatorNames2();
|
|
|
|
|
void testMoveFuncDefOutsideMacroUses();
|
|
|
|
|
void testMoveFuncDefOutsideTemplate();
|
|
|
|
|
void testMoveFuncDefOutsideTemplateSpecializedClass();
|
|
|
|
|
void testMoveFuncDefOutsideUnnamedTemplate();
|
|
|
|
|
void testMoveFuncDefOutsideMemberFuncToCppStatic();
|
|
|
|
|
void testMoveFuncDefOutsideMemberFuncToCppWithInlinePartOfName();
|
|
|
|
|
|
|
|
|
|
void testMoveAllFuncDefOutsideMemberFuncToCpp();
|
|
|
|
|
void testMoveAllFuncDefOutsideMemberFuncOutside();
|
|
|
|
|
void testMoveAllFuncDefOutsideDoNotTriggerOnBaseClass();
|
|
|
|
|
void testMoveAllFuncDefOutsideClassWithBaseClass();
|
|
|
|
|
void testMoveAllFuncDefOutsideIgnoreMacroCode();
|
|
|
|
|
|
|
|
|
|
void testMoveFuncDefToDeclMemberFunc();
|
|
|
|
|
void testMoveFuncDefToDeclMemberFuncOutside();
|
|
|
|
|
void testMoveFuncDefToDeclMemberFuncToCppNS();
|
|
|
|
|
void testMoveFuncDefToDeclMemberFuncToCppNSUsing();
|
|
|
|
|
void testMoveFuncDefToDeclMemberFuncOutsideWithNs();
|
|
|
|
|
void testMoveFuncDefToDeclFreeFuncToCpp();
|
|
|
|
|
void testMoveFuncDefToDeclFreeFuncToCppNS();
|
|
|
|
|
void testMoveFuncDefToDeclCtorWithInitialization();
|
|
|
|
|
void testMoveFuncDefToDeclStructWithAssignedVariable();
|
|
|
|
|
void testMoveFuncDefToDeclMacroUses();
|
|
|
|
|
void testMoveFuncDefToDeclOverride();
|
|
|
|
|
void testMoveFuncDefToDeclTemplate();
|
|
|
|
|
void testMoveFuncDefToDeclTemplateFunction();
|
|
|
|
|
|
|
|
|
|
void testAssignToLocalVariableTemplates();
|
|
|
|
|
|
|
|
|
|
void testExtractFunction_data();
|
|
|
|
|
void testExtractFunction();
|
|
|
|
|
|
|
|
|
|
void testExtractLiteralAsParameterTypeDeduction_data();
|
|
|
|
|
void testExtractLiteralAsParameterTypeDeduction();
|
|
|
|
|
void testExtractLiteralAsParameterFreeFunctionSeparateFiles();
|
|
|
|
|
void testExtractLiteralAsParameterMemberFunctionSeparateFiles();
|
|
|
|
|
void testExtractLiteralAsParameterNotTriggeringForInvalidCode();
|
|
|
|
|
|
|
|
|
|
void testAddCurlyBraces();
|
|
|
|
|
|
|
|
|
|
void testRemoveUsingNamespace_data();
|
|
|
|
|
void testRemoveUsingNamespace();
|
|
|
|
|
void testRemoveUsingNamespaceSimple_data();
|
|
|
|
|
void testRemoveUsingNamespaceSimple();
|
|
|
|
|
void testRemoveUsingNamespaceDifferentSymbols();
|
|
|
|
|
|
|
|
|
|
void testGenerateConstructor_data();
|
|
|
|
|
void testGenerateConstructor();
|
|
|
|
|
};
|
|
|
|
|
|
2014-01-23 07:53:24 +02:00
|
|
|
} // namespace Tests
|
|
|
|
|
} // namespace Internal
|
|
|
|
|
} // namespace CppEditor
|