diff options
| author | Przemyslaw Gorszkowski <pgorszkowski@gmail.com> | 2012-09-22 14:24:43 +0200 |
|---|---|---|
| committer | hjk <qthjk@ovi.com> | 2012-09-28 14:54:52 +0200 |
| commit | 7e9913f0f540e196ca7e53217d2edf19a9e8ef29 (patch) | |
| tree | ec0ee8cf284161d1c589b6ae4d2563771e7f0b1c /src/plugins/cpptools/cppcompletion_test.cpp | |
| parent | b02e954eff366bd10d672c756208955d1f934813 (diff) | |
| download | qt-creator-7e9913f0f540e196ca7e53217d2edf19a9e8ef29.tar.gz | |
Fix crashes when typing code
Problem was with cyclic recurrence.
To solve it we need to check if derived class is different class than its base class.
Keep completion corrected.
Include some unit tests when base class has the same name as derived.
Task-number: QTCREATORBUG-7887
Change-Id: I7973c0b06e3b62d2da3d06048f4327d18a0b8011
Reviewed-by: hjk <qthjk@ovi.com>
Diffstat (limited to 'src/plugins/cpptools/cppcompletion_test.cpp')
| -rw-r--r-- | src/plugins/cpptools/cppcompletion_test.cpp | 275 |
1 files changed, 274 insertions, 1 deletions
diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index a6681bb398..08e14bd67a 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -231,7 +231,7 @@ void CppToolsPlugin::test_completion_template_1() QVERIFY(!completions.contains("func")); } -void CppToolsPlugin::test_completion_template_as_base() +void CppToolsPlugin::test_completion() { QFETCH(QByteArray, code); QFETCH(QStringList, expectedCompletions); @@ -253,6 +253,11 @@ void CppToolsPlugin::test_completion_template_as_base() QCOMPARE(actualCompletions, expectedCompletions); } +void CppToolsPlugin::test_completion_template_as_base() +{ + test_completion(); +} + void CppToolsPlugin::test_completion_template_as_base_data() { QTest::addColumn<QByteArray>("code"); @@ -399,3 +404,271 @@ void CppToolsPlugin::test_completion_template_as_base_data() completions.append("otherMember"); QTest::newRow("case: base as template name in non-template") << code << completions; } + +void CppToolsPlugin::test_completion_use_global_identifier_as_base_class() +{ + test_completion(); +} + +void CppToolsPlugin::test_completion_use_global_identifier_as_base_class_data() +{ + QTest::addColumn<QByteArray>("code"); + QTest::addColumn<QStringList>("expectedCompletions"); + + QByteArray code; + QStringList completions; + + code = "\n" + "struct Global\n" + "{\n" + " int int_global;\n" + "};\n" + "\n" + "struct Final : ::Global\n" + "{\n" + " int int_final;\n" + "};\n" + "\n" + "Final c;\n" + "@\n" + "// padding so we get the scope right\n"; + + completions.append("int_global"); + completions.append("int_final"); + completions.append("Final"); + completions.append("Global"); + QTest::newRow("case: derived as global and base as global") << code << completions; + + completions.clear(); + + code = "\n" + "struct Global\n" + "{\n" + " int int_global;\n" + "};\n" + "\n" + "namespace NS\n" + "{\n" + "struct Final : ::Global\n" + "{\n" + " int int_final;\n" + "};\n" + "}\n" + "\n" + "NS::Final c;\n" + "@\n" + "// padding so we get the scope right\n"; + + completions.append("int_global"); + completions.append("int_final"); + completions.append("Final"); + completions.append("Global"); + QTest::newRow("case: derived is inside namespace, base as global") + << code << completions; + + completions.clear(); + + //this test does not work due to the bug QTCREATORBUG-7912 + + +// code = "\n" +// "struct Global\n" +// "{\n" +// " int int_global;\n" +// "};\n" +// "\n" +// "template <typename T>\n" +// "struct Enclosing\n" +// "{\n" +// "struct Final : ::Global\n" +// "{\n" +// " int int_final;\n" +// "};\n" +// "}\n" +// "\n" +// "Enclosing<int>::Final c;\n" +// "@\n" +// "// padding so we get the scope right\n"; + +// completions.append("int_global"); +// completions.append("int_final"); +// completions.append("Final"); +// completions.append("Global"); +// QTest::newRow("case: derived is enclosed by template, base as global") +// << code << completions; + +// completions.clear(); +} + +void CppToolsPlugin::test_completion_base_class_has_name_the_same_as_derived() +{ + test_completion(); +} + +void CppToolsPlugin::test_completion_base_class_has_name_the_same_as_derived_data() +{ + QTest::addColumn<QByteArray>("code"); + QTest::addColumn<QStringList>("expectedCompletions"); + + QByteArray code; + QStringList completions; + + code = "\n" + "struct A : A\n" + "{\n" + " int int_a;\n" + "};\n" + "\n" + "A c;\n" + "@\n" + "// padding so we get the scope right\n"; + + completions.append("int_a"); + completions.append("A"); + QTest::newRow("case: base class is derived class") << code << completions; + + completions.clear(); + + code = "\n" + "namespace NS\n" + "{\n" + "struct A : A\n" + "{\n" + " int int_a;\n" + "};\n" + "}\n" + "\n" + "NS::A c;\n" + "@\n" + "// padding so we get the scope right\n"; + + completions.append("int_a"); + completions.append("A"); + QTest::newRow("case: base class is derived class. class is in namespace") + << code << completions; + + completions.clear(); + + code = "\n" + "namespace NS\n" + "{\n" + "struct A : NS::A\n" + "{\n" + " int int_a;\n" + "};\n" + "}\n" + "\n" + "NS::A c;\n" + "@\n" + "// padding so we get the scope right\n"; + + completions.append("int_a"); + completions.append("A"); + QTest::newRow("case: base class is derived class. class is in namespace. " + "use scope operator for base class") << code << completions; + + completions.clear(); + + code = "\n" + "namespace NS1\n" + "{\n" + "struct A\n" + "{\n" + " int int_ns1_a;\n" + "};\n" + "}\n" + "namespace NS2\n" + "{\n" + "struct A : NS1::A\n" + "{\n" + " int int_ns2_a;\n" + "};\n" + "}\n" + "\n" + "NS2::A c;\n" + "@\n" + "// padding so we get the scope right\n"; + + completions.append("int_ns1_a"); + completions.append("int_ns2_a"); + completions.append("A"); + QTest::newRow("case: base class has the same name as derived but in different namespace") + << code << completions; + + completions.clear(); + + code = "\n" + "struct Enclosing\n" + "{\n" + "struct A\n" + "{\n" + " int int_enclosing_a;\n" + "};\n" + "};\n" + "namespace NS2\n" + "{\n" + "struct A : Enclosing::A\n" + "{\n" + " int int_ns2_a;\n" + "};\n" + "}\n" + "\n" + "NS2::A c;\n" + "@\n" + "// padding so we get the scope right\n"; + + completions.append("int_enclosing_a"); + completions.append("int_ns2_a"); + completions.append("A"); + QTest::newRow("case: base class has the same name as derived(in namespace) " + "but is nested by different class") << code << completions; + + completions.clear(); + + code = "\n" + "struct EnclosingBase\n" + "{\n" + "struct A\n" + "{\n" + " int int_enclosing_base_a;\n" + "};\n" + "};\n" + "struct EnclosingDerived\n" + "{\n" + "struct A : EnclosingBase::A\n" + "{\n" + " int int_enclosing_derived_a;\n" + "};\n" + "};\n" + "\n" + "EnclosingDerived::A c;\n" + "@\n" + "// padding so we get the scope right\n"; + + completions.append("int_enclosing_base_a"); + completions.append("int_enclosing_derived_a"); + completions.append("A"); + QTest::newRow("case: base class has the same name as derived(nested) " + "but is nested by different class") << code << completions; + + completions.clear(); + + code = "\n" + "template <typename T>\n" + "struct A : A\n" + "{\n" + " int int_a;\n" + "};\n" + "\n" + "A<int> c;\n" + "@\n" + "// padding so we get the scope right\n"; + + completions.append("int_a"); + completions.append("A"); + QTest::newRow("case: base class is derived class. class is a template") + << code << completions; + + completions.clear(); + +} |
