1
0
mirror of https://github.com/chylex/IntelliJ-IdeaVim.git synced 2025-05-01 16:34:03 +02:00

Add tests for existing word/WORD text objects

This commit is contained in:
Matt Ellis 2025-01-05 20:54:41 +00:00 committed by Alex Pláte
parent 580764b30c
commit 2da77f0f11
4 changed files with 2433 additions and 0 deletions

View File

@ -9,10 +9,630 @@
package org.jetbrains.plugins.ideavim.action.motion.`object`
import com.maddyhome.idea.vim.state.mode.Mode
import com.maddyhome.idea.vim.state.mode.SelectionType
import org.jetbrains.plugins.ideavim.VimBehaviorDiffers
import org.jetbrains.plugins.ideavim.VimTestCase
import org.junit.jupiter.api.Test
@Suppress("RemoveCurlyBracesFromTemplate", "SpellCheckingInspection")
class MotionInnerBigWordActionTest : VimTestCase() {
@Test
fun `test select WORD from beginning of word`() {
doTest(
"viW",
"${c}Lorem ipsum dolor sit amet, consectetur adipiscing elit",
"${s}Lore${c}m${se} ipsum dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select WORD from middle of word`() {
doTest(
"viW",
"Lo${c}rem ipsum dolor sit amet, consectetur adipiscing elit",
"${s}Lore${c}m${se} ipsum dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select WORD from end of word`() {
doTest(
"viW",
"Lore${c}m ipsum dolor sit amet, consectetur adipiscing elit",
"${s}Lore${c}m${se} ipsum dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select WORD from inside whitespace selects whitespace`() {
doTest(
"viW",
"Lorem ${c} ...ipsum dolor sit amet, consectetur adipiscing elit",
"Lorem${s} ${c} ${se}...ipsum dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select WORD from whitespace at start of line`() {
doTest(
"viW",
" ${c} ...Lorem ipsum",
"${s} ${c} ${se}...Lorem ipsum",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select WORD from whitespace at end of line`() {
doTest(
"viW",
"Lorem ipsum... ${c} ",
"Lorem ipsum...${s} ${c} ${se}",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select WORD ignores punctuation`() {
doTest(
"viW",
"Lorem ipsum dolor sit a${c}met,consectetur adipiscing elit",
"Lorem ipsum dolor sit ${s}amet,consectetu${c}r${se} adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select WORD with existing left-to-right selection selects rest of word`() {
doTest(
listOf("v", "l", "iW"),
"Lorem ipsum dolor sit amet, con${c}sectetur adipiscing elit",
"Lorem ipsum dolor sit amet, con${s}sectetu${c}r${se} adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select WORD with existing left-to-right selection in whitespace selects rest of whitespace`() {
doTest(
listOf("v", "l", "iW"),
"Lorem ${c} ipsum dolor sit amet",
"Lorem ${s} ${c} ${se}ipsum dolor sit amet",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter = "Lorem ipsum dolor sit amet, ${s}${c}consectet${se}ur adipiscing elit")
@Test
fun `test select WORD with existing right-to-left selection selects start of word`() {
doTest(
listOf("v", "h", "iW"),
"Lorem ipsum dolor sit amet, consecte${c}tur adipiscing elit",
"Lorem ipsum dolor sit amet,${s}${c} consectet${se}ur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select WORD with existing right-to-left selection in whitespace selects rest of whitespace`() {
doTest(
listOf("v", "h", "iW"),
"Lorem ${c} ipsum dolor sit amet",
"Lorem${s}${c} ${se} ipsum dolor sit amet",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@VimBehaviorDiffers(
originalVimAfter = "${s}Lorem${c}${se} ipsum dolor sit amet, consectetur adipiscing elit",
description = "Text objects are implicitly inclusive, because they set the selection." +
"Vim modifies the caret offset of inclusive motions when in exclusive selection mode. " +
"Fix this when IdeaVim also handles inclusive motions in exclusive selection mode."
)
@Test
fun `test select WORD with exclusive selection`() {
doTest(
"viW",
"Lo${c}rem ipsum dolor sit amet, consectetur adipiscing elit",
"${s}Lore${c}${se}m ipsum dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
) {
enterCommand("set selection=exclusive")
}
}
@Test
fun `test repeated text object expands selection to following whitespace`() {
doTest(
listOf("viW", "iW"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|con${c}sectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|${s}consectetur${c} ${se}adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test repeated text object expands selection to WORD following whitespace`() {
doTest(
listOf("viW", "iW", "iW"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|con${c}sectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|${s}consectetur adipiscin${c}g${se} elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test text object with count expands selection`() {
doTest(
"v3iW",
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|con${c}sectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|${s}consectetur adipiscin${c}g${se} elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test repeated text object does not expand selection from single character selection`() {
// Surprisingly, this is correct Vim behaviour! It does not expand selection from a single character selection
doTest(
listOf("viW", "iW"),
"""
|Lorem Ipsum
|
|Lore ${c}m ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lore ${s}${c}m${se} ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test repeated text object does not expand selection from current single whitespace`() {
// Surprisingly, this is correct Vim behaviour! It does not expand selection from a single whitespace selection
doTest(
listOf("viW", "iW"),
"""
|Lorem Ipsum
|
|Lorem${c} ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem${s}${c} ${se}ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test text object with count will expand selection from current single whitespace`() {
// `viwiw` on a single character doesn't expand selection, but `v2iw` does. Go figure
doTest(
listOf("v3iW"),
"""
|Lorem Ipsum
|
|Lore ${c}m ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lore ${s}m ipsu${c}m${se} dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test repeated text object expands selection to end of line`() {
doTest(
listOf("v2iW", "iW"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adi${c}piscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur ${s}adipiscing eli${c}t${se}
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur ${s}adipiscing elit.......${c}.${se}
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""",
description = "Caret placement is incorrect, but the selection is correct - it should not select the final newline char"
)
@Test
fun `test repeated text object expands selection to whitespace at end of line`() {
doTest(
listOf("v3iW", "iW"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adi${c}piscing elit........
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur ${s}adipiscing elit........${c}${se}
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing ${s}elit
|Se${c}d${se} in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""",
description = "IdeaVim expands to include newline character"
)
@Test
fun `test repeated text object expands across new line`() {
doTest(
listOf("viW", "iW", "iW"), // TODO: This should be just listOf("viW", "iW")
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing e${c}lit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing ${s}elit
|Se${c}d${se} in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test repeated text object expands to whitespace following new line`() {
doTest(
listOf("viW", "iW"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing e${c}lit
| Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing ${s}elit
| ${c} ${se}Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem ${s}Ipsum
|
|${c}L${se}orem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""",
description = "Vim's behaviour is weird. Makes no sense that it selects the first character of the word. " +
"Possibly a bug in Vim: https://github.com/vim/vim/issues/16514 " +
"Unclear what the correct behaviour should be",
shouldBeFixed = false
)
@Test
fun `test repeated text object expands to empty line`() {
doTest(
listOf("viW", "iW"),
"""
|Lorem Ip${c}sum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ${s}Ipsum
|${c}${se}
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem ${s}Ipsum
|
|${c}
|${se}Lorem ipsum dolor sit amet,
""",
description = "Off by one because IdeaVim does not allow selecting a newline char"
)
@Test
fun `test repeated text object expands to multiple empty lines`() {
doTest(
listOf("viW", "iW"),
"""
|Lorem Ip${c}sum
|
|
|Lorem ipsum dolor sit amet,
""".trimMargin(),
"""
|Lorem ${s}Ipsum
|
|${c}${se}
|Lorem ipsum dolor sit amet,
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem ${s}Ipsum
|.......${c}.${se}
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""",
description = "Caret placement is incorrect, but selection is correct. It should not select trailing new line char"
)
@Test
fun `test repeated text object expands to whitespace on following blank line`() {
doTest(
listOf("viW", "iW"),
"""
|Lorem Ip${c}sum
|........
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
"""
|Lorem ${s}Ipsum
|........${c}${se}
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem ${s}Ipsum
|
|${c}.${se}.......
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""",
description = "Vim's behaviour is weird. Makes no sense that it selects the first character of the word. " +
"Possibly a bug in Vim: https://github.com/vim/vim/issues/16514 " +
"Unclear what the correct behaviour should be",
shouldBeFixed = false
)
@Test
fun `test repeated text object expands to whitespace on following blank lines`() {
doTest(
listOf("viW", "iW"),
"""
|Lorem Ip${c}sum
|
|........
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
"""
|Lorem ${s}Ipsum
|
|........
|${c}${se}
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test repeated text object expands to include whitespace after non-word character`() {
doTest(
listOf("viW", "iW"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit a${c}met, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit ${s}amet,${c} ${se}consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select multiple WORDs selects includes whitespace between words in count`() {
doTest(
"v2iW",
"...Lo${c}rem... ipsum dolor sit amet, consectetur adipiscing elit",
"${s}...Lorem...${c} ${se}ipsum dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select multiple WORDs selects includes whitespace between words in count 2`() {
doTest(
"v3iW",
"...L${c}orem... ipsum... dolor sit amet, consectetur adipiscing elit",
"${s}...Lorem... ipsum..${c}.${se} dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select multiple WORDs starting in whitespace`() {
doTest(
"v3iW",
"Lorem ${c} ...ipsum... dolor sit amet, consectetur adipiscing elit",
"Lorem${s} ...ipsum...${c} ${se}dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing ${s}elit
|Sed${c} ${se}in orci mauris. Cras id tellus in ex imperdiet egestas.
""",
description = "Unclear why this fails. IdeaVim seems to treat the new line char as a word"
)
@Test
fun `test select multiple words wraps to next line`() {
doTest(
"v3iw",
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing e${c}lit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing ${s}elit
|Se${c}d${se} in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test at last dot`() {
doTest(

View File

@ -10,10 +10,649 @@ package org.jetbrains.plugins.ideavim.action.motion.`object`
import com.maddyhome.idea.vim.state.mode.Mode
import com.maddyhome.idea.vim.state.mode.SelectionType
import org.jetbrains.plugins.ideavim.VimBehaviorDiffers
import org.jetbrains.plugins.ideavim.VimTestCase
import org.junit.jupiter.api.Test
@Suppress("SpellCheckingInspection", "RemoveCurlyBracesFromTemplate")
class MotionInnerWordActionTest : VimTestCase() {
@Test
fun `test select word from beginning of word`() {
doTest(
"viw",
"${c}Lorem ipsum dolor sit amet, consectetur adipiscing elit",
"${s}Lore${c}m${se} ipsum dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select word from middle of word`() {
doTest(
"viw",
"Lo${c}rem ipsum dolor sit amet, consectetur adipiscing elit",
"${s}Lore${c}m${se} ipsum dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select word from end of word`() {
doTest(
"viw",
"Lore${c}m ipsum dolor sit amet, consectetur adipiscing elit",
"${s}Lore${c}m${se} ipsum dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select word from inside whitespace selects whitespace`() {
doTest(
"viw",
"Lorem ${c} ipsum dolor sit amet, consectetur adipiscing elit",
"Lorem${s} ${c} ${se}ipsum dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select word from whitespace at start of line`() {
doTest(
"viw",
" ${c} Lorem ipsum",
"${s} ${c} ${se}Lorem ipsum",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select word from whitespace at end of line`() {
doTest(
"viw",
"Lorem ipsum ${c} ",
"Lorem ipsum${s} ${c} ${se}",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select word selects up to punctuation`() {
doTest(
"viw",
"Lorem ipsum dolor sit a${c}met, consectetur adipiscing elit",
"Lorem ipsum dolor sit ${s}ame${c}t${se}, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select word with existing left-to-right selection selects rest of word`() {
doTest(
listOf("v", "l", "iw"),
"Lorem ipsum dolor sit amet, con${c}sectetur adipiscing elit",
"Lorem ipsum dolor sit amet, con${s}sectetu${c}r${se} adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select word with existing left-to-right selection in whitespace selects rest of whitespace`() {
doTest(
listOf("v", "l", "iw"),
"Lorem ${c} ipsum dolor sit amet",
"Lorem ${s} ${c} ${se}ipsum dolor sit amet",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter = "Lorem ipsum dolor sit amet, ${s}${c}consectet${se}ur adipiscing elit")
@Test
fun `test select word with existing right-to-left selection selects start of word`() {
doTest(
listOf("v", "h", "iw"),
"Lorem ipsum dolor sit amet, consecte${c}tur adipiscing elit",
"Lorem ipsum dolor sit amet,${s}${c} consectet${se}ur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select word with existing right-to-left selection in whitespace selects rest of whitespace`() {
doTest(
listOf("v", "h", "iw"),
"Lorem ${c} ipsum dolor sit amet",
"Lorem${s}${c} ${se} ipsum dolor sit amet",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@VimBehaviorDiffers(
originalVimAfter = "${s}Lorem${c}${se} ipsum dolor sit amet, consectetur adipiscing elit",
description = "Text objects are implicitly inclusive, because they set the selection." +
"Vim modifies the caret offset of inclusive motions when in exclusive selection mode. " +
"Fix this when IdeaVim also handles inclusive motions in exclusive selection mode."
)
@Test
fun `test select word with exclusive selection`() {
doTest(
"viw",
"Lo${c}rem ipsum dolor sit amet, consectetur adipiscing elit",
"${s}Lore${c}${se}m ipsum dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
) {
enterCommand("set selection=exclusive")
}
}
@Test
fun `test repeated text object expands selection to following whitespace`() {
doTest(
listOf("viw", "iw"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|con${c}sectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|${s}consectetur${c} ${se}adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test repeated text object expands selection to word following whitespace`() {
doTest(
listOf("viw", "iw", "iw"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|con${c}sectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|${s}consectetur adipiscin${c}g${se} elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test text object with count expands selection`() {
doTest(
"v3iw",
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|con${c}sectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|${s}consectetur adipiscin${c}g${se} elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test repeated text object does not expand selection from single character selection`() {
// Surprisingly, this is correct Vim behaviour! It does not expand selection from a single character selection
doTest(
listOf("viw", "iw"),
"""
|Lorem Ipsum
|
|Lore ${c}m ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lore ${s}${c}m${se} ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test repeated text object does not expand selection from current single whitespace`() {
// Surprisingly, this is correct Vim behaviour! It does not expand selection from a single whitespace selection
doTest(
listOf("viw", "iw"),
"""
|Lorem Ipsum
|
|Lorem${c} ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem${s}${c} ${se}ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test text object with count will expand selection from current single whitespace`() {
// `viwiw` on a single character doesn't expand selection, but `v2iw` does. Go figure
doTest(
listOf("v3iw"),
"""
|Lorem Ipsum
|
|Lore ${c}m ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lore ${s}m ipsu${c}m${se} dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test repeated text object expands selection to end of line`() {
doTest(
listOf("v2iw", "iw"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adi${c}piscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur ${s}adipiscing eli${c}t${se}
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur ${s}adipiscing elit.......${c}.${se}
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""",
description = "Caret placement is incorrect, but the selection is correct - it should not select the final newline char"
)
@Test
fun `test repeated text object expands selection to whitespace at end of line`() {
doTest(
listOf("v3iw", "iw"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adi${c}piscing elit........
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur ${s}adipiscing elit........${c}${se}
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing ${s}elit
|Se${c}d${se} in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""",
description = "IdeaVim expands to include newline character"
)
@Test
fun `test repeated text object expands across new line`() {
doTest(
listOf("viw", "iw", "iw"), // TODO: This should be just listOf("viw", "iw")
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing e${c}lit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing ${s}elit
|Se${c}d${se} in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test repeated text object expands to whitespace following new line`() {
doTest(
listOf("viw", "iw"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing e${c}lit
| Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing ${s}elit
| ${c} ${se}Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem ${s}Ipsum
|
|${c}L${se}orem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""",
description = "Vim's behaviour is weird. Makes no sense that it selects the first character of the word. " +
"Possibly a bug in Vim: https://github.com/vim/vim/issues/16514 " +
"Unclear what the correct behaviour should be",
shouldBeFixed = false
)
@Test
fun `test repeated text object expands to empty line`() {
doTest(
listOf("viw", "iw"),
"""
|Lorem Ip${c}sum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ${s}Ipsum
|${c}${se}
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem ${s}Ipsum
|
|${c}
|${se}Lorem ipsum dolor sit amet,
""",
description = "Off by one because IdeaVim does not allow selecting a newline char"
)
@Test
fun `test repeated text object expands to multiple empty lines`() {
doTest(
listOf("viw", "iw"),
"""
|Lorem Ip${c}sum
|
|
|Lorem ipsum dolor sit amet,
""".trimMargin(),
"""
|Lorem ${s}Ipsum
|
|${c}${se}
|Lorem ipsum dolor sit amet,
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem ${s}Ipsum
|.......${c}.${se}
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""",
description = "Caret placement is incorrect, but selection is correct. It should not select trailing new line char"
)
@Test
fun `test repeated text object expands to whitespace on following blank line`() {
doTest(
listOf("viw", "iw"),
"""
|Lorem Ip${c}sum
|........
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
"""
|Lorem ${s}Ipsum
|........${c}${se}
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem ${s}Ipsum
|
|${c}.${se}.......
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""",
description = "Vim's behaviour is weird. Makes no sense that it selects the first character of the word. " +
"Possibly a bug in Vim: https://github.com/vim/vim/issues/16514 " +
"Unclear what the correct behaviour should be",
shouldBeFixed = false
)
@Test
fun `test repeated text object expands to whitespace on following blank lines`() {
doTest(
listOf("viw", "iw"),
"""
|Lorem Ip${c}sum
|
|........
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
"""
|Lorem ${s}Ipsum
|
|........
|${c}${se}
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test repeated text object expands to include non-word character`() {
doTest(
listOf("viw", "iw"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit a${c}met, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit ${s}amet${c},${se} consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test repeated text object expands to include whitespace after non-word character`() {
doTest(
listOf("viw", "iw", "iw"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit a${c}met, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit ${s}amet,${c} ${se}consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select multiple words selects includes whitespace between words in count`() {
doTest(
"v2iw",
"${c}Lorem ipsum dolor sit amet, consectetur adipiscing elit",
"${s}Lorem${c} ${se}ipsum dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select multiple words selects includes whitespace between words in count 2`() {
doTest(
"v3iw",
"${c}Lorem ipsum dolor sit amet, consectetur adipiscing elit",
"${s}Lorem ipsu${c}m${se} dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select multiple words starting in whitespace`() {
doTest(
"v3iw",
"Lorem ${c} ipsum dolor sit amet, consectetur adipiscing elit",
"Lorem${s} ipsum${c} ${se}dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing ${s}elit
|Sed${c} ${se}in orci mauris. Cras id tellus in ex imperdiet egestas.
""",
description = "Unclear why this fails. IdeaVim seems to treat the new line char as a word"
)
@Test
fun `test select multiple words wraps to next line`() {
doTest(
"v3iw",
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing e${c}lit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing ${s}elit
|Se${c}d${se} in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test empty text`() {
doTest(

View File

@ -12,10 +12,575 @@ 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.VimBehaviorDiffers
import org.jetbrains.plugins.ideavim.VimTestCase
import org.junit.jupiter.api.Test
@Suppress("RemoveCurlyBracesFromTemplate", "SpellCheckingInspection")
class MotionOuterBigWordActionTest : VimTestCase() {
@Test
fun `test select outer WORD selects word and following whitespace`() {
doTest(
"vaW",
"Lorem ip${c}sum dolor sit amet, consectetur adipiscing elit",
"Lorem ${s}ipsum${c} ${se}dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select outer WORD from beginning of word`() {
doTest(
"vaW",
"Lorem ${c}ipsum dolor sit amet, consectetur adipiscing elit",
"Lorem ${s}ipsum${c} ${se}dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select outer WORD from end of word`() {
doTest(
"vaW",
"Lorem ipsu${c}m dolor sit amet, consectetur adipiscing elit",
"Lorem ${s}ipsum${c} ${se}dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select outer WORD from inside whitespace selects word and not following whitespace`() {
doTest(
"vaW",
"Lorem ${c} ipsum dolor sit amet, consectetur adipiscing elit",
"Lorem${s} ipsu${c}m${se} dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@VimBehaviorDiffers(
originalVimAfter = "Lorem ${s}ipsum ${c}${se}dolor sit amet, consectetur adipiscing elit",
description = "Text objects are implicitly inclusive. Vim adjusts the caret location for inclusive motions"
)
@Test
fun `test select outer WORD with exclusive selection`() {
doTest(
"vaW",
"Lorem ipsu${c}m dolor sit amet, consectetur adipiscing elit",
"Lorem ${s}ipsum${c} ${se}dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test repeated text object expands selection to whitespace after next WORD`() {
doTest(
listOf("vaW", "aW"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|con${c}sectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|${s}consectetur adipiscing${c} ${se}elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test repeated text object starting from whitespace expands selection`() {
doTest(
listOf("vaW", "aW"),
"""
|Lorem Ipsum
|
|Lorem${c} ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem${s} ipsum dolo${c}r${se} sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test text object with count expands selection`() {
doTest(
"v2aW",
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|con${c}sectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|${s}consectetur adipiscing${c} ${se}elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test repeated text object expands selection to end of line`() {
doTest(
listOf("v2aW", "aW"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|con${c}sectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|${s}consectetur adipiscing eli${c}t${se}
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|${s}consectetur adipiscing elit.......${c}.${se}
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
"""
)
@Test
fun `test repeated text object expands selection to whitespace at end of line`() {
doTest(
listOf("v2aW", "aW"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|con${c}sectetur adipiscing elit........
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|${s}consectetur adipiscing eli${c}t${se}........
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing${s} elit
|Sed${c} ${se}in orci mauris.
|Cras id tellus in ex imperdiet egestas.
"""
)
@Test
fun `test repeated text object expands across new line`() {
doTest(
listOf("vaW", "aW"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing el${c}it
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing ${s}elit
|Se${c}d${se} in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing${s} elit
| Se${c}d${se} in orci mauris.
|Cras id tellus in ex imperdiet egestas.
"""
)
@Test
fun `test repeated text object expands over whitespace following new line`() {
doTest(
listOf("vaW", "aW"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing el${c}it
| Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing ${s}elit
| Se${c}d${se} in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem${s} Ipsum
|
|Lore${c}m${se} ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
"""
)
@Test
fun `test repeated text object expands to empty line`() {
doTest(
listOf("vaW", "aW"),
"""
|Lorem Ip${c}sum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ${s}Ipsum
|
|Lore${c}m${se} ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem${s} Ipsum
|
|${c}${se}
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
"""
)
@Test
fun `test repeated text object expands to multiple empty lines`() {
doTest(
listOf("vaW", "aW"),
"""
|Lorem Ip${c}sum
|
|
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ${s}Ipsum
|
|
|
|Lore${c}m${se} ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem${s} Ipsum
|........
|Lore${c}m${se} ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
"""
)
@Test
fun `test repeated text object expands to cover whitespace on following blank line`() {
doTest(
listOf("vaW", "aW"),
"""
|Lorem Ip${c}sum
|........
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
"""
|Lorem ${s}Ipsum
|........
|Lore${c}m${se} ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem${s} Ipsum
|
|........
|${c}
|${se}Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
"""
)
@Test
fun `test repeated text object expands to cover whitespace on following blank lines`() {
doTest(
listOf("vaW", "aW"),
"""
|Lorem Ip${c}sum
|
|........
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
"""
|Lorem ${s}Ipsum
|
|........
|
|Lore${c}m${se} ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test repeated text object expands over non-word character`() {
doTest(
listOf("vaW", "aW"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit a${c}met, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit ${s}amet, consectetur${c} ${se}adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select outer WORD selects following whitespace up to punctuation`() {
doTest(
"vaW",
"Lorem ipsu${c}m ...dolor sit amet, consectetur adipiscing elit",
"Lorem ${s}ipsum ${c} ${se}...dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select outer WORD with following non-word characters selects following WORD characters`() {
doTest(
"vaW",
"Lorem ipsum dolor sit a${c}met, consectetur adipiscing elit",
"Lorem ipsum dolor sit ${s}amet,${c} ${se}consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing${s} eli${c}t${se}
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
"""
)
@Test
fun `test select outer WORD at end of line selects preceding whitespace`() {
doTest(
"vaW",
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing e${c}lit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing ${s}eli${c}t${se}
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select outer WORD with existing left-to-right selection selects rest of word and following whitespace`() {
doTest(
listOf("v", "l", "aW"),
"Lo${c}rem ipsum",
"Lo${s}rem ${c} ${se}ipsum",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select outer WORD with existing left-to-right selection in whitespace selects rest of whitespace and following word`() {
doTest(
listOf("v", "l", "aW"),
"Lorem ${c} ipsum dolor sit amet",
"Lorem ${s} ipsu${c}m${se} dolor sit amet",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select outer WORD with existing right-to-left selection selects rest of word and preceding whitespace`() {
doTest(
listOf("v", "h", "aW"),
"Lorem ip${c}sum dolor sit amet",
"Lorem${s}${c} ips${se}um dolor sit amet",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select outer WORD with existing right-to-left selection in whitespace selects rest of whitespace and preceding word`() {
doTest(
listOf("v", "h", "aW"),
"Lorem ipsum ${c} dolor sit amet",
"Lorem ${s}${c}ipsum ${se} dolor sit amet",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select multiple outer WORDs selects following whitespace`() {
doTest(
"v2aW",
"Lorem ipsu${c}m dolor sit amet, consectetur adipiscing elit",
"Lorem ${s}ipsum dolor${c} ${se}sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select multiple outer WORDs with non-word characters`() {
doTest(
"v2aW",
"Lorem ipsu${c}m -- dolor sit amet, consectetur adipiscing elit",
"Lorem ${s}ipsum --${c} ${se}dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select multiple outer WORDs with non-word characters 2`() {
doTest(
"v2aW",
"Lorem ipsu${c}m --dolor sit amet, consectetur adipiscing elit",
"Lorem ${s}ipsum --dolor${c} ${se}sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select multiple outer words starting in whitespace`() {
doTest(
"v3aW",
"Lorem ${c} ipsum --dolor sit amet, consectetur adipiscing elit",
"Lorem${s} ipsum --dolor si${c}t${se} amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select multiple outer WORDs crosses end of line`() {
doTest(
"v2aW",
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing e${c}lit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing ${s}elit
|Sed${c} ${se}in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@TestWithoutNeovim(SkipNeovimReason.UNCLEAR, description = "Wrong caret position, but in real neovim works fine")
@Test
fun `test on last dot`() {

View File

@ -0,0 +1,609 @@
/*
* Copyright 2003-2025 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.action.motion.`object`
import com.maddyhome.idea.vim.state.mode.Mode
import com.maddyhome.idea.vim.state.mode.SelectionType
import org.jetbrains.plugins.ideavim.VimBehaviorDiffers
import org.jetbrains.plugins.ideavim.VimTestCase
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.Test
@Suppress("SpellCheckingInspection", "RemoveCurlyBracesFromTemplate")
class MotionOuterWordActionTest : VimTestCase() {
@Test
fun `test select outer word selects word and following whitespace`() {
doTest(
"vaw",
"Lorem ip${c}sum dolor sit amet, consectetur adipiscing elit",
"Lorem ${s}ipsum${c} ${se}dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select outer word from beginning of word`() {
doTest(
"vaw",
"Lorem ${c}ipsum dolor sit amet, consectetur adipiscing elit",
"Lorem ${s}ipsum${c} ${se}dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select outer word from end of word`() {
doTest(
"vaw",
"Lorem ipsu${c}m dolor sit amet, consectetur adipiscing elit",
"Lorem ${s}ipsum${c} ${se}dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select outer word from inside whitespace selects word and not following whitespace`() {
doTest(
"vaw",
"Lorem ${c} ipsum dolor sit amet, consectetur adipiscing elit",
"Lorem${s} ipsu${c}m${se} dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@VimBehaviorDiffers(
originalVimAfter = "Lorem ${s}ipsum ${c}${se}dolor sit amet, consectetur adipiscing elit",
description = "Text objects are implicitly inclusive. Vim adjusts the caret location for inclusive motions"
)
@Test
fun `test select outer word with exclusive selection`() {
doTest(
"vaw",
"Lorem ipsu${c}m dolor sit amet, consectetur adipiscing elit",
"Lorem ${s}ipsum${c} ${se}dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test repeated text object expands selection to whitespace after next word`() {
doTest(
listOf("vaw", "aw"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|con${c}sectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|${s}consectetur adipiscing${c} ${se}elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test repeated text object starting from whitespace expands selection`() {
doTest(
listOf("vaw", "aw"),
"""
|Lorem Ipsum
|
|Lorem${c} ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem${s} ipsum dolo${c}r${se} sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test text object with count expands selection`() {
doTest(
"v2aw",
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|con${c}sectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|${s}consectetur adipiscing${c} ${se}elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test repeated text object expands selection to end of line`() {
doTest(
listOf("v2aw", "aw"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|con${c}sectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|${s}consectetur adipiscing eli${c}t${se}
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|${s}consectetur adipiscing elit.......${c}.${se}
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
"""
)
@Test
fun `test repeated text object expands selection to whitespace at end of line`() {
doTest(
listOf("v2aw", "aw"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|con${c}sectetur adipiscing elit........
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|${s}consectetur adipiscing eli${c}t${se}........
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing${s} elit
|Sed${c} ${se}in orci mauris.
|Cras id tellus in ex imperdiet egestas.
"""
)
@Test
fun `test repeated text object expands across new line`() {
doTest(
listOf("vaw", "aw"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing el${c}it
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing ${s}elit
|Se${c}d${se} in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing${s} elit
| Se${c}d${se} in orci mauris.
|Cras id tellus in ex imperdiet egestas.
"""
)
@Test
fun `test repeated text object expands over whitespace following new line`() {
doTest(
listOf("vaw", "aw"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing el${c}it
| Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing ${s}elit
| Se${c}d${se} in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem${s} Ipsum
|
|Lore${c}m${se} ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
"""
)
@Test
fun `test repeated text object expands to empty line`() {
doTest(
listOf("vaw", "aw"),
"""
|Lorem Ip${c}sum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ${s}Ipsum
|
|Lore${c}m${se} ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem${s} Ipsum
|
|${c}${se}
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
"""
)
@Test
fun `test repeated text object expands to multiple empty lines`() {
doTest(
listOf("vaw", "aw"),
"""
|Lorem Ip${c}sum
|
|
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ${s}Ipsum
|
|
|
|Lore${c}m${se} ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem${s} Ipsum
|........
|Lore${c}m${se} ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
"""
)
@Test
fun `test repeated text object expands to cover whitespace on following blank line`() {
doTest(
listOf("vaw", "aw"),
"""
|Lorem Ip${c}sum
|........
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
"""
|Lorem ${s}Ipsum
|........
|Lore${c}m${se} ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem${s} Ipsum
|
|........
|${c}
|${se}Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
"""
)
@Test
fun `test repeated text object expands to cover whitespace on following blank lines`() {
doTest(
listOf("vaw", "aw"),
"""
|Lorem Ip${c}sum
|
|........
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
"""
|Lorem ${s}Ipsum
|
|........
|
|Lore${c}m${se} ipsum dolor sit amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit${s} amet,${c} ${se}consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
"""
)
@Test
fun `test repeated text object expands over non-word character`() {
doTest(
listOf("vaw", "aw"),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit a${c}met, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit${s} amet${c},${se} consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select outer word selects following whitespace up to punctuation`() {
doTest(
"vaw",
"Lorem ipsu${c}m ...dolor sit amet, consectetur adipiscing elit",
"Lorem ${s}ipsum ${c} ${se}...dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select outer word with following non-word characters selects preceding whitespace`() {
doTest(
"vaw",
"Lorem ipsum dolor sit a${c}met, consectetur adipiscing elit",
"Lorem ipsum dolor sit${s} ame${c}t${se}, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter =
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing${s} eli${c}t${se}
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
"""
)
@Test
fun `test select outer word at end of line selects preceding whitespace`() {
doTest(
"vaw",
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing e${c}lit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing ${s}eli${c}t${se}
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select outer word with existing left-to-right selection selects rest of word and following whitespace`() {
doTest(
listOf("v", "l", "aw"),
"Lo${c}rem ipsum",
"Lo${s}rem ${c} ${se}ipsum",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select outer word with existing left-to-right selection in whitespace selects rest of whitespace and following word`() {
doTest(
listOf("v", "l", "aw"),
"Lorem ${c} ipsum dolor sit amet",
"Lorem ${s} ipsu${c}m${se} dolor sit amet",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select outer word with existing right-to-left selection selects rest of word and preceding whitespace`() {
doTest(
listOf("v", "h", "aw"),
"Lorem ip${c}sum dolor sit amet",
"Lorem${s}${c} ips${se}um dolor sit amet",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select outer word with existing right-to-left selection in whitespace selects rest of whitespace and preceding word`() {
doTest(
listOf("v", "h", "aw"),
"Lorem ipsum ${c} dolor sit amet",
"Lorem ${s}${c}ipsum ${se} dolor sit amet",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select multiple outer words selects following whitespace`() {
doTest(
"v2aw",
"Lorem ipsu${c}m dolor sit amet, consectetur adipiscing elit",
"Lorem ${s}ipsum dolor${c} ${se}sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select multiple outer words with non-word characters`() {
doTest(
"v2aw",
"Lorem ipsu${c}m -- dolor sit amet, consectetur adipiscing elit",
"Lorem ${s}ipsum --${c} ${se}dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select multiple outer words with no following whitespace selects preceding whitespace`() {
doTest(
"v2aw",
"Lorem ipsu${c}m --dolor sit amet, consectetur adipiscing elit",
"Lorem${s} ipsum -${c}-${se}dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@VimBehaviorDiffers(originalVimAfter =
"Lorem${s} ipsum --dolor${c} ${se}sit amet, consectetur adipiscing elit",
description = "First aw should select whitespace+'ipsum' " +
"second should select whitespace+'--' " +
"third should select 'dolor' and following whitespace",
)
@Test
fun `test select multiple outer words starting in whitespace`() {
doTest(
"v3aw",
"Lorem ${c} ipsum --dolor sit amet, consectetur adipiscing elit",
"Lorem${s} ipsum --dolo${c}r${se} sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Disabled("Implementation bug")
@Test
fun `test select multiple outer words with no following whitespace selects preceding whitespace 2`() {
// Implementation bug: caret placed anywhere other than last character would not select preceding whitespace
doTest(
"v2aw",
"Lorem ip${c}sum --dolor sit amet, consectetur adipiscing elit",
"Lorem${s} ipsum -${c}-${se}dolor sit amet, consectetur adipiscing elit",
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
@Test
fun `test select multiple outer words crosses end of line`() {
doTest(
"v2aw",
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing e${c}lit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing ${s}elit
|Sed${c} ${se}in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
Mode.VISUAL(SelectionType.CHARACTER_WISE),
)
}
}