display_spec.lua 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. local n = require('test.functional.testnvim')()
  2. local Screen = require('test.functional.ui.screen')
  3. local clear = n.clear
  4. local exec = n.exec
  5. local feed = n.feed
  6. local command = n.command
  7. describe('display', function()
  8. before_each(clear)
  9. -- oldtest: Test_display_scroll_at_topline()
  10. it('scroll when modified at topline vim-patch:8.2.1488', function()
  11. local screen = Screen.new(20, 4)
  12. command([[call setline(1, repeat('a', 21))]])
  13. feed('O')
  14. screen:expect([[
  15. ^ |
  16. aaaaaaaaaaaaaaaaaaaa|
  17. a |
  18. {5:-- INSERT --} |
  19. ]])
  20. end)
  21. -- oldtest: Test_display_scroll_update_visual()
  22. it('scrolling when modified at topline in Visual mode vim-patch:8.2.4626', function()
  23. local screen = Screen.new(60, 8)
  24. exec([[
  25. set scrolloff=0
  26. call setline(1, repeat(['foo'], 10))
  27. call sign_define('foo', { 'text': '>' })
  28. call sign_place(1, 'bar', 'foo', bufnr(), { 'lnum': 2 })
  29. call sign_place(2, 'bar', 'foo', bufnr(), { 'lnum': 1 })
  30. autocmd CursorMoved * if getcurpos()[1] == 2 | call sign_unplace('bar', { 'id': 1 }) | endif
  31. ]])
  32. feed('VG7kk')
  33. screen:expect([[
  34. {7: }^f{17:oo} |
  35. {7: }foo |*6
  36. {5:-- VISUAL LINE --} |
  37. ]])
  38. end)
  39. local function run_test_display_lastline(euro)
  40. local screen = Screen.new(75, 10)
  41. screen:set_default_attr_ids({
  42. [1] = { bold = true, foreground = Screen.colors.Blue }, -- NonText
  43. [2] = { bold = true, reverse = true }, -- StatusLine
  44. [3] = { reverse = true }, -- StatusLineNC
  45. })
  46. exec([[
  47. call setline(1, ['aaa', 'b'->repeat(200)])
  48. set display=truncate
  49. vsplit
  50. 100wincmd <
  51. ]])
  52. local fillchar = '@'
  53. if euro then
  54. command('set fillchars=lastline:€')
  55. fillchar = '€'
  56. end
  57. screen:expect((([[
  58. ^a│aaa |
  59. a│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|*2
  60. b│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb |
  61. b│{1:~ }|*3
  62. {1:@}│{1:~ }|
  63. {2:< }{3:[No Name] [+] }|
  64. |
  65. ]]):gsub('@', fillchar)))
  66. command('set display=lastline')
  67. screen:expect_unchanged()
  68. command('100wincmd >')
  69. screen:expect((([[
  70. ^aaa │a|
  71. bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb│a|*2
  72. bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb │b|
  73. {1:~ }│b|*3
  74. {1:~ }│{1:@}|
  75. {2:[No Name] [+] }{3:<}|
  76. |
  77. ]]):gsub('@', fillchar)))
  78. command('set display=truncate')
  79. screen:expect_unchanged()
  80. command('close')
  81. command('3split')
  82. screen:expect((([[
  83. ^aaa |
  84. bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
  85. {1:@@@ }|
  86. {2:[No Name] [+] }|
  87. aaa |
  88. bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|*2
  89. bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb |
  90. {3:[No Name] [+] }|
  91. |
  92. ]]):gsub('@', fillchar)))
  93. command('close')
  94. command('2vsplit')
  95. screen:expect((([[
  96. ^aa│aaa |
  97. a │bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
  98. bb│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
  99. bb│bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb |
  100. bb│{1:~ }|*3
  101. {1:@@}│{1:~ }|
  102. {2:< }{3:[No Name] [+] }|
  103. |
  104. ]]):gsub('@', fillchar)))
  105. end
  106. -- oldtest: Test_display_lastline()
  107. it('display "lastline" works correctly', function()
  108. run_test_display_lastline()
  109. end)
  110. it('display "lastline" works correctly with multibyte fillchar', function()
  111. run_test_display_lastline(true)
  112. end)
  113. -- oldtest: Test_display_long_lastline()
  114. it('"lastline" shows correct text when end of wrapped line is deleted', function()
  115. local screen = Screen.new(35, 14)
  116. exec([[
  117. set display=lastline smoothscroll scrolloff=0
  118. call setline(1, [
  119. \'aaaaa'->repeat(150),
  120. \'bbbbb '->repeat(7) .. 'ccccc '->repeat(7) .. 'ddddd '->repeat(7)
  121. \])
  122. ]])
  123. feed('736|')
  124. screen:expect([[
  125. {1:<<<}aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
  126. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|*11
  127. ^aaaaaaaaaaaaaaa |
  128. |
  129. ]])
  130. -- The correct part of the last line is moved into view.
  131. feed('D')
  132. screen:expect([[
  133. {1:<<<}aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
  134. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|*10
  135. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa^a|
  136. bbbbb bbbbb bbbbb bbbbb bbbbb bb{1:@@@}|
  137. |
  138. ]])
  139. -- "w_skipcol" does not change because the topline is still long enough
  140. -- to maintain the current skipcol.
  141. feed('g04l11gkD')
  142. screen:expect([[
  143. {1:<<<}^a |
  144. bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb|
  145. bbbbb ccccc ccccc ccccc ccccc cccc|
  146. c ccccc ccccc ddddd ddddd ddddd ddd|
  147. dd ddddd ddddd ddddd |
  148. {1:~ }|*8
  149. |
  150. ]])
  151. -- "w_skipcol" is reset to bring the entire topline into view because
  152. -- the line length is now smaller than the current skipcol + marker.
  153. feed('x')
  154. screen:expect([[
  155. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|*9
  156. aa^a |
  157. bbbbb bbbbb bbbbb bbbbb bbbbb bbbbb|
  158. bbbbb ccccc ccccc ccccc ccccc cccc|
  159. c ccccc ccccc ddddd ddddd ddddd {1:@@@}|
  160. |
  161. ]])
  162. end)
  163. -- oldtest: Test_display_cursor_long_line()
  164. it("correctly shows line that doesn't fit in the window", function()
  165. local screen = Screen.new(75, 8)
  166. exec([[
  167. call setline(1, ['a', 'b ' .. 'bbbbb'->repeat(150), 'c'])
  168. norm $j
  169. ]])
  170. screen:expect([[
  171. {1:<<<}bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
  172. bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|*5
  173. b^b |
  174. |
  175. ]])
  176. -- FIXME: moving the cursor above the topline does not set w_skipcol
  177. -- correctly with cpo+=n and zero scrolloff (curs_columns() extra == 1).
  178. exec('set number cpo+=n scrolloff=0')
  179. feed('$0')
  180. screen:expect([[
  181. {1:<<<}b^bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
  182. bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|*6
  183. |
  184. ]])
  185. -- Going to the start of the line with "b" did not set w_skipcol correctly with 'smoothscroll'.
  186. exec('set smoothscroll')
  187. feed('$b')
  188. screen:expect([[
  189. {8: 2 }b ^bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
  190. bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|*6
  191. |
  192. ]])
  193. -- Same for "ge".
  194. feed('$ge')
  195. screen:expect([[
  196. {8: 2 }^b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|
  197. bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|*6
  198. |
  199. ]])
  200. end)
  201. end)