diff --git a/tools/tui/readline/actions.go b/tools/tui/readline/actions.go index 11fd74f0e..837de26ea 100644 --- a/tools/tui/readline/actions.go +++ b/tools/tui/readline/actions.go @@ -11,6 +11,42 @@ import ( var _ = fmt.Print +func (self *Readline) text_upto_cursor_pos() string { + buf := strings.Builder{} + buf.Grow(1024) + for i, line := range self.lines { + if i == self.cursor_line { + buf.WriteString(line[:self.cursor_pos_in_line]) + break + } else { + buf.WriteString(line) + buf.WriteString("\n") + } + } + return buf.String() +} + +func (self *Readline) text_after_cursor_pos() string { + buf := strings.Builder{} + buf.Grow(1024) + for i, line := range self.lines { + if i == self.cursor_line { + buf.WriteString(line[self.cursor_pos_in_line:]) + buf.WriteString("\n") + } else if i > self.cursor_line { + buf.WriteString(line) + buf.WriteString("\n") + } + } + ans := buf.String() + ans = ans[:len(ans)-1] + return ans +} + +func (self *Readline) all_text() string { + return strings.Join(self.lines, "\n") +} + func (self *Readline) add_text(text string) { new_lines := make([]string, 0, len(self.lines)+4) new_lines = append(new_lines, self.lines[:self.cursor_line]...) diff --git a/tools/tui/readline/actions_test.go b/tools/tui/readline/actions_test.go new file mode 100644 index 000000000..821ef91b8 --- /dev/null +++ b/tools/tui/readline/actions_test.go @@ -0,0 +1,41 @@ +// License: GPLv3 Copyright: 2022, Kovid Goyal, + +package readline + +import ( + "fmt" + "kitty/tools/tui/loop" + "testing" +) + +var _ = fmt.Print + +func TestAddText(t *testing.T) { + lp, _ := loop.New() + + dt := func(initial string, prepare func(rl *Readline), expected ...string) { + rl := New(lp, RlInit{}) + rl.add_text(initial) + if prepare != nil { + prepare(rl) + } + if len(expected) > 0 { + if expected[0] != rl.text_upto_cursor_pos() { + t.Fatalf("Text upto cursor pos not as expected for: %#v\n%#v != %#v", initial, expected[0], rl.text_upto_cursor_pos()) + } + } + if len(expected) > 1 { + if expected[1] != rl.text_after_cursor_pos() { + t.Fatalf("Text after cursor pos not as expected for: %#v\n%#v != %#v", initial, expected[1], rl.text_after_cursor_pos()) + } + } + if len(expected) > 2 { + if expected[2] != rl.all_text() { + t.Fatalf("Text not as expected for: %#v\n%#v != %#v", initial, expected[2], rl.all_text()) + } + } + } + + dt("test", nil, "test", "", "test") + +}