gocui/text_area_test.go

735 lines
16 KiB
Go

package gocui
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestTextArea(t *testing.T) {
tests := []struct {
actions func(*TextArea)
expectedContent string
expectedCursor int
expectedClipboard string
}{
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.TypeRune('c')
},
expectedContent: "abc",
expectedCursor: 3,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('\n')
textarea.TypeRune('c')
},
expectedContent: "a\nc",
expectedCursor: 3,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("abcd")
},
expectedContent: "abcd",
expectedCursor: 4,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("a字cd")
},
expectedContent: "a字cd",
expectedCursor: 4,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.BackSpaceChar()
},
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.BackSpaceChar()
},
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.BackSpaceChar()
},
expectedContent: "a",
expectedCursor: 1,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.DeleteChar()
},
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.DeleteChar()
},
expectedContent: "a",
expectedCursor: 1,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.MoveCursorLeft()
textarea.DeleteChar()
},
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.TypeRune('c')
textarea.MoveCursorLeft()
textarea.MoveCursorLeft()
textarea.DeleteChar()
},
expectedContent: "ac",
expectedCursor: 1,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.MoveCursorLeft()
},
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.MoveCursorLeft()
},
expectedContent: "a",
expectedCursor: 0,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.MoveCursorLeft()
},
expectedContent: "ab",
expectedCursor: 1,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.MoveCursorRight()
},
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.MoveCursorRight()
},
expectedContent: "a",
expectedCursor: 1,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.MoveCursorLeft()
textarea.MoveCursorRight()
},
expectedContent: "ab",
expectedCursor: 2,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('漢')
textarea.TypeRune('字')
textarea.MoveCursorLeft()
},
expectedContent: "漢字",
expectedCursor: 1,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.ToggleOverwrite()
textarea.TypeRune('a')
textarea.TypeRune('b')
},
expectedContent: "ab",
expectedCursor: 2,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.TypeRune('c')
textarea.MoveCursorLeft()
textarea.MoveCursorLeft()
textarea.ToggleOverwrite()
textarea.TypeRune('d')
},
expectedContent: "adc",
expectedCursor: 2,
expectedClipboard: "",
},
{
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,
},
{
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')
},
expectedContent: "abcd",
expectedCursor: 4,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.DeleteToStartOfLine()
},
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.DeleteToStartOfLine()
},
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "ab",
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.MoveCursorLeft()
textarea.MoveCursorLeft()
textarea.DeleteToStartOfLine()
},
expectedContent: "ab",
expectedCursor: 0,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.TypeRune('\n')
textarea.DeleteToStartOfLine()
},
expectedContent: "ab",
expectedCursor: 2,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.TypeRune('\n')
textarea.TypeRune('c')
textarea.TypeRune('d')
textarea.DeleteToStartOfLine()
},
expectedContent: "ab\n",
expectedCursor: 3,
expectedClipboard: "cd",
},
{
actions: func(textarea *TextArea) {
textarea.GoToStartOfLine()
},
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.MoveCursorLeft()
textarea.GoToStartOfLine()
},
expectedContent: "a",
expectedCursor: 0,
expectedClipboard: "",
},
{
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()
},
expectedContent: "ab\ncd",
expectedCursor: 0,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeRune('a')
textarea.TypeRune('b')
textarea.TypeRune('\n')
textarea.TypeRune('c')
textarea.TypeRune('d')
textarea.GoToStartOfLine()
},
expectedContent: "ab\ncd",
expectedCursor: 3,
expectedClipboard: "",
},
{
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()
},
expectedContent: "ab\ncd",
expectedCursor: 3,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.GoToEndOfLine()
},
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
},
{
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()
},
expectedContent: "ab\ncd",
expectedCursor: 5,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.SetCursor2D(10, 10)
},
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.SetCursor2D(-1, -1)
},
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("ab\ncd")
textarea.SetCursor2D(0, 0)
},
expectedContent: "ab\ncd",
expectedCursor: 0,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("ab\ncd")
textarea.SetCursor2D(2, 0)
},
expectedContent: "ab\ncd",
expectedCursor: 2,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("ab\ncd\nef")
textarea.SetCursor2D(2, 1)
},
expectedContent: "ab\ncd\nef",
expectedCursor: 5,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("abcd\n\nijkl")
textarea.MoveCursorUp()
},
expectedContent: "abcd\n\nijkl",
expectedCursor: 5,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("abcdef\n老老老")
textarea.MoveCursorLeft()
textarea.MoveCursorUp()
},
expectedContent: "abcdef\n老老老",
expectedCursor: 4,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("abcdef\n老老老")
textarea.MoveCursorUp()
textarea.MoveCursorLeft()
textarea.MoveCursorLeft()
textarea.MoveCursorLeft()
textarea.MoveCursorDown()
},
expectedContent: "abcdef\n老老老",
expectedCursor: 9,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("abcd\nef")
textarea.MoveCursorUp()
textarea.GoToEndOfLine()
textarea.MoveCursorDown()
},
expectedContent: "abcd\nef",
expectedCursor: 7,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("abcd")
textarea.MoveCursorUp()
},
expectedContent: "abcd",
expectedCursor: 4,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString(`abcdefg`)
textarea.Clear()
},
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString(`abcdefg`)
textarea.Clear()
},
expectedContent: "",
expectedCursor: 0,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString(`abc def`)
textarea.MoveCursorLeft()
textarea.BackSpaceWord()
},
expectedContent: "abc f",
expectedCursor: 4,
expectedClipboard: "de",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString(`abc def `)
textarea.BackSpaceWord()
},
expectedContent: "abc ",
expectedCursor: 5,
expectedClipboard: "def ",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("abc def\nghi")
textarea.BackSpaceWord()
},
expectedContent: "abc def\n",
expectedCursor: 8,
expectedClipboard: "ghi",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString("abc def\nghi")
textarea.MoveCursorLeft()
textarea.MoveCursorLeft()
textarea.MoveCursorLeft()
textarea.BackSpaceWord()
},
expectedContent: "abc defghi",
expectedCursor: 7,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString(`abc(def)`)
textarea.BackSpaceWord()
},
expectedContent: "abc(def",
expectedCursor: 7,
expectedClipboard: ")",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString(`abc(def`)
textarea.BackSpaceWord()
},
expectedContent: "abc(",
expectedCursor: 4,
expectedClipboard: "def",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString(`abc`)
textarea.GoToStartOfLine()
textarea.BackSpaceWord()
},
expectedContent: "abc",
expectedCursor: 0,
expectedClipboard: "",
},
{
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",
},
{
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,
expectedClipboard: "",
},
{
actions: func(textarea *TextArea) {
textarea.TypeString(`abc def`)
textarea.BackSpaceWord()
textarea.Yank()
textarea.Yank()
},
expectedContent: "abc defdef",
expectedCursor: 10,
expectedClipboard: "def",
},
{
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",
},
}
for _, test := range tests {
textarea := &TextArea{}
test.actions(textarea)
assert.EqualValues(t, test.expectedContent, textarea.GetContent())
assert.EqualValues(t, test.expectedCursor, textarea.cursor)
assert.EqualValues(t, test.expectedClipboard, textarea.clipboard)
}
}
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)
}
}