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  }