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 }