view src/testdir/test_lispindent.vim @ 34379:37b4c89ba420 v9.1.0116

patch 9.1.0116: win_split_ins may not check available room Commit: https://github.com/vim/vim/commit/0fd44a5ad81ade342cb54d8984965bdedd2272c8 Author: Sean Dewar <6256228+seandewar@users.noreply.github.com> Date: Tue Feb 20 20:28:15 2024 +0100 patch 9.1.0116: win_split_ins may not check available room Problem: win_split_ins has no check for E36 when moving an existing window Solution: check for room and fix the issues in f_win_splitmove() (Sean Dewar) win_split_ins has no check for E36 when moving an existing window, allowing for layouts with many overlapping zero-sized windows to be created (which may also cause drawing issues with tablines and such). f_win_splitmove also has some bugs. So check for room and fix the issues in f_win_splitmove. Handle failure in the two relevant win_split_ins callers by restoring the original layout, and factor the common logic into win_splitmove. Don't check for room when opening an autocommand window, as it's a temporary window that's rarely interacted with or drawn anyhow, and is rather important for some autocommands. Issues fixed in f_win_splitmove: - Error if splitting is disallowed. - Fix heap-use-after-frees if autocommands fired from switching to "targetwin" close "wp" or "oldwin". - Fix splitting the wrong window if autocommands fired from switching to "targetwin" switch to a different window. - Ensure -1 is returned for all errors. Also handle allocation failure a bit earlier in make_snapshot (callers, except win_splitmove, don't really care if a snapshot can't be made, so just ignore the return value). Note: Test_smoothscroll_in_zero_width_window failed after these changes with E36, as it was using the previous behaviour to create a zero-width window. I've fixed the test such that it fails with UBSAN as expected when v9.0.1367 is reverted (and simplified it too). related: #14042 Signed-off-by: Sean Dewar <6256228+seandewar@users.noreply.github.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Tue, 20 Feb 2024 22:30:04 +0100
parents 40df8a6515f6
children
line wrap: on
line source

" Tests for 'lispwords' settings being global-local.
" And  other lisp indent stuff.

set nocompatible viminfo+=nviminfo

func Test_global_local_lispwords()
  setglobal lispwords=foo,bar,baz
  setlocal lispwords-=foo | setlocal lispwords+=quux
  call assert_equal('foo,bar,baz', &g:lispwords)
  call assert_equal('bar,baz,quux', &l:lispwords)
  call assert_equal('bar,baz,quux', &lispwords)

  setlocal lispwords<
  call assert_equal('foo,bar,baz', &g:lispwords)
  call assert_equal('foo,bar,baz', &l:lispwords)
  call assert_equal('foo,bar,baz', &lispwords)
endfunc

def Test_lisp_indent()
  enew!

  append(0, [
	       '(defun html-file (base)',
	       '(format nil "~(~A~).html" base))',
	       '',
	       '(defmacro page (name title &rest body)',
	       '(let ((ti (gensym)))',
	       '`(with-open-file (*standard-output*',
	       '(html-file ,name)',
	       ':direction :output',
	       ':if-exists :supersede)',
	       '(let ((,ti ,title))',
	       '(as title ,ti)',
	       '(with center ',
	       '(as h2 (string-upcase ,ti)))',
	       '(brs 3)',
	       ',@body))))',
	       '',
	       ';;; Utilities for generating links',
	       '',
	       '(defmacro with-link (dest &rest body)',
	       '`(progn',
	       '(format t "<a href=\"~A\">" (html-file ,dest))',
	       ',@body',
	       '(princ "</a>")))'
	       ])
  assert_equal(7, lispindent(2))
  assert_equal(5, 6->lispindent())
  assert_fails('lispindent(-1)', 'E966: Invalid line number: -1')

  set lisp
  set lispwords&
  var save_copt = &cpoptions
  set cpoptions+=p
  normal 1G=G

  assert_equal([
	       '(defun html-file (base)',
	       '  (format nil "~(~A~).html" base))',
	       '',
	       '(defmacro page (name title &rest body)',
	       '  (let ((ti (gensym)))',
	       '       `(with-open-file (*standard-output*',
	       '			 (html-file ,name)',
	       '			 :direction :output',
	       '			 :if-exists :supersede)',
	       '			(let ((,ti ,title))',
	       '			     (as title ,ti)',
	       '			     (with center ',
	       '				   (as h2 (string-upcase ,ti)))',
	       '			     (brs 3)',
	       '			     ,@body))))',
	       '',
	       ';;; Utilities for generating links',
	       '',
	       '(defmacro with-link (dest &rest body)',
	       '  `(progn',
	       '    (format t "<a href=\"~A\">" (html-file ,dest))',
	       '    ,@body',
	       '    (princ "</a>")))',
	       ''
	       ], getline(1, "$"))

  enew!
  &cpoptions = save_copt
  set nolisp
enddef

func Test_lispindent_negative()
  " in legacy script there is no error
  call assert_equal(-1, lispindent(-1))
endfunc

func Test_lispindent_with_indentexpr()
  enew
  setl ai lisp nocin indentexpr=11
  exe "normal a(x\<CR>1\<CR>2)\<Esc>"
  let expected = ['(x', '  1', '  2)']
  call assert_equal(expected, getline(1, 3))
  " with Lisp indenting the first line is not indented
  normal 1G=G
  call assert_equal(expected, getline(1, 3))

  %del
  setl lispoptions=expr:1 indentexpr=5
  exe "normal a(x\<CR>1\<CR>2)\<Esc>"
  let expected_expr = ['(x', '     1', '     2)']
  call assert_equal(expected_expr, getline(1, 3))
  normal 2G2<<=G
  call assert_equal(expected_expr, getline(1, 3))

  setl lispoptions=expr:0
  " with Lisp indenting the first line is not indented
  normal 1G3<<=G
  call assert_equal(expected, getline(1, 3))

  bwipe!
endfunc

func Test_lisp_indent_works()
  " This was reading beyond the end of the line
  new
  exe "norm a\tü(\<CR>="
  set lisp
  norm ==
  bwipe!
endfunc

" vim: shiftwidth=2 sts=2 expandtab