1" Tests for decoding escape sequences sent by the terminal.
2
3" This only works for Unix in a terminal
4if has('gui_running') || !has('unix')
5  finish
6endif
7
8func Test_xterm_mouse_click()
9  new
10  let save_mouse = &mouse
11  let save_term = &term
12  let save_ttymouse = &ttymouse
13  set mouse=a
14  set term=xterm
15  call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer'])
16  redraw
17
18  " Xterm mouse click
19  set ttymouse=xterm
20  let button = 0x20  " left down
21  let row = 2 + 32
22  let col = 6 + 32
23  call feedkeys("\<Esc>[M" .. list2str([button, col, row]), 'Lx!')
24
25  let button = 0x23  " release
26  call feedkeys("\<Esc>[M" .. list2str([button, col, row]), 'Lx!')
27
28  call assert_equal([0, 2, 6, 0], getpos('.'))
29
30  " SGR mouse click
31  set ttymouse=sgr
32  let button = 0  " left down
33  let row = 3
34  let col = 9
35  call feedkeys(printf("\<Esc>[<%d;%d;%dM", button, col, row), 'Lx!')
36
37  let button = 3  " release
38  call feedkeys(printf("\<Esc>[<%d;%d;%dm", button, col, row), 'Lx!')
39
40  call assert_equal([0, 3, 9, 0], getpos('.'))
41
42  let &mouse = save_mouse
43  let &term = save_term
44  let &ttymouse = save_ttymouse
45  bwipe!
46endfunc
47
48func Test_xterm_mouse_wheel()
49  new
50  let save_mouse = &mouse
51  let save_term = &term
52  let save_ttymouse = &ttymouse
53  set mouse=a
54  set term=xterm
55  call setline(1, range(1, 100))
56
57  " Test Xterm mouse wheel.
58  set ttymouse=xterm
59  let button = 0x41 " wheel down.
60  let row = 1 + 32  " cursor position for mouse wheel is not relevant.
61  let col = 1 + 32
62
63  call assert_equal(1, line('w0'))
64  call assert_equal([0, 1, 1, 0], getpos('.'))
65  call feedkeys("\<Esc>[M" .. list2str([button, col, row]), 'Lx!')
66  call assert_equal(4, line('w0'))
67  call assert_equal([0, 4, 1, 0], getpos('.'))
68  call feedkeys("\<Esc>[M" .. list2str([button, col, row]), 'Lx!')
69  call assert_equal(7, line('w0'))
70  call assert_equal([0, 7, 1, 0], getpos('.'))
71
72  let button = 0x40  " wheel up.
73
74  call feedkeys("\<Esc>[M" .. list2str([button, col, row]), 'Lx!')
75  call assert_equal(4, line('w0'))
76  call assert_equal([0, 7, 1, 0], getpos('.'))
77  call feedkeys("\<Esc>[M" .. list2str([button, col, row]), 'Lx!')
78  call assert_equal(1, line('w0'))
79  call assert_equal([0, 7, 1, 0], getpos('.'))
80
81  " Test SGR mouse wheel.
82  set ttymouse=sgr
83  go
84  let button = 0x41 " wheel down.
85  let row = 1       " cursor position for mouse wheel is not relevant.
86  let col = 1
87
88  call assert_equal(1, line('w0'))
89  call assert_equal([0, 1, 1, 0], getpos('.'))
90  call feedkeys(printf("\<Esc>[<%d;%d;%dM", button, col, row), 'Lx!')
91  call assert_equal(4, line('w0'))
92  call assert_equal([0, 4, 1, 0], getpos('.'))
93  call feedkeys(printf("\<Esc>[<%d;%d;%dM", button, col, row), 'Lx!')
94  call assert_equal(7, line('w0'))
95  call assert_equal([0, 7, 1, 0], getpos('.'))
96
97  let button = 0x40  " wheel up.
98
99  call feedkeys(printf("\<Esc>[<%d;%d;%dM", button, col, row), 'Lx!')
100  call assert_equal(4, line('w0'))
101  call assert_equal([0, 7, 1, 0], getpos('.'))
102  call feedkeys(printf("\<Esc>[<%d;%d;%dM", button, col, row), 'Lx!')
103  call assert_equal(1, line('w0'))
104  call assert_equal([0, 7, 1, 0], getpos('.'))
105  call feedkeys(printf("\<Esc>[<%d;%d;%dM", button, col, row), 'Lx!')
106  call assert_equal(1, line('w0'))
107  call assert_equal([0, 7, 1, 0], getpos('.'))
108
109  let &mouse = save_mouse
110  let &term = save_term
111  let &ttymouse = save_ttymouse
112  bwipe!
113endfunc
114
115func Test_xterm_mouse_drag_window_separator()
116  let save_mouse = &mouse
117  let save_term = &term
118  let save_ttymouse = &ttymouse
119  set mouse=a
120  set term=xterm
121  set ttymouse=sgr
122
123  " Split horizontally and test dragging the horizontal window separator.
124  split
125  let rowseparator = winheight(0) + 1
126
127  let button = 0  " left down.
128  let row = rowseparator
129  let col = 1
130  call feedkeys(printf("\<Esc>[<%d;%d;%dM", button, col, row), 'Lx!')
131
132  let drag = 32
133  let row -= 1
134  call feedkeys(printf("\<Esc>[<%d;%d;%dM", drag, col, row), 'Lx!')
135  call assert_equal(rowseparator - 1, winheight(0) + 1)
136  let row += 1
137  call feedkeys(printf("\<Esc>[<%d;%d;%dM", drag, col, row), 'Lx!')
138  call assert_equal(rowseparator, winheight(0) + 1)
139
140  let release = 3
141  call feedkeys(printf("\<Esc>[<%d;%d;%dm", release, col, row), 'Lx!')
142  call assert_equal(rowseparator, winheight(0) + 1)
143
144  bwipe!
145
146  " Split vertically and test dragging the vertical window separator.
147  vsplit
148  let colseparator = winwidth(0) + 1
149
150  let button = 0
151  let row = 1
152  let col = colseparator
153  call feedkeys(printf("\<Esc>[<%d;%d;%dM", button, col, row), 'Lx!')
154
155  let drag = 32
156  let col -= 1
157  call feedkeys(printf("\<Esc>[<%d;%d;%dM", drag, col, row), 'Lx!')
158  call assert_equal(colseparator - 1, winwidth(0) + 1)
159  let col += 1
160  call feedkeys(printf("\<Esc>[<%d;%d;%dM", drag, col, row), 'Lx!')
161  call assert_equal(colseparator, winwidth(0) + 1)
162
163  let release = 3
164  call feedkeys(printf("\<Esc>[<%d;%d;%dm", release, col, row), 'Lx!')
165  call assert_equal(colseparator, winwidth(0) + 1)
166
167  bwipe!
168  let &mouse = save_mouse
169  let &term = save_term
170  let &ttymouse = save_ttymouse
171endfunc
172