Mercurial > vim
view src/testdir/test_cdo.vim @ 11424:328a9ee98fb2 v8.0.0596
patch 8.0.0596: crash when complete() called after complete_add()
commit https://github.com/vim/vim/commit/4475b623960671898dac6a72b13a8d140402afa6
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon May 1 20:46:52 2017 +0200
patch 8.0.0596: crash when complete() called after complete_add()
Problem: Crash when complete() is called after complete_add() in
'completefunc'. (Lifepillar)
Solution: Bail out if compl_pattern is NULL. (closes #1668)
Also avoid using freed memory.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Mon, 01 May 2017 21:00:04 +0200 |
parents | 779a7c14c795 |
children | ba7727889385 |
line wrap: on
line source
" Tests for the :cdo, :cfdo, :ldo and :lfdo commands if !has('quickfix') finish endif " Create the files used by the tests function SetUp() call writefile(["Line1", "Line2", "Line3"], 'Xtestfile1') call writefile(["Line1", "Line2", "Line3"], 'Xtestfile2') call writefile(["Line1", "Line2", "Line3"], 'Xtestfile3') endfunction " Remove the files used by the tests function TearDown() call delete('Xtestfile1') call delete('Xtestfile2') call delete('Xtestfile3') endfunction " Returns the current line in '<filename> <linenum>L <column>C' format function GetRuler() return expand('%') . ' ' . line('.') . 'L' . ' ' . col('.') . 'C' endfunction " Tests for the :cdo and :ldo commands function XdoTests(cchar) enew " Shortcuts for calling the cdo and ldo commands let Xdo = a:cchar . 'do' let Xgetexpr = a:cchar . 'getexpr' let Xprev = a:cchar. 'prev' let XdoCmd = Xdo . ' call add(l, GetRuler())' " Try with an empty list let l = [] exe XdoCmd call assert_equal([], l) " Populate the list and then try exe Xgetexpr . " ['non-error 1', 'Xtestfile1:1:3:Line1', 'non-error 2', 'Xtestfile2:2:2:Line2', 'non-error 3', 'Xtestfile3:3:1:Line3']" let l = [] exe XdoCmd call assert_equal(['Xtestfile1 1L 3C', 'Xtestfile2 2L 2C', 'Xtestfile3 3L 1C'], l) " Run command only on selected error lines let l = [] enew exe "2,3" . XdoCmd call assert_equal(['Xtestfile2 2L 2C', 'Xtestfile3 3L 1C'], l) " Boundary condition tests let l = [] enew exe "1,1" . XdoCmd call assert_equal(['Xtestfile1 1L 3C'], l) let l = [] enew exe "3" . XdoCmd call assert_equal(['Xtestfile3 3L 1C'], l) " Range test commands let l = [] enew exe "%" . XdoCmd call assert_equal(['Xtestfile1 1L 3C', 'Xtestfile2 2L 2C', 'Xtestfile3 3L 1C'], l) let l = [] enew exe "1,$" . XdoCmd call assert_equal(['Xtestfile1 1L 3C', 'Xtestfile2 2L 2C', 'Xtestfile3 3L 1C'], l) let l = [] enew exe Xprev exe "." . XdoCmd call assert_equal(['Xtestfile2 2L 2C'], l) let l = [] enew exe "+" . XdoCmd call assert_equal(['Xtestfile3 3L 1C'], l) " Invalid error lines test let l = [] enew exe "silent! 27" . XdoCmd exe "silent! 4,5" . XdoCmd call assert_equal([], l) " Run commands from an unsaved buffer let v:errmsg='' let l = [] enew setlocal modified exe "silent! 2,2" . XdoCmd if v:errmsg !~# 'No write since last change' call add(v:errors, 'Unsaved file change test failed') endif " If the executed command fails, then the operation should be aborted enew! let subst_count = 0 exe "silent!" . Xdo . " s/Line/xLine/ | let subst_count += 1" if subst_count != 1 || getline('.') != 'xLine1' call add(v:errors, 'Abort command on error test failed') endif let l = [] exe "2,2" . Xdo . "! call add(l, GetRuler())" call assert_equal(['Xtestfile2 2L 2C'], l) " List with no valid error entries let l = [] edit! +2 Xtestfile1 exe Xgetexpr . " ['non-error 1', 'non-error 2', 'non-error 3']" exe XdoCmd call assert_equal([], l) exe "silent! 2" . XdoCmd call assert_equal([], l) let v:errmsg='' exe "%" . XdoCmd exe "1,$" . XdoCmd exe "." . XdoCmd call assert_equal('', v:errmsg) " List with only one valid entry let l = [] exe Xgetexpr . " ['Xtestfile3:3:1:Line3']" exe XdoCmd call assert_equal(['Xtestfile3 3L 1C'], l) endfunction " Tests for the :cfdo and :lfdo commands function XfdoTests(cchar) enew " Shortcuts for calling the cfdo and lfdo commands let Xfdo = a:cchar . 'fdo' let Xgetexpr = a:cchar . 'getexpr' let XfdoCmd = Xfdo . ' call add(l, GetRuler())' let Xpfile = a:cchar. 'pfile' " Clear the quickfix/location list exe Xgetexpr . " []" " Try with an empty list let l = [] exe XfdoCmd call assert_equal([], l) " Populate the list and then try exe Xgetexpr . " ['non-error 1', 'Xtestfile1:1:3:Line1', 'Xtestfile1:2:1:Line2', 'non-error 2', 'Xtestfile2:2:2:Line2', 'non-error 3', 'Xtestfile3:2:3:Line2', 'Xtestfile3:3:1:Line3']" let l = [] exe XfdoCmd call assert_equal(['Xtestfile1 1L 3C', 'Xtestfile2 2L 2C', 'Xtestfile3 2L 3C'], l) " Run command only on selected error lines let l = [] exe "2,3" . XfdoCmd call assert_equal(['Xtestfile2 2L 2C', 'Xtestfile3 2L 3C'], l) " Boundary condition tests let l = [] exe "3" . XfdoCmd call assert_equal(['Xtestfile3 2L 3C'], l) " Range test commands let l = [] exe "%" . XfdoCmd call assert_equal(['Xtestfile1 1L 3C', 'Xtestfile2 2L 2C', 'Xtestfile3 2L 3C'], l) let l = [] exe "1,$" . XfdoCmd call assert_equal(['Xtestfile1 1L 3C', 'Xtestfile2 2L 2C', 'Xtestfile3 2L 3C'], l) let l = [] exe Xpfile exe "." . XfdoCmd call assert_equal(['Xtestfile2 2L 2C'], l) " List with only one valid entry let l = [] exe Xgetexpr . " ['Xtestfile2:2:5:Line2']" exe XfdoCmd call assert_equal(['Xtestfile2 2L 5C'], l) endfunction " Tests for cdo and cfdo function Test_cdo() call XdoTests('c') call XfdoTests('c') endfunction " Tests for ldo and lfdo function Test_ldo() call XdoTests('l') call XfdoTests('l') endfunction