aboutsummaryrefslogtreecommitdiff
path: root/test/functional/autocmd/winscrolled_spec.lua
blob: cd9c6dd16812a2228b404cb4fd0e6278e92c2ce7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')

local clear = helpers.clear
local eq = helpers.eq
local eval = helpers.eval
local exec = helpers.exec
local command = helpers.command
local feed = helpers.feed
local meths = helpers.meths
local assert_alive = helpers.assert_alive

before_each(clear)

describe('WinScrolled', function()
  local win_id

  before_each(function()
    win_id = meths.get_current_win().id
    command(string.format('autocmd WinScrolled %d let g:matched = v:true', win_id))
    command('let g:scrolled = 0')
    command('autocmd WinScrolled * let g:scrolled += 1')
    command([[autocmd WinScrolled * let g:amatch = str2nr(expand('<amatch>'))]])
    command([[autocmd WinScrolled * let g:afile = str2nr(expand('<afile>'))]])
  end)

  after_each(function()
    eq(true, eval('g:matched'))
    eq(win_id, eval('g:amatch'))
    eq(win_id, eval('g:afile'))
  end)

  it('is triggered by scrolling vertically', function()
    local lines = {'123', '123'}
    meths.buf_set_lines(0, 0, -1, true, lines)
    eq(0, eval('g:scrolled'))
    feed('<C-E>')
    eq(1, eval('g:scrolled'))
  end)

  it('is triggered by scrolling horizontally', function()
    command('set nowrap')
    local width = meths.win_get_width(0)
    local line = '123' .. ('*'):rep(width * 2)
    local lines = {line, line}
    meths.buf_set_lines(0, 0, -1, true, lines)
    eq(0, eval('g:scrolled'))
    feed('zl')
    eq(1, eval('g:scrolled'))
  end)

  it('is triggered by horizontal scrolling from cursor move', function()
    command('set nowrap')
    local lines = {'', '', 'Foo'}
    meths.buf_set_lines(0, 0, -1, true, lines)
    meths.win_set_cursor(0, {3, 0})
    eq(0, eval('g:scrolled'))
    feed('zl')
    eq(1, eval('g:scrolled'))
    feed('zl')
    eq(2, eval('g:scrolled'))
    feed('h')
    eq(3, eval('g:scrolled'))
  end)

  it('is triggered by scrolling on a long wrapped line #19968', function()
    local height = meths.win_get_height(0)
    local width = meths.win_get_width(0)
    meths.buf_set_lines(0, 0, -1, true, {('foo'):rep(height * width)})
    meths.win_set_cursor(0, {1, height * width - 1})
    eq(0, eval('g:scrolled'))
    feed('gj')
    eq(1, eval('g:scrolled'))
    feed('0')
    eq(2, eval('g:scrolled'))
    feed('$')
    eq(3, eval('g:scrolled'))
  end)

  it('is triggered when the window scrolls in Insert mode', function()
    local height = meths.win_get_height(0)
    local lines = {}
    for i = 1, height * 2 do
      lines[i] = tostring(i)
    end
    meths.buf_set_lines(0, 0, -1, true, lines)
    feed('L')
    eq(0, eval('g:scrolled'))
    feed('A<CR><Esc>')
    eq(1, eval('g:scrolled'))
  end)
end)

describe('WinScrolled', function()
  -- oldtest: Test_WinScrolled_mouse()
  it('is triggered by mouse scrolling in another window', function()
    local screen = Screen.new(75, 10)
    screen:attach()
    exec([[
      set nowrap scrolloff=0
      set mouse=a
      call setline(1, ['foo']->repeat(32))
      split
      let g:scrolled = 0
      au WinScrolled * let g:scrolled += 1
    ]])
    eq(0, eval('g:scrolled'))

    -- With the upper split focused, send a scroll-down event to the unfocused one.
    meths.input_mouse('wheel', 'down', '', 0, 6, 0)
    eq(1, eval('g:scrolled'))

    -- Again, but this time while we're in insert mode.
    feed('i')
    meths.input_mouse('wheel', 'down', '', 0, 6, 0)
    feed('<Esc>')
    eq(2, eval('g:scrolled'))
  end)

  -- oldtest: Test_WinScrolled_close_curwin()
  it('closing window does not cause use-after-free #13265', function()
    exec([[
      set nowrap scrolloff=0
      call setline(1, ['aaa', 'bbb'])
      vsplit
      au WinScrolled * close
    ]])

    -- This was using freed memory
    feed('<C-E>')
    assert_alive()
  end)
end)