File indexing completed on 2024-05-12 15:45:13

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