aboutsummaryrefslogtreecommitdiff
path: root/test/functional/autocmd/textchanged_spec.lua
diff options
context:
space:
mode:
Diffstat (limited to 'test/functional/autocmd/textchanged_spec.lua')
-rw-r--r--test/functional/autocmd/textchanged_spec.lua142
1 files changed, 81 insertions, 61 deletions
diff --git a/test/functional/autocmd/textchanged_spec.lua b/test/functional/autocmd/textchanged_spec.lua
index d501560dc1..7c679cd4c0 100644
--- a/test/functional/autocmd/textchanged_spec.lua
+++ b/test/functional/autocmd/textchanged_spec.lua
@@ -1,17 +1,19 @@
-local helpers = require('test.functional.helpers')(after_each)
-local clear = helpers.clear
-local exec = helpers.exec
-local command = helpers.command
-local feed = helpers.feed
-local eq = helpers.eq
-local neq = helpers.neq
-local eval = helpers.eval
-local poke_eventloop = helpers.poke_eventloop
-
-before_each(clear)
+local t = require('test.testutil')
+local n = require('test.functional.testnvim')()
+
+local clear = n.clear
+local exec = n.exec
+local command = n.command
+local feed = n.feed
+local eq = t.eq
+local neq = t.neq
+local eval = n.eval
+local poke_eventloop = n.poke_eventloop
+local write_file = t.write_file
-- oldtest: Test_ChangedP()
it('TextChangedI and TextChangedP autocommands', function()
+ clear()
-- The oldtest uses feedkeys() with 'x' flag, which never triggers TextChanged.
-- So don't add TextChanged autocommand here.
exec([[
@@ -93,6 +95,7 @@ end)
-- oldtest: Test_TextChangedI_with_setline()
it('TextChangedI with setline()', function()
+ clear()
exec([[
let g:setline_handled = v:false
func SetLineOne()
@@ -118,76 +121,93 @@ it('TextChangedI with setline()', function()
eq('', eval('getline(2)'))
end)
+-- oldtest: Test_TextChanged_with_norm()
+it('TextChanged is triggered after :norm that enters Insert mode', function()
+ clear()
+ exec([[
+ let g:a = 0
+ au TextChanged * let g:a += 1
+ ]])
+ eq(0, eval('g:a'))
+ feed(':norm! ia<CR>')
+ eq(1, eval('g:a'))
+end)
+
-- oldtest: Test_Changed_ChangedI()
it('TextChangedI and TextChanged', function()
+ write_file('XTextChangedI2', 'one\ntwo\nthree')
+ finally(function()
+ os.remove('XTextChangedI2')
+ end)
+ clear('XTextChangedI2')
+
exec([[
- let [g:autocmd_i, g:autocmd_n] = ['','']
+ let [g:autocmd_n, g:autocmd_i] = ['','']
- func! TextChangedAutocmdI(char)
+ func TextChangedAutocmd(char)
let g:autocmd_{tolower(a:char)} = a:char .. b:changedtick
endfunc
- augroup Test_TextChanged
- au!
- au TextChanged <buffer> :call TextChangedAutocmdI('N')
- au TextChangedI <buffer> :call TextChangedAutocmdI('I')
- augroup END
+ au TextChanged <buffer> :call TextChangedAutocmd('N')
+ au TextChangedI <buffer> :call TextChangedAutocmd('I')
+
+ nnoremap <CR> o<Esc>
]])
+ -- TextChanged should trigger if a mapping enters and leaves Insert mode.
+ feed('<CR>')
+ eq('N4', eval('g:autocmd_n'))
+ eq('', eval('g:autocmd_i'))
+
feed('i')
- poke_eventloop()
+ eq('N4', eval('g:autocmd_n'))
+ eq('', eval('g:autocmd_i'))
+ -- TextChangedI should trigger if change is done in Insert mode.
feed('f')
- poke_eventloop()
+ eq('N4', eval('g:autocmd_n'))
+ eq('I5', eval('g:autocmd_i'))
feed('o')
- poke_eventloop()
+ eq('N4', eval('g:autocmd_n'))
+ eq('I6', eval('g:autocmd_i'))
feed('o')
- poke_eventloop()
- feed('<esc>')
- eq('', eval('g:autocmd_n'))
- eq('I5', eval('g:autocmd_i'))
+ eq('N4', eval('g:autocmd_n'))
+ eq('I7', eval('g:autocmd_i'))
+ -- TextChanged shouldn't trigger when leaving Insert mode and TextChangedI
+ -- has been triggered.
+ feed('<Esc>')
+ eq('N4', eval('g:autocmd_n'))
+ eq('I7', eval('g:autocmd_i'))
+ -- TextChanged should trigger if change is done in Normal mode.
feed('yyp')
- eq('N6', eval('g:autocmd_n'))
- eq('I5', eval('g:autocmd_i'))
-
- -- TextChangedI should only trigger if change was done in Insert mode
- command([[let g:autocmd_i = '']])
- feed('yypi<esc>')
- eq('', eval('g:autocmd_i'))
+ eq('N8', eval('g:autocmd_n'))
+ eq('I7', eval('g:autocmd_i'))
- -- TextChanged should only trigger if change was done in Normal mode
- command([[let g:autocmd_n = '']])
- feed('ibar<esc>')
- eq('', eval('g:autocmd_n'))
+ -- TextChangedI shouldn't trigger if change isn't done in Insert mode.
+ feed('i')
+ eq('N8', eval('g:autocmd_n'))
+ eq('I7', eval('g:autocmd_i'))
+ feed('<Esc>')
+ eq('N8', eval('g:autocmd_n'))
+ eq('I7', eval('g:autocmd_i'))
+ -- TextChangedI should trigger if change is a mix of Normal and Insert modes.
local function validate_mixed_textchangedi(keys)
- feed('ifoo<esc>')
- command([[let g:autocmd_i = '']])
- command([[let g:autocmd_n = '']])
- for _, s in ipairs(keys) do
- feed(s)
- poke_eventloop()
- end
+ feed('ifoo<Esc>')
+ command(":let [g:autocmd_n, g:autocmd_i] = ['', '']")
+ feed(keys)
+ eq('', eval('g:autocmd_n'))
neq('', eval('g:autocmd_i'))
+ feed('<Esc>')
eq('', eval('g:autocmd_n'))
+ neq('', eval('g:autocmd_i'))
end
- validate_mixed_textchangedi({ 'o', '<esc>' })
- validate_mixed_textchangedi({ 'O', '<esc>' })
- validate_mixed_textchangedi({ 'ciw', '<esc>' })
- validate_mixed_textchangedi({ 'cc', '<esc>' })
- validate_mixed_textchangedi({ 'C', '<esc>' })
- validate_mixed_textchangedi({ 's', '<esc>' })
- validate_mixed_textchangedi({ 'S', '<esc>' })
-end)
-
--- oldtest: Test_TextChanged_with_norm()
-it('TextChanged is triggered after :norm that enters Insert mode', function()
- exec([[
- let g:a = 0
- au TextChanged * let g:a += 1
- ]])
- eq(0, eval('g:a'))
- feed(':norm! ia<CR>')
- eq(1, eval('g:a'))
+ validate_mixed_textchangedi('o')
+ validate_mixed_textchangedi('O')
+ validate_mixed_textchangedi('ciw')
+ validate_mixed_textchangedi('cc')
+ validate_mixed_textchangedi('C')
+ validate_mixed_textchangedi('s')
+ validate_mixed_textchangedi('S')
end)