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"