gocui/text_area_test.go

735 lines
16 KiB
Go
Raw Normal View History

2021-10-17 14:52:23 +11:00
package gocui
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestTextArea(t *testing.T) {
tests := []struct {
2022-03-28 22:22:09 +09:00
actions func(*TextArea)
expectedContent string
expectedCursor int
expectedClipboard string
2021-10-17 14:52:23 +11:00
}{
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.TypeRune('c')
},
2022-03-28 22:22:09 +09:00
expectedContent: "abc",
expectedCursor: 3,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('\n')
textarea.TypeRune('c')
},
2022-03-28 22:22:09 +09:00
expectedContent: "a\nc",
expectedCursor: 3,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("abcd")
},
2022-03-28 22:22:09 +09:00
expectedContent: "abcd",
expectedCursor: 4,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("a字cd")
},
2022-03-28 22:22:09 +09:00
expectedContent: "a字cd",
expectedCursor: 4,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.BackSpaceChar()
},
2022-03-28 22:22:09 +09:00
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.BackSpaceChar()
},
2022-03-28 22:22:09 +09:00
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.BackSpaceChar()
},
2022-03-28 22:22:09 +09:00
expectedContent: "a",
expectedCursor: 1,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.DeleteChar()
},
2022-03-28 22:22:09 +09:00
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.DeleteChar()
},
2022-03-28 22:22:09 +09:00
expectedContent: "a",
expectedCursor: 1,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.MoveCursorLeft()
textarea.DeleteChar()
},
2022-03-28 22:22:09 +09:00
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.TypeRune('c')
textarea.MoveCursorLeft()
textarea.MoveCursorLeft()
textarea.DeleteChar()
},
2022-03-28 22:22:09 +09:00
expectedContent: "ac",
expectedCursor: 1,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.MoveCursorLeft()
},
2022-03-28 22:22:09 +09:00
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.MoveCursorLeft()
},
2022-03-28 22:22:09 +09:00
expectedContent: "a",
expectedCursor: 0,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.MoveCursorLeft()
},
2022-03-28 22:22:09 +09:00
expectedContent: "ab",
expectedCursor: 1,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.MoveCursorRight()
},
2022-03-28 22:22:09 +09:00
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.MoveCursorRight()
},
2022-03-28 22:22:09 +09:00
expectedContent: "a",
expectedCursor: 1,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.MoveCursorLeft()
textarea.MoveCursorRight()
},
2022-03-28 22:22:09 +09:00
expectedContent: "ab",
expectedCursor: 2,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('漢')
textarea.TypeRune('字')
textarea.MoveCursorLeft()
},
2022-03-28 22:22:09 +09:00
expectedContent: "漢字",
expectedCursor: 1,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.ToggleOverwrite()
textarea.TypeRune('a')
textarea.TypeRune('b')
},
2022-03-28 22:22:09 +09:00
expectedContent: "ab",
expectedCursor: 2,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.TypeRune('c')
textarea.MoveCursorLeft()
textarea.MoveCursorLeft()
textarea.ToggleOverwrite()
textarea.TypeRune('d')
},
2022-03-28 22:22:09 +09:00
expectedContent: "adc",
expectedCursor: 2,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("aaa bbb")
textarea.MoveLeftWord()
},
expectedContent: "aaa bbb",
expectedCursor: 4,
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("aaa bbb\n")
textarea.MoveLeftWord()
},
expectedContent: "aaa bbb\n",
expectedCursor: 7,
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("aaa bbb")
textarea.MoveLeftWord()
textarea.MoveLeftWord()
},
expectedContent: "aaa bbb",
expectedCursor: 0,
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("aaa")
textarea.GoToStartOfLine()
textarea.MoveLeftWord()
},
expectedContent: "aaa",
expectedCursor: 0,
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("aaa bbb")
textarea.MoveRightWord()
},
expectedContent: "aaa bbb",
expectedCursor: 7,
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("aaa\nbbb")
textarea.GoToStartOfLine()
textarea.MoveCursorLeft()
textarea.MoveRightWord()
},
expectedContent: "aaa\nbbb",
expectedCursor: 4,
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("aaa bbb")
textarea.GoToStartOfLine()
textarea.MoveRightWord()
},
expectedContent: "aaa bbb",
expectedCursor: 3,
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("aaa bbb\n")
textarea.MoveCursorLeft()
textarea.GoToStartOfLine()
textarea.MoveRightWord()
textarea.MoveRightWord()
},
expectedContent: "aaa bbb\n",
expectedCursor: 7,
},
2021-10-17 14:52:23 +11:00
{
actions: func(textarea *TextArea) {
// overwrite mode acts same as normal mode when cursor is at the end
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.TypeRune('c')
textarea.ToggleOverwrite()
textarea.TypeRune('d')
},
2022-03-28 22:22:09 +09:00
expectedContent: "abcd",
expectedCursor: 4,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.DeleteToStartOfLine()
},
2022-03-28 22:22:09 +09:00
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.DeleteToStartOfLine()
},
2022-03-28 22:22:09 +09:00
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "ab",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.MoveCursorLeft()
textarea.MoveCursorLeft()
textarea.DeleteToStartOfLine()
},
2022-03-28 22:22:09 +09:00
expectedContent: "ab",
expectedCursor: 0,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.TypeRune('\n')
textarea.DeleteToStartOfLine()
},
2022-03-28 22:22:09 +09:00
expectedContent: "ab",
expectedCursor: 2,
2022-03-29 20:37:12 +09:00
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.TypeRune('\n')
textarea.TypeRune('c')
textarea.TypeRune('d')
textarea.DeleteToStartOfLine()
},
2022-03-28 22:22:09 +09:00
expectedContent: "ab\n",
expectedCursor: 3,
expectedClipboard: "cd",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.GoToStartOfLine()
},
2022-03-28 22:22:09 +09:00
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.MoveCursorLeft()
textarea.GoToStartOfLine()
},
2022-03-28 22:22:09 +09:00
expectedContent: "a",
expectedCursor: 0,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.TypeRune('\n')
textarea.TypeRune('c')
textarea.TypeRune('d')
textarea.MoveCursorLeft()
textarea.MoveCursorLeft()
textarea.MoveCursorLeft()
textarea.GoToStartOfLine()
},
2022-03-28 22:22:09 +09:00
expectedContent: "ab\ncd",
expectedCursor: 0,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.TypeRune('\n')
textarea.TypeRune('c')
textarea.TypeRune('d')
textarea.GoToStartOfLine()
},
2022-03-28 22:22:09 +09:00
expectedContent: "ab\ncd",
expectedCursor: 3,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.TypeRune('\n')
textarea.TypeRune('c')
textarea.TypeRune('d')
textarea.MoveCursorLeft()
textarea.MoveCursorLeft()
textarea.GoToStartOfLine()
},
2022-03-28 22:22:09 +09:00
expectedContent: "ab\ncd",
expectedCursor: 3,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.GoToEndOfLine()
},
2022-03-28 22:22:09 +09:00
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.TypeRune('\n')
textarea.TypeRune('c')
textarea.TypeRune('d')
textarea.MoveCursorLeft()
textarea.MoveCursorLeft()
textarea.GoToEndOfLine()
},
2022-03-28 22:22:09 +09:00
expectedContent: "ab\ncd",
expectedCursor: 5,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.SetCursor2D(10, 10)
},
2022-03-28 22:22:09 +09:00
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.SetCursor2D(-1, -1)
},
2022-03-28 22:22:09 +09:00
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("ab\ncd")
textarea.SetCursor2D(0, 0)
},
2022-03-28 22:22:09 +09:00
expectedContent: "ab\ncd",
expectedCursor: 0,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("ab\ncd")
textarea.SetCursor2D(2, 0)
},
2022-03-28 22:22:09 +09:00
expectedContent: "ab\ncd",
expectedCursor: 2,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("ab\ncd\nef")
textarea.SetCursor2D(2, 1)
},
2022-03-28 22:22:09 +09:00
expectedContent: "ab\ncd\nef",
expectedCursor: 5,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("abcd\n\nijkl")
textarea.MoveCursorUp()
},
2022-03-28 22:22:09 +09:00
expectedContent: "abcd\n\nijkl",
expectedCursor: 5,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("abcdef\n老老老")
textarea.MoveCursorLeft()
textarea.MoveCursorUp()
},
2022-03-28 22:22:09 +09:00
expectedContent: "abcdef\n老老老",
expectedCursor: 4,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("abcdef\n老老老")
textarea.MoveCursorUp()
textarea.MoveCursorLeft()
textarea.MoveCursorLeft()
textarea.MoveCursorLeft()
textarea.MoveCursorDown()
},
2022-03-28 22:22:09 +09:00
expectedContent: "abcdef\n老老老",
expectedCursor: 9,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("abcd\nef")
textarea.MoveCursorUp()
textarea.GoToEndOfLine()
textarea.MoveCursorDown()
},
2022-03-28 22:22:09 +09:00
expectedContent: "abcd\nef",
expectedCursor: 7,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("abcd")
textarea.MoveCursorUp()
},
2022-03-28 22:22:09 +09:00
expectedContent: "abcd",
expectedCursor: 4,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeString(`abcdefg`)
textarea.Clear()
},
2022-03-28 22:22:09 +09:00
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
2021-10-17 14:52:23 +11:00
},
2021-10-18 20:45:39 +09:00
{
actions: func(textarea *TextArea) {
textarea.TypeString(`abcdefg`)
textarea.Clear()
},
2022-03-28 22:22:09 +09:00
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
2021-10-18 20:45:39 +09:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeString(`abc def`)
textarea.MoveCursorLeft()
textarea.BackSpaceWord()
},
2022-03-28 22:22:09 +09:00
expectedContent: "abc f",
expectedCursor: 4,
expectedClipboard: "de",
2021-10-18 20:45:39 +09:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeString(`abc def `)
textarea.BackSpaceWord()
},
2022-03-28 22:22:09 +09:00
expectedContent: "abc ",
expectedCursor: 5,
expectedClipboard: "def ",
2021-10-18 20:45:39 +09:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("abc def\nghi")
textarea.BackSpaceWord()
},
2022-03-28 22:22:09 +09:00
expectedContent: "abc def\n",
expectedCursor: 8,
expectedClipboard: "ghi",
2021-10-18 20:45:39 +09:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("abc def\nghi")
textarea.MoveCursorLeft()
textarea.MoveCursorLeft()
textarea.MoveCursorLeft()
textarea.BackSpaceWord()
},
2022-03-28 22:22:09 +09:00
expectedContent: "abc defghi",
expectedCursor: 7,
2022-03-29 20:37:12 +09:00
expectedClipboard: "",
2021-10-18 20:45:39 +09:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeString(`abc(def)`)
textarea.BackSpaceWord()
},
2022-03-28 22:22:09 +09:00
expectedContent: "abc(def",
expectedCursor: 7,
expectedClipboard: ")",
2021-10-18 20:45:39 +09:00
},
{
actions: func(textarea *TextArea) {
textarea.TypeString(`abc(def`)
textarea.BackSpaceWord()
},
2022-03-28 22:22:09 +09:00
expectedContent: "abc(",
expectedCursor: 4,
expectedClipboard: "def",
},
2022-03-29 20:30:21 +09:00
{
actions: func(textarea *TextArea) {
textarea.TypeString(`abc`)
textarea.GoToStartOfLine()
textarea.BackSpaceWord()
},
expectedContent: "abc",
expectedCursor: 0,
expectedClipboard: "",
},
2022-03-28 22:22:09 +09:00
{
actions: func(textarea *TextArea) {
textarea.TypeString(`abc`)
textarea.Yank()
},
expectedContent: "abc",
expectedCursor: 3,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString(`abc def`)
textarea.DeleteToStartOfLine()
textarea.Yank()
textarea.Yank()
},
expectedContent: "abc defabc def",
expectedCursor: 14,
expectedClipboard: "abc def",
},
2022-03-28 22:51:17 +09:00
{
actions: func(textarea *TextArea) {
textarea.TypeString("abc\ndef")
textarea.MoveCursorLeft()
textarea.MoveCursorLeft()
textarea.MoveCursorUp()
textarea.DeleteToEndOfLine()
},
expectedContent: "a\ndef",
expectedCursor: 1,
expectedClipboard: "bc",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("abc\ndef")
textarea.MoveCursorUp()
textarea.DeleteToEndOfLine()
},
expectedContent: "abcdef",
expectedCursor: 3,
2022-03-29 20:37:12 +09:00
expectedClipboard: "",
2022-03-28 22:51:17 +09:00
},
2022-03-28 22:22:09 +09:00
{
actions: func(textarea *TextArea) {
textarea.TypeString(`abc def`)
textarea.BackSpaceWord()
textarea.Yank()
textarea.Yank()
},
expectedContent: "abc defdef",
expectedCursor: 10,
expectedClipboard: "def",
2021-10-18 20:45:39 +09:00
},
2022-03-28 22:51:17 +09:00
{
actions: func(textarea *TextArea) {
textarea.TypeString(`abc def`)
textarea.MoveCursorLeft()
textarea.MoveCursorLeft()
textarea.DeleteToEndOfLine()
textarea.Yank()
textarea.Yank()
},
expectedContent: "abc defef",
expectedCursor: 9,
expectedClipboard: "ef",
},
2021-10-17 14:52:23 +11:00
}
for _, test := range tests {
textarea := &TextArea{}
test.actions(textarea)
assert.EqualValues(t, test.expectedContent, textarea.GetContent())
assert.EqualValues(t, test.expectedCursor, textarea.cursor)
2022-03-28 22:22:09 +09:00
assert.EqualValues(t, test.expectedClipboard, textarea.clipboard)
2021-10-17 14:52:23 +11:00
}
}
func TestGetCursorXY(t *testing.T) {
tests := []struct {
actions func(*TextArea)
expectedX int
expectedY int
}{
{
actions: func(textarea *TextArea) {
// do nothing
},
expectedX: 0,
expectedY: 0,
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("ab\ncd")
},
expectedX: 2,
expectedY: 1,
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("ab\n\n")
},
expectedX: 0,
expectedY: 2,
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('漢')
textarea.TypeRune('字')
},
expectedX: 4,
expectedY: 0,
},
}
for _, test := range tests {
textarea := &TextArea{}
test.actions(textarea)
x, y := textarea.GetCursorXY()
assert.EqualValues(t, test.expectedX, x)
assert.EqualValues(t, test.expectedY, y)
}
}