github.com/kolbycrouch/elvish@v0.14.1-0.20210614162631-215b9ac1c423/pkg/cli/mode/histwalk_test.go (about) 1 package mode 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.SetAddon(nil, false) }, 35 term.K(ui.Enter): func(tk.Widget) { f.App.SetAddon(nil, true) }, 36 }, 37 } 38 } 39 40 startHistwalk(f.App, getCfg()) 41 buf5 := f.MakeBuffer( 42 "ls -a", Styles, 43 " ___", term.DotHere, "\n", 44 " HISTORY #5 ", Styles, 45 "************", 46 ) 47 f.TTY.TestBuffer(t, buf5) 48 49 f.TTY.Inject(term.K(ui.Up)) 50 buf1 := f.MakeBuffer( 51 "ls -l", Styles, 52 " ___", term.DotHere, "\n", 53 " HISTORY #1 ", Styles, 54 "************", 55 ) 56 f.TTY.TestBuffer(t, buf1) 57 58 f.TTY.Inject(term.K(ui.Down)) 59 f.TTY.TestBuffer(t, buf5) 60 61 f.TTY.Inject(term.K('[', ui.Ctrl)) 62 f.TTY.TestBuffer(t, buf0) 63 64 // Start over and accept. 65 startHistwalk(f.App, getCfg()) 66 f.TTY.TestBuffer(t, buf5) 67 f.TTY.Inject(term.K(ui.Enter)) 68 f.TestTTY(t, "ls -a", term.DotHere) 69 } 70 71 func TestHistWalk_NoWalker(t *testing.T) { 72 f := Setup() 73 defer f.Stop() 74 75 startHistwalk(f.App, HistwalkSpec{}) 76 f.TestTTYNotes(t, "no history store") 77 } 78 79 func TestHistWalk_NoMatch(t *testing.T) { 80 f := Setup(WithSpec(func(spec *cli.AppSpec) { 81 spec.CodeAreaState.Buffer = tk.CodeBuffer{Content: "ls", Dot: 2} 82 })) 83 defer f.Stop() 84 85 f.App.Redraw() 86 buf0 := f.MakeBuffer("ls", term.DotHere) 87 f.TTY.TestBuffer(t, buf0) 88 89 store := histutil.NewMemStore("echo 1", "echo 2") 90 cfg := HistwalkSpec{Store: store, Prefix: "ls"} 91 startHistwalk(f.App, cfg) 92 // Test that an error message has been written to the notes buffer. 93 f.TestTTYNotes(t, "end of history") 94 // Test that buffer has not changed - histwalk addon is not active. 95 f.TTY.TestBuffer(t, buf0) 96 } 97 98 func TestHistWalk_FallbackHandler(t *testing.T) { 99 f := Setup() 100 defer f.Stop() 101 102 store := histutil.NewMemStore("ls") 103 startHistwalk(f.App, HistwalkSpec{Store: store, Prefix: ""}) 104 f.TestTTY(t, 105 "ls", Styles, 106 "__", term.DotHere, "\n", 107 " HISTORY #0 ", Styles, 108 "************", 109 ) 110 111 f.TTY.Inject(term.K(ui.Backspace)) 112 f.TestTTY(t, "l", term.DotHere) 113 } 114 115 func startHistwalk(app cli.App, cfg HistwalkSpec) { 116 w, err := NewHistwalk(app, cfg) 117 if err != nil { 118 app.Notify(err.Error()) 119 return 120 } 121 app.SetAddon(w, false) 122 app.Redraw() 123 }