view src/testdir/test_cdo.vim @ 35308:22c03485f222 v9.1.0456

patch 9.1.0456: Left shift is incorrect with vartabstop and shiftwidth=0 Commit: https://github.com/vim/vim/commit/88d4f255b7b7a19bb4f6489e0ad0956e47d51fed Author: Gary Johnson <garyjohn@spocom.com> Date: Sat Jun 1 20:51:33 2024 +0200 patch 9.1.0456: Left shift is incorrect with vartabstop and shiftwidth=0 Problem: Left shift is incorrect with vartabstop and shiftwidth=0 Solution: make tabstop_at() function aware of shift direction (Gary Johnson) The problem was that with 'vartabstop' set and 'shiftwidth' equal 0, left shifts using << were shifting the line to the wrong column. The tabstop to the right of the first character in the line was being used as the shift amount instead of the tabstop to the left of that first character. The reason was that the tabstop_at() function always returned the value of the tabstop to the right of the given column and was not accounting for the direction of the shift. The solution was to make tabstop_at() aware of the direction of the shift and to choose the tabtop accordingly. A test was added to check this behavior and make sure it doesn't regress. While at it, also fix a few indentation/alignment issues. fixes: #14864 closes: #14887 Signed-off-by: Gary Johnson <garyjohn@spocom.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Sat, 01 Jun 2024 21:00:03 +0200
parents 5788b78a1af0
children
line wrap: on
line source

" Tests for the :cdo, :cfdo, :ldo and :lfdo commands

source check.vim
CheckFeature quickfix

" Create the files used by the tests
func SetUp()
  call writefile(["Line1", "Line2", "Line3"], 'Xtestfile1')
  call writefile(["Line1", "Line2", "Line3"], 'Xtestfile2')
  call writefile(["Line1", "Line2", "Line3"], 'Xtestfile3')
endfunc

" Remove the files used by the tests
func TearDown()
  call delete('Xtestfile1')
  call delete('Xtestfile2')
  call delete('Xtestfile3')
endfunc

" Returns the current line in '<filename> <linenum>L <column>C' format
func GetRuler()
  return expand('%') . ' ' . line('.') . 'L' . ' ' . col('.') . 'C'
endfunc

" Tests for the :cdo and :ldo commands
func 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)

endfunc

" Tests for the :cfdo and :lfdo commands
func 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)

endfunc

" Tests for cdo and cfdo
func Test_cdo()
  call XdoTests('c')
  call XfdoTests('c')
endfunc

" Tests for ldo and lfdo
func Test_ldo()
  call XdoTests('l')
  call XfdoTests('l')
endfunc

" Test for making 'shm' doesn't interfere with the output.
func Test_cdo_print()
  enew | only!
  cgetexpr ["Xtestfile1:1:Line1", "Xtestfile2:1:Line1", "Xtestfile3:1:Line1"]
  cdo print
  call assert_equal('Line1', Screenline(&lines))
  call assert_equal('Line1', Screenline(&lines - 3))
  call assert_equal('Line1', Screenline(&lines - 6))
endfunc

" vim: shiftwidth=2 sts=2 expandtab