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"