src.elv.sh@v0.21.0-dev.0.20240515223629-06979efb9a2a/pkg/cli/modes/lastcmd_test.go (about) 1 package modes 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/storedefs" 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_FocusedWidgetNotCodeArea(t *testing.T) { 27 testFocusedWidgetNotCodeArea(t, func(app cli.App) error { 28 st := histutil.NewMemStore("foo") 29 _, err := NewLastcmd(app, LastcmdSpec{Store: st}) 30 return err 31 }) 32 } 33 34 func TestNewLastcmd_StoreError(t *testing.T) { 35 f := Setup() 36 defer f.Stop() 37 38 db := histutil.NewFaultyInMemoryDB() 39 store, err := histutil.NewDBStore(db) 40 if err != nil { 41 panic(err) 42 } 43 db.SetOneOffError(errMock) 44 45 _, err = NewLastcmd(f.App, LastcmdSpec{Store: store}) 46 if err.Error() != "db error: mock error" { 47 t.Error("expect db error") 48 } 49 } 50 51 func TestLastcmd(t *testing.T) { 52 f := Setup() 53 defer f.Stop() 54 55 st := histutil.NewMemStore("foo,bar,baz") 56 startLastcmd(f.App, LastcmdSpec{ 57 Store: st, 58 Wordifier: func(cmd string) []string { 59 return strings.Split(cmd, ",") 60 }, 61 }) 62 63 // Test UI. 64 f.TestTTY(t, 65 "\n", // empty code area 66 " LASTCMD ", Styles, 67 "********* ", term.DotHere, "\n", 68 " foo,bar,baz \n", Styles, 69 "++++++++++++++++++++++++++++++++++++++++++++++++++", 70 " 0 foo\n", 71 " 1 bar\n", 72 " 2 baz", 73 ) 74 75 // Test negative filtering. 76 f.TTY.Inject(term.K('-')) 77 f.TestTTY(t, 78 "\n", // empty code area 79 " LASTCMD -", Styles, 80 "********* ", term.DotHere, "\n", 81 " -3 foo \n", Styles, 82 "++++++++++++++++++++++++++++++++++++++++++++++++++", 83 " -2 bar\n", 84 " -1 baz", 85 ) 86 87 // Test automatic submission. 88 f.TTY.Inject(term.K('2')) // -2 bar 89 f.TestTTY(t, "bar", term.DotHere) 90 91 // Test submission by Enter. 92 f.App.ActiveWidget().(tk.CodeArea).MutateState(func(s *tk.CodeAreaState) { 93 *s = tk.CodeAreaState{} 94 }) 95 startLastcmd(f.App, LastcmdSpec{ 96 Store: st, 97 Wordifier: func(cmd string) []string { 98 return strings.Split(cmd, ",") 99 }, 100 }) 101 f.TTY.Inject(term.K(ui.Enter)) 102 f.TestTTY(t, "foo,bar,baz", term.DotHere) 103 104 // Default wordifier. 105 f.App.ActiveWidget().(tk.CodeArea).MutateState(func(s *tk.CodeAreaState) { 106 *s = tk.CodeAreaState{} 107 }) 108 st.AddCmd(storedefs.Cmd{Text: "foo bar baz", Seq: 1}) 109 startLastcmd(f.App, LastcmdSpec{Store: st}) 110 f.TTY.Inject(term.K('0')) 111 f.TestTTY(t, "foo", term.DotHere) 112 } 113 114 func startLastcmd(app cli.App, spec LastcmdSpec) { 115 w, err := NewLastcmd(app, spec) 116 startMode(app, w, err) 117 }