go-prompt/document_test.go

593 lines
12 KiB
Go
Raw Normal View History

2017-07-03 15:54:43 +00:00
package prompt
import (
"reflect"
"testing"
"unicode/utf8"
)
func TestDocument_GetCharRelativeToCursor(t *testing.T) {
d := &Document{
Text: "line 1\nline 2\nline 3\nline 4\n",
CursorPosition: len([]rune("line 1\n" + "lin")),
}
ac := d.GetCharRelativeToCursor(1)
ex, _ := utf8.DecodeRuneInString("e")
if ac != ex {
t.Errorf("Should be %#v, got %#v", ex, ac)
}
}
func TestDocument_TextBeforeCursor(t *testing.T) {
d := &Document{
Text: "line 1\nline 2\nline 3\nline 4\n",
CursorPosition: len("line 1\n" + "lin"),
}
ac := d.TextBeforeCursor()
ex := "line 1\nlin"
if ac != ex {
t.Errorf("Should be %#v, got %#v", ex, ac)
}
}
func TestDocument_TextAfterCursor(t *testing.T) {
2017-07-15 13:23:47 +00:00
pattern := []struct {
2017-07-09 14:16:08 +00:00
document *Document
expected string
2017-07-15 13:23:47 +00:00
}{
2017-07-09 14:16:08 +00:00
{
document: &Document{
Text: "line 1\nline 2\nline 3\nline 4\n",
CursorPosition: len("line 1\n" + "lin"),
},
expected: "e 2\nline 3\nline 4\n",
},
{
document: &Document{
Text: "",
CursorPosition: 0,
},
expected: "",
},
2017-07-03 15:54:43 +00:00
}
2017-07-09 14:16:08 +00:00
for _, p := range pattern {
ac := p.document.TextAfterCursor()
if ac != p.expected {
t.Errorf("Should be %#v, got %#v", p.expected, ac)
}
2017-07-03 15:54:43 +00:00
}
}
func TestDocument_GetWordBeforeCursor(t *testing.T) {
2017-07-15 13:23:47 +00:00
pattern := []struct {
2017-07-09 14:16:08 +00:00
document *Document
expected string
2017-07-15 13:23:47 +00:00
}{
2017-07-09 14:16:08 +00:00
{
document: &Document{
Text: "apple bana",
CursorPosition: len("apple bana"),
},
expected: "bana",
},
{
document: &Document{
Text: "apple ",
CursorPosition: len("apple "),
},
expected: "",
},
2017-07-03 15:54:43 +00:00
}
2017-07-09 14:16:08 +00:00
for _, p := range pattern {
ac := p.document.GetWordBeforeCursor()
if ac != p.expected {
t.Errorf("Should be %#v, got %#v", p.expected, ac)
}
2017-07-03 15:54:43 +00:00
}
}
2018-04-11 12:55:49 +00:00
func TestDocument_GetWordAfterCursor(t *testing.T) {
pattern := []struct {
document *Document
expected string
}{
{
document: &Document{
Text: "apple bana",
CursorPosition: len("apple bana"),
},
expected: "",
},
{
document: &Document{
Text: "apple bana",
CursorPosition: len("apple "),
},
expected: "bana",
},
{
document: &Document{
Text: "apple bana",
CursorPosition: len("apple"),
},
expected: "",
},
{
document: &Document{
Text: "apple bana",
CursorPosition: len("ap"),
},
expected: "ple",
},
}
for k, p := range pattern {
ac := p.document.GetWordAfterCursor()
if ac != p.expected {
t.Errorf("[%d]Should be %#v, got %#v", k, p.expected, ac)
}
}
}
2017-08-16 09:15:37 +00:00
func TestDocument_GetWordBeforeCursorWithSpace(t *testing.T) {
pattern := []struct {
document *Document
expected string
}{
{
document: &Document{
Text: "apple bana ",
CursorPosition: len("apple bana "),
},
expected: "bana ",
},
{
document: &Document{
Text: "apple ",
CursorPosition: len("apple "),
},
expected: "apple ",
},
}
for _, p := range pattern {
ac := p.document.GetWordBeforeCursorWithSpace()
if ac != p.expected {
t.Errorf("Should be %#v, got %#v", p.expected, ac)
}
}
}
2018-04-11 12:55:49 +00:00
func TestDocument_GetWordAfterCursorWithSpace(t *testing.T) {
pattern := []struct {
document *Document
expected string
}{
{
document: &Document{
Text: "apple bana",
CursorPosition: len("apple bana"),
},
expected: "",
},
{
document: &Document{
Text: "apple bana",
CursorPosition: len("apple "),
},
expected: "bana",
},
{
document: &Document{
Text: "apple bana",
CursorPosition: len("apple"),
},
expected: " bana",
},
{
document: &Document{
Text: "apple bana",
CursorPosition: len("ap"),
},
expected: "ple",
},
}
for k, p := range pattern {
ac := p.document.GetWordAfterCursorWithSpace()
if ac != p.expected {
t.Errorf("[%d]Should be %#v, got %#v", k, p.expected, ac)
}
}
}
2017-07-03 15:54:43 +00:00
func TestDocument_FindStartOfPreviousWord(t *testing.T) {
2017-07-15 13:23:47 +00:00
pattern := []struct {
2017-07-09 14:16:08 +00:00
document *Document
expected int
2017-07-15 13:23:47 +00:00
}{
2017-07-09 14:16:08 +00:00
{
document: &Document{
Text: "apple bana",
CursorPosition: len("apple bana"),
},
expected: len("apple "),
},
{
document: &Document{
Text: "apple ",
CursorPosition: len("apple "),
},
expected: len("apple "),
},
2017-07-03 15:54:43 +00:00
}
2017-07-09 14:16:08 +00:00
for _, p := range pattern {
ac := p.document.FindStartOfPreviousWord()
if ac != p.expected {
t.Errorf("Should be %#v, got %#v", p.expected, ac)
}
2017-07-03 15:54:43 +00:00
}
}
2018-04-11 12:55:49 +00:00
func TestDocument_FindEndOfCurrentWord(t *testing.T) {
pattern := []struct {
document *Document
expected int
}{
{
document: &Document{
Text: "apple bana",
CursorPosition: len("apple bana"),
},
expected: len(""),
},
{
document: &Document{
Text: "apple bana",
CursorPosition: len("apple "),
},
expected: len("bana"),
},
{
document: &Document{
Text: "apple bana",
CursorPosition: len("apple"),
},
expected: len(""),
},
{
document: &Document{
Text: "apple bana",
CursorPosition: len("ap"),
},
expected: len("ple"),
},
}
for k, p := range pattern {
ac := p.document.FindEndOfCurrentWord()
if ac != p.expected {
t.Errorf("[%d]Should be %#v, got %#v", k, p.expected, ac)
}
}
}
2017-08-16 09:15:37 +00:00
func TestDocument_FindStartOfPreviousWordWithSpace(t *testing.T) {
pattern := []struct {
document *Document
expected int
}{
{
document: &Document{
Text: "apple bana ",
CursorPosition: len("apple bana "),
},
expected: len("apple "),
},
{
document: &Document{
Text: "apple ",
CursorPosition: len("apple "),
},
expected: len(""),
},
}
for _, p := range pattern {
ac := p.document.FindStartOfPreviousWordWithSpace()
if ac != p.expected {
t.Errorf("Should be %#v, got %#v", p.expected, ac)
}
}
}
2018-04-11 12:55:49 +00:00
func TestDocument_FindEndOfCurrentWordWithSpace(t *testing.T) {
pattern := []struct {
document *Document
expected int
}{
{
document: &Document{
Text: "apple bana",
CursorPosition: len("apple bana"),
},
expected: len(""),
},
{
document: &Document{
Text: "apple bana",
CursorPosition: len("apple "),
},
expected: len("bana"),
},
{
document: &Document{
Text: "apple bana",
CursorPosition: len("apple"),
},
expected: len(" bana"),
},
{
document: &Document{
Text: "apple bana",
CursorPosition: len("ap"),
},
expected: len("ple"),
},
}
for k, p := range pattern {
ac := p.document.FindEndOfCurrentWordWithSpace()
if ac != p.expected {
t.Errorf("[%d]Should be %#v, got %#v", k, p.expected, ac)
}
}
}
2017-07-03 15:54:43 +00:00
func TestDocument_CurrentLineBeforeCursor(t *testing.T) {
d := &Document{
Text: "line 1\nline 2\nline 3\nline 4\n",
CursorPosition: len("line 1\n" + "lin"),
}
ac := d.CurrentLineBeforeCursor()
ex := "lin"
if ac != ex {
t.Errorf("Should be %#v, got %#v", ex, ac)
}
}
func TestDocument_CurrentLineAfterCursor(t *testing.T) {
d := &Document{
Text: "line 1\nline 2\nline 3\nline 4\n",
CursorPosition: len("line 1\n" + "lin"),
}
ac := d.CurrentLineAfterCursor()
ex := "e 2"
if ac != ex {
t.Errorf("Should be %#v, got %#v", ex, ac)
}
}
func TestDocument_CurrentLine(t *testing.T) {
d := &Document{
Text: "line 1\nline 2\nline 3\nline 4\n",
CursorPosition: len("line 1\n" + "lin"),
}
ac := d.CurrentLine()
ex := "line 2"
if ac != ex {
t.Errorf("Should be %#v, got %#v", ex, ac)
}
}
// Table Driven Tests for CursorPositionRow and CursorPositionCol
type cursorPositionTest struct {
document *Document
expectedRow int
expectedCol int
}
var cursorPositionTests = []cursorPositionTest{
{
document: &Document{Text: "line 1\nline 2\nline 3\n", CursorPosition: len("line 1\n" + "lin")},
expectedRow: 1,
expectedCol: 3,
},
{
document: &Document{Text: "", CursorPosition: 0},
expectedRow: 0,
expectedCol: 0,
},
}
func TestDocument_CursorPositionRowAndCol(t *testing.T) {
for _, test := range cursorPositionTests {
ac := test.document.CursorPositionRow()
if ac != test.expectedRow {
t.Errorf("Should be %#v, got %#v", test.expectedRow, ac)
}
ac = test.document.CursorPositionCol()
if ac != test.expectedCol {
t.Errorf("Should be %#v, got %#v", test.expectedCol, ac)
}
}
}
func TestDocument_GetCursorLeftPosition(t *testing.T) {
d := &Document{
Text: "line 1\nline 2\nline 3\nline 4\n",
CursorPosition: len("line 1\n" + "line 2\n" + "lin"),
}
ac := d.GetCursorLeftPosition(2)
ex := -2
if ac != ex {
t.Errorf("Should be %#v, got %#v", ex, ac)
}
ac = d.GetCursorLeftPosition(10)
ex = -3
if ac != ex {
t.Errorf("Should be %#v, got %#v", ex, ac)
}
}
func TestDocument_GetCursorUpPosition(t *testing.T) {
d := &Document{
Text: "line 1\nline 2\nline 3\nline 4\n",
CursorPosition: len("line 1\n" + "line 2\n" + "lin"),
}
ac := d.GetCursorUpPosition(2, -1)
ex := len("lin") - len("line 1\n"+"line 2\n"+"lin")
if ac != ex {
t.Errorf("Should be %#v, got %#v", ex, ac)
}
ac = d.GetCursorUpPosition(100, -1)
ex = len("lin") - len("line 1\n"+"line 2\n"+"lin")
if ac != ex {
t.Errorf("Should be %#v, got %#v", ex, ac)
}
}
func TestDocument_GetCursorDownPosition(t *testing.T) {
d := &Document{
Text: "line 1\nline 2\nline 3\nline 4\n",
CursorPosition: len("lin"),
}
ac := d.GetCursorDownPosition(2, -1)
ex := len("line 1\n"+"line 2\n"+"lin") - len("lin")
if ac != ex {
t.Errorf("Should be %#v, got %#v", ex, ac)
}
ac = d.GetCursorDownPosition(100, -1)
ex = len("line 1\n"+"line 2\n"+"line 3\n"+"line 4\n") - len("lin")
if ac != ex {
t.Errorf("Should be %#v, got %#v", ex, ac)
}
}
func TestDocument_GetCursorRightPosition(t *testing.T) {
d := &Document{
Text: "line 1\nline 2\nline 3\nline 4\n",
CursorPosition: len("line 1\n" + "line 2\n" + "lin"),
}
ac := d.GetCursorRightPosition(2)
ex := 2
if ac != ex {
t.Errorf("Should be %#v, got %#v", ex, ac)
}
ac = d.GetCursorRightPosition(10)
ex = 3
if ac != ex {
t.Errorf("Should be %#v, got %#v", ex, ac)
}
}
func TestDocument_Lines(t *testing.T) {
d := &Document{
Text: "line 1\nline 2\nline 3\nline 4\n",
CursorPosition: len("line 1\n" + "lin"),
}
ac := d.Lines()
ex := []string{"line 1", "line 2", "line 3", "line 4", ""}
if !reflect.DeepEqual(ac, ex) {
t.Errorf("Should be %#v, got %#v", ex, ac)
}
}
func TestDocument_LineCount(t *testing.T) {
d := &Document{
Text: "line 1\nline 2\nline 3\nline 4\n",
CursorPosition: len("line 1\n" + "lin"),
}
ac := d.LineCount()
ex := 5
if ac != ex {
t.Errorf("Should be %#v, got %#v", ex, ac)
}
}
func TestDocument_TranslateIndexToPosition(t *testing.T) {
d := &Document{
Text: "line 1\nline 2\nline 3\nline 4\n",
CursorPosition: len("line 1\n" + "lin"),
}
row, col := d.TranslateIndexToPosition(len("line 1\nline 2\nlin"))
if row != 2 {
t.Errorf("Should be %#v, got %#v", 2, row)
}
if col != 3 {
t.Errorf("Should be %#v, got %#v", 3, col)
}
row, col = d.TranslateIndexToPosition(0)
if row != 0 {
t.Errorf("Should be %#v, got %#v", 0, row)
}
if col != 0 {
t.Errorf("Should be %#v, got %#v", 0, col)
}
}
func TestDocument_TranslateRowColToIndex(t *testing.T) {
d := &Document{
Text: "line 1\nline 2\nline 3\nline 4\n",
CursorPosition: len("line 1\n" + "lin"),
}
ac := d.TranslateRowColToIndex(2, 3)
ex := len("line 1\nline 2\nlin")
if ac != ex {
t.Errorf("Should be %#v, got %#v", ex, ac)
}
ac = d.TranslateRowColToIndex(0, 0)
ex = 0
if ac != ex {
t.Errorf("Should be %#v, got %#v", ex, ac)
}
}
func TestDocument_OnLastLine(t *testing.T) {
d := &Document{
Text: "line 1\nline 2\nline 3",
CursorPosition: len("line 1\nline"),
}
ac := d.OnLastLine()
2017-08-16 04:39:59 +00:00
if ac {
2017-07-03 15:54:43 +00:00
t.Errorf("Should be %#v, got %#v", false, ac)
}
d.CursorPosition = len("line 1\nline 2\nline")
ac = d.OnLastLine()
2017-08-16 04:39:59 +00:00
if !ac {
2017-07-03 15:54:43 +00:00
t.Errorf("Should be %#v, got %#v", true, ac)
}
}
func TestDocument_GetEndOfLinePosition(t *testing.T) {
d := &Document{
Text: "line 1\nline 2\nline 3",
CursorPosition: len("line 1\nli"),
}
ac := d.GetEndOfLinePosition()
ex := len("ne 2")
if ac != ex {
t.Errorf("Should be %#v, got %#v", ex, ac)
}
}
2018-02-15 09:15:32 +00:00
func TestBisectRight(t *testing.T) {
// Thanks!! https://play.golang.org/p/y9NRj_XVIW
in := []int{1, 2, 3, 3, 3, 6, 7}
r := bisectRight(in, 0)
if r != 0 {
t.Errorf("number 0 should inserted at 0 position, but got %d", r)
}
r = bisectRight(in, 4)
if r != 5 {
t.Errorf("number 4 should inserted at 5 position, but got %d", r)
}
}