Files
MujicaUI/input/masked_input_test.go
T

128 lines
3.1 KiB
Go

package input
import (
"testing"
"github.com/egoist/mygo/ui"
"git.zacharyzhang.com/ZacharyZhang-NY/MujicaUI/core"
)
func TestMaskFormat(t *testing.T) {
for _, tc := range [][3]string{
{"(999) 999-9999", "555123", "(555) 123-____"},
{"9999 9999 9999 9999", "", "____ ____ ____ ____"},
{"aa-99", "AB12", "AB-12"},
} {
if got := MaskFormat(tc[0], tc[1]); got != tc[2] {
t.Errorf("MaskFormat(%q, %q) = %q, want %q", tc[0], tc[1], got, tc[2])
}
}
}
func maskedTester(v *string, dis *bool, n, submits *int) *ui.Tester {
return ui.NewTester(func(c *ui.Context) {
core.Use(c, core.Settings{})
r := MaskedInput(c, v, MaskedInputOptions{Mask: "(999) 999-9999", Label: "Phone", Disabled: *dis})
if r.Changed() {
*n++
}
if r.Submitted() {
*submits++
}
}, 400, 120)
}
func TestMaskedInputTypingEditingAndPaste(t *testing.T) {
v := ""
dis := false
n, submits := 0, 0
tt := maskedTester(&v, &dis, &n, &submits)
tt.Key(0, ui.KeyTab)
tt.Type("55x5-12")
if v != "55512" {
t.Fatalf("typed: %q", v)
}
tt.Key(0, ui.KeyBackspace)
tt.Key(0, ui.KeyLeft)
tt.Key(0, ui.KeyLeft)
tt.Type("9")
if v != "55951" {
t.Fatalf("insert at caret: %q", v)
}
tt.Key(0, ui.KeyHome)
tt.Key(0, ui.KeyDelete)
if v != "5951" {
t.Fatalf("Delete at start: %q", v)
}
tt.Key(0, ui.KeyEnd)
tt.SetClipboard("123-456-789")
tt.Command("paste")
if v != "5951123456" {
t.Fatalf("paste fills to the end: %q", v)
}
tt.Type("7")
if v != "5951123456" {
t.Fatalf("typed past the mask: %q", v)
}
tt.Key(0, ui.KeyEnter)
if submits != 1 || n == 0 {
t.Fatalf("submits %d changes %d", submits, n)
}
if _, ok := tt.Find("Phone"); !ok {
t.Fatal("no field name")
}
}
func TestMaskedInputCompositionAndDisabled(t *testing.T) {
v := "12"
dis := false
n, submits := 0, 0
tt := maskedTester(&v, &dis, &n, &submits)
tt.Key(0, ui.KeyTab)
tt.Compose("3", 1)
if v != "12" || !tt.HasText("3") {
t.Fatalf("composition committed early: %q", v)
}
tt.Key(0, ui.KeyBackspace) // the input method's, while composing
if v != "12" {
t.Fatalf("Backspace during composition edited: %q", v)
}
tt.Type("3")
if v != "123" {
t.Fatalf("commit: %q", v)
}
dis = true
tt.Frame()
tt.Type("4")
tt.Key(0, ui.KeyBackspace)
if v != "123" {
t.Fatalf("disabled edit: %q", v)
}
}
func TestMaskedInputRejects(t *testing.T) {
for name, tc := range map[string][2]string{"no slots": {"---", ""}, "too long": {"99", "123"}, "wrong kind": {"99", "1a"}} {
func() {
defer func() {
if recover() == nil {
t.Errorf("%s: no panic", name)
}
}()
v := tc[1]
ui.NewTester(func(c *ui.Context) { core.Use(c, core.Settings{}); MaskedInput(c, &v, MaskedInputOptions{Mask: tc[0]}) }, 200, 100)
}()
}
}
func TestMaskedInputSnapshot(t *testing.T) {
a, b, d := "5551234", "", "4111111111111111"
snapshot(t, "masked_input", 520, 80, func(c *ui.Context) {
ui.Row(c).Padding(16).Gap(12).Children(func() {
MaskedInput(c, &a, MaskedInputOptions{Mask: "(999) 999-9999"}).Element.Width(160)
MaskedInput(c, &b, MaskedInputOptions{Mask: "99/99/9999"}).Element.Width(130)
MaskedInput(c, &d, MaskedInputOptions{Mask: "9999 9999 9999 9999", Disabled: true}).Element.Width(190)
})
})
}