comparison src/testdir/test_autocmd.vim @ 28917:c5862dfaf0bd v8.2.4981

patch 8.2.4981: it is not possible to manipulate autocommands Commit: https://github.com/vim/vim/commit/1755a91851f7022fdd3eecfbd2cc0b508a2f2a8f Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Thu May 19 10:31:47 2022 +0100 patch 8.2.4981: it is not possible to manipulate autocommands Problem: It is not possible to manipulate autocommands. Solution: Add functions to add, get and set autocommands. (Yegappan Lakshmanan, closes #10291)
author Bram Moolenaar <Bram@vim.org>
date Thu, 19 May 2022 11:45:05 +0200
parents 2edad5db074c
children 3c3bdb8069f5
comparison
equal deleted inserted replaced
28916:40a5b3396eb4 28917:c5862dfaf0bd
3208 3208
3209 au! test_noname_autocmd_group 3209 au! test_noname_autocmd_group
3210 augroup! test_noname_autocmd_group 3210 augroup! test_noname_autocmd_group
3211 endfunc 3211 endfunc
3212 3212
3213 " Test for the autocmd_get() function
3214 func Test_autocmd_get()
3215 augroup TestAutoCmdFns
3216 au!
3217 autocmd BufAdd *.vim echo "bufadd-vim"
3218 autocmd BufAdd *.py echo "bufadd-py"
3219 autocmd BufHidden *.vim echo "bufhidden"
3220 augroup END
3221 augroup TestAutoCmdFns2
3222 autocmd BufAdd *.vim echo "bufadd-vim-2"
3223 autocmd BufRead *.a1b2c3 echo "bufadd-vim-2"
3224 augroup END
3225
3226 let l = autocmd_get()
3227 call assert_true(l->len() > 0)
3228
3229 " Test for getting all the autocmds in a group
3230 let expected = [
3231 \ #{cmd: 'echo "bufadd-vim"', group: 'TestAutoCmdFns',
3232 \ pattern: '*.vim', nested: v:false, once: v:false,
3233 \ event: 'BufAdd'},
3234 \ #{cmd: 'echo "bufadd-py"', group: 'TestAutoCmdFns',
3235 \ pattern: '*.py', nested: v:false, once: v:false,
3236 \ event: 'BufAdd'},
3237 \ #{cmd: 'echo "bufhidden"', group: 'TestAutoCmdFns',
3238 \ pattern: '*.vim', nested: v:false,
3239 \ once: v:false, event: 'BufHidden'}]
3240 call assert_equal(expected, autocmd_get(#{group: 'TestAutoCmdFns'}))
3241
3242 " Test for getting autocmds for all the patterns in a group
3243 call assert_equal(expected, autocmd_get(#{group: 'TestAutoCmdFns',
3244 \ event: '*'}))
3245
3246 " Test for getting autocmds for an event in a group
3247 let expected = [
3248 \ #{cmd: 'echo "bufadd-vim"', group: 'TestAutoCmdFns',
3249 \ pattern: '*.vim', nested: v:false, once: v:false,
3250 \ event: 'BufAdd'},
3251 \ #{cmd: 'echo "bufadd-py"', group: 'TestAutoCmdFns',
3252 \ pattern: '*.py', nested: v:false, once: v:false,
3253 \ event: 'BufAdd'}]
3254 call assert_equal(expected, autocmd_get(#{group: 'TestAutoCmdFns',
3255 \ event: 'BufAdd'}))
3256
3257 " Test for getting the autocmds for all the events in a group for particular
3258 " pattern
3259 call assert_equal([{'cmd': 'echo "bufadd-py"', 'group': 'TestAutoCmdFns',
3260 \ 'pattern': '*.py', 'nested': v:false, 'once': v:false,
3261 \ 'event': 'BufAdd'}],
3262 \ autocmd_get(#{group: 'TestAutoCmdFns', event: '*', pattern: '*.py'}))
3263
3264 " Test for getting the autocmds for an events in a group for particular
3265 " pattern
3266 let l = autocmd_get(#{group: 'TestAutoCmdFns', event: 'BufAdd',
3267 \ pattern: '*.vim'})
3268 call assert_equal([
3269 \ #{cmd: 'echo "bufadd-vim"', group: 'TestAutoCmdFns',
3270 \ pattern: '*.vim', nested: v:false, once: v:false,
3271 \ event: 'BufAdd'}], l)
3272
3273 " Test for getting the autocmds for a pattern in a group
3274 let l = autocmd_get(#{group: 'TestAutoCmdFns', pattern: '*.vim'})
3275 call assert_equal([
3276 \ #{cmd: 'echo "bufadd-vim"', group: 'TestAutoCmdFns',
3277 \ pattern: '*.vim', nested: v:false, once: v:false,
3278 \ event: 'BufAdd'},
3279 \ #{cmd: 'echo "bufhidden"', group: 'TestAutoCmdFns',
3280 \ pattern: '*.vim', nested: v:false,
3281 \ once: v:false, event: 'BufHidden'}], l)
3282
3283 " Test for getting the autocmds for a pattern in all the groups
3284 let l = autocmd_get(#{pattern: '*.a1b2c3'})
3285 call assert_equal([{'cmd': 'echo "bufadd-vim-2"', 'group': 'TestAutoCmdFns2',
3286 \ 'pattern': '*.a1b2c3', 'nested': v:false, 'once': v:false,
3287 \ 'event': 'BufRead'}], l)
3288
3289 " Test for getting autocmds for a pattern without any autocmds
3290 call assert_equal([], autocmd_get(#{group: 'TestAutoCmdFns',
3291 \ pattern: '*.abc'}))
3292 call assert_equal([], autocmd_get(#{group: 'TestAutoCmdFns',
3293 \ event: 'BufAdd', pattern: '*.abc'}))
3294 call assert_equal([], autocmd_get(#{group: 'TestAutoCmdFns',
3295 \ event: 'BufWipeout'}))
3296 call assert_fails("call autocmd_get(#{group: 'abc', event: 'BufAdd'})",
3297 \ 'E367:')
3298 let cmd = "echo autocmd_get(#{group: 'TestAutoCmdFns', event: 'abc'})"
3299 call assert_fails(cmd, 'E216:')
3300 call assert_fails("call autocmd_get(#{group: 'abc'})", 'E367:')
3301 call assert_fails("echo autocmd_get(#{event: 'abc'})", 'E216:')
3302
3303 augroup TestAutoCmdFns
3304 au!
3305 augroup END
3306 call assert_equal([], autocmd_get(#{group: 'TestAutoCmdFns'}))
3307
3308 " Test for nested and once autocmds
3309 augroup TestAutoCmdFns
3310 au!
3311 autocmd VimSuspend * ++nested echo "suspend"
3312 autocmd VimResume * ++once echo "resume"
3313 augroup END
3314
3315 let expected = [
3316 \ {'cmd': 'echo "suspend"', 'group': 'TestAutoCmdFns', 'pattern': '*',
3317 \ 'nested': v:true, 'once': v:false, 'event': 'VimSuspend'},
3318 \ {'cmd': 'echo "resume"', 'group': 'TestAutoCmdFns', 'pattern': '*',
3319 \ 'nested': v:false, 'once': v:true, 'event': 'VimResume'}]
3320 call assert_equal(expected, autocmd_get(#{group: 'TestAutoCmdFns'}))
3321
3322 " Test for buffer-local autocmd
3323 augroup TestAutoCmdFns
3324 au!
3325 autocmd TextYankPost <buffer> echo "textyankpost"
3326 augroup END
3327
3328 let expected = [
3329 \ {'cmd': 'echo "textyankpost"', 'group': 'TestAutoCmdFns',
3330 \ 'pattern': '<buffer=' .. bufnr() .. '>', 'nested': v:false,
3331 \ 'once': v:false, 'bufnr': bufnr(), 'event': 'TextYankPost'}]
3332 call assert_equal(expected, autocmd_get(#{group: 'TestAutoCmdFns'}))
3333
3334 augroup TestAutoCmdFns
3335 au!
3336 augroup END
3337 augroup! TestAutoCmdFns
3338 augroup TestAutoCmdFns2
3339 au!
3340 augroup END
3341 augroup! TestAutoCmdFns2
3342
3343 call assert_fails("echo autocmd_get(#{group: []})", 'E730:')
3344 call assert_fails("echo autocmd_get(#{event: {}})", 'E731:')
3345 call assert_fails("echo autocmd_get([])", 'E1206:')
3346 endfunc
3347
3348 " Test for the autocmd_add() function
3349 func Test_autocmd_add()
3350 " Define a single autocmd in a group
3351 call autocmd_add([#{group: 'TestAcSet', event: 'BufAdd', pattern: '*.sh',
3352 \ cmd: 'echo "bufadd"', once: v:true, nested: v:true}])
3353 call assert_equal([#{cmd: 'echo "bufadd"', group: 'TestAcSet',
3354 \ pattern: '*.sh', nested: v:true, once: v:true,
3355 \ event: 'BufAdd'}], autocmd_get(#{group: 'TestAcSet'}))
3356
3357 " Define two autocmds in the same group
3358 call autocmd_delete([#{group: 'TestAcSet'}])
3359 call autocmd_add([#{group: 'TestAcSet', event: 'BufAdd', pattern: '*.sh',
3360 \ cmd: 'echo "bufadd"'},
3361 \ #{group: 'TestAcSet', event: 'BufEnter', pattern: '*.sh',
3362 \ cmd: 'echo "bufenter"'}])
3363 call assert_equal([
3364 \ #{cmd: 'echo "bufadd"', group: 'TestAcSet', pattern: '*.sh',
3365 \ nested: v:false, once: v:false, event: 'BufAdd'},
3366 \ #{cmd: 'echo "bufenter"', group: 'TestAcSet', pattern: '*.sh',
3367 \ nested: v:false, once: v:false, event: 'BufEnter'}],
3368 \ autocmd_get(#{group: 'TestAcSet'}))
3369
3370 " Define a buffer-local autocmd
3371 call autocmd_delete([#{group: 'TestAcSet'}])
3372 call autocmd_add([#{group: 'TestAcSet', event: 'CursorHold',
3373 \ bufnr: bufnr(), cmd: 'echo "cursorhold"'}])
3374 call assert_equal([
3375 \ #{cmd: 'echo "cursorhold"', group: 'TestAcSet',
3376 \ pattern: '<buffer=' .. bufnr() .. '>', nested: v:false,
3377 \ once: v:false, bufnr: bufnr(), event: 'CursorHold'}],
3378 \ autocmd_get(#{group: 'TestAcSet'}))
3379
3380 " Use an invalid buffer number
3381 call autocmd_delete([#{group: 'TestAcSet'}])
3382 call autocmd_add([#{group: 'TestAcSet', event: 'BufEnter',
3383 \ bufnr: -1, cmd: 'echo "bufenter"'}])
3384 let l = [#{group: 'TestAcSet', event: 'BufAdd', bufnr: 9999,
3385 \ cmd: 'echo "bufadd"'}]
3386 call assert_fails("echo autocmd_add(l)", 'E680:')
3387 let l = [#{group: 'TestAcSet', event: 'BufRead', bufnr: [],
3388 \ cmd: 'echo "bufread"'}]
3389 call assert_fails("echo autocmd_add(l)", 'E745:')
3390 call assert_equal([], autocmd_get(#{group: 'TestAcSet'}))
3391
3392 " Add two commands to the same group, event and pattern
3393 call autocmd_delete([#{group: 'TestAcSet'}])
3394 call autocmd_add([#{group: 'TestAcSet', event: 'BufUnload',
3395 \ pattern: 'abc', cmd: 'echo "cmd1"'}])
3396 call autocmd_add([#{group: 'TestAcSet', event: 'BufUnload',
3397 \ pattern: 'abc', cmd: 'echo "cmd2"'}])
3398 call assert_equal([
3399 \ #{cmd: 'echo "cmd1"', group: 'TestAcSet', pattern: 'abc',
3400 \ nested: v:false, once: v:false, event: 'BufUnload'},
3401 \ #{cmd: 'echo "cmd2"', group: 'TestAcSet', pattern: 'abc',
3402 \ nested: v:false, once: v:false, event: 'BufUnload'}],
3403 \ autocmd_get(#{group: 'TestAcSet'}))
3404
3405 " When adding a new autocmd, if the autocmd 'group' is not specified, then
3406 " the current autocmd group should be used.
3407 call autocmd_delete([#{group: 'TestAcSet'}])
3408 augroup TestAcSet
3409 call autocmd_add([#{event: 'BufHidden', pattern: 'abc', cmd: 'echo "abc"'}])
3410 augroup END
3411 call assert_equal([
3412 \ #{cmd: 'echo "abc"', group: 'TestAcSet', pattern: 'abc',
3413 \ nested: v:false, once: v:false, event: 'BufHidden'}],
3414 \ autocmd_get(#{group: 'TestAcSet'}))
3415
3416 let l = [#{group: 'TestAcSet', event: 'abc', pattern: '*.sh',
3417 \ cmd: 'echo "bufadd"'}]
3418 call assert_fails('call autocmd_add(l)', 'E216:')
3419
3420 call assert_fails("call autocmd_add({})", 'E1211:')
3421 call assert_equal(v:false, autocmd_add(test_null_list()))
3422 call assert_true(autocmd_add([[]]))
3423 call assert_true(autocmd_add([test_null_dict()]))
3424
3425 augroup TestAcSet
3426 au!
3427 augroup END
3428
3429 call autocmd_add([#{group: 'TestAcSet'}])
3430 call autocmd_add([#{group: 'TestAcSet', event: 'BufAdd'}])
3431 call autocmd_add([#{group: 'TestAcSet', pat: '*.sh'}])
3432 call autocmd_add([#{group: 'TestAcSet', cmd: 'echo "a"'}])
3433 call autocmd_add([#{group: 'TestAcSet', event: 'BufAdd', pat: '*.sh'}])
3434 call autocmd_add([#{group: 'TestAcSet', event: 'BufAdd', cmd: 'echo "a"'}])
3435 call autocmd_add([#{group: 'TestAcSet', pat: '*.sh', cmd: 'echo "a"'}])
3436 call assert_equal([], autocmd_get(#{group: 'TestAcSet'}))
3437
3438 augroup! TestAcSet
3439 endfunc
3440
3441 " Test for deleting autocmd events and groups
3442 func Test_autocmd_delete()
3443 " Delete an event in an autocmd group
3444 augroup TestAcSet
3445 au!
3446 au BufAdd *.sh echo "bufadd"
3447 au BufEnter *.sh echo "bufenter"
3448 augroup END
3449 call autocmd_delete([#{group: 'TestAcSet', event: 'BufAdd'}])
3450 call assert_equal([#{cmd: 'echo "bufenter"', group: 'TestAcSet',
3451 \ pattern: '*.sh', nested: v:false, once: v:false,
3452 \ event: 'BufEnter'}], autocmd_get(#{group: 'TestAcSet'}))
3453
3454 " Delete all the events in an autocmd group
3455 augroup TestAcSet
3456 au BufAdd *.sh echo "bufadd"
3457 augroup END
3458 call autocmd_delete([#{group: 'TestAcSet', event: '*'}])
3459 call assert_equal([], autocmd_get(#{group: 'TestAcSet'}))
3460
3461 " Delete a non-existing autocmd group
3462 call assert_fails("call autocmd_delete([#{group: 'abc'}])", 'E367:')
3463 " Delete a non-existing autocmd event
3464 let l = [#{group: 'TestAcSet', event: 'abc'}]
3465 call assert_fails("call autocmd_delete(l)", 'E216:')
3466 " Delete a non-existing autocmd pattern
3467 let l = [#{group: 'TestAcSet', event: 'BufAdd', pat: 'abc'}]
3468 call assert_true(autocmd_delete(l))
3469
3470 " Delete an autocmd group
3471 augroup TestAcSet
3472 au!
3473 au BufAdd *.sh echo "bufadd"
3474 au BufEnter *.sh echo "bufenter"
3475 augroup END
3476 call autocmd_delete([#{group: 'TestAcSet'}])
3477 call assert_fails("call autocmd_get(#{group: 'TestAcSet'})", 'E367:')
3478
3479 call assert_true(autocmd_delete([[]]))
3480 call assert_true(autocmd_delete([test_null_dict()]))
3481 endfunc
3482
3213 " vim: shiftwidth=2 sts=2 expandtab 3483 " vim: shiftwidth=2 sts=2 expandtab