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
8source shared.vim
9
10" xterm2 and sgr always work, urxvt is optional.
11let s:ttymouse_values = ['xterm2', 'sgr']
12if has('mouse_urxvt')
13  call add(s:ttymouse_values, 'urxvt')
14endif
15
16" dec doesn't support all the functionality
17if has('mouse_dec')
18  let s:ttymouse_dec = ['dec']
19else
20  let s:ttymouse_dec = []
21endif
22
23" netterm only supports left click
24if has('mouse_netterm')
25  let s:ttymouse_netterm = ['netterm']
26else
27  let s:ttymouse_netterm = []
28endif
29
30" Helper function to emit a terminal escape code.
31func TerminalEscapeCode(code, row, col, m)
32  if &ttymouse ==# 'xterm2'
33    " need to use byte encoding here.
34    let str = list2str([a:code + 0x20, a:col + 0x20, a:row + 0x20])
35    if has('iconv')
36      let bytes = iconv(str, 'utf-8', 'latin1')
37    else
38      " Hopefully the numbers are not too big.
39      let bytes = str
40    endif
41    call feedkeys("\<Esc>[M" .. bytes, 'Lx!')
42  elseif &ttymouse ==# 'sgr'
43    call feedkeys(printf("\<Esc>[<%d;%d;%d%s", a:code, a:col, a:row, a:m), 'Lx!')
44  elseif &ttymouse ==# 'urxvt'
45    call feedkeys(printf("\<Esc>[%d;%d;%dM", a:code + 0x20, a:col, a:row), 'Lx!')
46  endif
47endfunc
48
49func DecEscapeCode(code, down, row, col)
50    call feedkeys(printf("\<Esc>[%d;%d;%d;%d&w", a:code, a:down, a:row, a:col), 'Lx!')
51endfunc
52
53func NettermEscapeCode(row, col)
54    call feedkeys(printf("\<Esc>}%d,%d\r", a:row, a:col), 'Lx!')
55endfunc
56
57func MouseLeftClick(row, col)
58  if &ttymouse ==# 'dec'
59    call DecEscapeCode(2, 4, a:row, a:col)
60  elseif &ttymouse ==# 'netterm'
61    call NettermEscapeCode(a:row, a:col)
62  else
63    call TerminalEscapeCode(0, a:row, a:col, 'M')
64  endif
65endfunc
66
67func MouseMiddleClick(row, col)
68  if &ttymouse ==# 'dec'
69    call DecEscapeCode(4, 2, a:row, a:col)
70  else
71    call TerminalEscapeCode(1, a:row, a:col, 'M')
72  endif
73endfunc
74
75func MouseCtrlLeftClick(row, col)
76  let ctrl = 0x10
77  call TerminalEscapeCode(0 + ctrl, a:row, a:col, 'M')
78endfunc
79
80func MouseCtrlRightClick(row, col)
81  let ctrl = 0x10
82  call TerminalEscapeCode(2 + ctrl, a:row, a:col, 'M')
83endfunc
84
85func MouseLeftRelease(row, col)
86  if &ttymouse ==# 'dec'
87    call DecEscapeCode(3, 0, a:row, a:col)
88  elseif &ttymouse ==# 'netterm'
89    " send nothing
90  else
91    call TerminalEscapeCode(3, a:row, a:col, 'm')
92  endif
93endfunc
94
95func MouseMiddleRelease(row, col)
96  if &ttymouse ==# 'dec'
97    call DecEscapeCode(5, 0, a:row, a:col)
98  else
99    call TerminalEscapeCode(3, a:row, a:col, 'm')
100  endif
101endfunc
102
103func MouseRightRelease(row, col)
104  call TerminalEscapeCode(3, a:row, a:col, 'm')
105endfunc
106
107func MouseLeftDrag(row, col)
108  if &ttymouse ==# 'dec'
109    call DecEscapeCode(1, 4, a:row, a:col)
110  else
111    call TerminalEscapeCode(0x20, a:row, a:col, 'M')
112  endif
113endfunc
114
115func MouseWheelUp(row, col)
116  call TerminalEscapeCode(0x40, a:row, a:col, 'M')
117endfunc
118
119func MouseWheelDown(row, col)
120  call TerminalEscapeCode(0x41, a:row, a:col, 'M')
121endfunc
122
123func Test_term_mouse_left_click()
124  new
125  let save_mouse = &mouse
126  let save_term = &term
127  let save_ttymouse = &ttymouse
128  call test_override('no_query_mouse', 1)
129  set mouse=a term=xterm
130  call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer'])
131
132  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec + s:ttymouse_netterm
133    let msg = 'ttymouse=' .. ttymouse_val
134    exe 'set ttymouse=' .. ttymouse_val
135    go
136    call assert_equal([0, 1, 1, 0], getpos('.'), msg)
137    let row = 2
138    let col = 6
139    call MouseLeftClick(row, col)
140    call MouseLeftRelease(row, col)
141    call assert_equal([0, 2, 6, 0], getpos('.'), msg)
142  endfor
143
144  let &mouse = save_mouse
145  let &term = save_term
146  let &ttymouse = save_ttymouse
147  call test_override('no_query_mouse', 0)
148  bwipe!
149endfunc
150
151" Test that <C-LeftMouse> jumps to help tag and <C-RightMouse> jumps back.
152func Test_xterm_mouse_ctrl_click()
153  let save_mouse = &mouse
154  let save_term = &term
155  let save_ttymouse = &ttymouse
156  set mouse=a term=xterm
157
158  for ttymouse_val in s:ttymouse_values
159    let msg = 'ttymouse=' .. ttymouse_val
160    exe 'set ttymouse=' .. ttymouse_val
161    help
162    /usr_02.txt
163    norm! zt
164    let row = 1
165    let col = 1
166    call MouseCtrlLeftClick(row, col)
167    call MouseLeftRelease(row, col)
168    call assert_match('usr_02.txt$', bufname('%'), msg)
169    call assert_equal('*usr_02.txt*', expand('<cWORD>'))
170
171    call MouseCtrlRightClick(row, col)
172    call MouseRightRelease(row, col)
173    call assert_match('help.txt$', bufname('%'), msg)
174    call assert_equal('|usr_02.txt|', expand('<cWORD>'))
175
176    helpclose
177  endfor
178
179  let &mouse = save_mouse
180  let &term = save_term
181  let &ttymouse = save_ttymouse
182endfunc
183
184func Test_term_mouse_middle_click()
185  if !WorkingClipboard()
186    throw 'Skipped: No working clipboard'
187  endif
188
189  new
190  let save_mouse = &mouse
191  let save_term = &term
192  let save_ttymouse = &ttymouse
193  call test_override('no_query_mouse', 1)
194  let save_quotestar = @*
195  let @* = 'abc'
196  set mouse=a term=xterm
197
198  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec
199    let msg = 'ttymouse=' .. ttymouse_val
200    exe 'set ttymouse=' .. ttymouse_val
201    call setline(1, ['123456789', '123456789'])
202
203    " Middle-click in the middle of the line pastes text where clicked.
204    let row = 1
205    let col = 6
206    call MouseMiddleClick(row, col)
207    call MouseMiddleRelease(row, col)
208    call assert_equal(['12345abc6789', '123456789'], getline(1, '$'), msg)
209
210    " Middle-click beyond end of the line pastes text at the end of the line.
211    let col = 20
212    call MouseMiddleClick(row, col)
213    call MouseMiddleRelease(row, col)
214    call assert_equal(['12345abc6789abc', '123456789'], getline(1, '$'), msg)
215
216    " Middle-click beyond the last line pastes in the last line.
217    let row = 5
218    let col = 3
219    call MouseMiddleClick(row, col)
220    call MouseMiddleRelease(row, col)
221    call assert_equal(['12345abc6789abc', '12abc3456789'], getline(1, '$'), msg)
222  endfor
223
224  let &mouse = save_mouse
225  let &term = save_term
226  let &ttymouse = save_ttymouse
227  call test_override('no_query_mouse', 0)
228  let @* = save_quotestar
229  bwipe!
230endfunc
231
232" TODO: for unclear reasons this test fails if it comes after
233" Test_xterm_mouse_ctrl_click()
234func Test_1xterm_mouse_wheel()
235  new
236  let save_mouse = &mouse
237  let save_term = &term
238  let save_ttymouse = &ttymouse
239  set mouse=a term=xterm
240  call setline(1, range(1, 100))
241
242  for ttymouse_val in s:ttymouse_values
243    let msg = 'ttymouse=' .. ttymouse_val
244    exe 'set ttymouse=' .. ttymouse_val
245    go
246    call assert_equal(1, line('w0'), msg)
247    call assert_equal([0, 1, 1, 0], getpos('.'), msg)
248
249    call MouseWheelDown(1, 1)
250    call assert_equal(4, line('w0'), msg)
251    call assert_equal([0, 4, 1, 0], getpos('.'), msg)
252
253    call MouseWheelDown(1, 1)
254    call assert_equal(7, line('w0'), msg)
255    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
256
257    call MouseWheelUp(1, 1)
258    call assert_equal(4, line('w0'), msg)
259    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
260
261    call MouseWheelUp(1, 1)
262    call assert_equal(1, line('w0'), msg)
263    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
264  endfor
265
266  let &mouse = save_mouse
267  let &term = save_term
268  let &ttymouse = save_ttymouse
269  bwipe!
270endfunc
271
272func Test_term_mouse_drag_window_separator()
273  let save_mouse = &mouse
274  let save_term = &term
275  let save_ttymouse = &ttymouse
276  call test_override('no_query_mouse', 1)
277  set mouse=a term=xterm
278
279  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec
280    let msg = 'ttymouse=' .. ttymouse_val
281    exe 'set ttymouse=' .. ttymouse_val
282
283    " Split horizontally and test dragging the horizontal window separator.
284    split
285    let rowseparator = winheight(0) + 1
286    let row = rowseparator
287    let col = 1
288
289    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
290    if ttymouse_val !=# 'xterm2' || row <= 223
291      call MouseLeftClick(row, col)
292      let row -= 1
293      call MouseLeftDrag(row, col)
294      call assert_equal(rowseparator - 1, winheight(0) + 1, msg)
295      let row += 1
296      call MouseLeftDrag(row, col)
297      call assert_equal(rowseparator, winheight(0) + 1, msg)
298      call MouseLeftRelease(row, col)
299      call assert_equal(rowseparator, winheight(0) + 1, msg)
300    endif
301    bwipe!
302
303    " Split vertically and test dragging the vertical window separator.
304    vsplit
305    let colseparator = winwidth(0) + 1
306    let row = 1
307    let col = colseparator
308
309    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
310    if ttymouse_val !=# 'xterm2' || col <= 223
311      call MouseLeftClick(row, col)
312      let col -= 1
313      call MouseLeftDrag(row, col)
314      call assert_equal(colseparator - 1, winwidth(0) + 1, msg)
315      let col += 1
316      call MouseLeftDrag(row, col)
317      call assert_equal(colseparator, winwidth(0) + 1, msg)
318      call MouseLeftRelease(row, col)
319      call assert_equal(colseparator, winwidth(0) + 1, msg)
320    endif
321    bwipe!
322  endfor
323
324  let &mouse = save_mouse
325  let &term = save_term
326  let &ttymouse = save_ttymouse
327  call test_override('no_query_mouse', 0)
328endfunc
329
330func Test_term_mouse_drag_statusline()
331  let save_mouse = &mouse
332  let save_term = &term
333  let save_ttymouse = &ttymouse
334  call test_override('no_query_mouse', 1)
335  let save_laststatus = &laststatus
336  set mouse=a term=xterm laststatus=2
337
338  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec
339    let msg = 'ttymouse=' .. ttymouse_val
340    exe 'set ttymouse=' .. ttymouse_val
341
342    call assert_equal(1, &cmdheight, msg)
343    let rowstatusline = winheight(0) + 1
344    let row = rowstatusline
345    let col = 1
346
347    if ttymouse_val ==# 'xterm2' && row > 223
348      " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
349      continue
350    endif
351
352    call MouseLeftClick(row, col)
353    let row -= 1
354    call MouseLeftDrag(row, col)
355    call assert_equal(2, &cmdheight, msg)
356    call assert_equal(rowstatusline - 1, winheight(0) + 1, msg)
357    let row += 1
358    call MouseLeftDrag(row, col)
359    call assert_equal(1, &cmdheight, msg)
360    call assert_equal(rowstatusline, winheight(0) + 1, msg)
361    call MouseLeftRelease(row, col)
362    call assert_equal(1, &cmdheight, msg)
363    call assert_equal(rowstatusline, winheight(0) + 1, msg)
364  endfor
365
366  let &mouse = save_mouse
367  let &term = save_term
368  let &ttymouse = save_ttymouse
369  call test_override('no_query_mouse', 0)
370  let &laststatus = save_laststatus
371endfunc
372
373func Test_term_mouse_click_tab()
374  let save_mouse = &mouse
375  let save_term = &term
376  let save_ttymouse = &ttymouse
377  call test_override('no_query_mouse', 1)
378  set mouse=a term=xterm
379  let row = 1
380
381  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec + s:ttymouse_netterm
382    let msg = 'ttymouse=' .. ttymouse_val
383    exe 'set ttymouse=' .. ttymouse_val
384    e Xfoo
385    tabnew Xbar
386
387    let a = split(execute(':tabs'), "\n")
388    call assert_equal(['Tab page 1',
389        \              '    Xfoo',
390        \              'Tab page 2',
391        \              '>   Xbar'], a, msg)
392
393    " Test clicking on tab names in the tabline at the top.
394    let col = 2
395    redraw
396    call MouseLeftClick(row, col)
397    call MouseLeftRelease(row, col)
398    let a = split(execute(':tabs'), "\n")
399    call assert_equal(['Tab page 1',
400        \              '>   Xfoo',
401        \              'Tab page 2',
402        \              '    Xbar'], a, msg)
403
404    let col = 9
405    call MouseLeftClick(row, col)
406    call MouseLeftRelease(row, col)
407    let a = split(execute(':tabs'), "\n")
408    call assert_equal(['Tab page 1',
409        \              '    Xfoo',
410        \              'Tab page 2',
411        \              '>   Xbar'], a, msg)
412
413    %bwipe!
414  endfor
415
416  let &mouse = save_mouse
417  let &term = save_term
418  let &ttymouse = save_ttymouse
419  call test_override('no_query_mouse', 0)
420endfunc
421
422func Test_term_mouse_click_X_to_close_tab()
423  let save_mouse = &mouse
424  let save_term = &term
425  let save_ttymouse = &ttymouse
426  call test_override('no_query_mouse', 1)
427  set mouse=a term=xterm
428  let row = 1
429  let col = &columns
430
431  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec + s:ttymouse_netterm
432    if ttymouse_val ==# 'xterm2' && col > 223
433      " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
434      continue
435    endif
436    let msg = 'ttymouse=' .. ttymouse_val
437    exe 'set ttymouse=' .. ttymouse_val
438    e Xtab1
439    tabnew Xtab2
440    tabnew Xtab3
441    tabn 2
442
443    let a = split(execute(':tabs'), "\n")
444    call assert_equal(['Tab page 1',
445        \              '    Xtab1',
446        \              'Tab page 2',
447        \              '>   Xtab2',
448        \              'Tab page 3',
449        \              '    Xtab3'], a, msg)
450
451    " Click on "X" in tabline to close current tab i.e. Xtab2.
452    redraw
453    call MouseLeftClick(row, col)
454    call MouseLeftRelease(row, col)
455    let a = split(execute(':tabs'), "\n")
456    call assert_equal(['Tab page 1',
457        \              '    Xtab1',
458        \              'Tab page 2',
459        \              '>   Xtab3'], a, msg)
460
461    %bwipe!
462  endfor
463
464  let &mouse = save_mouse
465  let &term = save_term
466  let &ttymouse = save_ttymouse
467  call test_override('no_query_mouse', 0)
468endfunc
469
470func Test_term_mouse_drag_to_move_tab()
471  let save_mouse = &mouse
472  let save_term = &term
473  let save_ttymouse = &ttymouse
474  call test_override('no_query_mouse', 1)
475  " Set 'mousetime' to 1 to avoid recognizing a double-click in the loop
476  set mouse=a term=xterm mousetime=1
477  let row = 1
478
479  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec
480    let msg = 'ttymouse=' .. ttymouse_val
481    exe 'set ttymouse=' .. ttymouse_val
482    e Xtab1
483    tabnew Xtab2
484
485    let a = split(execute(':tabs'), "\n")
486    call assert_equal(['Tab page 1',
487        \              '    Xtab1',
488        \              'Tab page 2',
489        \              '>   Xtab2'], a, msg)
490    redraw
491
492    " Click in tab2 and drag it to tab1.
493    " Check getcharmod() to verify that click is not
494    " interpreted as a spurious double-click.
495    call MouseLeftClick(row, 10)
496    call assert_equal(0, getcharmod(), msg)
497    for col in [9, 8, 7, 6]
498      call MouseLeftDrag(row, col)
499    endfor
500    call MouseLeftRelease(row, col)
501    let a = split(execute(':tabs'), "\n")
502    call assert_equal(['Tab page 1',
503        \              '>   Xtab2',
504        \              'Tab page 2',
505        \              '    Xtab1'], a, msg)
506
507    " brief sleep to avoid causing a double-click
508    sleep 20m
509    %bwipe!
510  endfor
511
512  let &mouse = save_mouse
513  let &term = save_term
514  let &ttymouse = save_ttymouse
515  call test_override('no_query_mouse', 0)
516  set mousetime&
517endfunc
518
519func Test_term_mouse_double_click_to_create_tab()
520  let save_mouse = &mouse
521  let save_term = &term
522  let save_ttymouse = &ttymouse
523  call test_override('no_query_mouse', 1)
524  " Set 'mousetime' to a small value, so that double-click works but we don't
525  " have to wait long to avoid a triple-click.
526  set mouse=a term=xterm mousetime=100
527  let row = 1
528  let col = 10
529
530  let round = 0
531  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec
532    let msg = 'ttymouse=' .. ttymouse_val
533    exe 'set ttymouse=' .. ttymouse_val
534    e Xtab1
535    tabnew Xtab2
536
537    if round > 0
538      " We need to sleep, or else the first MouseLeftClick() will be
539      " interpreted as a spurious triple-click.
540      sleep 100m
541    endif
542    let round += 1
543
544    let a = split(execute(':tabs'), "\n")
545    call assert_equal(['Tab page 1',
546        \              '    Xtab1',
547        \              'Tab page 2',
548        \              '>   Xtab2'], a, msg)
549
550    redraw
551    call MouseLeftClick(row, col)
552    " Check getcharmod() to verify that first click is not
553    " interpreted as a spurious double-click.
554    call assert_equal(0, getcharmod(), msg)
555    call MouseLeftRelease(row, col)
556    call MouseLeftClick(row, col)
557    call assert_equal(32, getcharmod(), msg) " double-click
558    call MouseLeftRelease(row, col)
559    let a = split(execute(':tabs'), "\n")
560    call assert_equal(['Tab page 1',
561        \              '    Xtab1',
562        \              'Tab page 2',
563        \              '>   [No Name]',
564        \              'Tab page 3',
565        \              '    Xtab2'], a, msg)
566
567    %bwipe!
568  endfor
569
570  let &mouse = save_mouse
571  let &term = save_term
572  let &ttymouse = save_ttymouse
573  call test_override('no_query_mouse', 0)
574  set mousetime&
575endfunc
576
577func Test_xterm_mouse_click_in_fold_columns()
578  new
579  let save_mouse = &mouse
580  let save_term = &term
581  let save_ttymouse = &ttymouse
582  let save_foldcolumn = &foldcolumn
583  set mouse=a term=xterm foldcolumn=3 ttymouse=xterm2
584
585  " Create 2 nested folds.
586  call setline(1, range(1, 7))
587  2,6fold
588  norm! zR
589  4,5fold
590  call assert_equal([-1, -1, -1, 4, 4, -1, -1],
591        \           map(range(1, 7), 'foldclosed(v:val)'))
592
593  " Click in "+" of inner fold in foldcolumn should open it.
594  redraw
595  let row = 4
596  let col = 2
597  call MouseLeftClick(row, col)
598  call MouseLeftRelease(row, col)
599  call assert_equal([-1, -1, -1, -1, -1, -1, -1],
600        \           map(range(1, 7), 'foldclosed(v:val)'))
601
602  " Click in "-" of outer fold in foldcolumn should close it.
603  redraw
604  let row = 2
605  let col = 1
606  call MouseLeftClick(row, col)
607  call MouseLeftRelease(row, col)
608  call assert_equal([-1, 2, 2, 2, 2, 2, -1],
609        \           map(range(1, 7), 'foldclosed(v:val)'))
610  norm! zR
611
612  " Click in "|" of inner fold in foldcolumn should close it.
613  redraw
614  let row = 5
615  let col = 2
616  call MouseLeftClick(row, col)
617  call MouseLeftRelease(row, col)
618  call assert_equal([-1, -1, -1, 4, 4, -1, -1],
619        \           map(range(1, 7), 'foldclosed(v:val)'))
620
621  let &foldcolumn = save_foldcolumn
622  let &ttymouse = save_ttymouse
623  let &term = save_term
624  let &mouse = save_mouse
625  bwipe!
626endfunc
627
628" This only checks if the sequence is recognized.
629func Test_term_rgb_response()
630  set t_RF=x
631  set t_RB=y
632
633  " response to t_RF, 4 digits
634  let red = 0x12
635  let green = 0x34
636  let blue = 0x56
637  let seq = printf("\<Esc>]10;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
638  call feedkeys(seq, 'Lx!')
639  call assert_equal(seq, v:termrfgresp)
640
641  " response to t_RF, 2 digits
642  let red = 0x78
643  let green = 0x9a
644  let blue = 0xbc
645  let seq = printf("\<Esc>]10;rgb:%02x/%02x/%02x\x07", red, green, blue)
646  call feedkeys(seq, 'Lx!')
647  call assert_equal(seq, v:termrfgresp)
648
649  " response to t_RB, 4 digits, dark
650  set background=light
651  call test_option_not_set('background')
652  let red = 0x29
653  let green = 0x4a
654  let blue = 0x6b
655  let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
656  call feedkeys(seq, 'Lx!')
657  call assert_equal(seq, v:termrbgresp)
658  call assert_equal('dark', &background)
659
660  " response to t_RB, 4 digits, light
661  set background=dark
662  call test_option_not_set('background')
663  let red = 0x81
664  let green = 0x63
665  let blue = 0x65
666  let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
667  call feedkeys(seq, 'Lx!')
668  call assert_equal(seq, v:termrbgresp)
669  call assert_equal('light', &background)
670
671  " response to t_RB, 2 digits, dark
672  set background=light
673  call test_option_not_set('background')
674  let red = 0x47
675  let green = 0x59
676  let blue = 0x5b
677  let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
678  call feedkeys(seq, 'Lx!')
679  call assert_equal(seq, v:termrbgresp)
680  call assert_equal('dark', &background)
681
682  " response to t_RB, 2 digits, light
683  set background=dark
684  call test_option_not_set('background')
685  let red = 0x83
686  let green = 0xa4
687  let blue = 0xc2
688  let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
689  call feedkeys(seq, 'Lx!')
690  call assert_equal(seq, v:termrbgresp)
691  call assert_equal('light', &background)
692
693  set t_RF= t_RB=
694endfunc
695
696" This only checks if the sequence is recognized.
697" This must be last, because it has side effects to xterm properties.
698" TODO: check that the values were parsed properly
699func Test_xx_term_style_response()
700  " Termresponse is only parsed when t_RV is not empty.
701  set t_RV=x
702
703  " send the termresponse to trigger requesting the XT codes
704  let seq = "\<Esc>[>41;337;0c"
705  call feedkeys(seq, 'Lx!')
706  call assert_equal(seq, v:termresponse)
707
708  let seq = "\<Esc>P1$r2 q\<Esc>\\"
709  call feedkeys(seq, 'Lx!')
710  call assert_equal(seq, v:termstyleresp)
711
712  set t_RV=
713endfunc
714
715func Test_get_termcode()
716  let k1 = &t_k1
717  set t_k1=
718  set t_k1&
719  call assert_equal(k1, &t_k1)
720
721  " use external termcap first
722  set nottybuiltin
723  set t_k1=
724  set t_k1&
725  " when using external termcap may get something else, but it must not be
726  " empty, since we would fallback to the builtin one.
727  call assert_notequal('', &t_k1)
728
729  if &term =~ 'xterm'
730    " use internal termcap first
731    let term_save = &term
732    let &term = 'builtin_' .. &term
733    set t_k1=
734    set t_k1&
735    call assert_equal(k1, &t_k1)
736    let &term = term_save
737  endif
738
739  set ttybuiltin
740endfunc
741