github.com/aretext/aretext@v1.3.0/state/textfield_test.go (about) 1 package state 2 3 import ( 4 "fmt" 5 "strings" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 ) 10 11 func TestShowAndHideTextField(t *testing.T) { 12 testCases := []struct { 13 name string 14 fromInputMode InputMode 15 }{ 16 { 17 name: "from normal mode", 18 fromInputMode: InputModeNormal, 19 }, 20 { 21 name: "from visual mode", 22 fromInputMode: InputModeVisual, 23 }, 24 } 25 26 for _, tc := range testCases { 27 t.Run(tc.name, func(t *testing.T) { 28 state := NewEditorState(100, 100, nil, nil) 29 setInputMode(state, tc.fromInputMode) 30 emptyAction := func(_ *EditorState, _ string) error { return nil } 31 32 ShowTextField(state, "test prompt", emptyAction, nil) 33 assert.Equal(t, InputModeTextField, state.InputMode()) 34 assert.Equal(t, "test prompt", state.TextField().PromptText()) 35 assert.Equal(t, "", state.TextField().InputText()) 36 37 HideTextField(state) 38 assert.Equal(t, tc.fromInputMode, state.InputMode()) 39 assert.Equal(t, "", state.TextField().PromptText()) 40 assert.Equal(t, "", state.TextField().InputText()) 41 }) 42 } 43 } 44 45 func TestAppendRuneToTextField(t *testing.T) { 46 state := NewEditorState(100, 100, nil, nil) 47 emptyAction := func(_ *EditorState, _ string) error { return nil } 48 ShowTextField(state, "test prompt", emptyAction, nil) 49 assert.Equal(t, InputModeTextField, state.InputMode()) 50 assert.Equal(t, "test prompt", state.TextField().PromptText()) 51 52 AppendRuneToTextField(state, 'a') 53 assert.Equal(t, "a", state.TextField().InputText()) 54 AppendRuneToTextField(state, 'b') 55 assert.Equal(t, "ab", state.TextField().InputText()) 56 AppendRuneToTextField(state, 'c') 57 assert.Equal(t, "abc", state.TextField().InputText()) 58 } 59 60 func TestAppendRuneToTextFieldMaxLimit(t *testing.T) { 61 state := NewEditorState(100, 100, nil, nil) 62 emptyAction := func(_ *EditorState, _ string) error { return nil } 63 ShowTextField(state, "test prompt", emptyAction, nil) 64 65 for i := 0; i < maxTextFieldLen+5; i++ { 66 AppendRuneToTextField(state, 'x') 67 } 68 assert.Equal(t, maxTextFieldLen, len(state.TextField().InputText())) 69 } 70 71 func TestDeleteRuneFromTextField(t *testing.T) { 72 state := NewEditorState(100, 100, nil, nil) 73 emptyAction := func(_ *EditorState, _ string) error { return nil } 74 ShowTextField(state, "test prompt", emptyAction, nil) 75 assert.Equal(t, InputModeTextField, state.InputMode()) 76 assert.Equal(t, "test prompt", state.TextField().PromptText()) 77 78 AppendRuneToTextField(state, 'a') 79 AppendRuneToTextField(state, 'b') 80 AppendRuneToTextField(state, 'c') 81 82 DeleteRuneFromTextField(state) 83 assert.Equal(t, "ab", state.TextField().InputText()) 84 DeleteRuneFromTextField(state) 85 assert.Equal(t, "a", state.TextField().InputText()) 86 DeleteRuneFromTextField(state) 87 assert.Equal(t, "", state.TextField().InputText()) 88 89 // Delete from empty input is a no-op. 90 DeleteRuneFromTextField(state) 91 assert.Equal(t, "", state.TextField().InputText()) 92 } 93 94 func TestExecuteTextFieldActionSuccess(t *testing.T) { 95 state := NewEditorState(100, 100, nil, nil) 96 97 fakeAction := func(state *EditorState, inputText string) error { 98 SetStatusMsg(state, StatusMsg{ 99 Style: StatusMsgStyleSuccess, 100 Text: fmt.Sprintf("Input: %s", inputText), 101 }) 102 return nil 103 } 104 105 ShowTextField(state, "test prompt", fakeAction, nil) 106 AppendRuneToTextField(state, 'a') 107 AppendRuneToTextField(state, 'b') 108 AppendRuneToTextField(state, 'c') 109 ExecuteTextFieldAction(state) 110 111 assert.Equal(t, InputModeNormal, state.InputMode()) 112 assert.Equal(t, "", state.TextField().PromptText()) 113 assert.Equal(t, "", state.TextField().InputText()) 114 assert.Equal(t, "Input: abc", state.StatusMsg().Text) 115 } 116 117 func TestExecuteTextFieldActionError(t *testing.T) { 118 state := NewEditorState(100, 100, nil, nil) 119 errorAction := func(_ *EditorState, _ string) error { 120 return fmt.Errorf("TEST ERROR") 121 } 122 ShowTextField(state, "test prompt", errorAction, nil) 123 AppendRuneToTextField(state, 'a') 124 AppendRuneToTextField(state, 'b') 125 AppendRuneToTextField(state, 'c') 126 ExecuteTextFieldAction(state) 127 128 assert.Equal(t, InputModeTextField, state.InputMode()) 129 assert.Equal(t, "test prompt", state.TextField().PromptText()) 130 assert.Equal(t, "abc", state.TextField().InputText()) 131 assert.Equal(t, StatusMsgStyleError, state.StatusMsg().Style) 132 assert.Equal(t, "TEST ERROR", state.StatusMsg().Text) 133 } 134 135 func TestAutocompleteTextField(t *testing.T) { 136 state := NewEditorState(100, 100, nil, nil) 137 fakeAction := func(state *EditorState, inputText string) error { 138 SetStatusMsg(state, StatusMsg{ 139 Style: StatusMsgStyleSuccess, 140 Text: fmt.Sprintf("Input: %s", inputText), 141 }) 142 return nil 143 } 144 145 fakeCandidates := []string{"aa", "ab", "ba", "bb"} 146 fakeAutocompleteFunc := func(prefix string) ([]string, error) { 147 var suffixes []string 148 for _, s := range fakeCandidates { 149 if strings.HasPrefix(s, prefix) && len(prefix) < len(s) { 150 suffixes = append(suffixes, s[len(prefix):]) 151 } 152 } 153 return suffixes, nil 154 } 155 156 ShowTextField(state, "test prompt", fakeAction, fakeAutocompleteFunc) 157 assert.Equal(t, InputModeTextField, state.InputMode()) 158 assert.Equal(t, "", state.TextField().InputText()) 159 assert.Equal(t, "", state.TextField().AutocompleteSuffix()) 160 161 AutocompleteTextField(state) 162 assert.Equal(t, "", state.TextField().InputText()) 163 assert.Equal(t, "aa", state.TextField().AutocompleteSuffix()) 164 165 AutocompleteTextField(state) 166 assert.Equal(t, "", state.TextField().InputText()) 167 assert.Equal(t, "ab", state.TextField().AutocompleteSuffix()) 168 169 AutocompleteTextField(state) 170 assert.Equal(t, "", state.TextField().InputText()) 171 assert.Equal(t, "ba", state.TextField().AutocompleteSuffix()) 172 173 AutocompleteTextField(state) 174 assert.Equal(t, "", state.TextField().InputText()) 175 assert.Equal(t, "bb", state.TextField().AutocompleteSuffix()) 176 177 AutocompleteTextField(state) 178 assert.Equal(t, "", state.TextField().InputText()) 179 assert.Equal(t, "", state.TextField().AutocompleteSuffix()) 180 181 AppendRuneToTextField(state, 'b') 182 assert.Equal(t, "b", state.TextField().InputText()) 183 assert.Equal(t, "", state.TextField().AutocompleteSuffix()) 184 185 AutocompleteTextField(state) 186 assert.Equal(t, "b", state.TextField().InputText()) 187 assert.Equal(t, "a", state.TextField().AutocompleteSuffix()) 188 189 AutocompleteTextField(state) 190 assert.Equal(t, "b", state.TextField().InputText()) 191 assert.Equal(t, "b", state.TextField().AutocompleteSuffix()) 192 193 ExecuteTextFieldAction(state) 194 assert.Equal(t, InputModeNormal, state.InputMode()) 195 assert.Equal(t, "", state.TextField().PromptText()) 196 assert.Equal(t, "", state.TextField().InputText()) 197 assert.Equal(t, "Input: bb", state.StatusMsg().Text) 198 } 199 200 func TestAutocompleteTextFieldError(t *testing.T) { 201 state := NewEditorState(100, 100, nil, nil) 202 emptyAction := func(_ *EditorState, _ string) error { return nil } 203 errorAutocompleteFunc := func(prefix string) ([]string, error) { 204 return nil, fmt.Errorf("autocomplete error") 205 } 206 207 // Show autocomplete error in status msg. 208 ShowTextField(state, "test prompt", emptyAction, errorAutocompleteFunc) 209 AutocompleteTextField(state) 210 assert.Equal(t, InputModeTextField, state.InputMode()) 211 assert.Equal(t, StatusMsgStyleError, state.StatusMsg().Style) 212 assert.Equal(t, "Error occurred during autocomplete: autocomplete error", state.StatusMsg().Text) 213 214 // Typing more clears the status msg. 215 AppendRuneToTextField(state, 'a') 216 assert.Equal(t, "", state.StatusMsg().Text) 217 218 // Autocomplete again to bring the error back. 219 AutocompleteTextField(state) 220 assert.Equal(t, StatusMsgStyleError, state.StatusMsg().Style) 221 assert.Equal(t, "Error occurred during autocomplete: autocomplete error", state.StatusMsg().Text) 222 223 // Deleting also clears the status msg. 224 DeleteRuneFromTextField(state) 225 assert.Equal(t, "", state.StatusMsg().Text) 226 }