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

Add tests for existing word/WORD motion behaviour

This commit is contained in:
Matt Ellis 2025-01-05 00:03:29 +00:00 committed by Alex Pláte
parent fa4c89e134
commit 4bc75e0a9b
8 changed files with 1184 additions and 0 deletions

View File

@ -0,0 +1,135 @@
/*
* 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.text
import org.jetbrains.plugins.ideavim.VimBehaviorDiffers
import org.jetbrains.plugins.ideavim.VimTestCase
import org.junit.jupiter.api.Test
@Suppress("SpellCheckingInspection", "RemoveCurlyBracesFromTemplate")
class MotionBigWordEndLeftActionTest : VimTestCase() {
@Test
fun `test move to previous WORD end`() {
doTest(
"gE",
"Lorem ip${c}sum dolor sit amet, consectetur adipiscing elit",
"Lore${c}m ipsum dolor sit amet, consectetur adipiscing elit",
)
}
@Test
fun `test move to previous WORD end from end of word`() {
doTest(
"gE",
"Lorem ipsu${c}m dolor sit amet, consectetur adipiscing elit",
"Lore${c}m ipsum dolor sit amet, consectetur adipiscing elit",
)
}
@Test
fun `test move to previous WORD end from whitespace`() {
doTest(
"gE",
"Lorem ${c} ipsum dolor sit amet, consectetur adipiscing elit",
"Lore${c}m ipsum dolor sit amet, consectetur adipiscing elit",
)
}
@Test
fun `test move to previous WORD end stops at non-word characters`() {
doTest(
"gE",
"Lorem ipsum dolor sit amet, con${c}sectetur adipiscing elit",
"Lorem ipsum dolor sit amet${c}, consectetur adipiscing elit",
)
}
@Test
fun `test move to previous WORD end moves to end at non-word characters`() {
doTest(
"gE",
"Lorem ipsum dolor sit amet,,, con${c}sectetur adipiscing elit",
"Lorem ipsum dolor sit amet,,${c}, consectetur adipiscing elit",
)
}
@Test
fun `test move to previous WORD end with count`() {
doTest(
"3gE",
"Lorem ipsum dolor sit a${c}met, consectetur adipiscing elit",
"Lorem ipsu${c}m dolor sit amet, consectetur adipiscing elit",
)
}
@Test
fun `test move to previous WORD end with count over non-word characters`() {
doTest(
"3gE",
"Lorem ipsum dolor sit amet, conse${c}ctetur adipiscing elit",
"Lorem ipsum dolo${c}r sit amet, consectetur adipiscing elit",
)
}
@Test
fun `test move to previous WORD end wraps to previous line`() {
doTest(
"gE",
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing elit
|Se${c}d in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing eli${c}t
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
)
}
@Test
fun `test move to previous WORD end wraps to previous line skipping trailing whitespace`() {
doTest(
"gE",
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing elit....
|Se${c}d in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing eli${c}t....
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter = "${c}Lorem ipsum")
@Test
fun `test move to previous word end on first word moves to start of file`() {
doTest("gE", "Lore${c}m ipsum", "Lore${c}m ipsum")
}
@Test
fun `test move to previous word end on first word with leading whitespace moves to start of file`() {
doTest("gE", " Lore${c}m ipsum", "${c} Lorem ipsum")
}
@Test
fun `test move to previous word end at start of file reports error`() {
doTest("gE", "${c}Lorem ipsum", "${c}Lorem ipsum")
assertPluginError(true)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter = "${c}Lorem ipsum")
@Test
fun `test move to previous word end with large count moves to start of file without reporting error`() {
doTest("100gE", "Lorem ip${c}sum", "Lore${c}m ipsum")
assertPluginError(false)
}
}

View File

@ -0,0 +1,122 @@
/*
* 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.text
import org.jetbrains.plugins.ideavim.VimBehaviorDiffers
import org.jetbrains.plugins.ideavim.VimTestCase
import org.junit.jupiter.api.Test
@Suppress("SpellCheckingInspection", "RemoveCurlyBracesFromTemplate")
class MotionBigWordEndRightActionTest : VimTestCase() {
@Test
fun `test move to WORD end`() {
doTest(
"E",
"${c}Lorem ipsum dolor sit amet, consectetur adipiscing elit",
"Lore${c}m ipsum dolor sit amet, consectetur adipiscing elit",
)
}
@Test
fun `test move to WORD end from end of word`() {
doTest(
"E",
"Lore${c}m ipsum dolor sit amet, consectetur adipiscing elit",
"Lorem ipsu${c}m dolor sit amet, consectetur adipiscing elit",
)
}
@Test
fun `test move to WORD end from leading whitespace`() {
doTest(
"E",
" ${c} Lorem ipsum dolor sit amet, consectetur adipiscing elit",
" Lore${c}m ipsum dolor sit amet, consectetur adipiscing elit",
)
}
@Test
fun `test move to WORD end ignores non-word characters`() {
doTest(
"E",
"Lorem ipsum dolor sit ${c}amet, consectetur adipiscing elit",
"Lorem ipsum dolor sit amet${c}, consectetur adipiscing elit",
)
}
@Test
fun `test move to WORD end moves to end of non-word characters`() {
doTest(
"E",
"Lorem ipsum dolor sit a${c}met,,,, consectetur adipiscing elit",
"Lorem ipsum dolor sit amet,,,${c}, consectetur adipiscing elit",
)
}
@Test
fun `test move to WORD end with count`() {
doTest(
"3E",
"${c}Lorem ipsum dolor sit amet, consectetur adipiscing elit",
"Lorem ipsum dolo${c}r sit amet, consectetur adipiscing elit",
)
}
@Test
fun `test move to WORD end with count over non-word characters`() {
doTest(
"3E",
"Lorem ipsum dolor si${c}t amet, consectetur adipiscing elit",
"Lorem ipsum dolor sit amet, consectetur adipiscin${c}g elit",
)
}
@Test
fun `test move to WORD end wraps to next line`() {
doTest(
"E",
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing eli${c}t
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing elit
|Se${c}d in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
)
}
@Test
fun `test move to WORD end wraps to next line skipping trailing whitespace`() {
doTest(
"E",
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing eli${c}t....
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing elit....
|Se${c}d in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
)
}
@Test
fun `test move to WORD end at end of file reports error`() {
doTest("E", "Lorem ipsu${c}m", "Lorem ipsu${c}m")
assertPluginError(true)
}
@VimBehaviorDiffers(description = "IdeaVim cannot move and have an error at the same time")
@Test
fun `test move to WORD end with large count moves to end of file and reports error`() {
doTest("300E", "${c}Lorem ipsum", "Lorem ipsu${c}m")
assertPluginError(false)
}
}

View File

@ -0,0 +1,198 @@
/*
* 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.text
import org.jetbrains.plugins.ideavim.VimTestCase
import org.junit.jupiter.api.Test
@Suppress("RemoveCurlyBracesFromTemplate")
class MotionBigWordLeftActionTest : VimTestCase() {
@Test
fun `test WORD left from within word`() {
doTest("B", "Lorem ip${c}sum", "Lorem ${c}ipsum")
}
@Test
fun `test WORD left from start of word`() {
doTest("B", "Lorem ${c}ipsum", "${c}Lorem ipsum")
}
@Test
fun `test WORD left ignores non-word characters`() {
doTest("B", "Lorem ipsum;dolor.sit,a${c}met", "Lorem ${c}ipsum;dolor.sit,amet")
}
@Test
fun `test WORD left with CTRL-Left`() {
doTest("<C-Left>", "Lorem ipsum;dolor.sit,a${c}met", "Lorem ${c}ipsum;dolor.sit,amet")
}
@Test
fun `test WORD left from trailing whitespace`() {
doTest("B", "Lorem Ipsum ${c} ", "Lorem ${c}Ipsum ")
}
@Test
fun `test WORD left from trailing whitespace 2`() {
doTest("B", "Lorem ${c} Ipsum", "${c}Lorem Ipsum")
}
@Test
fun `test WORD left with count from within word`() {
doTest(
"3B",
"""
|Lorem ipsum dolor s${c}it amet, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ${c}ipsum dolor sit amet, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin()
)
}
@Test
fun `test WORD left with count from start of word`() {
doTest(
"3B",
"""
|Lorem ipsum dolor ${c}sit amet, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|${c}Lorem ipsum dolor sit amet, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin()
)
}
@Test
fun `test WORD left with count across non-word characters`() {
doTest(
"3B",
"""
|Lorem ipsum dolor sit amet, cons${c}ectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ipsum dolor ${c}sit amet, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin()
)
}
@Test
fun `test WORD left at start of line wraps to previous line`() {
doTest(
"B",
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|${c}Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing ${c}elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin()
)
}
@Test
fun `test WORD left at start of line wraps to previous line with trailing whitespace`() {
doTest(
"B",
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit....
|${c}Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing ${c}elit....
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace()
)
}
@Test
fun `test WORD left at start of line with count wraps to previous line`() {
doTest(
"3B",
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Se${c}d in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur ${c}adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin()
)
}
@Test
fun `test WORD left at start of line across non-word characters`() {
doTest(
"B",
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|${c}consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit ${c}amet,
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin()
)
}
@Test
fun `test WORD left on first word moves caret to start of word`() {
doTest("B", "Lo${c}rem Ipsum", "${c}Lorem Ipsum")
}
@Test
fun `test WORD left on leading whitespace at start of file moves caret to start of file`() {
doTest("B", " ${c} Lorem Ipsum", "${c} Lorem Ipsum")
}
@Test
fun `test WORD left on first character of file reports error`() {
doTest("B", "${c}Lorem Ipsum", "${c}Lorem Ipsum")
assertPluginError(true)
}
}

View File

@ -0,0 +1,137 @@
/*
* 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.text
import org.jetbrains.plugins.ideavim.VimTestCase
import org.junit.jupiter.api.Test
@Suppress("SpellCheckingInspection", "RemoveCurlyBracesFromTemplate")
class MotionBigWordRightActionTest : VimTestCase() {
@Test
fun `test simple WORD right`() {
doTest("W", "${c}Lorem Ipsum", "Lorem ${c}Ipsum")
}
@Test
fun `test WORD right ignoring non-alpha characters`() {
doTest("W", "Lo${c}rem,ipsum;dolor.sit amet", "Lorem,ipsum;dolor.sit ${c}amet")
}
@Test
fun `test WORD right with CTRL-Right`() {
doTest("<C-Right>", "Lo${c}rem,ipsum;dolor.sit amet", "Lorem,ipsum;dolor.sit ${c}amet")
}
@Test
fun `test WORD right from leading whitespace`() {
doTest("W", "${c} Lorem Ipsum", " ${c}Lorem Ipsum")
}
@Test
fun `test WORD right from leading whitespace 2`() {
doTest("W", "Lorem ${c} Ipsum", "Lorem ${c}Ipsum")
}
@Test
fun `test WORD right with count`() {
doTest(
"3W",
"""
|Lo${c}rem ipsum dolor sit amet, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ipsum dolor ${c}sit amet, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin()
)
}
@Test
fun `test WORD right with count across non-word characters`() {
doTest(
"3W",
"""
|Lorem ipsum dolor s${c}it amet, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ipsum dolor sit amet, consectetur ${c}adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin()
)
}
@Test
fun `test WORD right at end of line wraps to next line`() {
doTest(
"W",
"""
|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 elit
| ${c}Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin()
)
}
@Test
fun `test WORD right at end of line with trailing whitespace wraps to next line`() {
doTest(
"W",
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing e${c}lit....
| Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing elit....
| ${c}Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace()
)
}
@Test
fun `test WORD right at end of line with count wraps to next line`() {
doTest(
"3W",
"""
|Lorem ipsum dolor sit amet, consectetur a${c}dipiscing elit
| Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing elit
| Sed ${c}in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin()
)
}
@Test
fun `test WORD right on last word moves caret to end of word`() {
doTest("W", "Lorem I${c}psum", "Lorem Ipsu${c}m")
}
@Test
fun `test WORD right on last word with trailing whitespace moves to end of whitespace`() {
doTest("W", "Lorem Ipsu${c}m ", "Lorem Ipsum ${c} ")
}
@Test
fun `test WORD right on last character of file reports error`() {
doTest("W", "Lorem Ipsu${c}m", "Lorem Ipsu${c}m")
assertPluginError(true)
}
@Test
fun `test WORD right at end of file with large count does not report error`() {
doTest("100W", "L${c}orem Ipsum", "Lorem Ipsu${c}m")
assertPluginError(false)
}
}

View File

@ -0,0 +1,135 @@
/*
* 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.text
import org.jetbrains.plugins.ideavim.VimBehaviorDiffers
import org.jetbrains.plugins.ideavim.VimTestCase
import org.junit.jupiter.api.Test
@Suppress("SpellCheckingInspection", "RemoveCurlyBracesFromTemplate")
class MotionWordEndLeftActionTest : VimTestCase() {
@Test
fun `test move to previous word end`() {
doTest(
"ge",
"Lorem ip${c}sum dolor sit amet, consectetur adipiscing elit",
"Lore${c}m ipsum dolor sit amet, consectetur adipiscing elit",
)
}
@Test
fun `test move to previous word end from end of word`() {
doTest(
"ge",
"Lorem ipsu${c}m dolor sit amet, consectetur adipiscing elit",
"Lore${c}m ipsum dolor sit amet, consectetur adipiscing elit",
)
}
@Test
fun `test move to previous word end from whitespace`() {
doTest(
"ge",
"Lorem ${c} ipsum dolor sit amet, consectetur adipiscing elit",
"Lore${c}m ipsum dolor sit amet, consectetur adipiscing elit",
)
}
@Test
fun `test move to previous word end stops at non-word characters`() {
doTest(
"ge",
"Lorem ipsum dolor sit amet, con${c}sectetur adipiscing elit",
"Lorem ipsum dolor sit amet${c}, consectetur adipiscing elit",
)
}
@Test
fun `test move to previous word end moves to end at non-word characters`() {
doTest(
"ge",
"Lorem ipsum dolor sit amet,,, con${c}sectetur adipiscing elit",
"Lorem ipsum dolor sit amet,,${c}, consectetur adipiscing elit",
)
}
@Test
fun `test move to previous word end with count`() {
doTest(
"3ge",
"Lorem ipsum dolor sit a${c}met, consectetur adipiscing elit",
"Lorem ipsu${c}m dolor sit amet, consectetur adipiscing elit",
)
}
@Test
fun `test move to previous word end with count over non-word characters`() {
doTest(
"3ge",
"Lorem ipsum dolor sit amet, conse${c}ctetur adipiscing elit",
"Lorem ipsum dolor si${c}t amet, consectetur adipiscing elit",
)
}
@Test
fun `test move to previous word end wraps to previous line`() {
doTest(
"ge",
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing elit
|Se${c}d in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing eli${c}t
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
)
}
@Test
fun `test move to previous word end wraps to previous line skipping trailing whitespace`() {
doTest(
"ge",
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing elit....
|Se${c}d in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing eli${c}t....
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter = "${c}Lorem ipsum")
@Test
fun `test move to previous word end on first word moves to start of file`() {
doTest("ge", "Lore${c}m ipsum", "Lore${c}m ipsum")
}
@Test
fun `test move to previous word end on first word with leading whitespace moves to start of file`() {
doTest("ge", " Lore${c}m ipsum", "${c} Lorem ipsum")
}
@Test
fun `test move to previous word end at start of file reports error`() {
doTest("ge", "${c}Lorem ipsum", "${c}Lorem ipsum")
assertPluginError(true)
}
// TODO: Fix this bug
@VimBehaviorDiffers(originalVimAfter = "${c}Lorem ipsum")
@Test
fun `test move to previous word end with large count moves to start of file without reporting error`() {
doTest("100ge", "Lorem ip${c}sum", "Lore${c}m ipsum")
assertPluginError(false)
}
}

View File

@ -0,0 +1,122 @@
/*
* 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.text
import org.jetbrains.plugins.ideavim.VimBehaviorDiffers
import org.jetbrains.plugins.ideavim.VimTestCase
import org.junit.jupiter.api.Test
@Suppress("SpellCheckingInspection", "RemoveCurlyBracesFromTemplate")
class MotionWordEndRightActionTest : VimTestCase() {
@Test
fun `test move to word end`() {
doTest(
"e",
"${c}Lorem ipsum dolor sit amet, consectetur adipiscing elit",
"Lore${c}m ipsum dolor sit amet, consectetur adipiscing elit",
)
}
@Test
fun `test move to word end from end of word`() {
doTest(
"e",
"Lore${c}m ipsum dolor sit amet, consectetur adipiscing elit",
"Lorem ipsu${c}m dolor sit amet, consectetur adipiscing elit",
)
}
@Test
fun `test move to word end from leading whitespace`() {
doTest(
"e",
" ${c} Lorem ipsum dolor sit amet, consectetur adipiscing elit",
" Lore${c}m ipsum dolor sit amet, consectetur adipiscing elit",
)
}
@Test
fun `test move to word end stops at non-word characters`() {
doTest(
"e",
"Lorem ipsum dolor sit ${c}amet, consectetur adipiscing elit",
"Lorem ipsum dolor sit ame${c}t, consectetur adipiscing elit",
)
}
@Test
fun `test move to word end moves to end of non-word characters`() {
doTest(
"e",
"Lorem ipsum dolor sit ame${c}t,,,, consectetur adipiscing elit",
"Lorem ipsum dolor sit amet,,,${c}, consectetur adipiscing elit",
)
}
@Test
fun `test move to word end with count`() {
doTest(
"3e",
"${c}Lorem ipsum dolor sit amet, consectetur adipiscing elit",
"Lorem ipsum dolo${c}r sit amet, consectetur adipiscing elit",
)
}
@Test
fun `test move to word end with count over non-word characters`() {
doTest(
"3e",
"Lorem ipsum dolor si${c}t amet, consectetur adipiscing elit",
"Lorem ipsum dolor sit amet, consectetu${c}r adipiscing elit",
)
}
@Test
fun `test move to word end wraps to next line`() {
doTest(
"e",
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing eli${c}t
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing elit
|Se${c}d in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
)
}
@Test
fun `test move to word end wraps to next line skipping trailing whitespace`() {
doTest(
"e",
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing eli${c}t....
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing elit....
|Se${c}d in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
)
}
@Test
fun `test move to word end at end of file reports error`() {
doTest("e", "Lorem ipsu${c}m", "Lorem ipsu${c}m")
assertPluginError(true)
}
@VimBehaviorDiffers(description = "IdeaVim cannot move and have an error at the same time")
@Test
fun `test move to word end with large count moves to end of file and reports error`() {
doTest("300e", "${c}Lorem ipsum", "Lorem ipsu${c}m")
assertPluginError(false)
}
}

View File

@ -0,0 +1,198 @@
/*
* 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.text
import org.jetbrains.plugins.ideavim.VimTestCase
import org.junit.jupiter.api.Test
@Suppress("RemoveCurlyBracesFromTemplate", "SpellCheckingInspection")
class MotionWordLeftActionTest : VimTestCase() {
@Test
fun `test word left from within word`() {
doTest("b", "Lorem ip${c}sum", "Lorem ${c}ipsum")
}
@Test
fun `test word left from start of word`() {
doTest("b", "Lorem ${c}ipsum", "${c}Lorem ipsum")
}
@Test
fun `test word left stops at non-word characters`() {
doTest("b", "Lorem ipsum;dolor.sit,a${c}met", "Lorem ipsum;dolor.sit,${c}amet")
}
@Test
fun `test word left with Shift-Left`() {
doTest("<S-Left>", "Lorem ipsum;dolor.sit,a${c}met", "Lorem ipsum;dolor.sit,${c}amet")
}
@Test
fun `test word left from trailing whitespace`() {
doTest("b", "Lorem Ipsum ${c} ", "Lorem ${c}Ipsum ")
}
@Test
fun `test word left from trailing whitespace 2`() {
doTest("b", "Lorem ${c} Ipsum", "${c}Lorem Ipsum")
}
@Test
fun `test word left with count from within word`() {
doTest(
"3b",
"""
|Lorem ipsum dolor s${c}it amet, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ${c}ipsum dolor sit amet, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin()
)
}
@Test
fun `test word left with count from start of word`() {
doTest(
"3b",
"""
|Lorem ipsum dolor ${c}sit amet, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|${c}Lorem ipsum dolor sit amet, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin()
)
}
@Test
fun `test word left with count across non-word characters`() {
doTest(
"3b",
"""
|Lorem ipsum dolor sit amet, cons${c}ectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ipsum dolor sit ${c}amet, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin()
)
}
@Test
fun `test word left at start of line wraps to previous line`() {
doTest(
"b",
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|${c}Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing ${c}elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin()
)
}
@Test
fun `test word left at start of line wraps to previous line with trailing whitespace`() {
doTest(
"b",
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit....
|${c}Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing ${c}elit....
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace()
)
}
@Test
fun `test word left at start of line with count wraps to previous line`() {
doTest(
"3b",
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur adipiscing elit
|Se${c}d in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|consectetur ${c}adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin()
)
}
@Test
fun `test word left at start of line across non-word characters`() {
doTest(
"b",
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet,
|${c}consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem Ipsum
|
|Lorem ipsum dolor sit amet${c},
|consectetur adipiscing elit
|Sed in orci mauris.
|Cras id tellus in ex imperdiet egestas.
""".trimMargin()
)
}
@Test
fun `test word left on first word moves caret to start of word`() {
doTest("b", "Lo${c}rem Ipsum", "${c}Lorem Ipsum")
}
@Test
fun `test word left on leading whitespace at start of file moves caret to start of file`() {
doTest("b", " ${c} Lorem Ipsum", "${c} Lorem Ipsum")
}
@Test
fun `test word left on first character of file reports error`() {
doTest("b", "${c}Lorem Ipsum", "${c}Lorem Ipsum")
assertPluginError(true)
}
}

View File

@ -0,0 +1,137 @@
/*
* 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.text
import org.jetbrains.plugins.ideavim.VimTestCase
import org.junit.jupiter.api.Test
@Suppress("SpellCheckingInspection", "RemoveCurlyBracesFromTemplate")
class MotionWordRightActionTest : VimTestCase() {
@Test
fun `test simple word right`() {
doTest("w", "${c}Lorem Ipsum", "Lorem ${c}Ipsum")
}
@Test
fun `test word right with non-alpha characters`() {
doTest("w", "Lo${c}rem,ipsum;dolor.sit amet", "Lorem${c},ipsum;dolor.sit amet")
}
@Test
fun `test word right with Shift-Right`() {
doTest("<S-Right>", "Lo${c}rem,ipsum;dolor.sit amet", "Lorem${c},ipsum;dolor.sit amet")
}
@Test
fun `test word right from leading whitespace`() {
doTest("w", "${c} Lorem Ipsum", " ${c}Lorem Ipsum")
}
@Test
fun `test word right from leading whitespace 2`() {
doTest("w", "Lorem ${c} Ipsum", "Lorem ${c}Ipsum")
}
@Test
fun `test word right with count`() {
doTest(
"3w",
"""
|Lo${c}rem ipsum dolor sit amet, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ipsum dolor ${c}sit amet, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin()
)
}
@Test
fun `test word right with count across non-word characters`() {
doTest(
"3w",
"""
|Lorem ipsum dolor s${c}it amet, consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ipsum dolor sit amet, ${c}consectetur adipiscing elit
|Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin()
)
}
@Test
fun `test word right at end of line wraps to next line`() {
doTest(
"w",
"""
|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 elit
| ${c}Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin()
)
}
@Test
fun `test word right at end of line with trailing whitespace wraps to next line`() {
doTest(
"w",
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing e${c}lit....
| Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace(),
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing elit....
| ${c}Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin().dotToSpace()
)
}
@Test
fun `test word right at end of line with count wraps to next line`() {
doTest(
"3w",
"""
|Lorem ipsum dolor sit amet, consectetur a${c}dipiscing elit
| Sed in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin(),
"""
|Lorem ipsum dolor sit amet, consectetur adipiscing elit
| Sed ${c}in orci mauris. Cras id tellus in ex imperdiet egestas.
""".trimMargin()
)
}
@Test
fun `test word right on last word moves caret to end of word`() {
doTest("w", "Lorem I${c}psum", "Lorem Ipsu${c}m")
}
@Test
fun `test word right on last word with trailing whitespace moves to end of whitespace`() {
doTest("w", "Lorem Ipsu${c}m ", "Lorem Ipsum ${c} ")
}
@Test
fun `test word right on last character of file reports error`() {
doTest("w", "Lorem Ipsu${c}m", "Lorem Ipsu${c}m")
assertPluginError(true)
}
@Test
fun `test word right at end of file with large count does not report error`() {
doTest("100w", "L${c}orem Ipsum", "Lorem Ipsu${c}m")
assertPluginError(false)
}
}