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  }