diff src/testdir/test_display.vim @ 32670:695b50472e85

Fix line endings issue
author Christian Brabandt <cb@256bit.org>
date Mon, 26 Jun 2023 13:13:12 +0200
parents 448aef880252
children 0561bf3ba10c
line wrap: on
line diff
--- a/src/testdir/test_display.vim
+++ b/src/testdir/test_display.vim
@@ -1,537 +1,537 @@
-" Test for displaying stuff
-
-if !has('gui_running') && has('unix')
-  set term=ansi
-endif
-
-source view_util.vim
-source check.vim
-source screendump.vim
-
-func Test_display_foldcolumn()
-  CheckFeature folding
-
-  new
-  vnew
-  vert resize 25
-  call assert_equal(25, winwidth(winnr()))
-  set isprint=@
-
-  1put='e more noise blah blah‚ more stuff here'
-
-  let expect = [
-        \ "e more noise blah blah<82",
-        \ "> more stuff here        "
-        \ ]
-
-  call cursor(2, 1)
-  norm! zt
-  let lines = ScreenLines([1,2], winwidth(0))
-  call assert_equal(expect, lines)
-  set fdc=2
-  let lines = ScreenLines([1,2], winwidth(0))
-  let expect = [
-        \ "  e more noise blah blah<",
-        \ "  82> more stuff here    "
-        \ ]
-  call assert_equal(expect, lines)
-
-  quit!
-  quit!
-endfunc
-
-func Test_display_foldtext_mbyte()
-  CheckFeature folding
-
-  call NewWindow(10, 40)
-  call append(0, range(1,20))
-  exe "set foldmethod=manual foldtext=foldtext() fillchars=fold:\u2500,vert:\u2502 fdc=2"
-  call cursor(2, 1)
-  norm! zf13G
-  let lines=ScreenLines([1,3], winwidth(0)+1)
-  let expect=[
-        \ "  1                                     \u2502",
-        \ "+ +-- 12 lines: 2". repeat("\u2500", 23). "\u2502",
-        \ "  14                                    \u2502",
-        \ ]
-  call assert_equal(expect, lines)
-
-  set fillchars=fold:-,vert:\|
-  let lines=ScreenLines([1,3], winwidth(0)+1)
-  let expect=[
-        \ "  1                                     |",
-        \ "+ +-- 12 lines: 2". repeat("-", 23). "|",
-        \ "  14                                    |",
-        \ ]
-  call assert_equal(expect, lines)
-
-  set foldtext& fillchars& foldmethod& fdc&
-  bw!
-endfunc
-
-" check that win_ins_lines() and win_del_lines() work when t_cs is empty.
-func Test_scroll_without_region()
-  CheckScreendump
-
-  let lines =<< trim END
-    call setline(1, range(1, 20))
-    set t_cs=
-    set laststatus=2
-  END
-  call writefile(lines, 'Xtestscroll', 'D')
-  let buf = RunVimInTerminal('-S Xtestscroll', #{rows: 10})
-
-  call VerifyScreenDump(buf, 'Test_scroll_no_region_1', {})
-
-  call term_sendkeys(buf, ":3delete\<cr>")
-  call VerifyScreenDump(buf, 'Test_scroll_no_region_2', {})
-
-  call term_sendkeys(buf, ":4put\<cr>")
-  call VerifyScreenDump(buf, 'Test_scroll_no_region_3', {})
-
-  call term_sendkeys(buf, ":undo\<cr>")
-  call term_sendkeys(buf, ":undo\<cr>")
-  call term_sendkeys(buf, ":set laststatus=0\<cr>")
-  call VerifyScreenDump(buf, 'Test_scroll_no_region_4', {})
-
-  call term_sendkeys(buf, ":3delete\<cr>")
-  call VerifyScreenDump(buf, 'Test_scroll_no_region_5', {})
-
-  call term_sendkeys(buf, ":4put\<cr>")
-  call VerifyScreenDump(buf, 'Test_scroll_no_region_6', {})
-
-  " clean up
-  call StopVimInTerminal(buf)
-endfunc
-
-func Test_display_listchars_precedes()
-  call NewWindow(10, 10)
-  " Need a physical line that wraps over the complete
-  " window size
-  call append(0, repeat('aaa aaa aa ', 10))
-  call append(1, repeat(['bbb bbb bbb bbb'], 2))
-  " remove blank trailing line
-  $d
-  set list nowrap
-  call cursor(1, 1)
-  " move to end of line and scroll 2 characters back
-  norm! $2zh
-  let lines=ScreenLines([1,4], winwidth(0)+1)
-  let expect = [
-        \ " aaa aa $ |",
-        \ "$         |",
-        \ "$         |",
-        \ "~         |",
-        \ ]
-  call assert_equal(expect, lines)
-  set list listchars+=precedes:< nowrap
-  call cursor(1, 1)
-  " move to end of line and scroll 2 characters back
-  norm! $2zh
-  let lines = ScreenLines([1,4], winwidth(0)+1)
-  let expect = [
-        \ "<aaa aa $ |",
-        \ "<         |",
-        \ "<         |",
-        \ "~         |",
-        \ ]
-  call assert_equal(expect, lines)
-  set wrap
-  call cursor(1, 1)
-  " the complete line should be displayed in the window
-  norm! $
-
-  let lines = ScreenLines([1,10], winwidth(0)+1)
-  let expect = [
-        \ "<aaa aaa a|",
-        \ "a aaa aaa |",
-        \ "aa aaa aaa|",
-        \ " aa aaa aa|",
-        \ "a aa aaa a|",
-        \ "aa aa aaa |",
-        \ "aaa aa aaa|",
-        \ " aaa aa aa|",
-        \ "a aaa aa a|",
-        \ "aa aaa aa |",
-        \ ]
-  call assert_equal(expect, lines)
-  set list& listchars& wrap&
-  bw!
-endfunc
-
-" Check that win_lines() works correctly with the number_only parameter=TRUE
-" should break early to optimize cost of drawing, but needs to make sure
-" that the number column is correctly highlighted.
-func Test_scroll_CursorLineNr_update()
-  CheckScreendump
-
-  let lines =<< trim END
-    hi CursorLineNr ctermfg=73 ctermbg=236
-    set nu rnu cursorline cursorlineopt=number
-    exe ":norm! o\<esc>110ia\<esc>"
-  END
-  let filename = 'Xdrawscreen'
-  call writefile(lines, filename, 'D')
-  let buf = RunVimInTerminal('-S '.filename, #{rows: 5, cols: 50})
-  call term_sendkeys(buf, "k")
-  call VerifyScreenDump(buf, 'Test_winline_rnu', {})
-
-  " clean up
-  call StopVimInTerminal(buf)
-endfunc
-
-" check a long file name does not result in the hit-enter prompt
-func Test_edit_long_file_name()
-  CheckScreendump
-
-  let longName = 'x'->repeat(min([&columns, 255]))
-  call writefile([], longName, 'D')
-  let buf = RunVimInTerminal('-N -u NONE ' .. longName, #{rows: 8})
-
-  call VerifyScreenDump(buf, 'Test_long_file_name_1', {})
-
-  " clean up
-  call StopVimInTerminal(buf)
-endfunc
-
-func Test_unprintable_fileformats()
-  CheckScreendump
-
-  call writefile(["unix\r", "two"], 'Xunix.txt', 'D')
-  call writefile(["mac\r", "two"], 'Xmac.txt', 'D')
-  let lines =<< trim END
-    edit Xunix.txt
-    split Xmac.txt
-    edit ++ff=mac
-  END
-  let filename = 'Xunprintable'
-  call writefile(lines, filename, 'D')
-  let buf = RunVimInTerminal('-S '.filename, #{rows: 9, cols: 50})
-  call VerifyScreenDump(buf, 'Test_display_unprintable_01', {})
-  call term_sendkeys(buf, "\<C-W>\<C-W>\<C-L>")
-  call VerifyScreenDump(buf, 'Test_display_unprintable_02', {})
-
-  " clean up
-  call StopVimInTerminal(buf)
-endfunc
-
-" Test for scrolling that modifies buffer during visual block
-func Test_visual_block_scroll()
-  CheckScreendump
-
-  let lines =<< trim END
-    source $VIMRUNTIME/plugin/matchparen.vim
-    set scrolloff=1
-    call setline(1, ['a', 'b', 'c', 'd', 'e', '', '{', '}', '{', 'f', 'g', '}'])
-    call cursor(5, 1)
-  END
-
-  let filename = 'Xvisualblockmodifiedscroll'
-  call writefile(lines, filename, 'D')
-
-  let buf = RunVimInTerminal('-S '.filename, #{rows: 7})
-  call term_sendkeys(buf, "V\<C-D>\<C-D>")
-
-  call VerifyScreenDump(buf, 'Test_display_visual_block_scroll', {})
-
-  call StopVimInTerminal(buf)
-endfunc
-
-" Test for clearing paren highlight when switching buffers
-func Test_matchparen_clear_highlight()
-  CheckScreendump
-
-  let lines =<< trim END
-    source $VIMRUNTIME/plugin/matchparen.vim
-    set hidden
-    call setline(1, ['()'])
-    normal 0
-
-    func OtherBuffer()
-       enew
-       exe "normal iaa\<Esc>0"
-    endfunc
-  END
-  call writefile(lines, 'XMatchparenClear', 'D')
-  let buf = RunVimInTerminal('-S XMatchparenClear', #{rows: 5})
-  call VerifyScreenDump(buf, 'Test_matchparen_clear_highlight_1', {})
-
-  call term_sendkeys(buf, ":call OtherBuffer()\<CR>:\<Esc>")
-  call VerifyScreenDump(buf, 'Test_matchparen_clear_highlight_2', {})
-
-  call term_sendkeys(buf, "\<C-^>:\<Esc>")
-  call VerifyScreenDump(buf, 'Test_matchparen_clear_highlight_1', {})
-
-  call term_sendkeys(buf, "\<C-^>:\<Esc>")
-  call VerifyScreenDump(buf, 'Test_matchparen_clear_highlight_2', {})
-
-  call StopVimInTerminal(buf)
-endfunc
-
-func Test_display_scroll_at_topline()
-  CheckScreendump
-
-  let buf = RunVimInTerminal('', #{cols: 20})
-  call term_sendkeys(buf, ":call setline(1, repeat('a', 21))\<CR>")
-  call TermWait(buf)
-  call term_sendkeys(buf, "O\<Esc>")
-  call VerifyScreenDump(buf, 'Test_display_scroll_at_topline', #{rows: 4})
-
-  call StopVimInTerminal(buf)
-endfunc
-
-func Test_display_scroll_update_visual()
-  CheckScreendump
-
-  let lines =<< trim END
-      set scrolloff=0
-      call setline(1, repeat(['foo'], 10))
-      call sign_define('foo', { 'text': '>' })
-      call sign_place(1, 'bar', 'foo', bufnr(), { 'lnum': 2 })
-      call sign_place(2, 'bar', 'foo', bufnr(), { 'lnum': 1 })
-      autocmd CursorMoved * if getcurpos()[1] == 2 | call sign_unplace('bar', { 'id': 1 }) | endif
-  END
-  call writefile(lines, 'XupdateVisual.vim', 'D')
-
-  let buf = RunVimInTerminal('-S XupdateVisual.vim', #{rows: 8, cols: 60})
-  call term_sendkeys(buf, "VG7kk")
-  call VerifyScreenDump(buf, 'Test_display_scroll_update_visual', {})
-
-  call StopVimInTerminal(buf)
-endfunc
-
-" Test for 'eob' (EndOfBuffer) item in 'fillchars'
-func Test_eob_fillchars()
-  " default value
-  call assert_match('eob:\~', &fillchars)
-  " invalid values
-  call assert_fails(':set fillchars=eob:', 'E474:')
-  call assert_fails(':set fillchars=eob:xy', 'E474:')
-  call assert_fails(':set fillchars=eob:\255', 'E474:')
-  call assert_fails(':set fillchars=eob:<ff>', 'E474:')
-  call assert_fails(":set fillchars=eob:\x01", 'E474:')
-  call assert_fails(':set fillchars=eob:\\x01', 'E474:')
-  " default is ~
-  new
-  redraw
-  call assert_equal('~', Screenline(2))
-  set fillchars=eob:+
-  redraw
-  call assert_equal('+', Screenline(2))
-  set fillchars=eob:\ 
-  redraw
-  call assert_equal(' ', nr2char(screenchar(2, 1)))
-  set fillchars&
-  close
-endfunc
-
-" Test for 'foldopen', 'foldclose' and 'foldsep' in 'fillchars'
-func Test_fold_fillchars()
-  new
-  set fdc=2 foldenable foldmethod=manual
-  call setline(1, ['one', 'two', 'three', 'four', 'five'])
-  2,4fold
-  " First check for the default setting for a closed fold
-  let lines = ScreenLines([1, 3], 8)
-  let expected = [
-        \ '  one   ',
-        \ '+ +--  3',
-        \ '  five  '
-        \ ]
-  call assert_equal(expected, lines)
-  normal 2Gzo
-  " check the characters for an open fold
-  let lines = ScreenLines([1, 5], 8)
-  let expected = [
-        \ '  one   ',
-        \ '- two   ',
-        \ '| three ',
-        \ '| four  ',
-        \ '  five  '
-        \ ]
-  call assert_equal(expected, lines)
-
-  " change the setting
-  set fillchars=vert:\|,fold:-,eob:~,foldopen:[,foldclose:],foldsep:-
-
-  " check the characters for an open fold
-  let lines = ScreenLines([1, 5], 8)
-  let expected = [
-        \ '  one   ',
-        \ '[ two   ',
-        \ '- three ',
-        \ '- four  ',
-        \ '  five  '
-        \ ]
-  call assert_equal(expected, lines)
-
-  " check the characters for a closed fold
-  normal 2Gzc
-  let lines = ScreenLines([1, 3], 8)
-  let expected = [
-        \ '  one   ',
-        \ '] +--  3',
-        \ '  five  '
-        \ ]
-  call assert_equal(expected, lines)
-
-  %bw!
-  set fillchars& fdc& foldmethod& foldenable&
-endfunc
-
-func Test_local_fillchars()
-  CheckScreendump
-
-  let lines =<< trim END
-      call setline(1, ['window 1']->repeat(3))
-      setlocal fillchars=stl:1,stlnc:a,vert:=,eob:x
-      vnew
-      call setline(1, ['window 2']->repeat(3))
-      setlocal fillchars=stl:2,stlnc:b,vert:+,eob:y
-      new
-      wincmd J
-      call setline(1, ['window 3']->repeat(3))
-      setlocal fillchars=stl:3,stlnc:c,vert:<,eob:z
-      vnew
-      call setline(1, ['window 4']->repeat(3))
-      setlocal fillchars=stl:4,stlnc:d,vert:>,eob:o
-  END
-  call writefile(lines, 'Xdisplayfillchars', 'D')
-  let buf = RunVimInTerminal('-S Xdisplayfillchars', #{rows: 12})
-  call VerifyScreenDump(buf, 'Test_display_fillchars_1', {})
-
-  call term_sendkeys(buf, ":wincmd k\r")
-  call VerifyScreenDump(buf, 'Test_display_fillchars_2', {})
-
-  call StopVimInTerminal(buf)
-endfunc
-
-func Test_display_linebreak_breakat()
-  new
-  vert resize 25
-  let _breakat = &breakat
-  setl signcolumn=yes linebreak breakat=) showbreak=+\ 
-  call setline(1, repeat('x', winwidth(0) - 2) .. ')abc')
-  let lines = ScreenLines([1, 2], 25)
-  let expected = [
-          \ '  xxxxxxxxxxxxxxxxxxxxxxx',
-          \ '  + )abc                 '
-          \ ]
-  call assert_equal(expected, lines)
-  %bw!
-  let &breakat=_breakat
-endfunc
-
-func Run_Test_display_lastline(euro)
-  let lines =<< trim END
-      call setline(1, ['aaa', 'b'->repeat(200)])
-      set display=truncate
-
-      vsplit
-      100wincmd <
-  END
-  if a:euro != ''
-    let lines[2] = 'set fillchars=vert:\|,lastline:€'
-  endif
-  call writefile(lines, 'XdispLastline', 'D')
-  let buf = RunVimInTerminal('-S XdispLastline', #{rows: 10})
-  call VerifyScreenDump(buf, $'Test_display_lastline_{a:euro}1', {})
-
-  call term_sendkeys(buf, ":set display=lastline\<CR>")
-  call VerifyScreenDump(buf, $'Test_display_lastline_{a:euro}2', {})
-
-  call term_sendkeys(buf, ":100wincmd >\<CR>")
-  call VerifyScreenDump(buf, $'Test_display_lastline_{a:euro}3', {})
-
-  call term_sendkeys(buf, ":set display=truncate\<CR>")
-  call VerifyScreenDump(buf, $'Test_display_lastline_{a:euro}4', {})
-
-  call term_sendkeys(buf, ":close\<CR>")
-  call term_sendkeys(buf, ":3split\<CR>")
-  call VerifyScreenDump(buf, $'Test_display_lastline_{a:euro}5', {})
-
-  call term_sendkeys(buf, ":close\<CR>")
-  call term_sendkeys(buf, ":2vsplit\<CR>")
-  call VerifyScreenDump(buf, $'Test_display_lastline_{a:euro}6', {})
-
-  call StopVimInTerminal(buf)
-endfunc
-
-func Test_display_lastline()
-  CheckScreendump
-
-  call Run_Test_display_lastline('')
-  call Run_Test_display_lastline('euro_')
-
-  call assert_fails(':set fillchars=lastline:', 'E474:')
-  call assert_fails(':set fillchars=lastline:〇', 'E474:')
-endfunc
-
-func Test_display_long_lastline()
-  CheckScreendump
-
-  let lines =<< trim END
-    set display=lastline smoothscroll scrolloff=0
-    call setline(1, [
-      \'aaaaa'->repeat(150),
-      \'bbbbb '->repeat(7) .. 'ccccc '->repeat(7) .. 'ddddd '->repeat(7)
-    \])
-  END
-
-  call writefile(lines, 'XdispLongline', 'D')
-  let buf = RunVimInTerminal('-S XdispLongline', #{rows: 14, cols: 35})
-
-  call term_sendkeys(buf, "736|")
-  call VerifyScreenDump(buf, 'Test_display_long_line_1', {})
-
-  " The correct part of the last line is moved into view.
-  call term_sendkeys(buf, "D")
-  call VerifyScreenDump(buf, 'Test_display_long_line_2', {})
-
-  " "w_skipcol" does not change because the topline is still long enough
-  " to maintain the current skipcol.
-  call term_sendkeys(buf, "g04l11gkD")
-  call VerifyScreenDump(buf, 'Test_display_long_line_3', {})
-
-  " "w_skipcol" is reset to bring the entire topline into view because
-  " the line length is now smaller than the current skipcol + marker.
-  call term_sendkeys(buf, "x")
-  call VerifyScreenDump(buf, 'Test_display_long_line_4', {})
-
-  call StopVimInTerminal(buf)
-endfunc
-
-" Moving the cursor to a line that doesn't fit in the window should show
-" correctly.
-func Test_display_cursor_long_line()
-  CheckScreendump
-
-  let lines =<< trim END
-    call setline(1, ['a', 'b ' .. 'bbbbb'->repeat(150), 'c'])
-    norm $j
-  END
-
-  call writefile(lines, 'XdispCursorLongline', 'D')
-  let buf = RunVimInTerminal('-S XdispCursorLongline', #{rows: 8})
-
-  call VerifyScreenDump(buf, 'Test_display_cursor_long_line_1', {})
-
-  " FIXME: moving the cursor above the topline does not set w_skipcol
-  " correctly with cpo+=n and zero scrolloff (curs_columns() extra == 1).
-  call term_sendkeys(buf, ":set number cpo+=n scrolloff=0\<CR>")
-  call term_sendkeys(buf, '$0')
-  call VerifyScreenDump(buf, 'Test_display_cursor_long_line_2', {})
-
-  " Going to the start of the line with "b" did not set w_skipcol correctly
-  " with 'smoothscroll'.
-   call term_sendkeys(buf, ":set smoothscroll\<CR>")
-   call term_sendkeys(buf, '$b')
-   call VerifyScreenDump(buf, 'Test_display_cursor_long_line_3', {})
-  " Same for "ge".
-   call term_sendkeys(buf, '$ge')
-   call VerifyScreenDump(buf, 'Test_display_cursor_long_line_4', {})
-
-  call StopVimInTerminal(buf)
-endfunc
-
-" vim: shiftwidth=2 sts=2 expandtab
+" Test for displaying stuff
+
+if !has('gui_running') && has('unix')
+  set term=ansi
+endif
+
+source view_util.vim
+source check.vim
+source screendump.vim
+
+func Test_display_foldcolumn()
+  CheckFeature folding
+
+  new
+  vnew
+  vert resize 25
+  call assert_equal(25, winwidth(winnr()))
+  set isprint=@
+
+  1put='e more noise blah blah‚ more stuff here'
+
+  let expect = [
+        \ "e more noise blah blah<82",
+        \ "> more stuff here        "
+        \ ]
+
+  call cursor(2, 1)
+  norm! zt
+  let lines = ScreenLines([1,2], winwidth(0))
+  call assert_equal(expect, lines)
+  set fdc=2
+  let lines = ScreenLines([1,2], winwidth(0))
+  let expect = [
+        \ "  e more noise blah blah<",
+        \ "  82> more stuff here    "
+        \ ]
+  call assert_equal(expect, lines)
+
+  quit!
+  quit!
+endfunc
+
+func Test_display_foldtext_mbyte()
+  CheckFeature folding
+
+  call NewWindow(10, 40)
+  call append(0, range(1,20))
+  exe "set foldmethod=manual foldtext=foldtext() fillchars=fold:\u2500,vert:\u2502 fdc=2"
+  call cursor(2, 1)
+  norm! zf13G
+  let lines=ScreenLines([1,3], winwidth(0)+1)
+  let expect=[
+        \ "  1                                     \u2502",
+        \ "+ +-- 12 lines: 2". repeat("\u2500", 23). "\u2502",
+        \ "  14                                    \u2502",
+        \ ]
+  call assert_equal(expect, lines)
+
+  set fillchars=fold:-,vert:\|
+  let lines=ScreenLines([1,3], winwidth(0)+1)
+  let expect=[
+        \ "  1                                     |",
+        \ "+ +-- 12 lines: 2". repeat("-", 23). "|",
+        \ "  14                                    |",
+        \ ]
+  call assert_equal(expect, lines)
+
+  set foldtext& fillchars& foldmethod& fdc&
+  bw!
+endfunc
+
+" check that win_ins_lines() and win_del_lines() work when t_cs is empty.
+func Test_scroll_without_region()
+  CheckScreendump
+
+  let lines =<< trim END
+    call setline(1, range(1, 20))
+    set t_cs=
+    set laststatus=2
+  END
+  call writefile(lines, 'Xtestscroll', 'D')
+  let buf = RunVimInTerminal('-S Xtestscroll', #{rows: 10})
+
+  call VerifyScreenDump(buf, 'Test_scroll_no_region_1', {})
+
+  call term_sendkeys(buf, ":3delete\<cr>")
+  call VerifyScreenDump(buf, 'Test_scroll_no_region_2', {})
+
+  call term_sendkeys(buf, ":4put\<cr>")
+  call VerifyScreenDump(buf, 'Test_scroll_no_region_3', {})
+
+  call term_sendkeys(buf, ":undo\<cr>")
+  call term_sendkeys(buf, ":undo\<cr>")
+  call term_sendkeys(buf, ":set laststatus=0\<cr>")
+  call VerifyScreenDump(buf, 'Test_scroll_no_region_4', {})
+
+  call term_sendkeys(buf, ":3delete\<cr>")
+  call VerifyScreenDump(buf, 'Test_scroll_no_region_5', {})
+
+  call term_sendkeys(buf, ":4put\<cr>")
+  call VerifyScreenDump(buf, 'Test_scroll_no_region_6', {})
+
+  " clean up
+  call StopVimInTerminal(buf)
+endfunc
+
+func Test_display_listchars_precedes()
+  call NewWindow(10, 10)
+  " Need a physical line that wraps over the complete
+  " window size
+  call append(0, repeat('aaa aaa aa ', 10))
+  call append(1, repeat(['bbb bbb bbb bbb'], 2))
+  " remove blank trailing line
+  $d
+  set list nowrap
+  call cursor(1, 1)
+  " move to end of line and scroll 2 characters back
+  norm! $2zh
+  let lines=ScreenLines([1,4], winwidth(0)+1)
+  let expect = [
+        \ " aaa aa $ |",
+        \ "$         |",
+        \ "$         |",
+        \ "~         |",
+        \ ]
+  call assert_equal(expect, lines)
+  set list listchars+=precedes:< nowrap
+  call cursor(1, 1)
+  " move to end of line and scroll 2 characters back
+  norm! $2zh
+  let lines = ScreenLines([1,4], winwidth(0)+1)
+  let expect = [
+        \ "<aaa aa $ |",
+        \ "<         |",
+        \ "<         |",
+        \ "~         |",
+        \ ]
+  call assert_equal(expect, lines)
+  set wrap
+  call cursor(1, 1)
+  " the complete line should be displayed in the window
+  norm! $
+
+  let lines = ScreenLines([1,10], winwidth(0)+1)
+  let expect = [
+        \ "<aaa aaa a|",
+        \ "a aaa aaa |",
+        \ "aa aaa aaa|",
+        \ " aa aaa aa|",
+        \ "a aa aaa a|",
+        \ "aa aa aaa |",
+        \ "aaa aa aaa|",
+        \ " aaa aa aa|",
+        \ "a aaa aa a|",
+        \ "aa aaa aa |",
+        \ ]
+  call assert_equal(expect, lines)
+  set list& listchars& wrap&
+  bw!
+endfunc
+
+" Check that win_lines() works correctly with the number_only parameter=TRUE
+" should break early to optimize cost of drawing, but needs to make sure
+" that the number column is correctly highlighted.
+func Test_scroll_CursorLineNr_update()
+  CheckScreendump
+
+  let lines =<< trim END
+    hi CursorLineNr ctermfg=73 ctermbg=236
+    set nu rnu cursorline cursorlineopt=number
+    exe ":norm! o\<esc>110ia\<esc>"
+  END
+  let filename = 'Xdrawscreen'
+  call writefile(lines, filename, 'D')
+  let buf = RunVimInTerminal('-S '.filename, #{rows: 5, cols: 50})
+  call term_sendkeys(buf, "k")
+  call VerifyScreenDump(buf, 'Test_winline_rnu', {})
+
+  " clean up
+  call StopVimInTerminal(buf)
+endfunc
+
+" check a long file name does not result in the hit-enter prompt
+func Test_edit_long_file_name()
+  CheckScreendump
+
+  let longName = 'x'->repeat(min([&columns, 255]))
+  call writefile([], longName, 'D')
+  let buf = RunVimInTerminal('-N -u NONE ' .. longName, #{rows: 8})
+
+  call VerifyScreenDump(buf, 'Test_long_file_name_1', {})
+
+  " clean up
+  call StopVimInTerminal(buf)
+endfunc
+
+func Test_unprintable_fileformats()
+  CheckScreendump
+
+  call writefile(["unix\r", "two"], 'Xunix.txt', 'D')
+  call writefile(["mac\r", "two"], 'Xmac.txt', 'D')
+  let lines =<< trim END
+    edit Xunix.txt
+    split Xmac.txt
+    edit ++ff=mac
+  END
+  let filename = 'Xunprintable'
+  call writefile(lines, filename, 'D')
+  let buf = RunVimInTerminal('-S '.filename, #{rows: 9, cols: 50})
+  call VerifyScreenDump(buf, 'Test_display_unprintable_01', {})
+  call term_sendkeys(buf, "\<C-W>\<C-W>\<C-L>")
+  call VerifyScreenDump(buf, 'Test_display_unprintable_02', {})
+
+  " clean up
+  call StopVimInTerminal(buf)
+endfunc
+
+" Test for scrolling that modifies buffer during visual block
+func Test_visual_block_scroll()
+  CheckScreendump
+
+  let lines =<< trim END
+    source $VIMRUNTIME/plugin/matchparen.vim
+    set scrolloff=1
+    call setline(1, ['a', 'b', 'c', 'd', 'e', '', '{', '}', '{', 'f', 'g', '}'])
+    call cursor(5, 1)
+  END
+
+  let filename = 'Xvisualblockmodifiedscroll'
+  call writefile(lines, filename, 'D')
+
+  let buf = RunVimInTerminal('-S '.filename, #{rows: 7})
+  call term_sendkeys(buf, "V\<C-D>\<C-D>")
+
+  call VerifyScreenDump(buf, 'Test_display_visual_block_scroll', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+" Test for clearing paren highlight when switching buffers
+func Test_matchparen_clear_highlight()
+  CheckScreendump
+
+  let lines =<< trim END
+    source $VIMRUNTIME/plugin/matchparen.vim
+    set hidden
+    call setline(1, ['()'])
+    normal 0
+
+    func OtherBuffer()
+       enew
+       exe "normal iaa\<Esc>0"
+    endfunc
+  END
+  call writefile(lines, 'XMatchparenClear', 'D')
+  let buf = RunVimInTerminal('-S XMatchparenClear', #{rows: 5})
+  call VerifyScreenDump(buf, 'Test_matchparen_clear_highlight_1', {})
+
+  call term_sendkeys(buf, ":call OtherBuffer()\<CR>:\<Esc>")
+  call VerifyScreenDump(buf, 'Test_matchparen_clear_highlight_2', {})
+
+  call term_sendkeys(buf, "\<C-^>:\<Esc>")
+  call VerifyScreenDump(buf, 'Test_matchparen_clear_highlight_1', {})
+
+  call term_sendkeys(buf, "\<C-^>:\<Esc>")
+  call VerifyScreenDump(buf, 'Test_matchparen_clear_highlight_2', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+func Test_display_scroll_at_topline()
+  CheckScreendump
+
+  let buf = RunVimInTerminal('', #{cols: 20})
+  call term_sendkeys(buf, ":call setline(1, repeat('a', 21))\<CR>")
+  call TermWait(buf)
+  call term_sendkeys(buf, "O\<Esc>")
+  call VerifyScreenDump(buf, 'Test_display_scroll_at_topline', #{rows: 4})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+func Test_display_scroll_update_visual()
+  CheckScreendump
+
+  let lines =<< trim END
+      set scrolloff=0
+      call setline(1, repeat(['foo'], 10))
+      call sign_define('foo', { 'text': '>' })
+      call sign_place(1, 'bar', 'foo', bufnr(), { 'lnum': 2 })
+      call sign_place(2, 'bar', 'foo', bufnr(), { 'lnum': 1 })
+      autocmd CursorMoved * if getcurpos()[1] == 2 | call sign_unplace('bar', { 'id': 1 }) | endif
+  END
+  call writefile(lines, 'XupdateVisual.vim', 'D')
+
+  let buf = RunVimInTerminal('-S XupdateVisual.vim', #{rows: 8, cols: 60})
+  call term_sendkeys(buf, "VG7kk")
+  call VerifyScreenDump(buf, 'Test_display_scroll_update_visual', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+" Test for 'eob' (EndOfBuffer) item in 'fillchars'
+func Test_eob_fillchars()
+  " default value
+  call assert_match('eob:\~', &fillchars)
+  " invalid values
+  call assert_fails(':set fillchars=eob:', 'E474:')
+  call assert_fails(':set fillchars=eob:xy', 'E474:')
+  call assert_fails(':set fillchars=eob:\255', 'E474:')
+  call assert_fails(':set fillchars=eob:<ff>', 'E474:')
+  call assert_fails(":set fillchars=eob:\x01", 'E474:')
+  call assert_fails(':set fillchars=eob:\\x01', 'E474:')
+  " default is ~
+  new
+  redraw
+  call assert_equal('~', Screenline(2))
+  set fillchars=eob:+
+  redraw
+  call assert_equal('+', Screenline(2))
+  set fillchars=eob:\ 
+  redraw
+  call assert_equal(' ', nr2char(screenchar(2, 1)))
+  set fillchars&
+  close
+endfunc
+
+" Test for 'foldopen', 'foldclose' and 'foldsep' in 'fillchars'
+func Test_fold_fillchars()
+  new
+  set fdc=2 foldenable foldmethod=manual
+  call setline(1, ['one', 'two', 'three', 'four', 'five'])
+  2,4fold
+  " First check for the default setting for a closed fold
+  let lines = ScreenLines([1, 3], 8)
+  let expected = [
+        \ '  one   ',
+        \ '+ +--  3',
+        \ '  five  '
+        \ ]
+  call assert_equal(expected, lines)
+  normal 2Gzo
+  " check the characters for an open fold
+  let lines = ScreenLines([1, 5], 8)
+  let expected = [
+        \ '  one   ',
+        \ '- two   ',
+        \ '| three ',
+        \ '| four  ',
+        \ '  five  '
+        \ ]
+  call assert_equal(expected, lines)
+
+  " change the setting
+  set fillchars=vert:\|,fold:-,eob:~,foldopen:[,foldclose:],foldsep:-
+
+  " check the characters for an open fold
+  let lines = ScreenLines([1, 5], 8)
+  let expected = [
+        \ '  one   ',
+        \ '[ two   ',
+        \ '- three ',
+        \ '- four  ',
+        \ '  five  '
+        \ ]
+  call assert_equal(expected, lines)
+
+  " check the characters for a closed fold
+  normal 2Gzc
+  let lines = ScreenLines([1, 3], 8)
+  let expected = [
+        \ '  one   ',
+        \ '] +--  3',
+        \ '  five  '
+        \ ]
+  call assert_equal(expected, lines)
+
+  %bw!
+  set fillchars& fdc& foldmethod& foldenable&
+endfunc
+
+func Test_local_fillchars()
+  CheckScreendump
+
+  let lines =<< trim END
+      call setline(1, ['window 1']->repeat(3))
+      setlocal fillchars=stl:1,stlnc:a,vert:=,eob:x
+      vnew
+      call setline(1, ['window 2']->repeat(3))
+      setlocal fillchars=stl:2,stlnc:b,vert:+,eob:y
+      new
+      wincmd J
+      call setline(1, ['window 3']->repeat(3))
+      setlocal fillchars=stl:3,stlnc:c,vert:<,eob:z
+      vnew
+      call setline(1, ['window 4']->repeat(3))
+      setlocal fillchars=stl:4,stlnc:d,vert:>,eob:o
+  END
+  call writefile(lines, 'Xdisplayfillchars', 'D')
+  let buf = RunVimInTerminal('-S Xdisplayfillchars', #{rows: 12})
+  call VerifyScreenDump(buf, 'Test_display_fillchars_1', {})
+
+  call term_sendkeys(buf, ":wincmd k\r")
+  call VerifyScreenDump(buf, 'Test_display_fillchars_2', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+func Test_display_linebreak_breakat()
+  new
+  vert resize 25
+  let _breakat = &breakat
+  setl signcolumn=yes linebreak breakat=) showbreak=+\ 
+  call setline(1, repeat('x', winwidth(0) - 2) .. ')abc')
+  let lines = ScreenLines([1, 2], 25)
+  let expected = [
+          \ '  xxxxxxxxxxxxxxxxxxxxxxx',
+          \ '  + )abc                 '
+          \ ]
+  call assert_equal(expected, lines)
+  %bw!
+  let &breakat=_breakat
+endfunc
+
+func Run_Test_display_lastline(euro)
+  let lines =<< trim END
+      call setline(1, ['aaa', 'b'->repeat(200)])
+      set display=truncate
+
+      vsplit
+      100wincmd <
+  END
+  if a:euro != ''
+    let lines[2] = 'set fillchars=vert:\|,lastline:€'
+  endif
+  call writefile(lines, 'XdispLastline', 'D')
+  let buf = RunVimInTerminal('-S XdispLastline', #{rows: 10})
+  call VerifyScreenDump(buf, $'Test_display_lastline_{a:euro}1', {})
+
+  call term_sendkeys(buf, ":set display=lastline\<CR>")
+  call VerifyScreenDump(buf, $'Test_display_lastline_{a:euro}2', {})
+
+  call term_sendkeys(buf, ":100wincmd >\<CR>")
+  call VerifyScreenDump(buf, $'Test_display_lastline_{a:euro}3', {})
+
+  call term_sendkeys(buf, ":set display=truncate\<CR>")
+  call VerifyScreenDump(buf, $'Test_display_lastline_{a:euro}4', {})
+
+  call term_sendkeys(buf, ":close\<CR>")
+  call term_sendkeys(buf, ":3split\<CR>")
+  call VerifyScreenDump(buf, $'Test_display_lastline_{a:euro}5', {})
+
+  call term_sendkeys(buf, ":close\<CR>")
+  call term_sendkeys(buf, ":2vsplit\<CR>")
+  call VerifyScreenDump(buf, $'Test_display_lastline_{a:euro}6', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+func Test_display_lastline()
+  CheckScreendump
+
+  call Run_Test_display_lastline('')
+  call Run_Test_display_lastline('euro_')
+
+  call assert_fails(':set fillchars=lastline:', 'E474:')
+  call assert_fails(':set fillchars=lastline:〇', 'E474:')
+endfunc
+
+func Test_display_long_lastline()
+  CheckScreendump
+
+  let lines =<< trim END
+    set display=lastline smoothscroll scrolloff=0
+    call setline(1, [
+      \'aaaaa'->repeat(150),
+      \'bbbbb '->repeat(7) .. 'ccccc '->repeat(7) .. 'ddddd '->repeat(7)
+    \])
+  END
+
+  call writefile(lines, 'XdispLongline', 'D')
+  let buf = RunVimInTerminal('-S XdispLongline', #{rows: 14, cols: 35})
+
+  call term_sendkeys(buf, "736|")
+  call VerifyScreenDump(buf, 'Test_display_long_line_1', {})
+
+  " The correct part of the last line is moved into view.
+  call term_sendkeys(buf, "D")
+  call VerifyScreenDump(buf, 'Test_display_long_line_2', {})
+
+  " "w_skipcol" does not change because the topline is still long enough
+  " to maintain the current skipcol.
+  call term_sendkeys(buf, "g04l11gkD")
+  call VerifyScreenDump(buf, 'Test_display_long_line_3', {})
+
+  " "w_skipcol" is reset to bring the entire topline into view because
+  " the line length is now smaller than the current skipcol + marker.
+  call term_sendkeys(buf, "x")
+  call VerifyScreenDump(buf, 'Test_display_long_line_4', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+" Moving the cursor to a line that doesn't fit in the window should show
+" correctly.
+func Test_display_cursor_long_line()
+  CheckScreendump
+
+  let lines =<< trim END
+    call setline(1, ['a', 'b ' .. 'bbbbb'->repeat(150), 'c'])
+    norm $j
+  END
+
+  call writefile(lines, 'XdispCursorLongline', 'D')
+  let buf = RunVimInTerminal('-S XdispCursorLongline', #{rows: 8})
+
+  call VerifyScreenDump(buf, 'Test_display_cursor_long_line_1', {})
+
+  " FIXME: moving the cursor above the topline does not set w_skipcol
+  " correctly with cpo+=n and zero scrolloff (curs_columns() extra == 1).
+  call term_sendkeys(buf, ":set number cpo+=n scrolloff=0\<CR>")
+  call term_sendkeys(buf, '$0')
+  call VerifyScreenDump(buf, 'Test_display_cursor_long_line_2', {})
+
+  " Going to the start of the line with "b" did not set w_skipcol correctly
+  " with 'smoothscroll'.
+   call term_sendkeys(buf, ":set smoothscroll\<CR>")
+   call term_sendkeys(buf, '$b')
+   call VerifyScreenDump(buf, 'Test_display_cursor_long_line_3', {})
+  " Same for "ge".
+   call term_sendkeys(buf, '$ge')
+   call VerifyScreenDump(buf, 'Test_display_cursor_long_line_4', {})
+
+  call StopVimInTerminal(buf)
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab