diff --git a/util/tests/CMakeLists.txt b/util/tests/CMakeLists.txt index fdff47a2d..4c099de87 100644 --- a/util/tests/CMakeLists.txt +++ b/util/tests/CMakeLists.txt @@ -1,23 +1,26 @@ 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) diff --git a/util/tests/test_texteditorhelpers.cpp b/util/tests/test_texteditorhelpers.cpp new file mode 100644 index 000000000..64a3d15bb --- /dev/null +++ b/util/tests/test_texteditorhelpers.cpp @@ -0,0 +1,68 @@ +/* + * Copyright 2016 Kevin Funk + * + * 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_texteditorhelpers.h" + +#include "texteditorhelpers.h" + +#include + +QTEST_MAIN(TestKTextEditorHelpers); + +using namespace KDevelop; + +void TestKTextEditorHelpers::testExtractCursor() +{ + QFETCH(QString, input); + QFETCH(KTextEditor::Cursor, expectedCursor); + QFETCH(QString, expectedPath); + + int pathLen; + const auto cursor = KTextEditorHelpers::extractCursor(input, &pathLen); + QCOMPARE(cursor, expectedCursor); + QCOMPARE(input.mid(0, pathLen), expectedPath); +} + +void TestKTextEditorHelpers::testExtractCursor_data() +{ + QTest::addColumn("input"); + QTest::addColumn("expectedCursor"); + QTest::addColumn("expectedPath"); + + // valid input + QTest::newRow("file") + << QStringLiteral("widget.cpp") + << KTextEditor::Cursor::invalid() + << QStringLiteral("widget.cpp"); + QTest::newRow("file:line") + << QStringLiteral("widget.cpp:12") + << KTextEditor::Cursor(11, 0) + << QStringLiteral("widget.cpp"); + QTest::newRow("file:line:column") + << QStringLiteral("widget.cpp:12:5") + << KTextEditor::Cursor(11, 4) + << QStringLiteral("widget.cpp"); + // partially invalid input + QTest::newRow("file:") + << QStringLiteral("widget.cpp:") + << KTextEditor::Cursor::invalid() + << QStringLiteral("widget.cpp:"); +} diff --git a/util/tests/test_texteditorhelpers.h b/util/tests/test_texteditorhelpers.h new file mode 100644 index 000000000..7f99c31bb --- /dev/null +++ b/util/tests/test_texteditorhelpers.h @@ -0,0 +1,36 @@ +/* + * Copyright 2016 Kevin Funk + * + * 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 . + * + */ + +#ifndef TESTKTEXTEDITORHELPERS_H +#define TESTKTEXTEDITORHELPERS_H + +#include + +class TestKTextEditorHelpers : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void testExtractCursor(); + void testExtractCursor_data(); +}; + +#endif diff --git a/util/texteditorhelpers.cpp b/util/texteditorhelpers.cpp index 0ce6519ba..0c80b86fc 100644 --- a/util/texteditorhelpers.cpp +++ b/util/texteditorhelpers.cpp @@ -1,73 +1,73 @@ /* This file is part of the KDE project Copyright 2015 Maciej Cencora This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "texteditorhelpers.h" #include #include namespace KDevelop { namespace { // TODO: this is a hack, but Kate does not provide interface for this int getLineHeight(const KTextEditor::View* view, int curLine) { KTextEditor::Cursor c(curLine, 0); int currentHeight = view->cursorToCoordinate(c).y(); c.setLine(curLine + 1); if (view->cursorToCoordinate(c).y() < 0) { c.setLine(curLine - 1); } return std::abs(view->cursorToCoordinate(c).y() - currentHeight); } } QRect KTextEditorHelpers::getItemBoundingRect(const KTextEditor::View* view, const KTextEditor::Range& itemRange) { QPoint startPoint = view->mapToGlobal(view->cursorToCoordinate(itemRange.start())); QPoint endPoint = view->mapToGlobal(view->cursorToCoordinate(itemRange.end())); endPoint.ry() += getLineHeight(view, itemRange.start().line()); return QRect(startPoint, endPoint); } KTextEditor::Cursor KTextEditorHelpers::extractCursor(const QString& input, int* pathLength) { static const QRegularExpression pattern(QStringLiteral(":(\\d+)(?::(\\d+))?$")); const auto match = pattern.match(input); - if (!match.isValid()) { + if (!match.hasMatch()) { if (pathLength) *pathLength = input.length(); - return {}; + return KTextEditor::Cursor::invalid(); } - int line = match.captured(1).toInt() - 1; + int line = match.capturedRef(1).toInt() - 1; // don't use an invalid column when the line is valid int column = qMax(0, match.captured(2).toInt() - 1); if (pathLength) - *pathLength = match.capturedLength(); + *pathLength = match.capturedStart(0); return {line, column}; } }