From cb57cd20e99c29391031a0bb27d1d3e099b21157 Mon Sep 17 00:00:00 2001 From: Oskar Sharipov Date: Wed, 26 Jul 2023 16:52:55 +0700 Subject: textinput: fix deleteWord with an only whitespace Fix a panic in the textinput.deleteWord when text is a whitespace symbol. Add tests for textinput. Fixes: https://todo.sr.ht/~rjarry/aerc/183 Signed-off-by: Oskar Sharipov Acked-by: Robin Jarry --- lib/ui/textinput.go | 2 +- lib/ui/textinput_test.go | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 lib/ui/textinput_test.go (limited to 'lib/ui') diff --git a/lib/ui/textinput.go b/lib/ui/textinput.go index e41cff75..dd946aec 100644 --- a/lib/ui/textinput.go +++ b/lib/ui/textinput.go @@ -220,7 +220,7 @@ func (ti *TextInput) deleteWord() { for i >= 0 && ti.text[i] == ' ' { i-- } - if strings.ContainsRune(separators, ti.text[i]) { + if i >= 0 && strings.ContainsRune(separators, ti.text[i]) { for i >= 0 && strings.ContainsRune(separators, ti.text[i]) { i-- } diff --git a/lib/ui/textinput_test.go b/lib/ui/textinput_test.go new file mode 100644 index 00000000..47a4c294 --- /dev/null +++ b/lib/ui/textinput_test.go @@ -0,0 +1,72 @@ +package ui + +import "testing" + +func TestDeleteWord(t *testing.T) { + tests := []struct { + name string + text string + expected string + }{ + { + name: "hello-world", + text: "hello world", + expected: "hello ", + }, + { + name: "empty", + text: "", + expected: "", + }, + { + name: "quoted", + text: `"hello"`, + expected: `"hello`, + }, + { + name: "hello-and-space", + text: "hello ", + expected: "", + }, + { + name: "space-and-hello", + text: " hello", + expected: " ", + }, + { + name: "only-quote", + text: `"`, + expected: "", + }, + { + name: "only-space", + text: " ", + expected: "", + }, + { + name: "space-and-quoted", + text: " 'hello", + expected: " '", + }, + { + name: "paths", + text: "foo/bar/baz", + expected: "foo/bar/", + }, + { + name: "space-and-paths", + text: " /foo", + expected: " /", + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + textinput := NewTextInput(test.text, nil) + textinput.deleteWord() + if string(textinput.text) != test.expected { + t.Errorf("word was deleted incorrectly: got %s but expected %s", string(textinput.text), test.expected) + } + }) + } +} -- cgit