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}
+}