src.elv.sh@v0.21.0-dev.0.20240515223629-06979efb9a2a/pkg/edit/config_api_test.go (about)

     1  package edit
     2  
     3  import (
     4  	"testing"
     5  
     6  	"src.elv.sh/pkg/cli/term"
     7  	"src.elv.sh/pkg/store/storedefs"
     8  	"src.elv.sh/pkg/ui"
     9  )
    10  
    11  func TestBeforeReadline(t *testing.T) {
    12  	f := setup(t, rc(
    13  		`var called = 0`,
    14  		`set edit:before-readline = [ { set called = (+ $called 1) } ]`))
    15  
    16  	// Wait for UI to stabilize so that we can be sure that before-readline hooks
    17  	// have been called.
    18  	f.TestTTY(t, "~> ", term.DotHere)
    19  
    20  	testGlobal(t, f.Evaler, "called", 1)
    21  }
    22  
    23  func TestAfterReadline(t *testing.T) {
    24  	f := setup(t)
    25  
    26  	evals(f.Evaler,
    27  		`var called = 0`,
    28  		`var called-with = ''`,
    29  		`set edit:after-readline = [
    30  		{|code| set called = (+ $called 1); set called-with = $code } ]`)
    31  
    32  	// Wait for UI to stabilize so that we can be sure that after-readline hooks
    33  	// are *not* called.
    34  	f.TestTTY(t, "~> ", term.DotHere)
    35  	testGlobal(t, f.Evaler, "called", "0")
    36  
    37  	// Input "test code", press Enter and wait until the editor is done.
    38  	feedInput(f.TTYCtrl, "test code\n")
    39  	f.Wait()
    40  
    41  	testGlobals(t, f.Evaler, map[string]any{
    42  		"called":      1,
    43  		"called-with": "test code",
    44  	})
    45  }
    46  
    47  func TestAddCmdFilters(t *testing.T) {
    48  	cases := []struct {
    49  		name        string
    50  		rc          string
    51  		input       string
    52  		wantHistory []storedefs.Cmd
    53  	}{
    54  		// TODO: Enable the following two tests once error output can
    55  		// be tested.
    56  		// {
    57  		// 	name:        "non callable item",
    58  		// 	rc:          "edit:add-cmd-filters = [$false]",
    59  		// 	input:       "echo\n",
    60  		// 	wantHistory: []string{"echo"},
    61  		// },
    62  		// {
    63  		// 	name:        "callback outputs nothing",
    64  		// 	rc:          "edit:add-cmd-filters = [{|_| }]",
    65  		// 	input:       "echo\n",
    66  		// 	wantHistory: []string{"echo"},
    67  		// },
    68  		{
    69  			name:        "callback outputs true",
    70  			rc:          "set edit:add-cmd-filters = [{|_| put $true }]",
    71  			input:       "echo\n",
    72  			wantHistory: []storedefs.Cmd{{Text: "echo", Seq: 1}},
    73  		},
    74  		{
    75  			name:        "callback outputs false",
    76  			rc:          "set edit:add-cmd-filters = [{|_| put $false }]",
    77  			input:       "echo\n",
    78  			wantHistory: nil,
    79  		},
    80  		{
    81  			name:        "false-true chain",
    82  			rc:          "set edit:add-cmd-filters = [{|_| put $false } {|_| put $true }]",
    83  			input:       "echo\n",
    84  			wantHistory: nil,
    85  		},
    86  		{
    87  			name:        "true-false chain",
    88  			rc:          "set edit:add-cmd-filters = [{|_| put $true } {|_| put $false }]",
    89  			input:       "echo\n",
    90  			wantHistory: nil,
    91  		},
    92  		{
    93  			name:        "positive",
    94  			rc:          "set edit:add-cmd-filters = [{|cmd| ==s $cmd echo }]",
    95  			input:       "echo\n",
    96  			wantHistory: []storedefs.Cmd{{Text: "echo", Seq: 1}},
    97  		},
    98  		{
    99  			name:        "negative",
   100  			rc:          "set edit:add-cmd-filters = [{|cmd| ==s $cmd echo }]",
   101  			input:       "echo x\n",
   102  			wantHistory: nil,
   103  		},
   104  		{
   105  			name:        "default value",
   106  			rc:          "",
   107  			input:       " echo\n",
   108  			wantHistory: nil,
   109  		},
   110  	}
   111  
   112  	for _, c := range cases {
   113  		t.Run(c.name, func(t *testing.T) {
   114  			f := setup(t, rc(c.rc))
   115  
   116  			feedInput(f.TTYCtrl, c.input)
   117  			f.Wait()
   118  
   119  			testCommands(t, f.Store, c.wantHistory...)
   120  		})
   121  	}
   122  }
   123  
   124  func TestAddCmdFilters_SkipsRemainingOnFalse(t *testing.T) {
   125  	f := setup(t, rc(
   126  		`var called = $false`,
   127  		`set @edit:add-cmd-filters = {|_| put $false } {|_| called = $true; put $true }`,
   128  	))
   129  
   130  	feedInput(f.TTYCtrl, "echo\n")
   131  	f.Wait()
   132  	testCommands(t, f.Store)
   133  	testGlobal(t, f.Evaler, "called", false)
   134  }
   135  
   136  func TestGlobalBindings(t *testing.T) {
   137  	f := setup(t, rc(
   138  		`var called = $false`,
   139  		`set edit:global-binding[Ctrl-X] = { set called = $true }`,
   140  	))
   141  
   142  	f.TTYCtrl.Inject(term.K('X', ui.Ctrl))
   143  	f.TTYCtrl.Inject(term.K(ui.Enter))
   144  	f.Wait()
   145  
   146  	testGlobal(t, f.Evaler, "called", true)
   147  }