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  }