diff options
-rw-r--r-- | src/Document.cxx | 19 | ||||
-rw-r--r-- | test/unit/testDocument.cxx | 23 |
2 files changed, 34 insertions, 8 deletions
diff --git a/src/Document.cxx b/src/Document.cxx index 96bee868e..3a3627fdc 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -1907,6 +1907,15 @@ Sci::Position Document::NextWordEnd(Sci::Position pos, int delta) const { return pos; } +namespace { + +constexpr bool IsWordEdge(CharacterClass cc, CharacterClass ccNext) noexcept { + return (cc != ccNext) && + (cc == CharacterClass::word || cc == CharacterClass::punctuation); +} + +} + /** * Check that the character at the given position is a word or punctuation character and that * the previous character is of a different character class. @@ -1916,11 +1925,8 @@ bool Document::IsWordStartAt(Sci::Position pos) const { return false; if (pos > 0) { const CharacterExtracted cePos = CharacterAfter(pos); - const CharacterClass ccPos = WordCharacterClass(cePos.character); const CharacterExtracted cePrev = CharacterBefore(pos); - const CharacterClass ccPrev = WordCharacterClass(cePrev.character); - return (ccPos == CharacterClass::word || ccPos == CharacterClass::punctuation) && - (ccPos != ccPrev); + return IsWordEdge(WordCharacterClass(cePos.character), WordCharacterClass(cePrev.character)); } return true; } @@ -1934,11 +1940,8 @@ bool Document::IsWordEndAt(Sci::Position pos) const { return false; if (pos < LengthNoExcept()) { const CharacterExtracted cePos = CharacterAfter(pos); - const CharacterClass ccPos = WordCharacterClass(cePos.character); const CharacterExtracted cePrev = CharacterBefore(pos); - const CharacterClass ccPrev = WordCharacterClass(cePrev.character); - return (ccPrev == CharacterClass::word || ccPrev == CharacterClass::punctuation) && - (ccPrev != ccPos); + return IsWordEdge(WordCharacterClass(cePrev.character), WordCharacterClass(cePos.character)); } return true; } diff --git a/test/unit/testDocument.cxx b/test/unit/testDocument.cxx index 97db6d9a2..0f8e399fa 100644 --- a/test/unit/testDocument.cxx +++ b/test/unit/testDocument.cxx @@ -455,3 +455,26 @@ TEST_CASE("Document") { } } + +TEST_CASE("Words") { + + SECTION("WordsInText") { + const DocPlus doc(" abc ", 0); + REQUIRE(doc.document.IsWordAt(1, 4)); + REQUIRE(!doc.document.IsWordAt(0, 1)); + REQUIRE(!doc.document.IsWordAt(1, 2)); + const DocPlus docPunct(" [!] ", 0); + REQUIRE(docPunct.document.IsWordAt(1, 4)); + REQUIRE(!docPunct.document.IsWordAt(0, 1)); + REQUIRE(!docPunct.document.IsWordAt(1, 2)); + const DocPlus docMixed(" -ab ", 0); // '-' is punctuation, 'ab' is word + REQUIRE(docMixed.document.IsWordAt(2, 4)); + REQUIRE(docMixed.document.IsWordAt(1, 4)); + REQUIRE(docMixed.document.IsWordAt(1, 2)); + REQUIRE(!docMixed.document.IsWordAt(1, 3)); // 3 is between a and b so not word edge + // Scintilla's word definition just examines the ends + const DocPlus docOverSpace(" a b ", 0); + REQUIRE(docOverSpace.document.IsWordAt(1, 4)); + } + +} |