Files
MujicaUI/toolbar_test.go
T

106 lines
2.9 KiB
Go

package mujica
import (
"slices"
"testing"
"github.com/egoist/mygo/ui"
"mujicaui/icons"
)
type toolbarLog struct{ clicks []string }
func (l *toolbarLog) view(width float32) func(c *ui.Context) {
return func(c *ui.Context) {
ui.Column(c).Width(width).Children(func() {
Toolbar(c, ToolbarOptions{Label: "Format"}, func() {
ToolbarGroup(c, func() {
for _, n := range []string{"Bold", "Italic", "Underline"} {
if ToolbarButton(c, n, ToolbarButtonOptions{Icon: icons.Must(map[string]string{"Bold": "bold", "Italic": "italic", "Underline": "underline"}[n])}).Clicked() {
l.clicks = append(l.clicks, n)
}
}
})
ToolbarSeparator(c)
if ToolbarButton(c, "Copy", ToolbarButtonOptions{Icon: icons.Must("copy"), ShowLabel: true}).Clicked() {
l.clicks = append(l.clicks, "Copy")
}
if ToolbarButton(c, "Delete", ToolbarButtonOptions{Icon: icons.Must("trash-2"), Disabled: true}).Clicked() {
l.clicks = append(l.clicks, "Delete")
}
if ToolbarButton(c, "Share", ToolbarButtonOptions{}).Clicked() {
l.clicks = append(l.clicks, "Share")
}
})
})
}
}
func TestToolbarClickAndArrows(t *testing.T) {
l := &toolbarLog{}
tt := ui.NewTester(func(c *ui.Context) { Use(c, Settings{}); l.view(600)(c) }, 700, 100)
if err := tt.Click("Italic"); err != nil {
t.Fatal(err)
}
tt.Key(0, ui.KeyRight) // from Italic to Underline
tt.Key(0, ui.KeyRight) // Copy
tt.Key(0, ui.KeyRight) // Share, skipping disabled Delete
tt.Key(0, ui.KeyEnter)
tt.Key(0, ui.KeyHome)
tt.Key(0, ui.KeySpace)
_ = tt.Click("Delete")
if want := []string{"Italic", "Share", "Bold"}; !slices.Equal(l.clicks, want) {
t.Fatalf("clicks %q, want %q", l.clicks, want)
}
}
func TestToolbarOverflow(t *testing.T) {
l := &toolbarLog{}
// The snapshot's layout: MyGo caches the overflow chevrons by position.
tt := ui.NewTester(func(c *ui.Context) {
Use(c, Settings{})
ui.Column(c).Padding(16).Gap(16).Children(func() { l.view(180)(c) })
}, 520, 300)
tt.Frame()
if r, ok := tt.Find("Share"); ok && r.W > 0 {
t.Fatalf("Share should overflow, at %+v", r)
}
if err := tt.Click("More"); err != nil {
t.Fatal(err)
}
menu := tt.Menu()
if !slices.Contains(menu, "Share") || !slices.Contains(menu, "Copy") {
t.Fatalf("overflow menu %q", menu)
}
if err := tt.ChooseMenuItem("Share"); err != nil {
t.Fatal(err)
}
tt.Frame()
if !slices.Equal(l.clicks, []string{"Share"}) {
t.Fatalf("overflow choice clicked %q", l.clicks)
}
}
func TestToolbarButtonNeedsLabel(t *testing.T) {
defer func() {
if recover() == nil {
t.Fatal("no panic")
}
}()
ui.Render(func(c *ui.Context) {
Use(c, Settings{})
ToolbarButton(c, "", ToolbarButtonOptions{Icon: icons.Must("copy")})
}, 200, 100, 1)
}
func TestToolbarSnapshot(t *testing.T) {
l := &toolbarLog{}
snapshot(t, "toolbar", 520, 140, func(c *ui.Context) {
ui.Column(c).Padding(16).Gap(16).Children(func() {
l.view(180)(c)
l.view(420)(c)
})
})
}