Bram Moolenaar | f273245 | 2018-06-03 14:47:35 +0200 | [diff] [blame] | 1 | " Tests for setting 'buftype' to "prompt" |
| 2 | |
Bram Moolenaar | b46fecd | 2019-06-15 17:58:09 +0200 | [diff] [blame] | 3 | source check.vim |
| 4 | CheckFeature channel |
Bram Moolenaar | f273245 | 2018-06-03 14:47:35 +0200 | [diff] [blame] | 5 | |
| 6 | source shared.vim |
| 7 | source screendump.vim |
| 8 | |
Bram Moolenaar | 6b810d9 | 2018-06-04 17:28:44 +0200 | [diff] [blame] | 9 | func CanTestPromptBuffer() |
Bram Moolenaar | f273245 | 2018-06-03 14:47:35 +0200 | [diff] [blame] | 10 | " We need to use a terminal window to be able to feed keys without leaving |
| 11 | " Insert mode. |
| 12 | if !has('terminal') |
Bram Moolenaar | 6b810d9 | 2018-06-04 17:28:44 +0200 | [diff] [blame] | 13 | return 0 |
Bram Moolenaar | 1149382 | 2018-06-03 15:08:09 +0200 | [diff] [blame] | 14 | endif |
| 15 | if has('win32') |
Bram Moolenaar | 6b810d9 | 2018-06-04 17:28:44 +0200 | [diff] [blame] | 16 | " TODO: make the tests work on MS-Windows |
| 17 | return 0 |
Bram Moolenaar | f273245 | 2018-06-03 14:47:35 +0200 | [diff] [blame] | 18 | endif |
Bram Moolenaar | 6b810d9 | 2018-06-04 17:28:44 +0200 | [diff] [blame] | 19 | return 1 |
| 20 | endfunc |
| 21 | |
| 22 | func WriteScript(name) |
Bram Moolenaar | f273245 | 2018-06-03 14:47:35 +0200 | [diff] [blame] | 23 | call writefile([ |
| 24 | \ 'func TextEntered(text)', |
| 25 | \ ' if a:text == "exit"', |
Bram Moolenaar | 71ef1ba | 2018-06-21 12:07:04 +0200 | [diff] [blame] | 26 | \ ' " Reset &modified to allow the buffer to be closed.', |
| 27 | \ ' set nomodified', |
Bram Moolenaar | f273245 | 2018-06-03 14:47:35 +0200 | [diff] [blame] | 28 | \ ' stopinsert', |
| 29 | \ ' close', |
| 30 | \ ' else', |
| 31 | \ ' " Add the output above the current prompt.', |
| 32 | \ ' call append(line("$") - 1, "Command: \"" . a:text . "\"")', |
| 33 | \ ' " Reset &modified to allow the buffer to be closed.', |
| 34 | \ ' set nomodified', |
| 35 | \ ' call timer_start(20, {id -> TimerFunc(a:text)})', |
| 36 | \ ' endif', |
| 37 | \ 'endfunc', |
| 38 | \ '', |
| 39 | \ 'func TimerFunc(text)', |
| 40 | \ ' " Add the output above the current prompt.', |
| 41 | \ ' call append(line("$") - 1, "Result: \"" . a:text . "\"")', |
Bram Moolenaar | 3339d3d | 2018-06-03 17:10:40 +0200 | [diff] [blame] | 42 | \ ' " Reset &modified to allow the buffer to be closed.', |
| 43 | \ ' set nomodified', |
Bram Moolenaar | f273245 | 2018-06-03 14:47:35 +0200 | [diff] [blame] | 44 | \ 'endfunc', |
| 45 | \ '', |
| 46 | \ 'call setline(1, "other buffer")', |
Bram Moolenaar | 3339d3d | 2018-06-03 17:10:40 +0200 | [diff] [blame] | 47 | \ 'set nomodified', |
Bram Moolenaar | f273245 | 2018-06-03 14:47:35 +0200 | [diff] [blame] | 48 | \ 'new', |
| 49 | \ 'set buftype=prompt', |
| 50 | \ 'call prompt_setcallback(bufnr(""), function("TextEntered"))', |
Bram Moolenaar | 3f4f3d8 | 2019-09-04 20:05:59 +0200 | [diff] [blame] | 51 | \ 'eval bufnr("")->prompt_setprompt("cmd: ")', |
Bram Moolenaar | f273245 | 2018-06-03 14:47:35 +0200 | [diff] [blame] | 52 | \ 'startinsert', |
Bram Moolenaar | 6b810d9 | 2018-06-04 17:28:44 +0200 | [diff] [blame] | 53 | \ ], a:name) |
| 54 | endfunc |
| 55 | |
| 56 | func Test_prompt_basic() |
| 57 | if !CanTestPromptBuffer() |
| 58 | return |
| 59 | endif |
| 60 | let scriptName = 'XpromptscriptBasic' |
| 61 | call WriteScript(scriptName) |
| 62 | |
| 63 | let buf = RunVimInTerminal('-S ' . scriptName, {}) |
Bram Moolenaar | 3f4f3d8 | 2019-09-04 20:05:59 +0200 | [diff] [blame] | 64 | call WaitForAssert({-> assert_equal('cmd:', term_getline(buf, 1))}) |
Bram Moolenaar | f273245 | 2018-06-03 14:47:35 +0200 | [diff] [blame] | 65 | |
| 66 | call term_sendkeys(buf, "hello\<CR>") |
Bram Moolenaar | 3f4f3d8 | 2019-09-04 20:05:59 +0200 | [diff] [blame] | 67 | call WaitForAssert({-> assert_equal('cmd: hello', term_getline(buf, 1))}) |
Bram Moolenaar | f273245 | 2018-06-03 14:47:35 +0200 | [diff] [blame] | 68 | call WaitForAssert({-> assert_equal('Command: "hello"', term_getline(buf, 2))}) |
| 69 | call WaitForAssert({-> assert_equal('Result: "hello"', term_getline(buf, 3))}) |
| 70 | |
| 71 | call term_sendkeys(buf, "exit\<CR>") |
| 72 | call WaitForAssert({-> assert_equal('other buffer', term_getline(buf, 1))}) |
| 73 | |
| 74 | call StopVimInTerminal(buf) |
Bram Moolenaar | 6b810d9 | 2018-06-04 17:28:44 +0200 | [diff] [blame] | 75 | call delete(scriptName) |
| 76 | endfunc |
| 77 | |
| 78 | func Test_prompt_editing() |
| 79 | if !CanTestPromptBuffer() |
| 80 | return |
| 81 | endif |
| 82 | let scriptName = 'XpromptscriptEditing' |
| 83 | call WriteScript(scriptName) |
| 84 | |
| 85 | let buf = RunVimInTerminal('-S ' . scriptName, {}) |
Bram Moolenaar | 3f4f3d8 | 2019-09-04 20:05:59 +0200 | [diff] [blame] | 86 | call WaitForAssert({-> assert_equal('cmd:', term_getline(buf, 1))}) |
Bram Moolenaar | 6b810d9 | 2018-06-04 17:28:44 +0200 | [diff] [blame] | 87 | |
| 88 | let bs = "\<BS>" |
| 89 | call term_sendkeys(buf, "hello" . bs . bs) |
Bram Moolenaar | 3f4f3d8 | 2019-09-04 20:05:59 +0200 | [diff] [blame] | 90 | call WaitForAssert({-> assert_equal('cmd: hel', term_getline(buf, 1))}) |
Bram Moolenaar | 6b810d9 | 2018-06-04 17:28:44 +0200 | [diff] [blame] | 91 | |
| 92 | let left = "\<Left>" |
| 93 | call term_sendkeys(buf, left . left . left . bs . '-') |
Bram Moolenaar | 3f4f3d8 | 2019-09-04 20:05:59 +0200 | [diff] [blame] | 94 | call WaitForAssert({-> assert_equal('cmd: -hel', term_getline(buf, 1))}) |
Bram Moolenaar | 6b810d9 | 2018-06-04 17:28:44 +0200 | [diff] [blame] | 95 | |
| 96 | let end = "\<End>" |
| 97 | call term_sendkeys(buf, end . "x") |
Bram Moolenaar | 3f4f3d8 | 2019-09-04 20:05:59 +0200 | [diff] [blame] | 98 | call WaitForAssert({-> assert_equal('cmd: -helx', term_getline(buf, 1))}) |
Bram Moolenaar | 6b810d9 | 2018-06-04 17:28:44 +0200 | [diff] [blame] | 99 | |
| 100 | call term_sendkeys(buf, "\<C-U>exit\<CR>") |
| 101 | call WaitForAssert({-> assert_equal('other buffer', term_getline(buf, 1))}) |
| 102 | |
| 103 | call StopVimInTerminal(buf) |
| 104 | call delete(scriptName) |
Bram Moolenaar | f273245 | 2018-06-03 14:47:35 +0200 | [diff] [blame] | 105 | endfunc |
Bram Moolenaar | 75a1a94 | 2019-06-20 03:45:36 +0200 | [diff] [blame] | 106 | |
| 107 | func Test_prompt_garbage_collect() |
| 108 | func MyPromptCallback(x, text) |
| 109 | " NOP |
| 110 | endfunc |
| 111 | func MyPromptInterrupt(x) |
| 112 | " NOP |
| 113 | endfunc |
| 114 | |
| 115 | new |
| 116 | set buftype=prompt |
Bram Moolenaar | 3f4f3d8 | 2019-09-04 20:05:59 +0200 | [diff] [blame] | 117 | eval bufnr('')->prompt_setcallback(function('MyPromptCallback', [{}])) |
| 118 | eval bufnr('')->prompt_setinterrupt(function('MyPromptInterrupt', [{}])) |
Bram Moolenaar | 75a1a94 | 2019-06-20 03:45:36 +0200 | [diff] [blame] | 119 | call test_garbagecollect_now() |
| 120 | " Must not crash |
| 121 | call feedkeys("\<CR>\<C-C>", 'xt') |
| 122 | call assert_true(v:true) |
| 123 | |
| 124 | delfunc MyPromptCallback |
| 125 | bwipe! |
| 126 | endfunc |
Bram Moolenaar | f5f1e10 | 2020-03-08 05:13:15 +0100 | [diff] [blame^] | 127 | |
| 128 | " Test for editing the prompt buffer |
| 129 | func Test_prompt_buffer_edit() |
| 130 | new |
| 131 | set buftype=prompt |
| 132 | normal! i |
| 133 | call assert_beeps('normal! dd') |
| 134 | call assert_beeps('normal! ~') |
| 135 | close! |
| 136 | endfunc |
| 137 | |
| 138 | " vim: shiftwidth=2 sts=2 expandtab |