view src/testdir/test_quotestar.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 995b539939c4
children
line wrap: on
line source

" *-register (quotestar) tests

source shared.vim
source check.vim

CheckFeature clipboard_working

func Do_test_quotestar_for_macunix()
  if empty(exepath('pbcopy')) || empty(exepath('pbpaste'))
    return 'Test requires pbcopy(1) and pbpaste(1)'
  endif

  let @* = ''

  " Test #1: Pasteboard to Vim
  let test_msg = "text from pasteboard to vim via quotestar"
  " Write a piece of text to the pasteboard.
  call system('/bin/echo -n "' . test_msg . '" | pbcopy')
  " See if the *-register is changed as expected.
  call assert_equal(test_msg, @*)

  " Test #2: Vim to Pasteboard
  let test_msg = "text from vim to pasteboard via quotestar"
  " Write a piece of text to the *-register.
  let @* = test_msg
  " See if the pasteboard is changed as expected.
  call assert_equal(test_msg, system('pbpaste'))

  return ''
endfunc

func Do_test_quotestar_for_x11()
  if !has('clientserver') || !has('job')
    return 'Test requires the client-server and job features'
  endif

  let cmd = GetVimCommand()
  if cmd == ''
    throw 'GetVimCommand() failed'
  endif
  try
    call remote_send('xxx', '')
  catch
    if v:exception =~ 'E240:'
      " No connection to the X server, give up.
      return
    endif
    " ignore other errors
  endtry

  let name = 'XVIMCLIPBOARD'

  " Make sure a previous server has exited
  try
    call remote_send(name, ":qa!\<CR>")
  catch /E241:/
  endtry
  call WaitForAssert({-> assert_notmatch(name, serverlist())})

  let cmd .= ' --servername ' . name
  let job = job_start(cmd, {'stoponexit': 'kill', 'out_io': 'null'})
  call WaitForAssert({-> assert_equal("run", job_status(job))})

  " Takes a short while for the server to be active.
  call WaitForAssert({-> assert_match(name, serverlist())})

  " Wait for the server to be up and answering requests.  One second is not
  " always sufficient.
  call WaitForAssert({-> assert_notequal('', remote_expr(name, "v:version", "", 2))})

  " Clear the *-register of this vim instance and wait for it to be picked up
  " by the server.
  let @* = 'no'
  call remote_foreground(name)
  call WaitForAssert({-> assert_equal("no", remote_expr(name, "@*", "", 1))})

  " Set the * register on the server.
  call remote_send(name, ":let @* = 'yes'\<CR>")
  call WaitForAssert({-> assert_equal("yes", remote_expr(name, "@*", "", 1))})

  " Check that the *-register of this vim instance is changed as expected.
  call WaitForAssert({-> assert_equal("yes", @*)})

  " Handle the large selection over 262040 byte.
  let length = 262044
  let sample = 'a' . repeat('b', length - 2) . 'c'
  let @* = sample
  call WaitFor('remote_expr("' . name . '", "len(@*) >= ' . length . '", "", 1)')
  let res = remote_expr(name, "@*", "", 2)
  call assert_equal(length, len(res))
  " Check length to prevent a large amount of output at assertion failure.
  if length == len(res)
    call assert_equal(sample, res)
  endif

  if has('unix') && has('gui') && !has('gui_running')
    let @* = ''

    " Running in a terminal and the GUI is available: Tell the server to open
    " the GUI and check that the remote command still works.
    if has('gui_motif')
      " For those GUIs, ignore the 'failed to create input context' error.
      call remote_send(name, ":call test_ignore_error('E285') | gui -f\<CR>")
    else
      call remote_send(name, ":gui -f\<CR>")
    endif
    " Wait for the server in the GUI to be up and answering requests.
    " First need to wait for the GUI to start up, otherwise the send hangs in
    " trying to send to the terminal window.
    " On some systems and with valgrind this can be very slow.
    sleep 1
    call WaitForAssert({-> assert_match("1", remote_expr(name, "has('gui_running')", "", 1))}, 10000)

    call remote_send(name, ":let @* = 'maybe'\<CR>")
    call WaitForAssert({-> assert_equal("maybe", remote_expr(name, "@*", "", 2))})

    call assert_equal('maybe', @*)
  endif

  call remote_send(name, ":qa!\<CR>")
  try
    call WaitForAssert({-> assert_equal("dead", job_status(job))})
  finally
    if job_status(job) != 'dead'
      call assert_report('Server did not exit')
      call job_stop(job, 'kill')
    endif
  endtry

  return ''
endfunc

func Test_quotestar()
  let g:test_is_flaky = 1
  let skipped = ''

  let quotestar_saved = @*

  if has('macunix')
    let skipped = Do_test_quotestar_for_macunix()
  elseif has('x11')
    if empty($DISPLAY) || !empty($WAYLAND_DISPLAY)
      let skipped = "Test can only run when $DISPLAY is set and $WAYLAND_DISPLAY is not set."
    else
      let skipped = Do_test_quotestar_for_x11()
    endif
  else
    let skipped = "Test is not implemented yet for this platform."
  endif

  let @* = quotestar_saved

  if !empty(skipped)
    throw 'Skipped: ' . skipped
  endif
endfunc

" vim: shiftwidth=2 sts=2 expandtab