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 }