widget: test cursor motion in all editor permutations

This commit adds a testcase to catch unexpected panics in the
editor's scroll offset logic introduced by using different
setting combinations that affect editor layout. It also fixes
a panic for single-line editors with alignments other than
text.Start.

Signed-off-by: Chris Waldon <christopher.waldon.dev@gmail.com>
This commit is contained in:
Chris Waldon
2022-02-10 17:41:18 -05:00
committed by Elias Naur
parent ce116abded
commit 9e23412a01
2 changed files with 35 additions and 1 deletions
+1 -1
View File
@@ -644,7 +644,7 @@ func (e *Editor) layout(gtx layout.Context, content layout.Widget) layout.Dimens
var scrollRange image.Rectangle
if e.SingleLine {
scrollRange.Min.X = -e.scrollOff.X
scrollRange.Min.X = min(-e.scrollOff.X, 0)
scrollRange.Max.X = max(0, e.dims.Size.X-(e.scrollOff.X+e.viewSize.X))
} else {
scrollRange.Min.Y = -e.scrollOff.Y
+34
View File
@@ -27,6 +27,40 @@ import (
"golang.org/x/image/math/fixed"
)
func TestEditorConfigurations(t *testing.T) {
gtx := layout.Context{
Ops: new(op.Ops),
Constraints: layout.Exact(image.Pt(100, 100)),
}
cache := text.NewCache(gofont.Collection())
fontSize := unit.Px(10)
font := text.Font{}
sentence := "the quick brown fox jumps over the lazy dog"
runes := len([]rune(sentence))
// Ensure that both ends of the text are reachable in all permutations
// of settings that influence layout.
for _, lineMode := range []bool{true, false} {
for _, alignment := range []text.Alignment{text.Start, text.Middle, text.End} {
t.Run(fmt.Sprintf("SingleLine: %v Alignment: %v", lineMode, alignment), func(t *testing.T) {
defer func() {
if err := recover(); err != nil {
t.Error(err)
}
}()
e := new(Editor)
e.SingleLine = lineMode
e.Alignment = alignment
e.SetText(sentence)
e.SetCaret(0, 0)
e.Layout(gtx, cache, font, fontSize, nil)
e.SetCaret(runes, runes)
e.Layout(gtx, cache, font, fontSize, nil)
})
}
}
}
func TestEditor(t *testing.T) {
e := new(Editor)
gtx := layout.Context{