diff --git a/kdevplatform/util/formattinghelpers.h b/kdevplatform/util/formattinghelpers.h index 0c682d7fde..fe1efa4558 100644 --- a/kdevplatform/util/formattinghelpers.h +++ b/kdevplatform/util/formattinghelpers.h @@ -1,47 +1,47 @@ /* This file is part of KDevelop * Copyright 2011 David Nolden This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef KDEVPLATFORM_FORMATTINGHELPERS_H #define KDEVPLATFORM_FORMATTINGHELPERS_H #include "utilexport.h" #include namespace KDevelop { /** * Helps extracting a re-formatted version of a text fragment, within a specific left and right context. * The re-formatting must be an operation which only changes whitespace, and keeps whitespace boundaries * between identifiers intact. If this is not the case, the original text is returned. * * @param formattedMergedText The re-formatted merged text: format(leftContext + text + rightContext) * @param text The text fragment of which the re-formatted version will be returned * @param leftContext The left context of the text fragment * @param rightContext The right context of the text fragment * @param tabWidth The width of one tab, required while matching tabs vs. spaces * @param fuzzyCharacters Characters which are ignored in case of mismatches * * @return The re-formatted version of @p text * */ KDEVPLATFORMUTIL_EXPORT QString extractFormattedTextFromContext(const QString& formattedMergedText, const QString& text, const QString& leftContext, const QString& rightContext, int tabWidth = 4, - const QString& fuzzyCharacters = QStringLiteral( "{}()/*/" )); + const QString& fuzzyCharacters = QStringLiteral( "{}()/*\\" )); } #endif // KDEVPLATFORM_FORMATTINGHELPERS_H diff --git a/kdevplatform/util/tests/CMakeLists.txt b/kdevplatform/util/tests/CMakeLists.txt index f61b6dea91..a0ef6ad0d8 100644 --- a/kdevplatform/util/tests/CMakeLists.txt +++ b/kdevplatform/util/tests/CMakeLists.txt @@ -1,40 +1,43 @@ remove_definitions( -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_BYTEARRAY ) ecm_add_test(test_embeddedfreetree.cpp LINK_LIBRARIES KF5::TextEditor Qt5::Test KDev::Language KDev::Tests) ecm_add_test(test_kdevvarlengtharray.cpp LINK_LIBRARIES Qt5::Test) ecm_add_test(test_objectlist.cpp LINK_LIBRARIES Qt5::Test KDev::Util) ecm_add_test(test_stringhandler.cpp LINK_LIBRARIES Qt5::Test KDev::Util) ecm_add_test(test_texteditorhelpers.cpp LINK_LIBRARIES Qt5::Test KDev::Util) ecm_add_test(test_path.cpp LINK_LIBRARIES Qt5::Test KF5::KIOCore KDev::Tests KDev::Util) ecm_add_test(test_foregroundlock.cpp LINK_LIBRARIES Qt5::Test KDev::Util) ecm_add_test(test_executecompositejob.cpp LINK_LIBRARIES Qt5::Test KDev::Util) ecm_add_test(test_environment.cpp LINK_LIBRARIES Qt5::Test KDev::Util) ecm_add_test( ../kdevformatfile.cpp test_kdevformatsource.cpp TEST_NAME test_kdevformatsource LINK_LIBRARIES Qt5::Test ) + +ecm_add_test(test_formattinghelpers.cpp + LINK_LIBRARIES Qt5::Test KDev::Util) diff --git a/kdevplatform/util/tests/test_formattinghelpers.cpp b/kdevplatform/util/tests/test_formattinghelpers.cpp new file mode 100644 index 0000000000..4876e25067 --- /dev/null +++ b/kdevplatform/util/tests/test_formattinghelpers.cpp @@ -0,0 +1,129 @@ +/* + * Copyright 2019 Bernd Buschinski + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "test_formattinghelpers.h" + +#include "formattinghelpers.h" + +#include +#include + +QTEST_MAIN(TestFormattingHelpers) + +using namespace KDevelop; + +void TestFormattingHelpers::testFuzzyMatching() +{ + QFETCH(QString, formattedMergedText); + QFETCH(QString, selectedText); + QFETCH(QString, leftContext); + QFETCH(QString, rightContext); + QFETCH(QString, expectedOutput); + + QString output = extractFormattedTextFromContext(formattedMergedText, selectedText, leftContext, rightContext); + + QCOMPARE(output, expectedOutput); +} + +void TestFormattingHelpers::testFuzzyMatching_data() +{ + QTest::addColumn("formattedMergedText"); + QTest::addColumn("selectedText"); + QTest::addColumn("leftContext"); + QTest::addColumn("rightContext"); + QTest::addColumn("expectedOutput"); + + QString selectedText = QStringLiteral("void bar() {\nint x;\n}"); + QString expectedOutput = QStringLiteral("void bar() {\n int x;\n}"); + + QTest::newRow("left-indentation-fixed") + << QStringLiteral("void foo() {\n int i;\n int j;\n}\n\nvoid bar() {\n int x;\n}") + << selectedText + << QStringLiteral("void foo() {\nint i;\n\n\nint j;\n}\n\n") + << QStringLiteral("") + << expectedOutput; + + QTest::newRow("right-indentation-fixed") + << QStringLiteral("void bar() {\n int x;\n}\n\nvoid foo() {\n int i;\n int j;\n}") + << selectedText + << QStringLiteral("") + << QStringLiteral("\n\nvoid foo() {\nint i;\n\n\nint j;\n}") + << expectedOutput; + + // clang-format can break long comments into multiple lines, adding new "//". + // For the same of readability, the comments in the test are actually not very long. + QTest::newRow("left-comment-break-fixed") + << QStringLiteral("void foo() {\n // very\n // long\n}\n\nvoid bar() {\n int x;\n}") + << selectedText + << QStringLiteral("void foo() {\n// very long\n}\n\n") + << QStringLiteral("") + << expectedOutput; + + QTest::newRow("right-comment-break-fixed") + << QStringLiteral("void bar() {\n int x;\n}\n\nvoid foo() {\n // very\n // long\n}") + << selectedText + << QStringLiteral("") + << QStringLiteral("\n\nvoid foo() {\n// very long\n}") + << expectedOutput; + + QTest::newRow("left-multilinecomment-break-fixed") + << QStringLiteral("void foo() {\n /* very\n * long */\n}\n\nvoid bar() {\n int x;\n}") + << selectedText + << QStringLiteral("void foo() {\n/* very long */\n}\n\n") + << QStringLiteral("") + << expectedOutput; + + QTest::newRow("right-multilinecomment-break-fixed") + << QStringLiteral("void bar() {\n int x;\n}\n\nvoid foo() {\n /* very\n * long */\n}") + << selectedText + << QStringLiteral("") + << QStringLiteral("\n\nvoid foo() {\n/* very long */\n}") + << expectedOutput; + + // clang-format can break long macros and add (or remove) "\" + QTest::newRow("left-macro-break-removed") + << QStringLiteral("#define foo(a,b) a = b\n\nvoid bar() {\n int x;\n}") + << selectedText + << QStringLiteral("#define foo(a,b) \\ a = b\n\n") + << QStringLiteral("") + << expectedOutput; + + QTest::newRow("right-macro-break-removed") + << QStringLiteral("void bar() {\n int x;\n}\n\n#define foo(a,b) a = b") + << selectedText + << QStringLiteral("") + << QStringLiteral("\n\n#define foo(a,b) \\ a = b") + << expectedOutput; + + QTest::newRow("left-macro-break-added") + << QStringLiteral("#define foo(a,b) \\ a = b\n\nvoid bar() {\n int x;\n}") + << selectedText + << QStringLiteral("#define foo(a,b) a = b\n\n") + << QStringLiteral("") + << expectedOutput; + + QTest::newRow("right-macro-break-added") + << QStringLiteral("void bar() {\n int x;\n}\n\n#define foo(a,b) \\ a = b") + << selectedText + << QStringLiteral("") + << QStringLiteral("\n\n#define foo(a,b) a = b") + << expectedOutput; +} diff --git a/kdevplatform/util/tests/test_formattinghelpers.h b/kdevplatform/util/tests/test_formattinghelpers.h new file mode 100644 index 0000000000..f04960a605 --- /dev/null +++ b/kdevplatform/util/tests/test_formattinghelpers.h @@ -0,0 +1,33 @@ +/* + * Copyright 2019 Bernd Buschinski + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#pragma once + +#include + +class TestFormattingHelpers : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void testFuzzyMatching(); + void testFuzzyMatching_data(); +};