package vimkeys import ( "testing" ) func TestKeyString(t *testing.T) { tests := []struct { name string key Key want string }{ {name: "letter", key: Key{Sym: "j"}, want: "j"}, {name: "shift letter", key: Key{Sym: "j", Mods: ModShift}, want: "J"}, {name: "ctrl letter", key: Key{Sym: "d", Mods: ModCtrl}, want: ""}, {name: "ctrl plus", key: Key{Sym: "+", Mods: ModCtrl}, want: ""}, {name: "bare plus", key: Key{Sym: "+"}, want: ""}, {name: "shift glyph", key: Key{Sym: "!"}, want: "!"}, {name: "special CR", key: Key{Sym: "CR"}, want: ""}, {name: "special Esc", key: Key{Sym: "Esc"}, want: ""}, {name: "special Space", key: Key{Sym: "Space"}, want: ""}, {name: "special Tab", key: Key{Sym: "Tab"}, want: ""}, {name: "special BackSpace", key: Key{Sym: "BackSpace"}, want: ""}, {name: "special Delete", key: Key{Sym: "Delete"}, want: ""}, {name: "special Left", key: Key{Sym: "Left"}, want: ""}, {name: "special Right", key: Key{Sym: "Right"}, want: ""}, {name: "special Up", key: Key{Sym: "Up"}, want: ""}, {name: "special Down", key: Key{Sym: "Down"}, want: ""}, {name: "special Home", key: Key{Sym: "Home"}, want: ""}, {name: "special End", key: Key{Sym: "End"}, want: ""}, {name: "special PageUp", key: Key{Sym: "PageUp"}, want: ""}, {name: "special PageDown", key: Key{Sym: "PageDown"}, want: ""}, {name: "ctrl Tab", key: Key{Sym: "Tab", Mods: ModCtrl}, want: ""}, {name: "shift BackSpace", key: Key{Sym: "BackSpace", Mods: ModShift}, want: ""}, {name: "alt Delete", key: Key{Sym: "Delete", Mods: ModAlt}, want: ""}, {name: "ctrl Left", key: Key{Sym: "Left", Mods: ModCtrl}, want: ""}, {name: "literal lt", key: Key{Sym: "<"}, want: ""}, {name: "literal gt", key: Key{Sym: ">"}, want: ""}, {name: "ctrl gt", key: Key{Sym: ">", Mods: ModCtrl}, want: ""}, {name: "alt only", key: Key{Sym: "b", Mods: ModAlt}, want: ""}, {name: "ctrl alt", key: Key{Sym: "c", Mods: ModCtrl | ModAlt}, want: ""}, {name: "ctrl shift", key: Key{Sym: "a", Mods: ModCtrl | ModShift}, want: ""}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := tt.key.String(); got != tt.want { t.Errorf("Key.String() = %q, want %q", got, tt.want) } }) } } func TestSequenceString(t *testing.T) { tests := []struct { name string seq Sequence want string }{ {name: "yah", seq: Sequence{{Sym: "y"}, {Sym: "a"}, {Sym: "h"}}, want: "yah"}, {name: "double bracket", seq: Sequence{{Sym: "]"}, {Sym: "]"}}, want: "]]"}, {name: "gO", seq: Sequence{{Sym: "g"}, {Sym: "o", Mods: ModShift}}, want: "gO"}, {name: "esc collision", seq: Sequence{{Sym: "e"}, {Sym: "s"}, {Sym: "c"}}, want: "sc"}, {name: "enter collision", seq: Sequence{{Sym: "e"}, {Sym: "n"}, {Sym: "t"}, {Sym: "e"}, {Sym: "r"}}, want: "nter"}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := tt.seq.String(); got != tt.want { t.Errorf("Sequence.String() = %q, want %q", got, tt.want) } }) } } func TestSequenceEqual(t *testing.T) { a := Sequence{{Sym: "j"}, {Sym: "k"}} b := Sequence{{Sym: "j"}, {Sym: "k"}} c := Sequence{{Sym: "j"}} if !a.Equal(b) { t.Fatal("equal sequences reported unequal") } if a.Equal(c) { t.Fatal("unequal length sequences reported equal") } if a.Equal(Sequence{{Sym: "j"}, {Sym: "x"}}) { t.Fatal("different keys reported equal") } } func TestKeyStringEmpty(t *testing.T) { if got := (Key{}).String(); got != "" { t.Fatalf("empty Key.String() = %q, want empty", got) } } func TestErrorSentinels(t *testing.T) { if ErrEmptyBinding.Error() != "vimkeys: empty binding" { t.Errorf("ErrEmptyBinding = %q, want %q", ErrEmptyBinding.Error(), "vimkeys: empty binding") } if ErrBadBinding.Error() != "vimkeys: malformed binding" { t.Errorf("ErrBadBinding = %q, want %q", ErrBadBinding.Error(), "vimkeys: malformed binding") } }