From d614e1aa854136abaeeaaed8547fc599d8dfb7e7 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 5 Mar 2025 16:51:59 +0100 Subject: [PATCH] CppEditor: Convert ExtractFunctionTest to out-of-line approach Change-Id: Iee8d96bfd3a0c4f48bb16172e47654d2ffb2f38c Reviewed-by: Christian Stenger --- src/plugins/cppeditor/cppeditor.qrc | 9 ++ .../cppeditor/quickfixes/extractfunction.cpp | 146 +----------------- .../ExtractFunctionTest/basic/expected_file.h | 10 ++ .../ExtractFunctionTest/basic/original_file.h | 5 + .../class-in-namespace/description.txt | 1 + .../class-in-namespace/expected_file.h | 17 ++ .../class-in-namespace/original_file.h | 9 ++ .../if-block/expected_file.h | 12 ++ .../if-block/original_file.h | 7 + .../member-function/expected_file.h | 17 ++ .../member-function/original_file.h | 9 ++ 11 files changed, 101 insertions(+), 141 deletions(-) create mode 100644 src/plugins/cppeditor/testcases/ExtractFunctionTest/basic/expected_file.h create mode 100644 src/plugins/cppeditor/testcases/ExtractFunctionTest/basic/original_file.h create mode 100644 src/plugins/cppeditor/testcases/ExtractFunctionTest/class-in-namespace/description.txt create mode 100644 src/plugins/cppeditor/testcases/ExtractFunctionTest/class-in-namespace/expected_file.h create mode 100644 src/plugins/cppeditor/testcases/ExtractFunctionTest/class-in-namespace/original_file.h create mode 100644 src/plugins/cppeditor/testcases/ExtractFunctionTest/if-block/expected_file.h create mode 100644 src/plugins/cppeditor/testcases/ExtractFunctionTest/if-block/original_file.h create mode 100644 src/plugins/cppeditor/testcases/ExtractFunctionTest/member-function/expected_file.h create mode 100644 src/plugins/cppeditor/testcases/ExtractFunctionTest/member-function/original_file.h diff --git a/src/plugins/cppeditor/cppeditor.qrc b/src/plugins/cppeditor/cppeditor.qrc index ef0aee550e1..f28e03fb16b 100644 --- a/src/plugins/cppeditor/cppeditor.qrc +++ b/src/plugins/cppeditor/cppeditor.qrc @@ -321,5 +321,14 @@ testcases/ConvertToMetaMethodCallTest/Q_SLOT/original_file.cpp testcases/ConvertToMetaMethodCallTest/slot/expected_file.cpp testcases/ConvertToMetaMethodCallTest/slot/original_file.cpp + testcases/ExtractFunctionTest/basic/expected_file.h + testcases/ExtractFunctionTest/basic/original_file.h + testcases/ExtractFunctionTest/class-in-namespace/description.txt + testcases/ExtractFunctionTest/class-in-namespace/expected_file.h + testcases/ExtractFunctionTest/class-in-namespace/original_file.h + testcases/ExtractFunctionTest/member-function/expected_file.h + testcases/ExtractFunctionTest/member-function/original_file.h + testcases/ExtractFunctionTest/if-block/expected_file.h + testcases/ExtractFunctionTest/if-block/original_file.h diff --git a/src/plugins/cppeditor/quickfixes/extractfunction.cpp b/src/plugins/cppeditor/quickfixes/extractfunction.cpp index c417b88b761..3af0d1711de 100644 --- a/src/plugins/cppeditor/quickfixes/extractfunction.cpp +++ b/src/plugins/cppeditor/quickfixes/extractfunction.cpp @@ -480,16 +480,6 @@ public: //! Extracts the selected code and puts it to a function class ExtractFunction : public CppQuickFixFactory { -public: - ExtractFunction(FunctionNameGetter functionNameGetter = FunctionNameGetter()) - : m_functionNameGetter(functionNameGetter) - {} - -#ifdef WITH_TESTS - static QObject *createTest(); -#endif - -private: void doMatch(const CppQuickFixInterface &interface, QuickFixOperations &result) override { const CppRefactoringFilePtr file = interface.currentFile(); @@ -616,148 +606,22 @@ private: // The current implementation doesn't try to be too smart since it preserves the original form // of the declarations. This might be or not the desired effect. An improvement would be to // let the user somehow customize the function interface. + FunctionNameGetter nameGetter; + if (testMode()) + nameGetter = []() { return QLatin1String("extracted"); }; result << new ExtractFunctionOperation(interface, analyser.m_extractionStart, analyser.m_extractionEnd, refFuncDef, funcReturn, relevantDecls, - m_functionNameGetter); - } - -private: - FunctionNameGetter m_functionNameGetter; // For tests to avoid GUI pop-up. -}; - -#ifdef WITH_TESTS -using namespace Tests; - -class ExtractFunctionTest : public QObject -{ - Q_OBJECT - -private slots: - void test_data() - { - QTest::addColumn("original"); - QTest::addColumn("expected"); - - QTest::newRow("basic") - << QByteArray("// Documentation for f\n" - "void f()\n" - "{\n" - " @{start}g();@{end}\n" - "}\n") - << QByteArray("inline void extracted()\n" - "{\n" - " g();\n" - "}\n" - "\n" - "// Documentation for f\n" - "void f()\n" - "{\n" - " extracted();\n" - "}\n"); - - QTest::newRow("class function") - << QByteArray("class Foo\n" - "{\n" - "private:\n" - " void bar();\n" - "};\n\n" - "void Foo::bar()\n" - "{\n" - " @{start}g();@{end}\n" - "}\n") - << QByteArray("class Foo\n" - "{\n" - "public:\n" - " void extracted();\n\n" - "private:\n" - " void bar();\n" - "};\n\n" - "inline void Foo::extracted()\n" - "{\n" - " g();\n" - "}\n\n" - "void Foo::bar()\n" - "{\n" - " extracted();\n" - "}\n"); - - QTest::newRow("class in namespace") - << QByteArray("namespace NS {\n" - "class C {\n" - " void f(C &c);\n" - "};\n" - "}\n" - "void NS::C::f(NS::C &c)\n" - "{\n" - " @{start}C *c2 = &c;@{end}\n" - "}\n") - << QByteArray("namespace NS {\n" - "class C {\n" - " void f(C &c);\n" - "\n" - "public:\n" - " void extracted(NS::C &c);\n" // TODO: Remove non-required qualification - "};\n" - "}\n" - "inline void NS::C::extracted(NS::C &c)\n" - "{\n" - " C *c2 = &c;\n" - "}\n" - "\n" - "void NS::C::f(NS::C &c)\n" - "{\n" - " extracted(c);\n" - "}\n"); - - QTest::newRow("if-block") - << QByteArray("inline void func()\n" - "{\n" - " int dummy = 0;\n" - " @{start}if@{end} (dummy < 10) {\n" - " ++dummy;\n" - " }\n" - "}\n") - << QByteArray("inline void extracted(int dummy)\n" - "{\n" - " if (dummy < 10) {\n" - " ++dummy;\n" - " }\n" - "}\n\n" - "inline void func()\n" - "{\n" - " int dummy = 0;\n" - " extracted(dummy);\n" - "}\n"); - } - - void test() - { - QFETCH(QByteArray, original); - QFETCH(QByteArray, expected); - - QList testDocuments; - testDocuments << CppTestDocument::create("file.h", original, expected); - - ExtractFunction factory([]() { return QLatin1String("extracted"); }); - QuickFixOperationTest(testDocuments, &factory); + nameGetter); } }; -QObject *ExtractFunction::createTest() { return new ExtractFunctionTest; } - -#endif // WITH_TESTS - } // namespace void registerExtractFunctionQuickfix() { - CppQuickFixFactory::registerFactory(); + CppQuickFixFactory::registerFactoryWithStandardTest("ExtractFunctionTest"); } } // namespace CppEditor::Internal - -#ifdef WITH_TESTS -#include -#endif diff --git a/src/plugins/cppeditor/testcases/ExtractFunctionTest/basic/expected_file.h b/src/plugins/cppeditor/testcases/ExtractFunctionTest/basic/expected_file.h new file mode 100644 index 00000000000..7e26e723c1d --- /dev/null +++ b/src/plugins/cppeditor/testcases/ExtractFunctionTest/basic/expected_file.h @@ -0,0 +1,10 @@ +inline void extracted() +{ + g(); +} + +// Documentation for f +void f() +{ + extracted(); +} diff --git a/src/plugins/cppeditor/testcases/ExtractFunctionTest/basic/original_file.h b/src/plugins/cppeditor/testcases/ExtractFunctionTest/basic/original_file.h new file mode 100644 index 00000000000..7d728b2d4d5 --- /dev/null +++ b/src/plugins/cppeditor/testcases/ExtractFunctionTest/basic/original_file.h @@ -0,0 +1,5 @@ +// Documentation for f +void f() +{ + @{start}g();@{end} +} diff --git a/src/plugins/cppeditor/testcases/ExtractFunctionTest/class-in-namespace/description.txt b/src/plugins/cppeditor/testcases/ExtractFunctionTest/class-in-namespace/description.txt new file mode 100644 index 00000000000..20f1dd41f69 --- /dev/null +++ b/src/plugins/cppeditor/testcases/ExtractFunctionTest/class-in-namespace/description.txt @@ -0,0 +1 @@ +class in namespace (TODO: Remove redundant qualification) diff --git a/src/plugins/cppeditor/testcases/ExtractFunctionTest/class-in-namespace/expected_file.h b/src/plugins/cppeditor/testcases/ExtractFunctionTest/class-in-namespace/expected_file.h new file mode 100644 index 00000000000..d22e682428f --- /dev/null +++ b/src/plugins/cppeditor/testcases/ExtractFunctionTest/class-in-namespace/expected_file.h @@ -0,0 +1,17 @@ +namespace NS { +class C { + void f(C &c); + +public: + void extracted(NS::C &c); +}; +} +inline void NS::C::extracted(NS::C &c) +{ + C *c2 = &c; +} + +void NS::C::f(NS::C &c) +{ + extracted(c); +} diff --git a/src/plugins/cppeditor/testcases/ExtractFunctionTest/class-in-namespace/original_file.h b/src/plugins/cppeditor/testcases/ExtractFunctionTest/class-in-namespace/original_file.h new file mode 100644 index 00000000000..3f7473d7100 --- /dev/null +++ b/src/plugins/cppeditor/testcases/ExtractFunctionTest/class-in-namespace/original_file.h @@ -0,0 +1,9 @@ +namespace NS { +class C { + void f(C &c); +}; +} +void NS::C::f(NS::C &c) +{ + @{start}C *c2 = &c;@{end} +} diff --git a/src/plugins/cppeditor/testcases/ExtractFunctionTest/if-block/expected_file.h b/src/plugins/cppeditor/testcases/ExtractFunctionTest/if-block/expected_file.h new file mode 100644 index 00000000000..08c5de96eb6 --- /dev/null +++ b/src/plugins/cppeditor/testcases/ExtractFunctionTest/if-block/expected_file.h @@ -0,0 +1,12 @@ +inline void extracted(int dummy) +{ + if (dummy < 10) { + ++dummy; + } +} + +inline void func() +{ + int dummy = 0; + extracted(dummy); +} diff --git a/src/plugins/cppeditor/testcases/ExtractFunctionTest/if-block/original_file.h b/src/plugins/cppeditor/testcases/ExtractFunctionTest/if-block/original_file.h new file mode 100644 index 00000000000..1d78d10d37f --- /dev/null +++ b/src/plugins/cppeditor/testcases/ExtractFunctionTest/if-block/original_file.h @@ -0,0 +1,7 @@ +inline void func() +{ + int dummy = 0; + @{start}if@{end} (dummy < 10) { + ++dummy; + } +} diff --git a/src/plugins/cppeditor/testcases/ExtractFunctionTest/member-function/expected_file.h b/src/plugins/cppeditor/testcases/ExtractFunctionTest/member-function/expected_file.h new file mode 100644 index 00000000000..57a59f2481c --- /dev/null +++ b/src/plugins/cppeditor/testcases/ExtractFunctionTest/member-function/expected_file.h @@ -0,0 +1,17 @@ +class Foo +{ +public: + void extracted(); + +private: + void bar(); +}; +inline void Foo::extracted() +{ + g(); +} + +void Foo::bar() +{ + extracted(); +} diff --git a/src/plugins/cppeditor/testcases/ExtractFunctionTest/member-function/original_file.h b/src/plugins/cppeditor/testcases/ExtractFunctionTest/member-function/original_file.h new file mode 100644 index 00000000000..2c496e50ad7 --- /dev/null +++ b/src/plugins/cppeditor/testcases/ExtractFunctionTest/member-function/original_file.h @@ -0,0 +1,9 @@ +class Foo +{ +private: + void bar(); +}; +void Foo::bar() +{ + @{start}g();@{end} +}