diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp index 914240dda7a5c5b1636e019199b6f4182f755a3e..a45aebbfd6f5665dda3ea4228ca658858067c7a2 100644 --- a/src/plugins/cppeditor/cppquickfix_test.cpp +++ b/src/plugins/cppeditor/cppquickfix_test.cpp @@ -609,60 +609,6 @@ void CppEditorPlugin::test_quickfix_GenerateGetterSetter_basicGetterWithPrefixAn data.run(&factory); } -/// Checks: In addition to test_quickfix_GenerateGetterSetter_basicGetterWithPrefix -/// generated definitions should fit in the namespace. -void CppEditorPlugin::test_quickfix_GenerateGetterSetter_basicGetterWithPrefixAndNamespaceToCpp() -{ - QList<TestDocumentPtr> testFiles; - QByteArray original; - QByteArray expected; - - // Header File - original = - "namespace SomeNamespace {\n" - "class Something\n" - "{\n" - " int @it;\n" - "};\n" - "}\n"; - expected = - "namespace SomeNamespace {\n" - "class Something\n" - "{\n" - " int it;\n" - "\n" - "public:\n" - " int getIt() const;\n" - " void setIt(int value);\n" - "};\n" - "}\n\n"; - testFiles << TestDocument::create(original, expected, QLatin1String("file.h")); - - // Source File - original = - "#include \"file.h\"\n" - "namespace SomeNamespace {\n" - "}\n"; - expected = - "#include \"file.h\"\n" - "namespace SomeNamespace {\n" - "int Something::getIt() const\n" - "{\n" - " return it;\n" - "}\n" - "\n" - "void Something::setIt(int value)\n" - "{\n" - " it = value;\n" - "}\n\n" - "}\n\n"; - testFiles << TestDocument::create(original, expected, QLatin1String("file.cpp")); - - GenerateGetterSetter factory; - TestCase data(testFiles); - data.run(&factory); -} - /// Checks: /// 1. Getter: "get" prefix is not necessary. /// 2. Setter: Parameter name is base name. @@ -1175,194 +1121,527 @@ void CppEditorPlugin::test_quickfix_InsertDefFromDecl_basic() data.run(&factory); } -/// Check if definition is inserted right after class for insert definition outside -void CppEditorPlugin::test_quickfix_InsertDefFromDecl_afterClass() -{ - QList<TestDocumentPtr> testFiles; - QByteArray original; - QByteArray expected; - - // Header File - original = - "class Foo\n" - "{\n" - " Foo();\n" - " void a@();\n" - "};\n" - "\n" - "class Bar {};\n"; - expected = - "class Foo\n" - "{\n" - " Foo();\n" - " void a();\n" - "};\n" - "\n" - "void Foo::a()\n" - "{\n\n}\n" - "\n" - "class Bar {};\n\n"; - testFiles << TestDocument::create(original, expected, QLatin1String("file.h")); - - // Source File - original = - "#include \"file.h\"\n" - "\n" - "Foo::Foo()\n" - "{\n\n" - "}\n"; - expected = original + "\n"; - testFiles << TestDocument::create(original, expected, QLatin1String("file.cpp")); - - InsertDefFromDecl factory; - TestCase data(testFiles); - data.run(&factory, 1); -} - -/// Check from header file: If there is a source file, insert the definition in the source file. -/// Case: Source file is empty. -void CppEditorPlugin::test_quickfix_InsertDefFromDecl_headerSource_basic1() +void CppEditorPlugin::test_quickfix_InsertDefFromDecl_freeFunction() { - QList<TestDocumentPtr> testFiles; - - QByteArray original; - QByteArray expected; - - // Header File - original = - "struct Foo\n" - "{\n" - " Foo()@;\n" - "};\n"; - expected = original + "\n"; - testFiles << TestDocument::create(original, expected, QLatin1String("file.h")); - - // Source File - original.resize(0); - expected = - "\n" - "Foo::Foo()\n" + const QByteArray original = "void free()@;\n"; + const QByteArray expected = + "void free()\n" "{\n\n" "}\n" "\n" ; - testFiles << TestDocument::create(original, expected, QLatin1String("file.cpp")); InsertDefFromDecl factory; - TestCase data(testFiles); + TestCase data(original, expected); data.run(&factory); } -/// Check from header file: If there is a source file, insert the definition in the source file. -/// Case: Source file is not empty. -void CppEditorPlugin::test_quickfix_InsertDefFromDecl_headerSource_basic2() +/// Check not triggering when it is a statement +void CppEditorPlugin::test_quickfix_InsertDefFromDecl_notTriggeringStatement() { - QList<TestDocumentPtr> testFiles; - - QByteArray original; - QByteArray expected; - - // Header File - original = "void f()@;\n"; - expected = original + "\n"; - testFiles << TestDocument::create(original, expected, QLatin1String("file.h")); - - // Source File - original = - "#include \"file.h\"\n" - "\n" - "int x;\n" - ; - expected = - "#include \"file.h\"\n" - "\n" - "int x;\n" - "\n" - "\n" - "void f()\n" - "{\n" - "\n" - "}\n" - "\n" - ; - testFiles << TestDocument::create(original, expected, QLatin1String("file.cpp")); + const QByteArray original = + "class Foo {\n" + "public:\n" + " Foo() {}\n" + "};\n" + "void freeFunc() {\n" + " Foo @f();" + "}\n"; + const QByteArray expected = original + "\n"; InsertDefFromDecl factory; - TestCase data(testFiles); + TestCase data(original, expected); data.run(&factory); } -/// Check from source file: Insert in source file, not header file. -void CppEditorPlugin::test_quickfix_InsertDefFromDecl_headerSource_basic3() +/// Check: Add local variable for a free function. +void CppEditorPlugin::test_quickfix_AssignToLocalVariable_freeFunction() { - QList<TestDocumentPtr> testFiles; - - QByteArray original; - QByteArray expected; - - // Empty Header File - testFiles << TestDocument::create("", "\n", QLatin1String("file.h")); - - // Source File - original = - "struct Foo\n" - "{\n" - " Foo()@;\n" - "};\n"; - expected = original + - "\n" - "\n" - "Foo::Foo()\n" - "{\n\n" - "}\n" - "\n" - ; - testFiles << TestDocument::create(original, expected, QLatin1String("file.cpp")); + const QByteArray original = + "int foo() {return 1;}\n" + "void bar() {fo@o();}"; + const QByteArray expected = + "int foo() {return 1;}\n" + "void bar() {int localFoo = foo();}\n"; - InsertDefFromDecl factory; - TestCase data(testFiles); + AssignToLocalVariable factory; + TestCase data(original, expected); data.run(&factory); } -/// Check from header file: If the class is in a namespace, the added function definition -/// name must be qualified accordingly. -void CppEditorPlugin::test_quickfix_InsertDefFromDecl_headerSource_namespace1() +/// Check: Add local variable for a member function. +void CppEditorPlugin::test_quickfix_AssignToLocalVariable_memberFunction() { - QList<TestDocumentPtr> testFiles; - - QByteArray original; - QByteArray expected; - - // Header File - original = - "namespace N {\n" - "struct Foo\n" - "{\n" - " Foo()@;\n" - "};\n" + const QByteArray original = + "class Foo {public: int* fooFunc();}\n" + "void bar() {\n" + " Foo *f = new Foo;\n" + " @f->fooFunc();\n" + "}"; + const QByteArray expected = + "class Foo {public: int* fooFunc();}\n" + "void bar() {\n" + " Foo *f = new Foo;\n" + " int *localFooFunc = f->fooFunc();\n" "}\n"; - expected = original + "\n"; - testFiles << TestDocument::create(original, expected, QLatin1String("file.h")); - - // Source File - original.resize(0); - expected = - "\n" - "N::Foo::Foo()\n" - "{\n\n" - "}\n" - "\n" - ; - testFiles << TestDocument::create(original, expected, QLatin1String("file.cpp")); - InsertDefFromDecl factory; - TestCase data(testFiles); + AssignToLocalVariable factory; + TestCase data(original, expected); data.run(&factory); } -/// Check from header file: If the class is in namespace N and the source file has a -/// "using namespace N" line, the function definition name must be qualified accordingly. -void CppEditorPlugin::test_quickfix_InsertDefFromDecl_headerSource_namespace2() +/// Check: Add local variable for a static member function. +void CppEditorPlugin::test_quickfix_AssignToLocalVariable_staticMemberFunction() +{ + const QByteArray original = + "class Foo {public: static int* fooFunc();}\n" + "void bar() {\n" + " Foo::fooF@unc();\n" + "}"; + const QByteArray expected = + "class Foo {public: static int* fooFunc();}\n" + "void bar() {\n" + " int *localFooFunc = Foo::fooFunc();\n" + "}\n"; + + AssignToLocalVariable factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: Add local variable for a new Expression. +void CppEditorPlugin::test_quickfix_AssignToLocalVariable_newExpression() +{ + const QByteArray original = + "class Foo {}\n" + "void bar() {\n" + " new Fo@o;\n" + "}"; + const QByteArray expected = + "class Foo {}\n" + "void bar() {\n" + " Foo *localFoo = new Foo;\n" + "}\n"; + + AssignToLocalVariable factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: No trigger for function inside member initialization list. +void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noInitializationList() +{ + const QByteArray original = + "class Foo\n" + "{\n" + " public: Foo : m_i(fooF@unc()) {}\n" + " int fooFunc() {return 2;}\n" + " int m_i;\n" + "};"; + const QByteArray expected = original + "\n"; + + AssignToLocalVariable factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: No trigger for void functions. +void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noVoidFunction() +{ + const QByteArray original = + "void foo() {}\n" + "void bar() {fo@o();}"; + const QByteArray expected = original + "\n"; + + AssignToLocalVariable factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: No trigger for void member functions. +void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noVoidMemberFunction() +{ + const QByteArray original = + "class Foo {public: void fooFunc();}\n" + "void bar() {\n" + " Foo *f = new Foo;\n" + " @f->fooFunc();\n" + "}"; + const QByteArray expected = original + "\n"; + + AssignToLocalVariable factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: No trigger for void static member functions. +void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noVoidStaticMemberFunction() +{ + const QByteArray original = + "class Foo {public: static void fooFunc();}\n" + "void bar() {\n" + " Foo::fo@oFunc();\n" + "}"; + const QByteArray expected = original + "\n"; + + AssignToLocalVariable factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: No trigger for functions in expressions. +void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noFunctionInExpression() +{ + const QByteArray original = + "int foo(int a) {return a;}\n" + "int bar() {return 1;}" + "void baz() {foo(@bar() + bar());}"; + const QByteArray expected = original + "\n"; + + AssignToLocalVariable factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: No trigger for functions in functions. (QTCREATORBUG-9510) +void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noFunctionInFunction() +{ + const QByteArray original = + "int foo(int a, int b) {return a + b;}\n" + "int bar(int a) {return a;}\n" + "void baz() {\n" + " int a = foo(ba@r(), bar());\n" + "}\n"; + const QByteArray expected = original + "\n"; + + AssignToLocalVariable factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: No trigger for functions in return statements (classes). +void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noReturnClass1() +{ + const QByteArray original = + "class Foo {public: static void fooFunc();}\n" + "Foo* bar() {\n" + " return new Fo@o;\n" + "}"; + const QByteArray expected = original + "\n"; + + AssignToLocalVariable factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: No trigger for functions in return statements (classes). (QTCREATORBUG-9525) +void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noReturnClass2() +{ + const QByteArray original = + "class Foo {public: int fooFunc();}\n" + "int bar() {\n" + " return (new Fo@o)->fooFunc();\n" + "}"; + const QByteArray expected = original + "\n"; + + AssignToLocalVariable factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: No trigger for functions in return statements (functions). +void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noReturnFunc1() +{ + const QByteArray original = + "class Foo {public: int fooFunc();}\n" + "int bar() {\n" + " return Foo::fooFu@nc();\n" + "}"; + const QByteArray expected = original + "\n"; + + AssignToLocalVariable factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: No trigger for functions in return statements (functions). (QTCREATORBUG-9525) +void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noReturnFunc2() +{ + const QByteArray original = + "int bar() {\n" + " return list.firs@t().foo;\n" + "}\n"; + const QByteArray expected = original + "\n"; + + AssignToLocalVariable factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: No trigger for functions which does not match in signature. +void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noSignatureMatch() +{ + const QByteArray original = + "int someFunc(int);\n" + "\n" + "void f()\n" + "{\n" + " some@Func();\n" + "}"; + const QByteArray expected = original + "\n"; + + AssignToLocalVariable factory; + TestCase data(original, expected); + data.run(&factory); +} + +void CppEditorPlugin::test_quickfix_ExtractLiteralAsParameter_freeFunction() +{ + const QByteArray original = + "void foo(const char *a, long b = 1)\n" + "{return 1@56 + 123 + 156;}"; + const QByteArray expected = + "void foo(const char *a, long b = 1, int newParameter = 156)\n" + "{return newParameter + 123 + newParameter;}\n"; + + ExtractLiteralAsParameter factory; + TestCase data(original, expected); + data.run(&factory); +} + +void CppEditorPlugin::test_quickfix_ExtractLiteralAsParameter_memberFunction() +{ + const QByteArray original = + "class Narf {\n" + "public:\n" + " int zort();\n" + "};\n\n" + "int Narf::zort()\n" + "{ return 15@5 + 1; }"; + const QByteArray expected = + "class Narf {\n" + "public:\n" + " int zort(int newParameter = 155);\n" + "};\n\n" + "int Narf::zort(int newParameter)\n" + "{ return newParameter + 1; }\n"; + + ExtractLiteralAsParameter factory; + TestCase data(original, expected); + data.run(&factory); +} + +void CppEditorPlugin::test_quickfix_ExtractLiteralAsParameter_memberFunctionInline() +{ + const QByteArray original = + "class Narf {\n" + "public:\n" + " int zort()\n" + " { return 15@5 + 1; }\n" + "};"; + const QByteArray expected = + "class Narf {\n" + "public:\n" + " int zort(int newParameter = 155)\n" + " { return newParameter + 1; }\n" + "};\n"; + + ExtractLiteralAsParameter factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: optimize postcrement +void CppEditorPlugin::test_quickfix_OptimizeForLoop_postcrement() +{ + const QByteArray original = "void foo() {f@or (int i = 0; i < 3; i++) {}}\n"; + const QByteArray expected = "void foo() {for (int i = 0; i < 3; ++i) {}}\n\n"; + OptimizeForLoop factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: optimize condition +void CppEditorPlugin::test_quickfix_OptimizeForLoop_condition() +{ + const QByteArray original = "void foo() {f@or (int i = 0; i < 3 + 5; ++i) {}}\n"; + const QByteArray expected = "void foo() {for (int i = 0, total = 3 + 5; i < total; ++i) {}}\n\n"; + OptimizeForLoop factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: optimize fliped condition +void CppEditorPlugin::test_quickfix_OptimizeForLoop_flipedCondition() +{ + const QByteArray original = "void foo() {f@or (int i = 0; 3 + 5 > i; ++i) {}}\n"; + const QByteArray expected = "void foo() {for (int i = 0, total = 3 + 5; total > i; ++i) {}}\n\n"; + OptimizeForLoop factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: if "total" used, create other name. +void CppEditorPlugin::test_quickfix_OptimizeForLoop_alterVariableName() +{ + const QByteArray original = "void foo() {f@or (int i = 0, total = 0; i < 3 + 5; ++i) {}}\n"; + const QByteArray expected = "void foo() {for (int i = 0, total = 0, totalX = 3 + 5; i < totalX; ++i) {}}\n\n"; + OptimizeForLoop factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: optimize postcrement and condition +void CppEditorPlugin::test_quickfix_OptimizeForLoop_optimizeBoth() +{ + const QByteArray original = "void foo() {f@or (int i = 0; i < 3 + 5; i++) {}}\n"; + const QByteArray expected = "void foo() {for (int i = 0, total = 3 + 5; i < total; ++i) {}}\n\n"; + OptimizeForLoop factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: empty initializier +void CppEditorPlugin::test_quickfix_OptimizeForLoop_emptyInitializer() +{ + const QByteArray original = "int i; void foo() {f@or (; i < 3 + 5; ++i) {}}\n"; + const QByteArray expected = "int i; void foo() {for (int total = 3 + 5; i < total; ++i) {}}\n\n"; + OptimizeForLoop factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: wrong initializier type -> no trigger +void CppEditorPlugin::test_quickfix_OptimizeForLoop_wrongInitializer() +{ + const QByteArray original = "int i; void foo() {f@or (double a = 0; i < 3 + 5; ++i) {}}\n"; + const QByteArray expected = "int i; void foo() {f@or (double a = 0; i < 3 + 5; ++i) {}}\n\n"; + OptimizeForLoop factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: No trigger when numeric +void CppEditorPlugin::test_quickfix_OptimizeForLoop_noTriggerNumeric1() +{ + const QByteArray original = "void foo() {fo@r (int i = 0; i < 3; ++i) {}}\n"; + const QByteArray expected = original + "\n"; + OptimizeForLoop factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Check: No trigger when numeric +void CppEditorPlugin::test_quickfix_OptimizeForLoop_noTriggerNumeric2() +{ + const QByteArray original = "void foo() {fo@r (int i = 0; i < -3; ++i) {}}\n"; + const QByteArray expected = original + "\n"; + OptimizeForLoop factory; + TestCase data(original, expected); + data.run(&factory); +} + +/// Checks: In addition to test_quickfix_GenerateGetterSetter_basicGetterWithPrefix +/// generated definitions should fit in the namespace. +void CppEditorPlugin::test_quickfix_GenerateGetterSetter_basicGetterWithPrefixAndNamespaceToCpp() +{ + QList<TestDocumentPtr> testFiles; + QByteArray original; + QByteArray expected; + + // Header File + original = + "namespace SomeNamespace {\n" + "class Something\n" + "{\n" + " int @it;\n" + "};\n" + "}\n"; + expected = + "namespace SomeNamespace {\n" + "class Something\n" + "{\n" + " int it;\n" + "\n" + "public:\n" + " int getIt() const;\n" + " void setIt(int value);\n" + "};\n" + "}\n\n"; + testFiles << TestDocument::create(original, expected, QLatin1String("file.h")); + + // Source File + original = + "#include \"file.h\"\n" + "namespace SomeNamespace {\n" + "}\n"; + expected = + "#include \"file.h\"\n" + "namespace SomeNamespace {\n" + "int Something::getIt() const\n" + "{\n" + " return it;\n" + "}\n" + "\n" + "void Something::setIt(int value)\n" + "{\n" + " it = value;\n" + "}\n\n" + "}\n\n"; + testFiles << TestDocument::create(original, expected, QLatin1String("file.cpp")); + + GenerateGetterSetter factory; + TestCase data(testFiles); + data.run(&factory); +} + +/// Check if definition is inserted right after class for insert definition outside +void CppEditorPlugin::test_quickfix_InsertDefFromDecl_afterClass() +{ + QList<TestDocumentPtr> testFiles; + QByteArray original; + QByteArray expected; + + // Header File + original = + "class Foo\n" + "{\n" + " Foo();\n" + " void a@();\n" + "};\n" + "\n" + "class Bar {};\n"; + expected = + "class Foo\n" + "{\n" + " Foo();\n" + " void a();\n" + "};\n" + "\n" + "void Foo::a()\n" + "{\n\n}\n" + "\n" + "class Bar {};\n\n"; + testFiles << TestDocument::create(original, expected, QLatin1String("file.h")); + + // Source File + original = + "#include \"file.h\"\n" + "\n" + "Foo::Foo()\n" + "{\n\n" + "}\n"; + expected = original + "\n"; + testFiles << TestDocument::create(original, expected, QLatin1String("file.cpp")); + + InsertDefFromDecl factory; + TestCase data(testFiles); + data.run(&factory, 1); +} + +/// Check from header file: If there is a source file, insert the definition in the source file. +/// Case: Source file is empty. +void CppEditorPlugin::test_quickfix_InsertDefFromDecl_headerSource_basic1() { QList<TestDocumentPtr> testFiles; @@ -1371,25 +1650,58 @@ void CppEditorPlugin::test_quickfix_InsertDefFromDecl_headerSource_namespace2() // Header File original = - "namespace N {\n" "struct Foo\n" "{\n" " Foo()@;\n" - "};\n" - "}\n"; + "};\n"; + expected = original + "\n"; + testFiles << TestDocument::create(original, expected, QLatin1String("file.h")); + + // Source File + original.resize(0); + expected = + "\n" + "Foo::Foo()\n" + "{\n\n" + "}\n" + "\n" + ; + testFiles << TestDocument::create(original, expected, QLatin1String("file.cpp")); + + InsertDefFromDecl factory; + TestCase data(testFiles); + data.run(&factory); +} + +/// Check from header file: If there is a source file, insert the definition in the source file. +/// Case: Source file is not empty. +void CppEditorPlugin::test_quickfix_InsertDefFromDecl_headerSource_basic2() +{ + QList<TestDocumentPtr> testFiles; + + QByteArray original; + QByteArray expected; + + // Header File + original = "void f()@;\n"; expected = original + "\n"; testFiles << TestDocument::create(original, expected, QLatin1String("file.h")); // Source File original = "#include \"file.h\"\n" - "using namespace N;\n" + "\n" + "int x;\n" ; - expected = original + + expected = + "#include \"file.h\"\n" "\n" + "int x;\n" + "\n" + "\n" + "void f()\n" + "{\n" "\n" - "Foo::Foo()\n" - "{\n\n" "}\n" "\n" ; @@ -1400,18 +1712,111 @@ void CppEditorPlugin::test_quickfix_InsertDefFromDecl_headerSource_namespace2() data.run(&factory); } -void CppEditorPlugin::test_quickfix_InsertDefFromDecl_freeFunction() +/// Check from source file: Insert in source file, not header file. +void CppEditorPlugin::test_quickfix_InsertDefFromDecl_headerSource_basic3() { - const QByteArray original = "void free()@;\n"; - const QByteArray expected = - "void free()\n" + QList<TestDocumentPtr> testFiles; + + QByteArray original; + QByteArray expected; + + // Empty Header File + testFiles << TestDocument::create("", "\n", QLatin1String("file.h")); + + // Source File + original = + "struct Foo\n" + "{\n" + " Foo()@;\n" + "};\n"; + expected = original + + "\n" + "\n" + "Foo::Foo()\n" + "{\n\n" + "}\n" + "\n" + ; + testFiles << TestDocument::create(original, expected, QLatin1String("file.cpp")); + + InsertDefFromDecl factory; + TestCase data(testFiles); + data.run(&factory); +} + +/// Check from header file: If the class is in a namespace, the added function definition +/// name must be qualified accordingly. +void CppEditorPlugin::test_quickfix_InsertDefFromDecl_headerSource_namespace1() +{ + QList<TestDocumentPtr> testFiles; + + QByteArray original; + QByteArray expected; + + // Header File + original = + "namespace N {\n" + "struct Foo\n" + "{\n" + " Foo()@;\n" + "};\n" + "}\n"; + expected = original + "\n"; + testFiles << TestDocument::create(original, expected, QLatin1String("file.h")); + + // Source File + original.resize(0); + expected = + "\n" + "N::Foo::Foo()\n" "{\n\n" "}\n" "\n" ; + testFiles << TestDocument::create(original, expected, QLatin1String("file.cpp")); + + InsertDefFromDecl factory; + TestCase data(testFiles); + data.run(&factory); +} + +/// Check from header file: If the class is in namespace N and the source file has a +/// "using namespace N" line, the function definition name must be qualified accordingly. +void CppEditorPlugin::test_quickfix_InsertDefFromDecl_headerSource_namespace2() +{ + QList<TestDocumentPtr> testFiles; + + QByteArray original; + QByteArray expected; + + // Header File + original = + "namespace N {\n" + "struct Foo\n" + "{\n" + " Foo()@;\n" + "};\n" + "}\n"; + expected = original + "\n"; + testFiles << TestDocument::create(original, expected, QLatin1String("file.h")); + + // Source File + original = + "#include \"file.h\"\n" + "using namespace N;\n" + ; + expected = original + + "\n" + "\n" + "Foo::Foo()\n" + "{\n\n" + "}\n" + "\n" + ; + testFiles << TestDocument::create(original, expected, QLatin1String("file.cpp")); InsertDefFromDecl factory; - TestCase data(original, expected); + TestCase data(testFiles); data.run(&factory); } @@ -1449,24 +1854,6 @@ void CppEditorPlugin::test_quickfix_InsertDefFromDecl_notTriggeringWhenDefinitio data.run(&factory, 1); } -/// Check not triggering when it is a statement -void CppEditorPlugin::test_quickfix_InsertDefFromDecl_notTriggeringStatement() -{ - const QByteArray original = - "class Foo {\n" - "public:\n" - " Foo() {}\n" - "};\n" - "void freeFunc() {\n" - " Foo @f();" - "}\n"; - const QByteArray expected = original + "\n"; - - InsertDefFromDecl factory; - TestCase data(original, expected); - data.run(&factory); -} - /// Find right implementation file. void CppEditorPlugin::test_quickfix_InsertDefFromDecl_findRightImplementationFile() { @@ -3358,316 +3745,75 @@ void CppEditorPlugin::test_quickfix_MoveFuncDefToDecl_CtorWithInitialization() "Foo::F@oo() : a(42), b(3.141) {}" ; expected ="#include \"file.h\"\n\n\n"; - testFiles << TestDocument::create(original, expected, QLatin1String("file.cpp")); - - MoveFuncDefToDecl factory; - TestCase data(testFiles); - data.run(&factory); -} - -/// Check: Definition should not be placed behind the variable. QTCREATORBUG-10303 -void CppEditorPlugin::test_quickfix_MoveFuncDefToDecl_structWithAssignedVariable() -{ - QByteArray original = - "struct Foo\n" - "{\n" - " void foo();\n" - "} bar;\n\n" - "void Foo::fo@o()\n" - "{\n" - " return;\n" - "}"; - - QByteArray expected = - "struct Foo\n" - "{\n" - " void foo()\n" - " {\n" - " return;\n" - " }\n" - "} bar;\n\n\n"; - - MoveFuncDefToDecl factory; - TestCase data(original, expected); - data.run(&factory); -} - -/// Check: Add local variable for a free function. -void CppEditorPlugin::test_quickfix_AssignToLocalVariable_freeFunction() -{ - const QByteArray original = - "int foo() {return 1;}\n" - "void bar() {fo@o();}"; - const QByteArray expected = - "int foo() {return 1;}\n" - "void bar() {int localFoo = foo();}\n"; - - AssignToLocalVariable factory; - TestCase data(original, expected); - data.run(&factory); -} - -/// Check: Add local variable for a member function. -void CppEditorPlugin::test_quickfix_AssignToLocalVariable_memberFunction() -{ - const QByteArray original = - "class Foo {public: int* fooFunc();}\n" - "void bar() {\n" - " Foo *f = new Foo;\n" - " @f->fooFunc();\n" - "}"; - const QByteArray expected = - "class Foo {public: int* fooFunc();}\n" - "void bar() {\n" - " Foo *f = new Foo;\n" - " int *localFooFunc = f->fooFunc();\n" - "}\n"; - - AssignToLocalVariable factory; - TestCase data(original, expected); - data.run(&factory); -} - -/// Check: Add local variable for a static member function. -void CppEditorPlugin::test_quickfix_AssignToLocalVariable_staticMemberFunction() -{ - const QByteArray original = - "class Foo {public: static int* fooFunc();}\n" - "void bar() {\n" - " Foo::fooF@unc();\n" - "}"; - const QByteArray expected = - "class Foo {public: static int* fooFunc();}\n" - "void bar() {\n" - " int *localFooFunc = Foo::fooFunc();\n" - "}\n"; - - AssignToLocalVariable factory; - TestCase data(original, expected); - data.run(&factory); -} - -/// Check: Add local variable for a new Expression. -void CppEditorPlugin::test_quickfix_AssignToLocalVariable_newExpression() -{ - const QByteArray original = - "class Foo {}\n" - "void bar() {\n" - " new Fo@o;\n" - "}"; - const QByteArray expected = - "class Foo {}\n" - "void bar() {\n" - " Foo *localFoo = new Foo;\n" - "}\n"; - - AssignToLocalVariable factory; - TestCase data(original, expected); - data.run(&factory); -} - -void CppEditorPlugin::test_quickfix_AssignToLocalVariable_templates() -{ - - QList<TestDocumentPtr> testFiles; - QByteArray original; - QByteArray expected; - - // Header File - original = - "template <typename T>\n" - "class List {\n" - "public:\n" - " T first();" - "};\n" - ; - expected = original + "\n"; - testFiles << TestDocument::create(original, expected, QLatin1String("file.h")); - - // Source File - original = - "#include \"file.h\"\n" - "void foo() {\n" - " List<int> list;\n" - " li@st.first();\n" - "}"; - expected = - "#include \"file.h\"\n" - "void foo() {\n" - " List<int> list;\n" - " int localFirst = list.first();\n" - "}\n"; - testFiles << TestDocument::create(original, expected, QLatin1String("file.cpp")); - - AssignToLocalVariable factory; - TestCase data(testFiles); - data.run(&factory); -} - -/// Check: No trigger for function inside member initialization list. -void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noInitializationList() -{ - const QByteArray original = - "class Foo\n" - "{\n" - " public: Foo : m_i(fooF@unc()) {}\n" - " int fooFunc() {return 2;}\n" - " int m_i;\n" - "};"; - const QByteArray expected = original + "\n"; - - AssignToLocalVariable factory; - TestCase data(original, expected); - data.run(&factory); -} - -/// Check: No trigger for void functions. -void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noVoidFunction() -{ - const QByteArray original = - "void foo() {}\n" - "void bar() {fo@o();}"; - const QByteArray expected = original + "\n"; - - AssignToLocalVariable factory; - TestCase data(original, expected); - data.run(&factory); -} - -/// Check: No trigger for void member functions. -void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noVoidMemberFunction() -{ - const QByteArray original = - "class Foo {public: void fooFunc();}\n" - "void bar() {\n" - " Foo *f = new Foo;\n" - " @f->fooFunc();\n" - "}"; - const QByteArray expected = original + "\n"; - - AssignToLocalVariable factory; - TestCase data(original, expected); - data.run(&factory); -} - -/// Check: No trigger for void static member functions. -void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noVoidStaticMemberFunction() -{ - const QByteArray original = - "class Foo {public: static void fooFunc();}\n" - "void bar() {\n" - " Foo::fo@oFunc();\n" - "}"; - const QByteArray expected = original + "\n"; - - AssignToLocalVariable factory; - TestCase data(original, expected); - data.run(&factory); -} - -/// Check: No trigger for functions in expressions. -void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noFunctionInExpression() -{ - const QByteArray original = - "int foo(int a) {return a;}\n" - "int bar() {return 1;}" - "void baz() {foo(@bar() + bar());}"; - const QByteArray expected = original + "\n"; - - AssignToLocalVariable factory; - TestCase data(original, expected); - data.run(&factory); -} - -/// Check: No trigger for functions in functions. (QTCREATORBUG-9510) -void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noFunctionInFunction() -{ - const QByteArray original = - "int foo(int a, int b) {return a + b;}\n" - "int bar(int a) {return a;}\n" - "void baz() {\n" - " int a = foo(ba@r(), bar());\n" - "}\n"; - const QByteArray expected = original + "\n"; + testFiles << TestDocument::create(original, expected, QLatin1String("file.cpp")); - AssignToLocalVariable factory; - TestCase data(original, expected); + MoveFuncDefToDecl factory; + TestCase data(testFiles); data.run(&factory); } -/// Check: No trigger for functions in return statements (classes). -void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noReturnClass1() +/// Check: Definition should not be placed behind the variable. QTCREATORBUG-10303 +void CppEditorPlugin::test_quickfix_MoveFuncDefToDecl_structWithAssignedVariable() { - const QByteArray original = - "class Foo {public: static void fooFunc();}\n" - "Foo* bar() {\n" - " return new Fo@o;\n" + QByteArray original = + "struct Foo\n" + "{\n" + " void foo();\n" + "} bar;\n\n" + "void Foo::fo@o()\n" + "{\n" + " return;\n" "}"; - const QByteArray expected = original + "\n"; - - AssignToLocalVariable factory; - TestCase data(original, expected); - data.run(&factory); -} -/// Check: No trigger for functions in return statements (classes). (QTCREATORBUG-9525) -void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noReturnClass2() -{ - const QByteArray original = - "class Foo {public: int fooFunc();}\n" - "int bar() {\n" - " return (new Fo@o)->fooFunc();\n" - "}"; - const QByteArray expected = original + "\n"; + QByteArray expected = + "struct Foo\n" + "{\n" + " void foo()\n" + " {\n" + " return;\n" + " }\n" + "} bar;\n\n\n"; - AssignToLocalVariable factory; + MoveFuncDefToDecl factory; TestCase data(original, expected); data.run(&factory); } -/// Check: No trigger for functions in return statements (functions). -void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noReturnFunc1() +void CppEditorPlugin::test_quickfix_AssignToLocalVariable_templates() { - const QByteArray original = - "class Foo {public: int fooFunc();}\n" - "int bar() {\n" - " return Foo::fooFu@nc();\n" - "}"; - const QByteArray expected = original + "\n"; - - AssignToLocalVariable factory; - TestCase data(original, expected); - data.run(&factory); -} -/// Check: No trigger for functions in return statements (functions). (QTCREATORBUG-9525) -void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noReturnFunc2() -{ - const QByteArray original = - "int bar() {\n" - " return list.firs@t().foo;\n" - "}\n"; - const QByteArray expected = original + "\n"; + QList<TestDocumentPtr> testFiles; + QByteArray original; + QByteArray expected; - AssignToLocalVariable factory; - TestCase data(original, expected); - data.run(&factory); -} + // Header File + original = + "template <typename T>\n" + "class List {\n" + "public:\n" + " T first();" + "};\n" + ; + expected = original + "\n"; + testFiles << TestDocument::create(original, expected, QLatin1String("file.h")); -/// Check: No trigger for functions which does not match in signature. -void CppEditorPlugin::test_quickfix_AssignToLocalVariable_noSignatureMatch() -{ - const QByteArray original = - "int someFunc(int);\n" - "\n" - "void f()\n" - "{\n" - " some@Func();\n" + // Source File + original = + "#include \"file.h\"\n" + "void foo() {\n" + " List<int> list;\n" + " li@st.first();\n" "}"; - const QByteArray expected = original + "\n"; + expected = + "#include \"file.h\"\n" + "void foo() {\n" + " List<int> list;\n" + " int localFirst = list.first();\n" + "}\n"; + testFiles << TestDocument::create(original, expected, QLatin1String("file.cpp")); AssignToLocalVariable factory; - TestCase data(original, expected); + TestCase data(testFiles); data.run(&factory); } @@ -3736,20 +3882,6 @@ void CppEditorPlugin::test_quickfix_ExtractLiteralAsParameter_typeDeduction() data.run(&factory); } -void CppEditorPlugin::test_quickfix_ExtractLiteralAsParameter_freeFunction() -{ - const QByteArray original = - "void foo(const char *a, long b = 1)\n" - "{return 1@56 + 123 + 156;}"; - const QByteArray expected = - "void foo(const char *a, long b = 1, int newParameter = 156)\n" - "{return newParameter + 123 + newParameter;}\n"; - - ExtractLiteralAsParameter factory; - TestCase data(original, expected); - data.run(&factory); -} - void CppEditorPlugin::test_quickfix_ExtractLiteralAsParameter_freeFunction_separateFiles() { QList<TestDocumentPtr> testFiles; @@ -3777,28 +3909,6 @@ void CppEditorPlugin::test_quickfix_ExtractLiteralAsParameter_freeFunction_separ data.run(&factory); } -void CppEditorPlugin::test_quickfix_ExtractLiteralAsParameter_memberFunction() -{ - const QByteArray original = - "class Narf {\n" - "public:\n" - " int zort();\n" - "};\n\n" - "int Narf::zort()\n" - "{ return 15@5 + 1; }"; - const QByteArray expected = - "class Narf {\n" - "public:\n" - " int zort(int newParameter = 155);\n" - "};\n\n" - "int Narf::zort(int newParameter)\n" - "{ return newParameter + 1; }\n"; - - ExtractLiteralAsParameter factory; - TestCase data(original, expected); - data.run(&factory); -} - void CppEditorPlugin::test_quickfix_ExtractLiteralAsParameter_memberFunction_separateFiles() { QList<TestDocumentPtr> testFiles; @@ -3834,26 +3944,6 @@ void CppEditorPlugin::test_quickfix_ExtractLiteralAsParameter_memberFunction_sep data.run(&factory); } -void CppEditorPlugin::test_quickfix_ExtractLiteralAsParameter_memberFunctionInline() -{ - const QByteArray original = - "class Narf {\n" - "public:\n" - " int zort()\n" - " { return 15@5 + 1; }\n" - "};"; - const QByteArray expected = - "class Narf {\n" - "public:\n" - " int zort(int newParameter = 155)\n" - " { return newParameter + 1; }\n" - "};\n"; - - ExtractLiteralAsParameter factory; - TestCase data(original, expected); - data.run(&factory); -} - /// Check: Insert only declarations void CppEditorPlugin::test_quickfix_InsertVirtualMethods_onlyDecl() { @@ -4296,93 +4386,3 @@ void CppEditorPlugin::test_quickfix_InsertVirtualMethods_BaseClassInNamespace() TestCase data(testFiles); data.run(&factory); } - -/// Check: optimize postcrement -void CppEditorPlugin::test_quickfix_OptimizeForLoop_postcrement() -{ - const QByteArray original = "void foo() {f@or (int i = 0; i < 3; i++) {}}\n"; - const QByteArray expected = "void foo() {for (int i = 0; i < 3; ++i) {}}\n\n"; - OptimizeForLoop factory; - TestCase data(original, expected); - data.run(&factory); -} - -/// Check: optimize condition -void CppEditorPlugin::test_quickfix_OptimizeForLoop_condition() -{ - const QByteArray original = "void foo() {f@or (int i = 0; i < 3 + 5; ++i) {}}\n"; - const QByteArray expected = "void foo() {for (int i = 0, total = 3 + 5; i < total; ++i) {}}\n\n"; - OptimizeForLoop factory; - TestCase data(original, expected); - data.run(&factory); -} - -/// Check: optimize fliped condition -void CppEditorPlugin::test_quickfix_OptimizeForLoop_flipedCondition() -{ - const QByteArray original = "void foo() {f@or (int i = 0; 3 + 5 > i; ++i) {}}\n"; - const QByteArray expected = "void foo() {for (int i = 0, total = 3 + 5; total > i; ++i) {}}\n\n"; - OptimizeForLoop factory; - TestCase data(original, expected); - data.run(&factory); -} - -/// Check: if "total" used, create other name. -void CppEditorPlugin::test_quickfix_OptimizeForLoop_alterVariableName() -{ - const QByteArray original = "void foo() {f@or (int i = 0, total = 0; i < 3 + 5; ++i) {}}\n"; - const QByteArray expected = "void foo() {for (int i = 0, total = 0, totalX = 3 + 5; i < totalX; ++i) {}}\n\n"; - OptimizeForLoop factory; - TestCase data(original, expected); - data.run(&factory); -} - -/// Check: optimize postcrement and condition -void CppEditorPlugin::test_quickfix_OptimizeForLoop_optimizeBoth() -{ - const QByteArray original = "void foo() {f@or (int i = 0; i < 3 + 5; i++) {}}\n"; - const QByteArray expected = "void foo() {for (int i = 0, total = 3 + 5; i < total; ++i) {}}\n\n"; - OptimizeForLoop factory; - TestCase data(original, expected); - data.run(&factory); -} - -/// Check: empty initializier -void CppEditorPlugin::test_quickfix_OptimizeForLoop_emptyInitializer() -{ - const QByteArray original = "int i; void foo() {f@or (; i < 3 + 5; ++i) {}}\n"; - const QByteArray expected = "int i; void foo() {for (int total = 3 + 5; i < total; ++i) {}}\n\n"; - OptimizeForLoop factory; - TestCase data(original, expected); - data.run(&factory); -} - -/// Check: wrong initializier type -> no trigger -void CppEditorPlugin::test_quickfix_OptimizeForLoop_wrongInitializer() -{ - const QByteArray original = "int i; void foo() {f@or (double a = 0; i < 3 + 5; ++i) {}}\n"; - const QByteArray expected = "int i; void foo() {f@or (double a = 0; i < 3 + 5; ++i) {}}\n\n"; - OptimizeForLoop factory; - TestCase data(original, expected); - data.run(&factory); -} - -/// Check: No trigger when numeric -void CppEditorPlugin::test_quickfix_OptimizeForLoop_noTriggerNumeric1() -{ - const QByteArray original = "void foo() {fo@r (int i = 0; i < 3; ++i) {}}\n"; - const QByteArray expected = original + "\n"; - OptimizeForLoop factory; - TestCase data(original, expected); - data.run(&factory); -} - -/// Check: No trigger when numeric -void CppEditorPlugin::test_quickfix_OptimizeForLoop_noTriggerNumeric2() -{ - const QByteArray original = "void foo() {fo@r (int i = 0; i < -3; ++i) {}}\n"; - const QByteArray expected = original + "\n"; - OptimizeForLoop factory; - TestCase data(original, expected); - data.run(&factory); -}