0
0
mirror of https://github.com/vim/vim.git synced 2025-10-08 06:04:08 -04:00

patch 8.1.1326: no test for listener with partial

Problem:    No test for listener with partial.
Solution:   Add a test.  Add example to help.
This commit is contained in:
Bram Moolenaar
2019-05-12 13:53:50 +02:00
parent 97b0075b0d
commit 8aad88d8de
3 changed files with 57 additions and 31 deletions

View File

@@ -6323,7 +6323,8 @@ listener_add({callback} [, {buf}]) *listener_add()*
Returns a unique ID that can be passed to |listener_remove()|. Returns a unique ID that can be passed to |listener_remove()|.
The {callback} is invoked with a list of items that indicate a The {callback} is invoked with a list of items that indicate a
change. Each list item is a dictionary with these entries: change. The list cannot be changed. Each list item is a
dictionary with these entries:
lnum the first line number of the change lnum the first line number of the change
end the first line below the change end the first line below the change
added number of lines added; negative if lines were added number of lines added; negative if lines were
@@ -6349,7 +6350,21 @@ listener_add({callback} [, {buf}]) *listener_add()*
added zero added zero
col first column with a change or one col first column with a change or one
The {callback} is invoked just before the screen is updated. The entries are in the order the changes was made, thus the
most recent change is at the end. One has to go through the
list from end to start to compute the line numbers in the
current state of the text.
When using the same function for multiple buffers, you can
pass the buffer to that function using a |Partial|.
Example: >
func Listener(bufnr, changes)
" ...
endfunc
let bufnr = ...
call listener_add(function('Listener', [bufnr]), bufnr)
< The {callback} is invoked just before the screen is updated.
To trigger this in a script use the `:redraw` command. To trigger this in a script use the `:redraw` command.
The {callback} is not invoked when the buffer is first loaded. The {callback} is not invoked when the buffer is first loaded.
@@ -10984,10 +10999,10 @@ expressions |expr-lambda|.
Example: > Example: >
function Something(key, value = 10) function Something(key, value = 10)
echo a:key .. ": " .. value echo a:key .. ": " .. a:value
endfunction endfunction
call Something('empty') "empty: 10" call Something('empty') "empty: 10"
call Something('key, 20) "key: 20" call Something('key', 20) "key: 20"
The argument default expressions are evaluated at the time of the function The argument default expressions are evaluated at the time of the function
call, not definition. Thus it is possible to use an expression which is call, not definition. Thus it is possible to use an expression which is

View File

@@ -1,77 +1,86 @@
" tests for listener_add() and listener_remove() " tests for listener_add() and listener_remove()
func StoreList(l) func s:StoreList(l)
let g:list = a:l let s:list = a:l
endfunc endfunc
func AnotherStoreList(l) func s:AnotherStoreList(l)
let g:list2 = a:l let s:list2 = a:l
endfunc endfunc
func EvilStoreList(l) func s:EvilStoreList(l)
let g:list3 = a:l let s:list3 = a:l
call assert_fails("call add(a:l, 'myitem')", "E742:") call assert_fails("call add(a:l, 'myitem')", "E742:")
endfunc endfunc
func Test_listening() func Test_listening()
new new
call setline(1, ['one', 'two']) call setline(1, ['one', 'two'])
let id = listener_add({l -> StoreList(l)}) let id = listener_add({l -> s:StoreList(l)})
call setline(1, 'one one') call setline(1, 'one one')
redraw redraw
call assert_equal([{'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], g:list) call assert_equal([{'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], s:list)
" Two listeners, both get called. " Two listeners, both get called.
let id2 = listener_add({l -> AnotherStoreList(l)}) let id2 = listener_add({l -> s:AnotherStoreList(l)})
let g:list = [] let s:list = []
let g:list2 = [] let s:list2 = []
exe "normal $asome\<Esc>" exe "normal $asome\<Esc>"
redraw redraw
call assert_equal([{'lnum': 1, 'end': 2, 'col': 8, 'added': 0}], g:list) call assert_equal([{'lnum': 1, 'end': 2, 'col': 8, 'added': 0}], s:list)
call assert_equal([{'lnum': 1, 'end': 2, 'col': 8, 'added': 0}], g:list2) call assert_equal([{'lnum': 1, 'end': 2, 'col': 8, 'added': 0}], s:list2)
call listener_remove(id2) call listener_remove(id2)
let g:list = [] let s:list = []
let g:list2 = [] let s:list2 = []
call setline(3, 'three') call setline(3, 'three')
redraw redraw
call assert_equal([{'lnum': 3, 'end': 3, 'col': 1, 'added': 1}], g:list) call assert_equal([{'lnum': 3, 'end': 3, 'col': 1, 'added': 1}], s:list)
call assert_equal([], g:list2) call assert_equal([], s:list2)
" the "o" command first adds an empty line and then changes it " the "o" command first adds an empty line and then changes it
let g:list = [] let s:list = []
exe "normal Gofour\<Esc>" exe "normal Gofour\<Esc>"
redraw redraw
call assert_equal([{'lnum': 4, 'end': 4, 'col': 1, 'added': 1}, call assert_equal([{'lnum': 4, 'end': 4, 'col': 1, 'added': 1},
\ {'lnum': 4, 'end': 5, 'col': 1, 'added': 0}], g:list) \ {'lnum': 4, 'end': 5, 'col': 1, 'added': 0}], s:list)
let g:list = [] " Remove last listener
let s:list = []
call listener_remove(id) call listener_remove(id)
call setline(1, 'asdfasdf') call setline(1, 'asdfasdf')
redraw redraw
call assert_equal([], g:list) call assert_equal([], s:list)
" Trying to change the list fails " Trying to change the list fails
let id = listener_add({l -> EvilStoreList(l)}) let id = listener_add({l -> s:EvilStoreList(l)})
let g:list3 = [] let s:list3 = []
call setline(1, 'asdfasdf') call setline(1, 'asdfasdf')
redraw redraw
call assert_equal([{'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], g:list3) call assert_equal([{'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], s:list3)
call listener_remove(id)
bwipe! bwipe!
endfunc endfunc
func s:StoreBufList(buf, l)
let s:bufnr = a:buf
let s:list = a:l
endfunc
func Test_listening_other_buf() func Test_listening_other_buf()
new new
call setline(1, ['one', 'two']) call setline(1, ['one', 'two'])
let bufnr = bufnr('') let bufnr = bufnr('')
normal ww normal ww
let id = listener_add({l -> StoreList(l)}, bufnr) let id = listener_add(function('s:StoreBufList', [bufnr]), bufnr)
let g:list = [] let s:list = []
call setbufline(bufnr, 1, 'hello') call setbufline(bufnr, 1, 'hello')
redraw redraw
call assert_equal([{'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], g:list) call assert_equal(bufnr, s:bufnr)
call assert_equal([{'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], s:list)
call listener_remove(id)
exe "buf " .. bufnr exe "buf " .. bufnr
bwipe! bwipe!
endfunc endfunc

View File

@@ -767,6 +767,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1326,
/**/ /**/
1325, 1325,
/**/ /**/