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