mirror of
https://github.com/chylex/IntelliJ-IdeaVim.git
synced 2025-05-28 00:34:02 +02:00
Extract search highlighting related tests
This commit is contained in:
parent
12ed60d88e
commit
970cfadaec
src
test/java/org/jetbrains/plugins/ideavim/group
SearchGroupTest.kt
search
testFixtures/kotlin/org/jetbrains/plugins/ideavim
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,247 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2003-2024 The IdeaVim authors
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by an MIT-style
|
||||||
|
* license that can be found in the LICENSE.txt file or at
|
||||||
|
* https://opensource.org/licenses/MIT.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.plugins.ideavim.group.search
|
||||||
|
|
||||||
|
import org.jetbrains.plugins.ideavim.VimTestCase
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
|
class IncsearchGlobalTest : VimTestCase() {
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights for global command with range`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText(":", "%g/and")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary l‷and‴
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights for global command in whole file with default range`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText(":", "g/and")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary l‷and‴
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights for global-bang command`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText(":", "%g!/and")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary l‷and‴
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch only highlights for global command after valid argument`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
// E.g., don't remove highlights when trying to type :goto
|
||||||
|
enterSearch("and")
|
||||||
|
typeText(":g")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights for global command only highlights in range`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|${c}hard by the torrent and rush of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText(":", "2,3g/and")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks ‷and‴ lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent and rush of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch for global command starts at beginning of range not caret position`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
|${c}I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
|I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText(":", "2,8g/and")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks ‷and‴ lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
|I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
|I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights for global command clears highlights on backspace`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText(":", "g/and", "<BS><BS><BS>")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights for global command resets highlights on backspace`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
enterSearch("and") // Moves the caret to "and" on the second line: (1, 10)
|
||||||
|
typeText(":", "g/roc", "<BS><BS><BS>")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
|
||||||
|
// Make sure the caret is reset too
|
||||||
|
assertPosition(1, 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test cancelling incsearch highlights for global command shows previous highlights`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
enterSearch("and") // Moves the caret to "and" on the second line (1, 10)
|
||||||
|
typeText(":", "g/ass", "<Esc>")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
|
||||||
|
// Make sure the caret is reset too
|
||||||
|
assertPosition(1, 10)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,314 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2003-2024 The IdeaVim authors
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by an MIT-style
|
||||||
|
* license that can be found in the LICENSE.txt file or at
|
||||||
|
* https://opensource.org/licenses/MIT.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.plugins.ideavim.group.search
|
||||||
|
|
||||||
|
import org.jetbrains.plugins.ideavim.VimTestCase
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
|
@Suppress("SpellCheckingInspection")
|
||||||
|
class IncsearchSubstituteTest : VimTestCase() {
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlight with force sensitive case atom`() {
|
||||||
|
configureByText("lorem ipsum Lorem Ipsum lorem ipsum")
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText("/", "\\Clorem")
|
||||||
|
|
||||||
|
assertSearchHighlights("\\Clorem", "«lorem» ipsum Lorem Ipsum ‷lorem‴ ipsum")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights for substitute command`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText(":", "%s/and")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary l‷and‴
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
@Test
|
||||||
|
fun `test incsearch only highlights for substitute command after valid argument`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
// E.g., don't remove highlights when trying to type :set
|
||||||
|
enterSearch("and")
|
||||||
|
typeText(":s")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights for substitute command only highlights in range`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|${c}hard by the torrent and rush of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText(":", "2,3s/and")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks ‷and‴ lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent and rush of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights for substitute command if range larger than file`() {
|
||||||
|
configureByText(
|
||||||
|
"""
|
||||||
|
|I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|${c}hard by the torrent and rush of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText(":", "1,300s/and")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary l‷and‴
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent «and» rush of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights for substitute command with reversed range`() {
|
||||||
|
configureByText(
|
||||||
|
"""
|
||||||
|
|I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|${c}hard by the torrent and rush of a mountain pass.
|
||||||
|
|I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent and rush of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText(":", "8,2s/and")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""
|
||||||
|
|I found it in a legendary land
|
||||||
|
|all rocks ‷and‴ lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent «and» rush of a mountain pass.
|
||||||
|
|I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent «and» rush of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights nothing for substitute with range after end of file`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|${c}hard by the torrent and rush of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText(":", "100,300s/and")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent and rush of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights for substitute command in current line with no range`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText(":", "s/and")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks ‷and‴ lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch for substitute command starts at beginning of range not caret position`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
|${c}I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
|I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText(":", "2,8s/and")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks ‷and‴ lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
|I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
|I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights for substitute command clears highlights on backspace`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText(":", "%s/and", "<BS><BS><BS>")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights for substitute command resets highlights on backspace`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
enterSearch("and") // Moves the caret to "and" on the second line: (1, 10)
|
||||||
|
typeText(":", "%s/roc", "<BS><BS><BS>")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
|
||||||
|
// Make sure the caret is reset too
|
||||||
|
assertPosition(1, 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test cancelling incsearch highlights for substitute command shows previous highlights`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
enterSearch("and") // Moves the care to "and" on the second line: (1, 10)
|
||||||
|
typeText(":", "%s/ass", "<Esc>")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
|
||||||
|
// Make sure the caret is reset too
|
||||||
|
assertPosition(1, 10)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,608 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2003-2024 The IdeaVim authors
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by an MIT-style
|
||||||
|
* license that can be found in the LICENSE.txt file or at
|
||||||
|
* https://opensource.org/licenses/MIT.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.plugins.ideavim.group.search
|
||||||
|
|
||||||
|
import com.maddyhome.idea.vim.state.mode.Mode
|
||||||
|
import com.maddyhome.idea.vim.state.mode.SelectionType
|
||||||
|
import org.jetbrains.plugins.ideavim.SkipNeovimReason
|
||||||
|
import org.jetbrains.plugins.ideavim.TestWithoutNeovim
|
||||||
|
import org.jetbrains.plugins.ideavim.VimTestCase
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
|
@Suppress("SpellCheckingInspection")
|
||||||
|
class IncsearchTests : VimTestCase() {
|
||||||
|
@TestWithoutNeovim(SkipNeovimReason.OPTION)
|
||||||
|
@Test
|
||||||
|
fun `test incsearch moves caret to start of first match`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set incsearch")
|
||||||
|
typeText("/", "la")
|
||||||
|
assertPosition(1, 14)
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestWithoutNeovim(SkipNeovimReason.OPTION)
|
||||||
|
@Test
|
||||||
|
fun `test incsearch + hlsearch moves caret to start of first match`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
typeText("/", "la")
|
||||||
|
assertPosition(1, 14)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch + hlsearch at bottom of file with wrapscan`() {
|
||||||
|
// Make sure the caret wraps during incsearch
|
||||||
|
configureByText(
|
||||||
|
"""
|
||||||
|
|Lorem ipsum dolor sit amet,
|
||||||
|
|consectetur adipiscing elit
|
||||||
|
|Sed in orci ${c}mauris.
|
||||||
|
|Cras id tellus in ex imperdiet egestas.
|
||||||
|
""".trimMargin()
|
||||||
|
)
|
||||||
|
enterCommand("set incsearch hlsearch wrapscan")
|
||||||
|
typeText("/it")
|
||||||
|
assertPosition(0, 19)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch + hlsearch at bottom of file with nowrapscan`() {
|
||||||
|
// This will highlight the occurrences above/before the caret, but should not move the caret
|
||||||
|
configureByText(
|
||||||
|
"""
|
||||||
|
|Lorem ipsum dolor sit amet,
|
||||||
|
|consectetur adipiscing elit
|
||||||
|
|Sed in orci ${c}mauris.
|
||||||
|
|Cras id tellus in ex imperdiet egestas.
|
||||||
|
""".trimMargin()
|
||||||
|
)
|
||||||
|
enterCommand("set incsearch hlsearch nowrapscan")
|
||||||
|
typeText("/it")
|
||||||
|
assertPosition(2, 12)
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestWithoutNeovim(SkipNeovimReason.OPTION)
|
||||||
|
@Test
|
||||||
|
fun `test incsearch + hlsearch moves caret to start of first match (backwards)`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
typeText("?", "la")
|
||||||
|
assertPosition(0, 26)
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestWithoutNeovim(SkipNeovimReason.OPTION)
|
||||||
|
@Test
|
||||||
|
fun `test incsearch moves caret to start of first match (backwards)`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set incsearch")
|
||||||
|
typeText("?", "la")
|
||||||
|
assertPosition(0, 26)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights with count`() {
|
||||||
|
configureByText(
|
||||||
|
"""
|
||||||
|
one
|
||||||
|
two
|
||||||
|
${c}one
|
||||||
|
two
|
||||||
|
one
|
||||||
|
two
|
||||||
|
one
|
||||||
|
two
|
||||||
|
one
|
||||||
|
two
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
typeText("3", "/", "one") // No enter
|
||||||
|
assertSearchHighlights("one",
|
||||||
|
"""
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
‷one‴
|
||||||
|
two
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
assertPosition(8, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights with large count and wrapscan`() {
|
||||||
|
configureByText(
|
||||||
|
"""
|
||||||
|
one
|
||||||
|
two
|
||||||
|
${c}one
|
||||||
|
two
|
||||||
|
one
|
||||||
|
two
|
||||||
|
one
|
||||||
|
two
|
||||||
|
one
|
||||||
|
two
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
typeText("12", "/", "one") // No enter
|
||||||
|
assertSearchHighlights("one",
|
||||||
|
"""
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
‷one‴
|
||||||
|
two
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
assertPosition(6, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights with large count and nowrapscan`() {
|
||||||
|
configureByText(
|
||||||
|
"""
|
||||||
|
one
|
||||||
|
two
|
||||||
|
${c}one
|
||||||
|
two
|
||||||
|
one
|
||||||
|
two
|
||||||
|
one
|
||||||
|
two
|
||||||
|
one
|
||||||
|
two
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch nowrapscan")
|
||||||
|
typeText("12", "/", "one") // No enter
|
||||||
|
|
||||||
|
// No current match highlight
|
||||||
|
assertSearchHighlights("one",
|
||||||
|
"""
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
|
||||||
|
// Back to the original location
|
||||||
|
assertPosition(2, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights with count and operator count`() {
|
||||||
|
configureByText("lorem 1 ipsum lorem 2 ipsum lorem 3 ipsum lorem 4 ipsum lorem 5 ipsum lorem 6 ipsum lorem 7 ipsum")
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
typeText("2d", "3/ipsum") // No enter
|
||||||
|
assertSearchHighlights("ipsum",
|
||||||
|
"lorem 1 «ipsum» lorem 2 «ipsum» lorem 3 «ipsum» lorem 4 «ipsum» lorem 5 «ipsum» lorem 6 ‷ipsum‴ lorem 7 «ipsum»")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test backwards incsearch with count`() {
|
||||||
|
configureByText(
|
||||||
|
"""
|
||||||
|
one
|
||||||
|
two
|
||||||
|
one
|
||||||
|
two
|
||||||
|
one
|
||||||
|
two
|
||||||
|
one
|
||||||
|
two
|
||||||
|
${c}one
|
||||||
|
two
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
typeText("3", "?", "one") // No enter
|
||||||
|
assertSearchHighlights("one",
|
||||||
|
"""
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
‷one‴
|
||||||
|
two
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
assertPosition(2, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test backwards incsearch highlights with large count and wrapscan`() {
|
||||||
|
configureByText(
|
||||||
|
"""
|
||||||
|
one
|
||||||
|
two
|
||||||
|
one
|
||||||
|
two
|
||||||
|
one
|
||||||
|
two
|
||||||
|
one
|
||||||
|
two
|
||||||
|
${c}one
|
||||||
|
two
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
typeText("12", "?", "one") // No enter
|
||||||
|
assertSearchHighlights("one",
|
||||||
|
"""
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
‷one‴
|
||||||
|
two
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
assertPosition(4, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test backwards incsearch highlights with large count and nowrapscan`() {
|
||||||
|
configureByText(
|
||||||
|
"""
|
||||||
|
one
|
||||||
|
two
|
||||||
|
one
|
||||||
|
two
|
||||||
|
one
|
||||||
|
two
|
||||||
|
one
|
||||||
|
two
|
||||||
|
${c}one
|
||||||
|
two
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch nowrapscan")
|
||||||
|
typeText("12", "?", "one") // No enter
|
||||||
|
|
||||||
|
// No current match highlight
|
||||||
|
assertSearchHighlights("one",
|
||||||
|
"""
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
«one»
|
||||||
|
two
|
||||||
|
""".trimIndent()
|
||||||
|
)
|
||||||
|
|
||||||
|
// Back to the original location
|
||||||
|
assertPosition(8, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test backwards incsearch highlights with count and operator count`() {
|
||||||
|
configureByText("lorem 1 ipsum lorem 2 ipsum lorem 3 ipsum lorem 4 ipsum lorem 5 ipsum lorem 6 ipsum lorem 7 ipsu${c}m")
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
typeText("2d", "3?ipsum") // No enter
|
||||||
|
assertSearchHighlights("ipsum",
|
||||||
|
"lorem 1 «ipsum» lorem 2 ‷ipsum‴ lorem 3 «ipsum» lorem 4 «ipsum» lorem 5 «ipsum» lorem 6 «ipsum» lorem 7 «ipsum»")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch removes all highlights if no match`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText("/", "and")
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks ‷and‴ lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
typeText("zz")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch does not hide previous search until first character is typed`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
enterSearch("and")
|
||||||
|
typeText("/")
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
typeText("v")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"v",
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and la‷v‴ender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch does not show previous search highlights when text field is deleted`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
enterSearch("and")
|
||||||
|
typeText("/", "grass", "<BS><BS><BS><BS><BS>")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test cancelling incsearch shows previous search highlights`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
enterSearch("and")
|
||||||
|
typeText("/", "grass", "<Esc>")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights only current match with nohlsearch`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set incsearch")
|
||||||
|
|
||||||
|
typeText("/", "and")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks ‷and‴ lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights only current match with nohlsearch (backwards)`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and lave${c}nder and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set incsearch")
|
||||||
|
|
||||||
|
typeText("?", "a")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"a",
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and l‷a‴vender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights all matches with hlsearch enabled`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText("/", "and")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks ‷and‴ lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test cancelling incsearch does not show previous search highlights after nohls command`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
enterSearch("and")
|
||||||
|
enterCommand("nohlsearch")
|
||||||
|
typeText("/", "grass", "<Esc>")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlight with force sensitive case atom`() {
|
||||||
|
configureByText("lorem ipsum Lorem Ipsum lorem ipsum")
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText("/", "\\Clorem")
|
||||||
|
|
||||||
|
assertSearchHighlights("\\Clorem", "«lorem» ipsum Lorem Ipsum ‷lorem‴ ipsum")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch updates selection when started in Visual mode`() {
|
||||||
|
doTest(
|
||||||
|
listOf("ve", "/dolor"),
|
||||||
|
"""
|
||||||
|
|Lorem ipsum dolor sit amet,
|
||||||
|
|consectetur adipiscing elit
|
||||||
|
|Sed in orci mauris.
|
||||||
|
|Cras id tellus in ex imperdiet egestas.
|
||||||
|
""".trimMargin(),
|
||||||
|
"""
|
||||||
|
|${s}Lorem ipsum ${c}${se}dolor sit amet,
|
||||||
|
|consectetur adipiscing elit
|
||||||
|
|Sed in orci mauris.
|
||||||
|
|Cras id tellus in ex imperdiet egestas.
|
||||||
|
""".trimMargin(),
|
||||||
|
Mode.CMD_LINE(Mode.VISUAL(SelectionType.CHARACTER_WISE))
|
||||||
|
) {
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch updates block selection when started in Visual mode`() {
|
||||||
|
doTest(
|
||||||
|
listOf("ll", "<C-V>2j", "/mauris"),
|
||||||
|
"""
|
||||||
|
|Lorem ipsum dolor sit amet,
|
||||||
|
|consectetur adipiscing elit
|
||||||
|
|Sed in orci mauris.
|
||||||
|
|Cras id tellus in ex imperdiet egestas.
|
||||||
|
""".trimMargin(),
|
||||||
|
"""
|
||||||
|
|Lo${s}rem ipsum ${c}d${se}olor sit amet,
|
||||||
|
|co${s}nsectetur ${c}a${se}dipiscing elit
|
||||||
|
|Se${s}d in orci ${c}m${se}auris.
|
||||||
|
|Cras id tellus in ex imperdiet egestas.
|
||||||
|
""".trimMargin(),
|
||||||
|
Mode.CMD_LINE(Mode.VISUAL(SelectionType.BLOCK_WISE))
|
||||||
|
) {
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,224 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2003-2024 The IdeaVim authors
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by an MIT-style
|
||||||
|
* license that can be found in the LICENSE.txt file or at
|
||||||
|
* https://opensource.org/licenses/MIT.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.plugins.ideavim.group.search
|
||||||
|
|
||||||
|
import org.jetbrains.plugins.ideavim.VimTestCase
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
|
class IncsearchVGlobalTest : VimTestCase() {
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights for vglobal command with range`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText(":", "%v/and")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary l‷and‴
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights for vglobal command in whole file with default range`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText(":", "v/and")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary l‷and‴
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch only highlights for vglobal command after valid argument`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
// E.g., don't remove highlights when trying to type :vmap
|
||||||
|
enterSearch("and")
|
||||||
|
typeText(":v")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights for vglobal command only highlights in range`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|${c}hard by the torrent and rush of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText(":", "2,3v/and")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks ‷and‴ lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent and rush of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch for vglobal command starts at beginning of range not caret position`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
|${c}I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
|I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText(":", "2,8v/and")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks ‷and‴ lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
|I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
|I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights for vglobal command clears highlights on backspace`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
typeText(":", "v/and", "<BS><BS><BS>")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test incsearch highlights for vglobal command resets highlights on backspace`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
enterSearch("and") // Moves the caret to "and" on the second line: (1, 10)
|
||||||
|
typeText(":", "v/roc", "<BS><BS><BS>")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
|
||||||
|
// Make sure the caret is reset too
|
||||||
|
assertPosition(1, 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test cancelling incsearch highlights for vglobal command shows previous highlights`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
enterSearch("and") // Moves the caret to "and" on the second line: (1, 10)
|
||||||
|
typeText(":", "v/ass", "<Esc>")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
"and",
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
|
||||||
|
// Make sure the caret is reset too
|
||||||
|
assertPosition(1, 10)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,527 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2003-2024 The IdeaVim authors
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by an MIT-style
|
||||||
|
* license that can be found in the LICENSE.txt file or at
|
||||||
|
* https://opensource.org/licenses/MIT.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.plugins.ideavim.group.search
|
||||||
|
|
||||||
|
import org.jetbrains.plugins.ideavim.VimTestCase
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
class SearchHighlightsTest : VimTestCase() {
|
||||||
|
@Test
|
||||||
|
fun `test highlight search results`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
|
||||||
|
val pattern = "and"
|
||||||
|
enterSearch(pattern)
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
pattern,
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test search removes previous search highlights`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
|
||||||
|
val pattern = "and"
|
||||||
|
enterSearch("mountain")
|
||||||
|
enterSearch(pattern)
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
pattern,
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test no highlights for unmatched search`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
enterSearch("zzzz")
|
||||||
|
assertNoSearchHighlights()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test nohlsearch command removes highlights`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
enterSearch("and")
|
||||||
|
enterCommand("nohlsearch")
|
||||||
|
assertNoSearchHighlights()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test set 'hlsearch' option after nohlsearch command shows highlights`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
|
||||||
|
val pattern = "and"
|
||||||
|
enterSearch(pattern)
|
||||||
|
enterCommand("nohlsearch")
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
pattern,
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test find next after nohlsearch command shows highlights`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
|
||||||
|
val pattern = "and"
|
||||||
|
enterSearch(pattern)
|
||||||
|
enterCommand("nohlsearch")
|
||||||
|
typeText("n")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
pattern,
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test nohlsearch correctly resets incsearch highlights after deleting last occurrence`() {
|
||||||
|
// Crazy edge case bug. With incsearch enabled, search for something with only one occurrence, delete it, call
|
||||||
|
// :nohlsearch, undo and search next - highlights don't work anymore
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch incsearch")
|
||||||
|
|
||||||
|
val pattern = "lavender"
|
||||||
|
enterSearch(pattern)
|
||||||
|
typeText("dd")
|
||||||
|
enterCommand("nohlsearch")
|
||||||
|
typeText("u", "n")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
pattern,
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and «lavender» and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test nohlsearch option hides search highlights`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
enterSearch("and")
|
||||||
|
enterCommand("set nohlsearch")
|
||||||
|
assertNoSearchHighlights()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test setting hlsearch option shows search highlights for last search`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
|
||||||
|
val pattern = "and"
|
||||||
|
enterSearch(pattern)
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
pattern,
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test deleting text moves search highlights`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
|
||||||
|
val pattern = "and"
|
||||||
|
enterSearch(pattern)
|
||||||
|
typeText("b", "dw") // deletes "rocks "
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
pattern,
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test deleting match removes search highlight`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
|
||||||
|
val pattern = "and"
|
||||||
|
enterSearch(pattern)
|
||||||
|
typeText("dw") // deletes first "and " on line 2
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
pattern,
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test deleting part of match removes search highlight`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
|
||||||
|
val pattern = "and"
|
||||||
|
enterSearch(pattern)
|
||||||
|
typeText("xx") // deletes "an" from first "and" on line 2
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
pattern,
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks d lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test deleting part of match keeps highlight if pattern still matches`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
|
||||||
|
val pattern = """\<s\w*d\>""" // Should match "settled" and "sand"
|
||||||
|
enterSearch(pattern)
|
||||||
|
typeText("l", "xxx") // Change "settled" to "sled"
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
pattern,
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was «sled» on some sodden «sand»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test inserting text moves search highlights`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
|
||||||
|
val pattern = "and"
|
||||||
|
enterSearch(pattern)
|
||||||
|
typeText("h", "i", ", trees") // inserts ", trees" before first "and" on line 2
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
pattern,
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks, trees «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test inserting text inside match removes search highlight`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
|
||||||
|
val pattern = "and"
|
||||||
|
enterSearch(pattern)
|
||||||
|
typeText("l", "i", "FOO") // inserts "FOO" inside first "and" - "aFOOnd"
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
pattern,
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks aFOOnd lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test inserting text inside match keeps highlight if pattern still matches`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
|
||||||
|
val pattern = """\<s\w*d\>""" // Should match "settled" and "sand"
|
||||||
|
enterSearch(pattern)
|
||||||
|
typeText("l", "i", "FOO", "<Esc>") // Change "settled" to "sFOOettled"
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
pattern,
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was «sFOOettled» on some sodden «sand»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test inserting text shows highlight if it contains matches`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
|
||||||
|
val pattern = "and"
|
||||||
|
enterSearch(pattern)
|
||||||
|
typeText("o", "and then I saw a cat and a dog", "<Esc>")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
pattern,
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks «and» lavender «and» tufted grass,
|
||||||
|
|«and» then I saw a cat «and» a dog
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test replacing text moves search highlights`() {
|
||||||
|
val pattern = "and"
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
|
||||||
|
enterSearch(pattern)
|
||||||
|
typeText("b", "cw", "boulders", "<Esc>") // Replaces "rocks" with "boulders" on line 2
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
pattern,
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all boulders «and» lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test replacing text inside match removes search highlight`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
|
||||||
|
val pattern = "and"
|
||||||
|
enterSearch(pattern)
|
||||||
|
typeText("l", "cw", "lso", "<Esc>") // replaces "nd" in first "and" with "lso" on line 2
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
pattern,
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks also lavender «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test replacing text shows highlight if it contains matches`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
|
||||||
|
val pattern = "and"
|
||||||
|
enterSearch(pattern)
|
||||||
|
typeText("w", "cw", "trees and boulders", "<Esc>")
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
pattern,
|
||||||
|
"""I found it in a legendary l«and»
|
||||||
|
|all rocks «and» trees «and» boulders «and» tufted grass,
|
||||||
|
|where it was settled on some sodden s«and»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test replacing text inside match keeps highlight if pattern still matches`() {
|
||||||
|
configureByText(
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|${c}all rocks and lavender and tufted grass,
|
||||||
|
|where it was settled on some sodden sand
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
|
||||||
|
val pattern = """\<s\w*d\>""" // Should match "settled" and "sand"
|
||||||
|
enterSearch(pattern)
|
||||||
|
typeText("l", "ctl", "huff", "<Esc>") // Change "settled" to "shuffled"
|
||||||
|
|
||||||
|
assertSearchHighlights(
|
||||||
|
pattern,
|
||||||
|
"""I found it in a legendary land
|
||||||
|
|all rocks and lavender and tufted grass,
|
||||||
|
|where it was «shuffled» on some sodden «sand»
|
||||||
|
|hard by the torrent of a mountain pass.
|
||||||
|
""".trimMargin(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test search highlight with tabs`() {
|
||||||
|
configureByText("\tfoo")
|
||||||
|
enterCommand("set hlsearch")
|
||||||
|
val pattern = "foo"
|
||||||
|
enterSearch(pattern)
|
||||||
|
assertSearchHighlights(pattern, "\t«foo»")
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun assertNoSearchHighlights() {
|
||||||
|
assertEquals(0, fixture.editor.markupModel.allHighlighters.size)
|
||||||
|
}
|
||||||
|
}
|
@ -22,6 +22,7 @@ import com.intellij.openapi.actionSystem.ex.ActionUtil
|
|||||||
import com.intellij.openapi.actionSystem.impl.SimpleDataContext
|
import com.intellij.openapi.actionSystem.impl.SimpleDataContext
|
||||||
import com.intellij.openapi.application.PathManager
|
import com.intellij.openapi.application.PathManager
|
||||||
import com.intellij.openapi.application.WriteAction
|
import com.intellij.openapi.application.WriteAction
|
||||||
|
import com.intellij.openapi.diagnostic.thisLogger
|
||||||
import com.intellij.openapi.editor.CaretVisualAttributes
|
import com.intellij.openapi.editor.CaretVisualAttributes
|
||||||
import com.intellij.openapi.editor.Editor
|
import com.intellij.openapi.editor.Editor
|
||||||
import com.intellij.openapi.editor.EditorSettings
|
import com.intellij.openapi.editor.EditorSettings
|
||||||
@ -29,9 +30,11 @@ import com.intellij.openapi.editor.Inlay
|
|||||||
import com.intellij.openapi.editor.LogicalPosition
|
import com.intellij.openapi.editor.LogicalPosition
|
||||||
import com.intellij.openapi.editor.VisualPosition
|
import com.intellij.openapi.editor.VisualPosition
|
||||||
import com.intellij.openapi.editor.colors.EditorColors
|
import com.intellij.openapi.editor.colors.EditorColors
|
||||||
|
import com.intellij.openapi.editor.colors.EditorColorsManager
|
||||||
import com.intellij.openapi.editor.ex.EditorEx
|
import com.intellij.openapi.editor.ex.EditorEx
|
||||||
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable
|
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable
|
||||||
import com.intellij.openapi.editor.ex.util.EditorUtil
|
import com.intellij.openapi.editor.ex.util.EditorUtil
|
||||||
|
import com.intellij.openapi.editor.markup.EffectType
|
||||||
import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx
|
import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx
|
||||||
import com.intellij.openapi.fileTypes.FileType
|
import com.intellij.openapi.fileTypes.FileType
|
||||||
import com.intellij.openapi.fileTypes.PlainTextFileType
|
import com.intellij.openapi.fileTypes.PlainTextFileType
|
||||||
@ -769,6 +772,76 @@ abstract class VimNoWriteActionTestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("DEPRECATION", "SameParameterValue")
|
||||||
|
protected fun assertSearchHighlights(tooltip: String, expected: String) {
|
||||||
|
val allHighlighters = fixture.editor.markupModel.allHighlighters
|
||||||
|
|
||||||
|
thisLogger().debug("Current text: ${fixture.editor.document.text}")
|
||||||
|
val actual = StringBuilder(fixture.editor.document.text)
|
||||||
|
val inserts = mutableMapOf<Int, String>()
|
||||||
|
|
||||||
|
// Digraphs:
|
||||||
|
// <C-K>3" → ‷ + <C-K>3' → ‴ (current match)
|
||||||
|
// <C-K><< → « + <C-K>>> → » (normal match)
|
||||||
|
allHighlighters.forEach {
|
||||||
|
// TODO: This is not the nicest way to check for current match. Add something to the highlight's user data?
|
||||||
|
if (it.textAttributes?.effectType == EffectType.ROUNDED_BOX) {
|
||||||
|
inserts.compute(it.startOffset) { _, v -> if (v == null) "‷" else "$v‷" }
|
||||||
|
inserts.compute(it.endOffset) { _, v -> if (v == null) "‴" else "$v‴" }
|
||||||
|
} else {
|
||||||
|
inserts.compute(it.startOffset) { _, v -> if (v == null) "«" else "$v«" }
|
||||||
|
inserts.compute(it.endOffset) { _, v -> if (v == null) "»" else "$v»" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var offset = 0
|
||||||
|
inserts.toSortedMap().forEach { (k, v) ->
|
||||||
|
actual.insert(k + offset, v)
|
||||||
|
offset += v.length
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals(expected, actual.toString())
|
||||||
|
|
||||||
|
// Assert all highlighters have the correct tooltip and text attributes
|
||||||
|
val editorColorsScheme = EditorColorsManager.getInstance().globalScheme
|
||||||
|
val attributes = editorColorsScheme.getAttributes(EditorColors.TEXT_SEARCH_RESULT_ATTRIBUTES)
|
||||||
|
val caretColour = editorColorsScheme.getColor(EditorColors.CARET_COLOR)
|
||||||
|
allHighlighters.forEach {
|
||||||
|
val offsets = "(${it.startOffset}, ${it.endOffset})"
|
||||||
|
assertEquals(tooltip, it.errorStripeTooltip, "Incorrect tooltip for highlighter at $offsets")
|
||||||
|
assertEquals(
|
||||||
|
attributes.backgroundColor,
|
||||||
|
it.textAttributes?.backgroundColor,
|
||||||
|
"Incorrect background colour for highlighter at $offsets",
|
||||||
|
)
|
||||||
|
assertEquals(
|
||||||
|
attributes.foregroundColor,
|
||||||
|
it.textAttributes?.foregroundColor,
|
||||||
|
"Incorrect foreground colour for highlighter at $offsets",
|
||||||
|
)
|
||||||
|
// TODO: Find a better way to identify the current match
|
||||||
|
if (it.textAttributes?.effectType == EffectType.ROUNDED_BOX) {
|
||||||
|
assertEquals(
|
||||||
|
EffectType.ROUNDED_BOX,
|
||||||
|
it.textAttributes?.effectType,
|
||||||
|
"Incorrect effect type for highlighter at $offsets",
|
||||||
|
)
|
||||||
|
assertEquals(caretColour, it.textAttributes?.effectColor, "Incorrect effect colour for highlighter at $offsets")
|
||||||
|
} else {
|
||||||
|
assertEquals(
|
||||||
|
attributes.effectType,
|
||||||
|
it.textAttributes?.effectType,
|
||||||
|
"Incorrect effect type for highlighter at $offsets",
|
||||||
|
)
|
||||||
|
assertEquals(
|
||||||
|
attributes.effectColor,
|
||||||
|
it.textAttributes?.effectColor,
|
||||||
|
"Incorrect effect colour for highlighter at $offsets",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@JvmOverloads
|
@JvmOverloads
|
||||||
fun doTest(
|
fun doTest(
|
||||||
keys: List<String>,
|
keys: List<String>,
|
||||||
|
Loading…
Reference in New Issue
Block a user