Files
MujicaUI/input/multi_select_test.go
T

144 lines
3.6 KiB
Go

package input
import (
"slices"
"testing"
"github.com/egoist/mygo/ui"
"github.com/ZacharyZhang-NY/MujicaUI/core"
)
var multiSelectTestOptions = []SelectOption[int]{
{Value: 1, Label: "Rose"},
{Value: 2, Label: "Lily"},
{Value: 3, Label: "Iris"},
{Value: 4, Label: "Violet", Disabled: true},
{Value: 5, Label: "Lilac"},
}
func multiSelectTester(values *[]int, opts MultiSelectOptions, changes *int) *ui.Tester {
return ui.NewTester(func(c *ui.Context) {
core.Use(c, core.Settings{})
ui.Column(c).Padding(10).Children(func() {
if MultiSelect(c, values, multiSelectTestOptions, opts).Changed() {
*changes++
}
})
}, 500, 500)
}
func TestMultiSelectCheckAndRemove(t *testing.T) {
var values []int
changes := 0
tt := multiSelectTester(&values, MultiSelectOptions{Label: "Flowers"}, &changes)
if err := tt.Click("Select…"); err != nil {
t.Fatal(err)
}
_ = tt.Click("Iris")
_ = tt.Click("Rose")
_ = tt.Click("Violet")
if !slices.Equal(values, []int{3, 1}) || changes != 2 {
t.Fatalf("values %v changes %d", values, changes)
}
tt.Key(0, ui.KeyEscape)
if tt.HasText("Lily") {
t.Fatal("Escape did not close")
}
if err := tt.Click("Remove Iris"); err != nil {
t.Fatal(err)
}
if !slices.Equal(values, []int{1}) {
t.Fatalf("after remove %v", values)
}
}
func TestMultiSelectSearchAndSelectAll(t *testing.T) {
var values []int
changes := 0
tt := multiSelectTester(&values, MultiSelectOptions{}, &changes)
_ = tt.Click("Select…")
tt.Type("li")
if tt.HasText("Rose") || !tt.HasText("Lily") || !tt.HasText("Lilac") {
t.Fatalf("filter shows %v", tt.Texts())
}
_ = tt.Click("Select all")
if !slices.Equal(values, []int{2, 5}) {
t.Fatalf("select all of matches: %v", values)
}
_ = tt.Click("Select all")
if len(values) != 0 {
t.Fatalf("second select all left %v", values)
}
_ = tt.Click("Search")
tt.Type("zz")
if !tt.HasText("No results") {
t.Fatal("no-results state missing")
}
}
func TestMultiSelectLimit(t *testing.T) {
values := []int{1}
changes := 0
tt := multiSelectTester(&values, MultiSelectOptions{Max: 2}, &changes)
_ = tt.Click("Rose")
_ = tt.Click("Select all")
if !slices.Equal(values, []int{1, 2}) {
t.Fatalf("select all past limit: %v", values)
}
if !tt.HasText("2 of 2 chosen") {
t.Fatal("limit note missing")
}
_ = tt.Click("Lilac")
if len(values) != 2 {
t.Fatalf("limit broken: %v", values)
}
}
func TestMultiSelectKeyboard(t *testing.T) {
var values []int
changes := 0
tt := multiSelectTester(&values, MultiSelectOptions{Label: "Flowers"}, &changes)
tt.Key(0, ui.KeyTab)
tt.Key(0, ui.KeyEnter)
if !tt.Focused("Search") {
t.Fatal("search not focused on open")
}
tt.Key(0, ui.KeyDown)
tt.Key(0, ui.KeyDown)
tt.Key(0, ui.KeySpace)
tt.Key(0, ui.KeyDown)
tt.Key(0, ui.KeySpace)
if !slices.Equal(values, []int{1, 2}) {
t.Fatalf("values %v", values)
}
tt.Key(0, ui.KeyEscape)
if !tt.Focused("Flowers") {
t.Fatal("focus did not return to the field")
}
tt.Key(0, ui.KeyBackspace)
if !slices.Equal(values, []int{1}) {
t.Fatalf("Backspace left %v", values)
}
}
func TestMultiSelectCollapsesTags(t *testing.T) {
values := []int{1, 2, 3, 5}
changes := 0
tt := multiSelectTester(&values, MultiSelectOptions{MaxTags: 2}, &changes)
if !tt.HasText("+2") || tt.HasText("Iris") {
t.Fatalf("texts %v", tt.Texts())
}
}
func TestMultiSelectSnapshot(t *testing.T) {
snapshot(t, "multi_select", 460, 110, func(c *ui.Context) {
var none []int
some := []int{1, 2, 3, 5}
ui.Row(c).Padding(20).Gap(16).Children(func() {
MultiSelect(c, &none, multiSelectTestOptions, MultiSelectOptions{})
MultiSelect(c, &some, multiSelectTestOptions, MultiSelectOptions{MaxTags: 2})
})
})
}