From 4680099aa1bb679481042417c2bc8c7f0ba786c5 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 13 Jun 2013 16:37:14 +0200 Subject: [PATCH] Fix searching for repeated characters in files. Searching for aaaa in aaaaaaaa would give 5 results instead of 2 in case of non-regexp search. Task-number: QTCREATORBUG-7883 Change-Id: I5936090b3eef5e68405201fe63d02bf0dd2469d5 Reviewed-by: David Schulz --- src/libs/utils/filesearch.cpp | 1 + tests/auto/filesearch/testfile.txt | 1 + tests/auto/filesearch/tst_filesearch.cpp | 22 ++++++++++++++++++++-- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/libs/utils/filesearch.cpp b/src/libs/utils/filesearch.cpp index 572ce17848d..68c3d8cef2c 100644 --- a/src/libs/utils/filesearch.cpp +++ b/src/libs/utils/filesearch.cpp @@ -173,6 +173,7 @@ void runFileSearch(QFutureInterface &future, results << FileSearchResult(s, lineNr, resultItemText, regionPtr - chunkPtr, termLength, QStringList()); + regionPtr += termLength - 1; // another +1 done by for-loop ++numMatches; } } diff --git a/tests/auto/filesearch/testfile.txt b/tests/auto/filesearch/testfile.txt index b131ad179bb..1a28e8c1702 100644 --- a/tests/auto/filesearch/testfile.txt +++ b/tests/auto/filesearch/testfile.txt @@ -2,4 +2,5 @@ wholeWordAtStart bla foo blubb wholeWordAtEnd search to find multiple find results search CaseSensitively for casesensitive here you find another result +aaaaaaaa this line has 2 results for four a in a row wholeWordAtVeryEnd diff --git a/tests/auto/filesearch/tst_filesearch.cpp b/tests/auto/filesearch/tst_filesearch.cpp index c5324294f01..72e57fdb2c6 100644 --- a/tests/auto/filesearch/tst_filesearch.cpp +++ b/tests/auto/filesearch/tst_filesearch.cpp @@ -46,6 +46,11 @@ bool operator==(const Utils::FileSearchResult &r1, const Utils::FileSearchResult class tst_FileSearch : public QObject { Q_OBJECT +public: + enum RegExpFlag { + NoRegExp, + RegExp + }; private slots: void multipleResults(); @@ -59,12 +64,15 @@ namespace { void test_helper(const Utils::FileSearchResultList &expectedResults, const QString &term, - QTextDocument::FindFlags flags) + QTextDocument::FindFlags flags, tst_FileSearch::RegExpFlag regexp = tst_FileSearch::NoRegExp) { Utils::FileIterator *it = new Utils::FileIterator(QStringList() << QLatin1String(FILENAME), QList() << QTextCodec::codecForLocale()); QFutureWatcher watcher; QSignalSpy ready(&watcher, SIGNAL(resultsReadyAt(int,int))); - watcher.setFuture(Utils::findInFiles(term, it, flags)); + if (regexp == tst_FileSearch::NoRegExp) + watcher.setFuture(Utils::findInFiles(term, it, flags)); + else + watcher.setFuture(Utils::findInFilesRegExp(term, it, flags)); watcher.future().waitForFinished(); QTest::qWait(100); // process events QCOMPARE(ready.count(), 1); @@ -83,6 +91,16 @@ void tst_FileSearch::multipleResults() expectedResults << Utils::FileSearchResult(QLatin1String(FILENAME), 2, QLatin1String("search to find multiple find results"), 24, 4, QStringList()); expectedResults << Utils::FileSearchResult(QLatin1String(FILENAME), 4, QLatin1String("here you find another result"), 9, 4, QStringList()); test_helper(expectedResults, QLatin1String("find"), QTextDocument::FindFlags(0)); + + expectedResults.clear(); + expectedResults << Utils::FileSearchResult(QLatin1String(FILENAME), 5, QLatin1String("aaaaaaaa this line has 2 results for four a in a row"), 0, 4, QStringList()); + expectedResults << Utils::FileSearchResult(QLatin1String(FILENAME), 5, QLatin1String("aaaaaaaa this line has 2 results for four a in a row"), 4, 4, QStringList()); + test_helper(expectedResults, QLatin1String("aaaa"), QTextDocument::FindFlags(0)); + + expectedResults.clear(); + expectedResults << Utils::FileSearchResult(QLatin1String(FILENAME), 5, QLatin1String("aaaaaaaa this line has 2 results for four a in a row"), 0, 4, QStringList() << QLatin1String("aaaa")); + expectedResults << Utils::FileSearchResult(QLatin1String(FILENAME), 5, QLatin1String("aaaaaaaa this line has 2 results for four a in a row"), 4, 4, QStringList() << QLatin1String("aaaa")); + test_helper(expectedResults, QLatin1String("aaaa"), QTextDocument::FindFlags(0), RegExp); } void tst_FileSearch::caseSensitive()