github.com/kolbycrouch/elvish@v0.14.1-0.20210614162631-215b9ac1c423/pkg/cli/mode/lastcmd_test.go (about)

     1  package mode
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  
     7  	"src.elv.sh/pkg/cli"
     8  	. "src.elv.sh/pkg/cli/clitest"
     9  	"src.elv.sh/pkg/cli/histutil"
    10  	"src.elv.sh/pkg/cli/term"
    11  	"src.elv.sh/pkg/cli/tk"
    12  	"src.elv.sh/pkg/store"
    13  	"src.elv.sh/pkg/ui"
    14  )
    15  
    16  func TestNewLastcmd_NoStore(t *testing.T) {
    17  	f := Setup()
    18  	defer f.Stop()
    19  
    20  	_, err := NewLastcmd(f.App, LastcmdSpec{})
    21  	if err != errNoHistoryStore {
    22  		t.Error("expect errNoHistoryStore")
    23  	}
    24  }
    25  
    26  func TestNewLastcmd_StoreError(t *testing.T) {
    27  	f := Setup()
    28  	defer f.Stop()
    29  
    30  	db := histutil.NewFaultyInMemoryDB()
    31  	store, err := histutil.NewDBStore(db)
    32  	if err != nil {
    33  		panic(err)
    34  	}
    35  	db.SetOneOffError(errMock)
    36  
    37  	_, err = NewLastcmd(f.App, LastcmdSpec{Store: store})
    38  	if err.Error() != "db error: mock error" {
    39  		t.Error("expect db error")
    40  	}
    41  }
    42  
    43  func TestLastcmd(t *testing.T) {
    44  	f := Setup()
    45  	defer f.Stop()
    46  
    47  	st := histutil.NewMemStore("foo,bar,baz")
    48  	startLastcmd(f.App, LastcmdSpec{
    49  		Store: st,
    50  		Wordifier: func(cmd string) []string {
    51  			return strings.Split(cmd, ",")
    52  		},
    53  	})
    54  
    55  	// Test UI.
    56  	f.TestTTY(t,
    57  		"\n", // empty code area
    58  		" LASTCMD  ", Styles,
    59  		"********* ", term.DotHere, "\n",
    60  		"    foo,bar,baz                                   \n", Styles,
    61  		"++++++++++++++++++++++++++++++++++++++++++++++++++",
    62  		"  0 foo\n",
    63  		"  1 bar\n",
    64  		"  2 baz",
    65  	)
    66  
    67  	// Test negative filtering.
    68  	f.TTY.Inject(term.K('-'))
    69  	f.TestTTY(t,
    70  		"\n", // empty code area
    71  		" LASTCMD  -", Styles,
    72  		"*********  ", term.DotHere, "\n",
    73  		" -3 foo                                           \n", Styles,
    74  		"++++++++++++++++++++++++++++++++++++++++++++++++++",
    75  		" -2 bar\n",
    76  		" -1 baz",
    77  	)
    78  
    79  	// Test automatic submission.
    80  	f.TTY.Inject(term.K('2')) // -2 bar
    81  	f.TestTTY(t, "bar", term.DotHere)
    82  
    83  	// Test submission by Enter.
    84  	f.App.CodeArea().MutateState(func(s *tk.CodeAreaState) {
    85  		*s = tk.CodeAreaState{}
    86  	})
    87  	startLastcmd(f.App, LastcmdSpec{
    88  		Store: st,
    89  		Wordifier: func(cmd string) []string {
    90  			return strings.Split(cmd, ",")
    91  		},
    92  	})
    93  	f.TTY.Inject(term.K(ui.Enter))
    94  	f.TestTTY(t, "foo,bar,baz", term.DotHere)
    95  
    96  	// Default wordifier.
    97  	f.App.CodeArea().MutateState(func(s *tk.CodeAreaState) {
    98  		*s = tk.CodeAreaState{}
    99  	})
   100  	st.AddCmd(store.Cmd{Text: "foo bar baz", Seq: 1})
   101  	startLastcmd(f.App, LastcmdSpec{Store: st})
   102  	f.TTY.Inject(term.K('0'))
   103  	f.TestTTY(t, "foo", term.DotHere)
   104  }
   105  
   106  func startLastcmd(app cli.App, spec LastcmdSpec) {
   107  	w, err := NewLastcmd(app, spec)
   108  	startMode(app, w, err)
   109  }