File indexing completed on 2024-04-28 03:57:10

0001 /*
0002    SPDX-FileCopyrightText: 2022 Martin Seher <martin.seher@gmail.com>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "hlsearch.h"
0008 #include "emulatedcommandbarsetupandteardown.h"
0009 
0010 #include <inputmode/kateviinputmode.h>
0011 #include <katebuffer.h>
0012 #include <kateconfig.h>
0013 #include <katedocument.h>
0014 #include <kateview.h>
0015 #include <vimode/emulatedcommandbar/emulatedcommandbar.h>
0016 
0017 #include <QMainWindow>
0018 #include <QTest>
0019 
0020 using namespace KTextEditor;
0021 
0022 #define TestHighlight(...) TestHighlight_(__LINE__, __FILE__, __VA_ARGS__)
0023 
0024 QTEST_MAIN(HlSearchTest)
0025 
0026 void HlSearchTest::highlightModeTests()
0027 {
0028     EmulatedCommandBarSetUpAndTearDown emulatedCommandBarSetUpAndTearDown(vi_input_mode, kate_view, mainWindow);
0029 
0030     setWindowSize();
0031 
0032     const QList<Kate::TextRange *> rangesInitial = rangesOnLine(0);
0033     Q_ASSERT(rangesInitial.isEmpty() && "Assumptions about ranges are wrong - this test is invalid and may need updating!");
0034 
0035     const QColor searchHighlightColor = kate_view->rendererConfig()->searchHighlightColor();
0036 
0037     // test commands exist
0038     {
0039         QCOMPARE(vi_input_mode->viModeEmulatedCommandBar()->executeCommand(QStringLiteral("set-hls")).size(), 0);
0040         QCOMPARE(vi_input_mode->viModeEmulatedCommandBar()->executeCommand(QStringLiteral("set-hlsearch")).size(), 0);
0041         QCOMPARE(vi_input_mode->viModeEmulatedCommandBar()->executeCommand(QStringLiteral("set-nohls")).size(), 0);
0042         QCOMPARE(vi_input_mode->viModeEmulatedCommandBar()->executeCommand(QStringLiteral("set-nohlsearch")).size(), 0);
0043         QCOMPARE(vi_input_mode->viModeEmulatedCommandBar()->executeCommand(QStringLiteral("noh")).size(), 0);
0044         QCOMPARE(vi_input_mode->viModeEmulatedCommandBar()->executeCommand(QStringLiteral("nohlsearch")).size(), 0);
0045     }
0046     // test highlight initiated by *
0047     {
0048         QString text = QStringLiteral("foo bar xyz foo ab bar x");
0049         BeginTest(text);
0050         auto vr = kate_view->visibleRange();
0051         QCOMPARE(vr.end().column(), text.length());
0052 
0053         TestPressKey(QStringLiteral("w*"));
0054         {
0055             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0056             QCOMPARE(ranges.size(), rangesInitial.size() + 2);
0057 
0058             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0059             TestHighlight(*ranges[1], {0, 19}, {0, 22}, searchHighlightColor);
0060         }
0061         FinishTest(text.toUtf8().constData());
0062     }
0063     // test highlight initiated by #
0064     {
0065         QString text = QStringLiteral("foo bar xyz foo ab bar x");
0066         BeginTest(text);
0067         auto vr = kate_view->visibleRange();
0068         QCOMPARE(vr.end().column(), text.length());
0069 
0070         TestPressKey(QStringLiteral("w#"));
0071         {
0072             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0073             QCOMPARE(ranges.size(), rangesInitial.size() + 2);
0074 
0075             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0076             TestHighlight(*ranges[1], {0, 19}, {0, 22}, searchHighlightColor);
0077         }
0078         FinishTest(text.toUtf8().constData());
0079     }
0080     // test highlight initiated by /
0081     {
0082         QString text = QStringLiteral("foo bar xyz foo ab bar x");
0083         BeginTest(text);
0084         auto vr = kate_view->visibleRange();
0085         QCOMPARE(vr.end().column(), text.length());
0086 
0087         TestPressKey(QStringLiteral("/bar\\enter"));
0088         {
0089             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0090             QCOMPARE(ranges.size(), rangesInitial.size() + 2);
0091 
0092             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0093             TestHighlight(*ranges[1], {0, 19}, {0, 22}, searchHighlightColor);
0094         }
0095         FinishTest(text.toUtf8().constData());
0096     }
0097     // test highlight initiated by ?
0098     {
0099         QString text = QStringLiteral("foo bar xyz foo ab bar x");
0100         BeginTest(text);
0101         auto vr = kate_view->visibleRange();
0102         QCOMPARE(vr.end().column(), text.length());
0103 
0104         TestPressKey(QStringLiteral("?bar\\enter"));
0105         {
0106             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0107             QCOMPARE(ranges.size(), rangesInitial.size() + 2);
0108 
0109             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0110             TestHighlight(*ranges[1], {0, 19}, {0, 22}, searchHighlightColor);
0111         }
0112         FinishTest(text.toUtf8().constData());
0113     }
0114     // test that aborting search removes highlights
0115     {
0116         QString text = QStringLiteral("foo bar xyz foo ab bar x");
0117         BeginTest(text);
0118         auto vr = kate_view->visibleRange();
0119         QCOMPARE(vr.end().column(), text.length());
0120 
0121         TestPressKey(QStringLiteral("/bar"));
0122         {
0123             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0124             QCOMPARE(ranges.size(), rangesInitial.size() + 2);
0125 
0126             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0127             TestHighlight(*ranges[1], {0, 19}, {0, 22}, searchHighlightColor);
0128         }
0129         TestPressKey(QStringLiteral("\\esc"));
0130         {
0131             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0132             QCOMPARE(ranges.size(), rangesInitial.size());
0133         }
0134         FinishTest(text.toUtf8().constData());
0135     }
0136     // test empty matches handled
0137     {
0138         QString text = QStringLiteral("foo bar xyz");
0139         BeginTest(text);
0140         auto vr = kate_view->visibleRange();
0141         QCOMPARE(vr.end().column(), text.length());
0142 
0143         TestPressKey(QStringLiteral("/\\\\<\\enter"));
0144         {
0145             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0146             QCOMPARE(ranges.size(), rangesInitial.size() + 6);
0147 
0148             TestHighlight(*ranges[0], {0, 0}, {0, 1}, searchHighlightColor);
0149             TestHighlight(*ranges[3], {0, 7}, {0, 8}, searchHighlightColor);
0150         }
0151         FinishTest(text.toUtf8().constData());
0152     }
0153     // test that only visible matches are highlighted
0154     {
0155         QString text = QStringLiteral("foo bar xyz\n\n\n\n\nfoo ab bar x");
0156         BeginTest(text);
0157         auto vr = kate_view->visibleRange();
0158         // ensure that last line is not visible
0159         QVERIFY(vr.end().line() < 4);
0160 
0161         TestPressKey(QStringLiteral("/bar\\enter"));
0162         {
0163             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0164             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0165             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0166             ranges = rangesOnLine(5);
0167             QCOMPARE(ranges.size(), rangesInitial.size());
0168         }
0169 
0170         kate_view->bottom();
0171         {
0172             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0173             QCOMPARE(ranges.size(), rangesInitial.size());
0174             ranges = rangesOnLine(5);
0175             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0176             TestHighlight(*ranges[0], {5, 7}, {5, 10}, searchHighlightColor);
0177         }
0178         FinishTest(text.toUtf8().constData());
0179     }
0180     // test highlighting when typing in search triggers a visual range change
0181     {
0182         QString text = QStringLiteral("foo bar xyz\n\n\n\n\nfoo ab barx");
0183         BeginTest(text);
0184         auto vr = kate_view->visibleRange();
0185         // ensure that last line is not visible
0186         QVERIFY(vr.end().line() < 4);
0187 
0188         TestPressKey(QStringLiteral("/barx"));
0189         {
0190             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0191             QCOMPARE(ranges.size(), rangesInitial.size());
0192             ranges = rangesOnLine(5);
0193             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0194             TestHighlight(*ranges[0], {5, 7}, {5, 11}, searchHighlightColor);
0195         }
0196         TestPressKey(QStringLiteral("\\enter"));
0197 
0198         FinishTest(text.toUtf8().constData());
0199     }
0200     // test that normal search highlight is deactivated when hls mode is active
0201     {
0202         QString text = QStringLiteral("foo bar xyz");
0203         BeginTest(text);
0204 
0205         TestPressKey(QStringLiteral("/bar"));
0206         {
0207             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0208             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0209             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0210         }
0211         TestPressKey(QStringLiteral("\\enter"));
0212         FinishTest(text.toUtf8().constData());
0213     }
0214     // test that :noh turns of current highlight
0215     {
0216         QString text = QStringLiteral("foo bar xyz\n\n\n\n\nfoo ab bar x");
0217         BeginTest(text);
0218         auto vr = kate_view->visibleRange();
0219         // ensure that last line is not visible
0220         QVERIFY(vr.end().line() < 4);
0221 
0222         TestPressKey(QStringLiteral("/bar\\enter"));
0223         {
0224             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0225             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0226             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0227         }
0228 
0229         TestPressKey(QStringLiteral(":noh\\enter"));
0230         {
0231             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0232             QCOMPARE(ranges.size(), rangesInitial.size());
0233         }
0234         // changing view range should not activate highlighting again
0235         kate_view->bottom();
0236         {
0237             QList<Kate::TextRange *> ranges = rangesOnLine(5);
0238             QCOMPARE(ranges.size(), rangesInitial.size());
0239         }
0240         FinishTest(text.toUtf8().constData());
0241     }
0242     // test that :nohlsearch turns of current highlight
0243     {
0244         QString text = QStringLiteral("foo bar xyz\n\n\n\n\nfoo ab bar x");
0245         BeginTest(text);
0246         auto vr = kate_view->visibleRange();
0247         // ensure that last line is not visible
0248         QVERIFY(vr.end().line() < 4);
0249 
0250         TestPressKey(QStringLiteral("/bar\\enter"));
0251         {
0252             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0253             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0254             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0255         }
0256 
0257         TestPressKey(QStringLiteral(":nohlsearch\\enter"));
0258         {
0259             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0260             QCOMPARE(ranges.size(), rangesInitial.size());
0261         }
0262         // changing view range should not activate highlighting again
0263         kate_view->bottom();
0264         {
0265             QList<Kate::TextRange *> ranges = rangesOnLine(5);
0266             QCOMPARE(ranges.size(), rangesInitial.size());
0267         }
0268         FinishTest(text.toUtf8().constData());
0269     }
0270     // test that new search activates highlighting after :noh
0271     {
0272         QString text = QStringLiteral("foo bar xyz foo");
0273         BeginTest(text);
0274 
0275         TestPressKey(QStringLiteral("/bar\\enter"));
0276         {
0277             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0278             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0279             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0280         }
0281 
0282         TestPressKey(QStringLiteral(":noh\\enter"));
0283         {
0284             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0285             QCOMPARE(ranges.size(), rangesInitial.size());
0286         }
0287         TestPressKey(QStringLiteral("/bar\\enter"));
0288         {
0289             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0290             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0291             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0292         }
0293         FinishTest(text.toUtf8().constData());
0294     }
0295     // test that word search activates highlighting after :noh
0296     {
0297         QString text = QStringLiteral("foo bar xyz foo");
0298         BeginTest(text);
0299 
0300         TestPressKey(QStringLiteral("/bar\\enter"));
0301         {
0302             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0303             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0304             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0305         }
0306 
0307         TestPressKey(QStringLiteral(":noh\\enter"));
0308         {
0309             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0310             QCOMPARE(ranges.size(), rangesInitial.size());
0311         }
0312         TestPressKey(QStringLiteral("*"));
0313         {
0314             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0315             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0316             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0317         }
0318         FinishTest(text.toUtf8().constData());
0319     }
0320     // test that next match ('n') activates highlighting after :noh
0321     {
0322         QString text = QStringLiteral("foo bar xyz foo");
0323         BeginTest(text);
0324 
0325         TestPressKey(QStringLiteral("/bar\\enter"));
0326         {
0327             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0328             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0329             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0330         }
0331 
0332         TestPressKey(QStringLiteral(":noh\\enter"));
0333         {
0334             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0335             QCOMPARE(ranges.size(), rangesInitial.size());
0336         }
0337         TestPressKey(QStringLiteral("n"));
0338         {
0339             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0340             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0341             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0342         }
0343         FinishTest(text.toUtf8().constData());
0344     }
0345     // test that previous match ('N') activates highlighting after :noh
0346     {
0347         QString text = QStringLiteral("foo bar xyz foo");
0348         BeginTest(text);
0349 
0350         TestPressKey(QStringLiteral("/bar\\enter"));
0351         {
0352             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0353             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0354             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0355         }
0356 
0357         TestPressKey(QStringLiteral(":noh\\enter"));
0358         {
0359             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0360             QCOMPARE(ranges.size(), rangesInitial.size());
0361         }
0362         TestPressKey(QStringLiteral("N"));
0363         {
0364             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0365             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0366             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0367         }
0368         FinishTest(text.toUtf8().constData());
0369     }
0370     // test that :set-nohls turns of highlight
0371     {
0372         QString text = QStringLiteral("foo bar xyz\n\n\n\n\nfoo ab bar x");
0373         BeginTest(text);
0374         auto vr = kate_view->visibleRange();
0375         // ensure that last line is not visible
0376         QVERIFY(vr.end().line() < 4);
0377 
0378         TestPressKey(QStringLiteral("/bar\\enter"));
0379         {
0380             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0381             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0382             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0383         }
0384 
0385         TestPressKey(QStringLiteral(":set-nohls\\enter"));
0386         {
0387             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0388             QCOMPARE(ranges.size(), rangesInitial.size());
0389         }
0390         // changing view range should not activate highlighting again
0391         kate_view->bottom();
0392         {
0393             QList<Kate::TextRange *> ranges = rangesOnLine(5);
0394             QCOMPARE(ranges.size(), rangesInitial.size());
0395         }
0396         FinishTest(text.toUtf8().constData());
0397     }
0398     // test that :set-nohlsearch turns of highlight
0399     {
0400         QString text = QStringLiteral("foo bar xyz\n\n\n\n\nfoo ab bar x");
0401         BeginTest(text);
0402         auto vr = kate_view->visibleRange();
0403         // ensure that last line is not visible
0404         QVERIFY(vr.end().line() < 4);
0405 
0406         TestPressKey(QStringLiteral("/bar\\enter"));
0407         {
0408             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0409             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0410             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0411         }
0412 
0413         TestPressKey(QStringLiteral(":set-nohlsearch\\enter"));
0414         {
0415             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0416             QCOMPARE(ranges.size(), rangesInitial.size());
0417         }
0418         // changing view range should not activate highlighting again
0419         kate_view->bottom();
0420         {
0421             QList<Kate::TextRange *> ranges = rangesOnLine(5);
0422             QCOMPARE(ranges.size(), rangesInitial.size());
0423         }
0424         FinishTest(text.toUtf8().constData());
0425     }
0426     // test that new search does not activate highlighting after :set-nohls
0427     {
0428         QString text = QStringLiteral("foo bar xyz foo");
0429         BeginTest(text);
0430 
0431         TestPressKey(QStringLiteral("/bar\\enter"));
0432         {
0433             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0434             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0435             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0436         }
0437 
0438         TestPressKey(QStringLiteral(":set-nohls\\enter"));
0439         {
0440             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0441             QCOMPARE(ranges.size(), rangesInitial.size());
0442         }
0443         TestPressKey(QStringLiteral("/bar\\enter"));
0444         {
0445             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0446             QCOMPARE(ranges.size(), rangesInitial.size());
0447         }
0448         FinishTest(text.toUtf8().constData());
0449     }
0450     // test that word search does not activate highlighting after :set-nohls
0451     {
0452         QString text = QStringLiteral("foo bar xyz foo");
0453         BeginTest(text);
0454 
0455         TestPressKey(QStringLiteral("/bar\\enter"));
0456         {
0457             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0458             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0459             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0460         }
0461 
0462         TestPressKey(QStringLiteral(":set-nohls\\enter"));
0463         {
0464             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0465             QCOMPARE(ranges.size(), rangesInitial.size());
0466         }
0467         TestPressKey(QStringLiteral("*"));
0468         {
0469             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0470             QCOMPARE(ranges.size(), rangesInitial.size());
0471         }
0472         FinishTest(text.toUtf8().constData());
0473     }
0474     // test that highlighting can be activated with :set-hls after :set-nohls
0475     {
0476         QString text = QStringLiteral("foo bar xyz foo");
0477         BeginTest(text);
0478 
0479         TestPressKey(QStringLiteral("/bar\\enter"));
0480         {
0481             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0482             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0483             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0484         }
0485 
0486         TestPressKey(QStringLiteral(":set-nohls\\enter"));
0487         {
0488             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0489             QCOMPARE(ranges.size(), rangesInitial.size());
0490         }
0491         TestPressKey(QStringLiteral(":set-hls\\enter"));
0492         {
0493             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0494             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0495             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0496         }
0497         FinishTest(text.toUtf8().constData());
0498     }
0499     // test that highlighting can be activated with :set-hlsearch after :set-nohls
0500     {
0501         QString text = QStringLiteral("foo bar xyz foo");
0502         BeginTest(text);
0503 
0504         TestPressKey(QStringLiteral("/bar\\enter"));
0505         {
0506             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0507             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0508             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0509         }
0510 
0511         TestPressKey(QStringLiteral(":set-nohls\\enter"));
0512         {
0513             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0514             QCOMPARE(ranges.size(), rangesInitial.size());
0515         }
0516         TestPressKey(QStringLiteral(":set-hlsearch\\enter"));
0517         {
0518             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0519             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0520             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0521         }
0522         FinishTest(text.toUtf8().constData());
0523     }
0524     // test that switching to normal mode turns off highlighting
0525     {
0526         QString text = QStringLiteral("foo bar xyz foo");
0527         BeginTest(text);
0528 
0529         TestPressKey(QStringLiteral("/bar\\enter"));
0530         {
0531             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0532             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0533             TestHighlight(*ranges[0], {0, 4}, {0, 7}, searchHighlightColor);
0534         }
0535 
0536         kate_view->setInputMode(KTextEditor::View::InputMode::NormalInputMode);
0537         {
0538             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0539             QCOMPARE(ranges.size(), rangesInitial.size());
0540         }
0541         kate_view->setInputMode(KTextEditor::View::InputMode::ViInputMode);
0542         FinishTest(text.toUtf8().constData());
0543     }
0544     // test that opening search bar does not hide previous results
0545     {
0546         QString text = QStringLiteral("foo xbar barx bar");
0547 
0548         BeginTest(text);
0549 
0550         TestPressKey(QStringLiteral("/bar\\enter"));
0551         {
0552             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0553             QCOMPARE(ranges.size(), rangesInitial.size() + 3);
0554             TestHighlight(*ranges[0], {0, 5}, {0, 8}, searchHighlightColor);
0555         }
0556         TestPressKey(QStringLiteral("/"));
0557         {
0558             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0559             QCOMPARE(ranges.size(), rangesInitial.size() + 3);
0560             TestHighlight(*ranges[0], {0, 5}, {0, 8}, searchHighlightColor);
0561         }
0562         TestPressKey(QStringLiteral("\\enter"));
0563         {
0564             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0565             QCOMPARE(ranges.size(), rangesInitial.size() + 3);
0566             TestHighlight(*ranges[0], {0, 5}, {0, 8}, searchHighlightColor);
0567         }
0568         TestPressKey(QStringLiteral("/"));
0569         {
0570             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0571             QCOMPARE(ranges.size(), rangesInitial.size() + 3);
0572             TestHighlight(*ranges[0], {0, 5}, {0, 8}, searchHighlightColor);
0573         }
0574         TestPressKey(QStringLiteral("\\esc"));
0575         {
0576             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0577             QCOMPARE(ranges.size(), rangesInitial.size() + 3);
0578             TestHighlight(*ranges[0], {0, 5}, {0, 8}, searchHighlightColor);
0579         }
0580         FinishTest(text.toUtf8().constData());
0581     }
0582     // test that deleting all text in search bar removes highlights
0583     {
0584         QString text = QStringLiteral("foo xbar barx bar");
0585 
0586         BeginTest(text);
0587 
0588         TestPressKey(QStringLiteral("/bar"));
0589         {
0590             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0591             QCOMPARE(ranges.size(), rangesInitial.size() + 3);
0592             TestHighlight(*ranges[0], {0, 5}, {0, 8}, searchHighlightColor);
0593         }
0594         TestPressKey(QStringLiteral("\\backspace\\backspace\\backspace"));
0595         {
0596             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0597             QCOMPARE(ranges.size(), rangesInitial.size());
0598         }
0599         TestPressKey(QStringLiteral("\\esc"));
0600         FinishTest(text.toUtf8().constData());
0601     }
0602     // test that previously results are shown when current search is aborted
0603     {
0604         QString text = QStringLiteral("foo xbar barx bar");
0605 
0606         BeginTest(text);
0607 
0608         TestPressKey(QStringLiteral("/bar\\enter"));
0609         {
0610             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0611             QCOMPARE(ranges.size(), rangesInitial.size() + 3);
0612             TestHighlight(*ranges[0], {0, 5}, {0, 8}, searchHighlightColor);
0613         }
0614         TestPressKey(QStringLiteral("/rx"));
0615         {
0616             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0617             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0618             TestHighlight(*ranges[0], {0, 11}, {0, 13}, searchHighlightColor);
0619         }
0620         TestPressKey(QStringLiteral("\\esc"));
0621         {
0622             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0623             QCOMPARE(ranges.size(), rangesInitial.size() + 3);
0624             TestHighlight(*ranges[0], {0, 5}, {0, 8}, searchHighlightColor);
0625         }
0626         FinishTest(text.toUtf8().constData());
0627     }
0628     // test that newly inserted text will be highlighted
0629     {
0630         QString text = QStringLiteral("foo xbar abcd bar");
0631 
0632         TestPressKey(QStringLiteral("/xbar\\enter"));
0633         {
0634             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0635             QCOMPARE(ranges.size(), rangesInitial.size() + 1);
0636             TestHighlight(*ranges[0], {0, 4}, {0, 8}, searchHighlightColor);
0637         }
0638         TestPressKey(QStringLiteral("wwix\\esc"));
0639         {
0640             QList<Kate::TextRange *> ranges = rangesOnLine(0);
0641             QCOMPARE(ranges.size(), rangesInitial.size() + 2);
0642             TestHighlight(*ranges[0], {0, 4}, {0, 8}, searchHighlightColor);
0643             TestHighlight(*ranges[1], {0, 14}, {0, 18}, searchHighlightColor);
0644         }
0645 
0646         BeginTest(text);
0647         FinishTest(text.toUtf8().constData());
0648     }
0649     // test that no endless loop is triggered
0650     {
0651         QString text = QStringLiteral("foo bar xyz\nabc def\nghi jkl\nmno pqr\nstu vwx\nfoo ab bar x");
0652         BeginTest(text);
0653         auto vr = kate_view->visibleRange();
0654         // ensure that last line is not visible
0655         QVERIFY(vr.end().line() < 4);
0656 
0657         TestPressKey(QStringLiteral("/\\\\<\\enter"));
0658 
0659         FinishTest(text.toUtf8().constData());
0660     }
0661 }
0662 
0663 QList<Kate::TextRange *> HlSearchTest::rangesOnLine(int line)
0664 {
0665     QList<Kate::TextRange *> arr = kate_document->buffer().rangesForLine(line, kate_view, true);
0666     std::sort(arr.begin(), arr.end(), [](const Kate::TextRange *l, const Kate::TextRange *r) {
0667         return l->toRange().start() < r->toRange().start();
0668     });
0669     return arr;
0670 }
0671 
0672 void HlSearchTest::setWindowSize()
0673 {
0674     const QFont font = kate_view->rendererConfig()->baseFont();
0675     QFontMetrics fm(font);
0676     auto fontHeight = fm.height();
0677 
0678     kate_document->setText(QStringLiteral("\n\n\n\n"));
0679     for (int i = 250; i > 0; i -= fontHeight) {
0680         mainWindow->setMaximumHeight(i);
0681         if (kate_view->visibleRange().end().line() == 3)
0682             break;
0683     }
0684     QVERIFY(kate_view->visibleRange().end().line() == 3);
0685 }
0686 
0687 void HlSearchTest::TestHighlight_(int line, const char *file, const Kate::TextRange &r, std::array<int, 2> start, std::array<int, 2> end, const QColor &bg)
0688 {
0689     QTest::qCompare(r.attribute()->background().color(), bg, "bgcolor", "bgcolor", file, line);
0690     QTest::qCompare(r.start().line(), start[0], "start_line", "start_line", file, line);
0691     QTest::qCompare(r.start().column(), start[1], "start_column", "start_column", file, line);
0692     QTest::qCompare(r.end().line(), end[0], "end_line", "end_line", file, line);
0693     QTest::qCompare(r.end().column(), end[1], "end_column", "end_column", file, line);
0694 }
0695 
0696 #include "moc_hlsearch.cpp"