blob: 949fa94814ccf16317f44919a358f924ddb6986c [file] [log] [blame]
" Tests for decoding escape sequences sent by the terminal.
" This only works for Unix in a terminal
if has('gui_running') || !has('unix')
finish
endif
" Helper function to emit a terminal escape code.
func TerminalEscapeCode(code_xterm, code_sgr, row, col, m)
if &ttymouse ==# 'xterm'
" need to use byte encoding here.
let str = list2str([a:code_xterm, a:col + 0x20, a:row + 0x20])
if has('iconv')
let bytes = iconv(str, 'utf-8', 'latin1')
else
" Hopefully the numbers are not too big.
let bytes = str
endif
call feedkeys("\<Esc>[M" .. bytes, 'Lx!')
elseif &ttymouse ==# 'sgr'
call feedkeys(printf("\<Esc>[<%d;%d;%d%s", a:code_sgr, a:col, a:row, a:m), 'Lx!')
endif
endfunc
func MouseLeftClick(row, col)
call TerminalEscapeCode(0x20, 0, a:row, a:col, 'M')
endfunc
func MouseLeftRelease(row, col)
call TerminalEscapeCode(0x23, 3, a:row, a:col, 'm')
endfunc
func MouseLeftDrag(row, col)
call TerminalEscapeCode(0x43, 0x20, a:row, a:col, 'M')
endfunc
func MouseWheelUp(row, col)
call TerminalEscapeCode(0x40, 0x40, a:row, a:col, 'M')
endfunc
func MouseWheelDown(row, col)
call TerminalEscapeCode(0x41, 0x41, a:row, a:col, 'M')
endfunc
func Test_xterm_mouse_click()
new
let save_mouse = &mouse
let save_term = &term
let save_ttymouse = &ttymouse
set mouse=a term=xterm
call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer'])
for ttymouse_val in ['xterm', 'sgr']
exe 'set ttymouse=' . ttymouse_val
go
call assert_equal([0, 1, 1, 0], getpos('.'))
let row = 2
let col = 6
call MouseLeftClick(row, col)
call MouseLeftRelease(row, col)
call assert_equal([0, 2, 6, 0], getpos('.'))
endfor
let &mouse = save_mouse
let &term = save_term
let &ttymouse = save_ttymouse
bwipe!
endfunc
func Test_xterm_mouse_wheel()
new
let save_mouse = &mouse
let save_term = &term
let save_ttymouse = &ttymouse
set mouse=a term=xterm
call setline(1, range(1, 100))
for ttymouse_val in ['xterm', 'sgr']
exe 'set ttymouse=' . ttymouse_val
go
call assert_equal(1, line('w0'))
call assert_equal([0, 1, 1, 0], getpos('.'))
call MouseWheelDown(1, 1)
call assert_equal(4, line('w0'))
call assert_equal([0, 4, 1, 0], getpos('.'))
call MouseWheelDown(1, 1)
call assert_equal(7, line('w0'))
call assert_equal([0, 7, 1, 0], getpos('.'))
call MouseWheelUp(1, 1)
call assert_equal(4, line('w0'))
call assert_equal([0, 7, 1, 0], getpos('.'))
call MouseWheelUp(1, 1)
call assert_equal(1, line('w0'))
call assert_equal([0, 7, 1, 0], getpos('.'))
endfor
let &mouse = save_mouse
let &term = save_term
let &ttymouse = save_ttymouse
bwipe!
endfunc
func Test_xterm_mouse_drag_window_separator()
let save_mouse = &mouse
let save_term = &term
let save_ttymouse = &ttymouse
set mouse=a term=xterm
for ttymouse_val in ['xterm', 'sgr']
exe 'set ttymouse=' . ttymouse_val
" Split horizontally and test dragging the horizontal window separator.
split
let rowseparator = winheight(0) + 1
let row = rowseparator
let col = 1
if ttymouse_val ==# 'xterm' && row > 223
" When 'ttymouse' is 'xterm', row/col bigger than 223 are not supported.
continue
endif
call MouseLeftClick(row, col)
let row -= 1
call MouseLeftDrag(row, col)
call assert_equal(rowseparator - 1, winheight(0) + 1)
let row += 1
call MouseLeftDrag(row, col)
call assert_equal(rowseparator, winheight(0) + 1)
call MouseLeftRelease(row, col)
call assert_equal(rowseparator, winheight(0) + 1)
bwipe!
" Split vertically and test dragging the vertical window separator.
vsplit
let colseparator = winwidth(0) + 1
let row = 1
let col = colseparator
call MouseLeftClick(row, col)
let col -= 1
call MouseLeftDrag(row, col)
call assert_equal(colseparator - 1, winwidth(0) + 1)
let col += 1
call MouseLeftDrag(row, col)
call assert_equal(colseparator, winwidth(0) + 1)
call MouseLeftRelease(row, col)
call assert_equal(colseparator, winwidth(0) + 1)
bwipe!
endfor
let &mouse = save_mouse
let &term = save_term
let &ttymouse = save_ttymouse
endfunc
func Test_xterm_mouse_drag_statusline()
let save_mouse = &mouse
let save_term = &term
let save_ttymouse = &ttymouse
set mouse=a term=xterm
for ttymouse_val in ['xterm', 'sgr']
exe 'set ttymouse=' . ttymouse_val
call assert_equal(1, &cmdheight)
let rowstatusline = winheight(0) + 1
let row = rowstatusline
let col = 1
if ttymouse_val ==# 'xterm' && row > 223
" When 'ttymouse' is 'xterm', row/col bigger than 223 are not supported.
continue
endif
call MouseLeftClick(row, col)
let row -= 1
call MouseLeftDrag(row, col)
call assert_equal(2, &cmdheight)
call assert_equal(rowstatusline - 1, winheight(0) + 1)
let row += 1
call MouseLeftDrag(row, col)
call assert_equal(1, &cmdheight)
call assert_equal(rowstatusline, winheight(0) + 1)
call MouseLeftRelease(row, col)
call assert_equal(1, &cmdheight)
call assert_equal(rowstatusline, winheight(0) + 1)
endfor
let &mouse = save_mouse
let &term = save_term
let &ttymouse = save_ttymouse
endfunc