diff options
| author | David Schulz <david.schulz@qt.io> | 2021-06-04 10:31:36 +0200 |
|---|---|---|
| committer | David Schulz <david.schulz@qt.io> | 2021-06-08 04:42:27 +0000 |
| commit | 4e69b5068a3a9c81e1c84d1dc8f14a0f93d23237 (patch) | |
| tree | 7795d051ea50b8a1422a37bd7267ba0db082823c | |
| parent | 64ce2a6f4374012b37b420dc0aaa6ea406bf7168 (diff) | |
| download | qt-creator-4e69b5068a3a9c81e1c84d1dc8f14a0f93d23237.tar.gz | |
LSP: Fix Range::overlaps
Change-Id: I14e6477b25a4c9a25c3832a4bc580728bb85c448
Reviewed-by: <sergeikrivonos@gmail.com>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
| -rw-r--r-- | src/libs/languageserverprotocol/lsptypes.cpp | 2 | ||||
| -rw-r--r-- | tests/auto/languageserverprotocol/tst_languageserverprotocol.cpp | 60 |
2 files changed, 61 insertions, 1 deletions
diff --git a/src/libs/languageserverprotocol/lsptypes.cpp b/src/libs/languageserverprotocol/lsptypes.cpp index bae7f157f1..b15e59f9bd 100644 --- a/src/libs/languageserverprotocol/lsptypes.cpp +++ b/src/libs/languageserverprotocol/lsptypes.cpp @@ -323,7 +323,7 @@ bool Range::contains(const Range &other) const bool Range::overlaps(const Range &range) const { - return contains(range.start()) || contains(range.end()); + return end() > range.start() && start() < range.end(); } bool DocumentFilter::applies(const Utils::FilePath &fileName, const Utils::MimeType &mimeType) const diff --git a/tests/auto/languageserverprotocol/tst_languageserverprotocol.cpp b/tests/auto/languageserverprotocol/tst_languageserverprotocol.cpp index c5d7ffbd11..57fa10c83e 100644 --- a/tests/auto/languageserverprotocol/tst_languageserverprotocol.cpp +++ b/tests/auto/languageserverprotocol/tst_languageserverprotocol.cpp @@ -38,6 +38,7 @@ Q_DECLARE_METATYPE(QTextCodec *) Q_DECLARE_METATYPE(BaseMessage) Q_DECLARE_METATYPE(JsonRpcMessage) Q_DECLARE_METATYPE(DocumentUri) +Q_DECLARE_METATYPE(Range) class tst_LanguageServerProtocol : public QObject { @@ -63,6 +64,9 @@ private slots: void documentUri_data(); void documentUri(); + void range_data(); + void range(); + private: QByteArray defaultMimeType; QTextCodec *defaultCodec = nullptr; @@ -537,6 +541,62 @@ void tst_LanguageServerProtocol::documentUri() QCOMPARE(uri.toString(), string); } +void tst_LanguageServerProtocol::range_data() +{ + QTest::addColumn<Range>("r1"); + QTest::addColumn<Range>("r2"); + QTest::addColumn<bool>("overlaps"); + QTest::addColumn<bool>("r1Containsr2"); + QTest::addColumn<bool>("r2Containsr1"); + + auto pos = [](int pos) { return Position(0, pos); }; + + QTest::newRow("both ranges empty") + << Range(pos(0), pos(0)) << Range(pos(0), pos(0)) << false << true << true; + QTest::newRow("equal ranges") + << Range(pos(0), pos(1)) << Range(pos(0), pos(1)) << true << true << true; + QTest::newRow("r1 before r2") + << Range(pos(0), pos(1)) << Range(pos(2), pos(3)) << false << false << false; + QTest::newRow("r1 adjacent before r2") + << Range(pos(0), pos(1)) << Range(pos(1), pos(2)) << false << false << false; + QTest::newRow("r1 starts before r2 overlapping") + << Range(pos(0), pos(2)) << Range(pos(1), pos(3)) << true << false << false; + QTest::newRow("empty r1 on r2 start") + << Range(pos(0), pos(0)) << Range(pos(0), pos(1)) << false << false << true; + QTest::newRow("r1 inside r2 equal start") + << Range(pos(0), pos(1)) << Range(pos(0), pos(2)) << true << false << true; + QTest::newRow("r1 inside r2 equal start") + << Range(pos(0), pos(1)) << Range(pos(0), pos(2)) << true << false << true; + QTest::newRow("empty r1 inside r2") + << Range(pos(1), pos(1)) << Range(pos(0), pos(2)) << true << false << true; + QTest::newRow("r1 completely inside r2") + << Range(pos(1), pos(2)) << Range(pos(0), pos(3)) << true << false << true; + QTest::newRow("r1 inside r2 equal end") + << Range(pos(1), pos(2)) << Range(pos(0), pos(2)) << true << false << true; + QTest::newRow("r1 ends after r2 overlapping") + << Range(pos(1), pos(3)) << Range(pos(0), pos(2)) << true << false << false; + QTest::newRow("empty r1 on r2 end") + << Range(pos(1), pos(1)) << Range(pos(0), pos(1)) << false << false << true; + QTest::newRow("r1 adjacent after r2") + << Range(pos(1), pos(2)) << Range(pos(0), pos(1)) << false << false << false; + QTest::newRow("r1 behind r2") + << Range(pos(2), pos(3)) << Range(pos(0), pos(1)) << false << false << false; +} + +void tst_LanguageServerProtocol::range() +{ + QFETCH(Range, r1); + QFETCH(Range, r2); + QFETCH(bool, overlaps); + QFETCH(bool, r1Containsr2); + QFETCH(bool, r2Containsr1); + + QVERIFY(r1.overlaps(r2) == r2.overlaps(r1)); + QCOMPARE(r1.overlaps(r2), overlaps); + QCOMPARE(r1.contains(r2), r1Containsr2); + QCOMPARE(r2.contains(r1), r2Containsr1); +} + QTEST_MAIN(tst_LanguageServerProtocol) #include "tst_languageserverprotocol.moc" |
