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

Fix tests

This commit is contained in:
filipp 2023-12-08 15:25:25 +02:00 committed by lippfi
parent 52d5d4d64c
commit b05fdaaa73
3 changed files with 121 additions and 91 deletions
src/test/java/org/jetbrains/plugins/ideavim/regex
vim-engine/src
main/kotlin/com/maddyhome/idea/vim/regexp/engine/nfa/matcher
test/kotlin/com/maddyhome/idea/vim/regexp/internal

View File

@ -0,0 +1,120 @@
/*
* Copyright 2003-2023 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.regex
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.common.TextRange
import com.maddyhome.idea.vim.mark.VimMark
import com.maddyhome.idea.vim.newapi.vim
import com.maddyhome.idea.vim.regexp.VimRegex
import org.jetbrains.plugins.ideavim.VimTestCase
import org.junit.jupiter.api.Test
import kotlin.test.assertEquals
class VimRegexEngineTest : VimTestCase() {
private fun findAll(pattern: String): List<TextRange> {
val regex = VimRegex(pattern)
return regex.findAll(fixture.editor.vim).map { it.range }
}
@Test
fun `test end of word at middle of text`() {
configureByText("Lorem Ipsum")
val result = findAll("Lorem\\>")
assertEquals(result, listOf(TextRange(0, 5)))
}
@Test
fun `test end of word should fail`() {
configureByText("Lorem Ipsum")
val result = findAll("Lo\\>rem")
assertEquals(result, emptyList())
}
@Test
fun `test start of word at offset`() {
configureByText("Lorem Ipsum")
val result = findAll("\\<Ipsum")
assertEquals(result, listOf(TextRange(6, 11)))
}
@Test
fun `test start of word should fail`() {
configureByText("Lorem Ipsum")
val result = findAll("Lo\\<rem")
assertEquals(result, emptyList())
}
@Test
fun `test end of word at end of text`() {
configureByText("Lorem Ipsum")
val result = findAll("Ipsum\\>")
assertEquals(result, listOf(TextRange(6, 11)))
}
@Test
fun `test start of word at start of text`() {
configureByText("Lorem Ipsum")
val result = findAll("\\<Lorem")
assertEquals(result, listOf(TextRange(0, 5)))
}
@Test
fun `test cursor and mark belong to the same cursor`() {
/*
In this test, there are two cursors, one at offset 3 and the other at 6.
The second cursor (at offset 6) has a mark 'm' at offset 0.
The pattern reads as "match the character at the cursor position that is after a mark 'm'".
Since the cursor and mark tokens have to "belong" to the same cursor, the resulting match
is at offset 6 (the offset of the second cursor), even though the first cursor appears first
in the text.
*/
configureByText("Lor${c}em ${c}Ipsum")
val editor = fixture.editor.vim
val mark = VimMark.create('m', 0, 0, editor.getPath(), editor.extractProtocol())!!
val secondCaret = editor.carets().maxByOrNull { it.offset.point }!!
secondCaret.markStorage.setMark(mark)
val result = findAll("\\%>'m\\%#.")
assertEquals(result, listOf(TextRange(6, 7)))
}
@Test
fun `test text at mark position`() {
configureByText("Lorem Ipsum")
val editor = fixture.editor.vim
val mark = VimMark.create('m', 0, 5, editor.getPath(), editor.extractProtocol())!!
injector.markService.setMark(editor.primaryCaret(), mark)
val result = findAll("\\%'m...")
assertEquals(result, listOf(TextRange(5, 8)))
}
@Test
fun `test text before mark position`() {
configureByText("Lorem Ipsum")
val editor = fixture.editor.vim
val mark = VimMark.create('m', 0, 5, editor.getPath(), editor.extractProtocol())!!
injector.markService.setMark(editor.primaryCaret(), mark)
val result = findAll("\\%<'m...")
assertEquals(result, listOf(TextRange(0, 3), TextRange(3, 6)))
}
@Test
fun `test text after mark position`() {
configureByText("Lorem Ipsum")
val editor = fixture.editor.vim
val mark = VimMark.create('m', 0, 5, editor.getPath(), editor.extractProtocol())!!
injector.markService.setMark(editor.primaryCaret(), mark)
val result = findAll("\\%>'m...")
assertEquals(result, listOf(TextRange(6, 9)))
}
}

View File

@ -26,7 +26,7 @@ internal class EndOfWordMatcher : Matcher {
): MatcherResult {
if (index > editor.text().length || index == 0) return MatcherResult.Failure
val isKeywordAtIndex = KeywordOptionHelper.isKeyword(editor, editor.text()[index])
val isKeywordAtIndex = editor.text().getOrNull(index)?.let { KeywordOptionHelper.isKeyword(editor, it) } ?: false
val isKeywordBeforeIndex = editor.text().getOrNull(index - 1)?.let { KeywordOptionHelper.isKeyword(editor, it) } ?: false
return if (isKeywordBeforeIndex && !isKeywordAtIndex) MatcherResult.Success(0) else MatcherResult.Failure

View File

@ -839,54 +839,6 @@ class VimRegexEngineTest {
)
}
@Test
fun `test start of word at start of text`() {
doTest(
"${START}Lorem$END Ipsum",
"\\<Lorem",
)
}
@Test
fun `test start of word at offset`() {
doTest(
"Lorem ${START}Ipsum$END",
"\\<Ipsum",
)
}
@Test
fun `test start of word should fail`() {
assertFailure(
"Lorem Ipsum",
"Lo\\<rem"
)
}
@Test
fun `test end of word at end of text`() {
doTest(
"Lorem ${START}Ipsum$END",
"Ipsum\\>",
)
}
@Test
fun `test end of word at middle of text`() {
doTest(
"${START}Lorem$END Ipsum",
"Lorem\\>",
)
}
@Test
fun `test end of word should fail`() {
assertFailure(
"Lorem Ipsum",
"Lo\\>rem"
)
}
@Test
fun `test collection with EOL`() {
doTest(
@ -1678,29 +1630,7 @@ class VimRegexEngineTest {
)
}
@Test
fun `test text at mark position`() {
doTest(
"Lorem ${START}${MARK('m')}Ips${END}um",
"\\%'m..."
)
}
@Test
fun `test text before mark position`() {
doTest(
"${START}Lor${END}em ${MARK('m')}Ipsum",
"\\%<'m..."
)
}
@Test
fun `test text after mark position`() {
doTest(
"Lorem ${MARK('m')}I${START}psu${END}m",
"\\%>'m..."
)
}
@Test
fun `test mark does not exist`() {
@ -1710,26 +1640,6 @@ class VimRegexEngineTest {
)
}
@Test
fun `test cursor and mark belong to the same cursor`() {
/*
In this test, there are two cursors, one at offset 3 and the other at 6.
The second cursor (at offset 6) has a mark 'm' at offset 0.
The pattern reads as "match the character at the cursor position that is after a mark 'm'".
Since the cursor and mark tokens have to "belong" to the same cursor, the resulting match
is at offset 6 (the offset of the second cursor), even though the first cursor appears first
in the text.
*/
doTest(
"Lorem ${START}I${END}psum",
"\\%>'m\\%#.",
listOf(
mockCaret(3),
mockCaret(6, marks = mapOf(Pair('m', BufferPosition(0, 0))))
)
)
}
@Test
fun `test cursor and visual belong to the same cursor`() {
doTest(