src.elv.sh@v0.21.0-dev.0.20240515223629-06979efb9a2a/pkg/cli/modes/histwalk_test.go (about) 1 package modes 2 3 import ( 4 "testing" 5 6 "src.elv.sh/pkg/cli" 7 . "src.elv.sh/pkg/cli/clitest" 8 "src.elv.sh/pkg/cli/histutil" 9 "src.elv.sh/pkg/cli/term" 10 "src.elv.sh/pkg/cli/tk" 11 "src.elv.sh/pkg/ui" 12 ) 13 14 func TestHistWalk(t *testing.T) { 15 f := Setup(WithSpec(func(spec *cli.AppSpec) { 16 spec.CodeAreaState.Buffer = tk.CodeBuffer{Content: "ls", Dot: 2} 17 })) 18 defer f.Stop() 19 20 f.App.Redraw() 21 buf0 := f.MakeBuffer("ls", term.DotHere) 22 f.TTY.TestBuffer(t, buf0) 23 24 getCfg := func() HistwalkSpec { 25 store := histutil.NewMemStore( 26 // 0 1 2 3 4 5 27 "echo", "ls -l", "echo a", "echo", "echo a", "ls -a") 28 return HistwalkSpec{ 29 Store: store, 30 Prefix: "ls", 31 Bindings: tk.MapBindings{ 32 term.K(ui.Up): func(w tk.Widget) { w.(Histwalk).Prev() }, 33 term.K(ui.Down): func(w tk.Widget) { w.(Histwalk).Next() }, 34 term.K('[', ui.Ctrl): func(tk.Widget) { f.App.PopAddon() }, 35 }, 36 } 37 } 38 39 startHistwalk(f.App, getCfg()) 40 buf5 := f.MakeBuffer( 41 "ls -a", Styles, 42 " ___", term.DotHere, "\n", 43 " HISTORY #5 ", Styles, 44 "************", 45 ) 46 f.TTY.TestBuffer(t, buf5) 47 48 f.TTY.Inject(term.K(ui.Up)) 49 buf1 := f.MakeBuffer( 50 "ls -l", Styles, 51 " ___", term.DotHere, "\n", 52 " HISTORY #1 ", Styles, 53 "************", 54 ) 55 f.TTY.TestBuffer(t, buf1) 56 57 f.TTY.Inject(term.K(ui.Down)) 58 f.TTY.TestBuffer(t, buf5) 59 60 f.TTY.Inject(term.K('[', ui.Ctrl)) 61 f.TTY.TestBuffer(t, buf0) 62 63 // Start over and accept. 64 startHistwalk(f.App, getCfg()) 65 f.TTY.TestBuffer(t, buf5) 66 f.TTY.Inject(term.K(' ')) 67 f.TestTTY(t, "ls -a ", term.DotHere) 68 } 69 70 func TestHistWalk_FocusedWidgetNotCodeArea(t *testing.T) { 71 testFocusedWidgetNotCodeArea(t, func(app cli.App) error { 72 store := histutil.NewMemStore("foo") 73 _, err := NewHistwalk(app, HistwalkSpec{Store: store}) 74 return err 75 }) 76 } 77 78 func TestHistWalk_NoWalker(t *testing.T) { 79 f := Setup() 80 defer f.Stop() 81 82 startHistwalk(f.App, HistwalkSpec{}) 83 f.TestTTYNotes(t, 84 "error: no history store", Styles, 85 "!!!!!!") 86 } 87 88 func TestHistWalk_NoMatch(t *testing.T) { 89 f := Setup(WithSpec(func(spec *cli.AppSpec) { 90 spec.CodeAreaState.Buffer = tk.CodeBuffer{Content: "ls", Dot: 2} 91 })) 92 defer f.Stop() 93 94 f.App.Redraw() 95 buf0 := f.MakeBuffer("ls", term.DotHere) 96 f.TTY.TestBuffer(t, buf0) 97 98 store := histutil.NewMemStore("echo 1", "echo 2") 99 cfg := HistwalkSpec{Store: store, Prefix: "ls"} 100 startHistwalk(f.App, cfg) 101 // Test that an error message has been written to the notes buffer. 102 f.TestTTYNotes(t, 103 "error: end of history", Styles, 104 "!!!!!!") 105 // Test that buffer has not changed - histwalk addon is not active. 106 f.TTY.TestBuffer(t, buf0) 107 } 108 109 func TestHistWalk_FallbackHandler(t *testing.T) { 110 f := Setup() 111 defer f.Stop() 112 113 store := histutil.NewMemStore("ls") 114 startHistwalk(f.App, HistwalkSpec{Store: store, Prefix: ""}) 115 f.TestTTY(t, 116 "ls", Styles, 117 "__", term.DotHere, "\n", 118 " HISTORY #0 ", Styles, 119 "************", 120 ) 121 122 f.TTY.Inject(term.K(ui.Backspace)) 123 f.TestTTY(t, "l", term.DotHere) 124 } 125 126 func startHistwalk(app cli.App, cfg HistwalkSpec) { 127 w, err := NewHistwalk(app, cfg) 128 if err != nil { 129 app.Notify(ErrorText(err)) 130 return 131 } 132 app.PushAddon(w) 133 app.Redraw() 134 }