1" Tests for decoding escape sequences sent by the terminal.
2
3" This only works for Unix in a terminal
4source check.vim
5CheckNotGui
6CheckUnix
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 = str->iconv('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  CheckFeature clipboard_working
186
187  new
188  let save_mouse = &mouse
189  let save_term = &term
190  let save_ttymouse = &ttymouse
191  call test_override('no_query_mouse', 1)
192  let save_quotestar = @*
193  let @* = 'abc'
194  set mouse=a term=xterm
195
196  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec
197    let msg = 'ttymouse=' .. ttymouse_val
198    exe 'set ttymouse=' .. ttymouse_val
199    call setline(1, ['123456789', '123456789'])
200
201    " Middle-click in the middle of the line pastes text where clicked.
202    let row = 1
203    let col = 6
204    call MouseMiddleClick(row, col)
205    call MouseMiddleRelease(row, col)
206    call assert_equal(['12345abc6789', '123456789'], getline(1, '$'), msg)
207
208    " Middle-click beyond end of the line pastes text at the end of the line.
209    let col = 20
210    call MouseMiddleClick(row, col)
211    call MouseMiddleRelease(row, col)
212    call assert_equal(['12345abc6789abc', '123456789'], getline(1, '$'), msg)
213
214    " Middle-click beyond the last line pastes in the last line.
215    let row = 5
216    let col = 3
217    call MouseMiddleClick(row, col)
218    call MouseMiddleRelease(row, col)
219    call assert_equal(['12345abc6789abc', '12abc3456789'], getline(1, '$'), msg)
220  endfor
221
222  let &mouse = save_mouse
223  let &term = save_term
224  let &ttymouse = save_ttymouse
225  call test_override('no_query_mouse', 0)
226  let @* = save_quotestar
227  bwipe!
228endfunc
229
230" TODO: for unclear reasons this test fails if it comes after
231" Test_xterm_mouse_ctrl_click()
232func Test_1xterm_mouse_wheel()
233  new
234  let save_mouse = &mouse
235  let save_term = &term
236  let save_ttymouse = &ttymouse
237  set mouse=a term=xterm
238  call setline(1, range(1, 100))
239
240  for ttymouse_val in s:ttymouse_values
241    let msg = 'ttymouse=' .. ttymouse_val
242    exe 'set ttymouse=' .. ttymouse_val
243    go
244    call assert_equal(1, line('w0'), msg)
245    call assert_equal([0, 1, 1, 0], getpos('.'), msg)
246
247    call MouseWheelDown(1, 1)
248    call assert_equal(4, line('w0'), msg)
249    call assert_equal([0, 4, 1, 0], getpos('.'), msg)
250
251    call MouseWheelDown(1, 1)
252    call assert_equal(7, line('w0'), msg)
253    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
254
255    call MouseWheelUp(1, 1)
256    call assert_equal(4, line('w0'), msg)
257    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
258
259    call MouseWheelUp(1, 1)
260    call assert_equal(1, line('w0'), msg)
261    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
262  endfor
263
264  let &mouse = save_mouse
265  let &term = save_term
266  let &ttymouse = save_ttymouse
267  bwipe!
268endfunc
269
270func Test_term_mouse_drag_window_separator()
271  let save_mouse = &mouse
272  let save_term = &term
273  let save_ttymouse = &ttymouse
274  call test_override('no_query_mouse', 1)
275  set mouse=a term=xterm
276
277  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec
278    let msg = 'ttymouse=' .. ttymouse_val
279    exe 'set ttymouse=' .. ttymouse_val
280
281    " Split horizontally and test dragging the horizontal window separator.
282    split
283    let rowseparator = winheight(0) + 1
284    let row = rowseparator
285    let col = 1
286
287    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
288    if ttymouse_val !=# 'xterm2' || row <= 223
289      call MouseLeftClick(row, col)
290      let row -= 1
291      call MouseLeftDrag(row, col)
292      call assert_equal(rowseparator - 1, winheight(0) + 1, msg)
293      let row += 1
294      call MouseLeftDrag(row, col)
295      call assert_equal(rowseparator, winheight(0) + 1, msg)
296      call MouseLeftRelease(row, col)
297      call assert_equal(rowseparator, winheight(0) + 1, msg)
298    endif
299    bwipe!
300
301    " Split vertically and test dragging the vertical window separator.
302    vsplit
303    let colseparator = winwidth(0) + 1
304    let row = 1
305    let col = colseparator
306
307    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
308    if ttymouse_val !=# 'xterm2' || col <= 223
309      call MouseLeftClick(row, col)
310      let col -= 1
311      call MouseLeftDrag(row, col)
312      call assert_equal(colseparator - 1, winwidth(0) + 1, msg)
313      let col += 1
314      call MouseLeftDrag(row, col)
315      call assert_equal(colseparator, winwidth(0) + 1, msg)
316      call MouseLeftRelease(row, col)
317      call assert_equal(colseparator, winwidth(0) + 1, msg)
318    endif
319    bwipe!
320  endfor
321
322  let &mouse = save_mouse
323  let &term = save_term
324  let &ttymouse = save_ttymouse
325  call test_override('no_query_mouse', 0)
326endfunc
327
328func Test_term_mouse_drag_statusline()
329  let save_mouse = &mouse
330  let save_term = &term
331  let save_ttymouse = &ttymouse
332  call test_override('no_query_mouse', 1)
333  let save_laststatus = &laststatus
334  set mouse=a term=xterm laststatus=2
335
336  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec
337    let msg = 'ttymouse=' .. ttymouse_val
338    exe 'set ttymouse=' .. ttymouse_val
339
340    call assert_equal(1, &cmdheight, msg)
341    let rowstatusline = winheight(0) + 1
342    let row = rowstatusline
343    let col = 1
344
345    if ttymouse_val ==# 'xterm2' && row > 223
346      " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
347      continue
348    endif
349
350    call MouseLeftClick(row, col)
351    let row -= 1
352    call MouseLeftDrag(row, col)
353    call assert_equal(2, &cmdheight, msg)
354    call assert_equal(rowstatusline - 1, winheight(0) + 1, msg)
355    let row += 1
356    call MouseLeftDrag(row, col)
357    call assert_equal(1, &cmdheight, msg)
358    call assert_equal(rowstatusline, winheight(0) + 1, msg)
359    call MouseLeftRelease(row, col)
360    call assert_equal(1, &cmdheight, msg)
361    call assert_equal(rowstatusline, winheight(0) + 1, msg)
362  endfor
363
364  let &mouse = save_mouse
365  let &term = save_term
366  let &ttymouse = save_ttymouse
367  call test_override('no_query_mouse', 0)
368  let &laststatus = save_laststatus
369endfunc
370
371func Test_term_mouse_click_tab()
372  let save_mouse = &mouse
373  let save_term = &term
374  let save_ttymouse = &ttymouse
375  call test_override('no_query_mouse', 1)
376  set mouse=a term=xterm
377  let row = 1
378
379  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec + s:ttymouse_netterm
380    let msg = 'ttymouse=' .. ttymouse_val
381    exe 'set ttymouse=' .. ttymouse_val
382    e Xfoo
383    tabnew Xbar
384
385    let a = split(execute(':tabs'), "\n")
386    call assert_equal(['Tab page 1',
387        \              '    Xfoo',
388        \              'Tab page 2',
389        \              '>   Xbar'], a, msg)
390
391    " Test clicking on tab names in the tabline at the top.
392    let col = 2
393    redraw
394    call MouseLeftClick(row, col)
395    call MouseLeftRelease(row, col)
396    let a = split(execute(':tabs'), "\n")
397    call assert_equal(['Tab page 1',
398        \              '>   Xfoo',
399        \              'Tab page 2',
400        \              '    Xbar'], a, msg)
401
402    let col = 9
403    call MouseLeftClick(row, col)
404    call MouseLeftRelease(row, col)
405    let a = split(execute(':tabs'), "\n")
406    call assert_equal(['Tab page 1',
407        \              '    Xfoo',
408        \              'Tab page 2',
409        \              '>   Xbar'], a, msg)
410
411    %bwipe!
412  endfor
413
414  let &mouse = save_mouse
415  let &term = save_term
416  let &ttymouse = save_ttymouse
417  call test_override('no_query_mouse', 0)
418endfunc
419
420func Test_term_mouse_click_X_to_close_tab()
421  let save_mouse = &mouse
422  let save_term = &term
423  let save_ttymouse = &ttymouse
424  call test_override('no_query_mouse', 1)
425  set mouse=a term=xterm
426  let row = 1
427  let col = &columns
428
429  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec + s:ttymouse_netterm
430    if ttymouse_val ==# 'xterm2' && col > 223
431      " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
432      continue
433    endif
434    let msg = 'ttymouse=' .. ttymouse_val
435    exe 'set ttymouse=' .. ttymouse_val
436    e Xtab1
437    tabnew Xtab2
438    tabnew Xtab3
439    tabn 2
440
441    let a = split(execute(':tabs'), "\n")
442    call assert_equal(['Tab page 1',
443        \              '    Xtab1',
444        \              'Tab page 2',
445        \              '>   Xtab2',
446        \              'Tab page 3',
447        \              '    Xtab3'], a, msg)
448
449    " Click on "X" in tabline to close current tab i.e. Xtab2.
450    redraw
451    call MouseLeftClick(row, col)
452    call MouseLeftRelease(row, col)
453    let a = split(execute(':tabs'), "\n")
454    call assert_equal(['Tab page 1',
455        \              '    Xtab1',
456        \              'Tab page 2',
457        \              '>   Xtab3'], a, msg)
458
459    %bwipe!
460  endfor
461
462  let &mouse = save_mouse
463  let &term = save_term
464  let &ttymouse = save_ttymouse
465  call test_override('no_query_mouse', 0)
466endfunc
467
468func Test_term_mouse_drag_to_move_tab()
469  let save_mouse = &mouse
470  let save_term = &term
471  let save_ttymouse = &ttymouse
472  call test_override('no_query_mouse', 1)
473  " Set 'mousetime' to 1 to avoid recognizing a double-click in the loop
474  set mouse=a term=xterm mousetime=1
475  let row = 1
476
477  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec
478    let msg = 'ttymouse=' .. ttymouse_val
479    exe 'set ttymouse=' .. ttymouse_val
480    e Xtab1
481    tabnew Xtab2
482
483    let a = split(execute(':tabs'), "\n")
484    call assert_equal(['Tab page 1',
485        \              '    Xtab1',
486        \              'Tab page 2',
487        \              '>   Xtab2'], a, msg)
488    redraw
489
490    " Click in tab2 and drag it to tab1.
491    " Check getcharmod() to verify that click is not
492    " interpreted as a spurious double-click.
493    call MouseLeftClick(row, 10)
494    call assert_equal(0, getcharmod(), msg)
495    for col in [9, 8, 7, 6]
496      call MouseLeftDrag(row, col)
497    endfor
498    call MouseLeftRelease(row, col)
499    let a = split(execute(':tabs'), "\n")
500    call assert_equal(['Tab page 1',
501        \              '>   Xtab2',
502        \              'Tab page 2',
503        \              '    Xtab1'], a, msg)
504
505    " brief sleep to avoid causing a double-click
506    sleep 20m
507    %bwipe!
508  endfor
509
510  let &mouse = save_mouse
511  let &term = save_term
512  let &ttymouse = save_ttymouse
513  call test_override('no_query_mouse', 0)
514  set mousetime&
515endfunc
516
517func Test_term_mouse_double_click_to_create_tab()
518  let save_mouse = &mouse
519  let save_term = &term
520  let save_ttymouse = &ttymouse
521  call test_override('no_query_mouse', 1)
522  " Set 'mousetime' to a small value, so that double-click works but we don't
523  " have to wait long to avoid a triple-click.
524  set mouse=a term=xterm mousetime=100
525  let row = 1
526  let col = 10
527
528  let round = 0
529  for ttymouse_val in s:ttymouse_values + s:ttymouse_dec
530    let msg = 'ttymouse=' .. ttymouse_val
531    exe 'set ttymouse=' .. ttymouse_val
532    e Xtab1
533    tabnew Xtab2
534
535    if round > 0
536      " We need to sleep, or else the first MouseLeftClick() will be
537      " interpreted as a spurious triple-click.
538      sleep 100m
539    endif
540    let round += 1
541
542    let a = split(execute(':tabs'), "\n")
543    call assert_equal(['Tab page 1',
544        \              '    Xtab1',
545        \              'Tab page 2',
546        \              '>   Xtab2'], a, msg)
547
548    redraw
549    call MouseLeftClick(row, col)
550    " Check getcharmod() to verify that first click is not
551    " interpreted as a spurious double-click.
552    call assert_equal(0, getcharmod(), msg)
553    call MouseLeftRelease(row, col)
554    call MouseLeftClick(row, col)
555    call assert_equal(32, getcharmod(), msg) " double-click
556    call MouseLeftRelease(row, col)
557    let a = split(execute(':tabs'), "\n")
558    call assert_equal(['Tab page 1',
559        \              '    Xtab1',
560        \              'Tab page 2',
561        \              '>   [No Name]',
562        \              'Tab page 3',
563        \              '    Xtab2'], a, msg)
564
565    %bwipe!
566  endfor
567
568  let &mouse = save_mouse
569  let &term = save_term
570  let &ttymouse = save_ttymouse
571  call test_override('no_query_mouse', 0)
572  set mousetime&
573endfunc
574
575func Test_xterm_mouse_click_in_fold_columns()
576  new
577  let save_mouse = &mouse
578  let save_term = &term
579  let save_ttymouse = &ttymouse
580  let save_foldcolumn = &foldcolumn
581  set mouse=a term=xterm foldcolumn=3 ttymouse=xterm2
582
583  " Create 2 nested folds.
584  call setline(1, range(1, 7))
585  2,6fold
586  norm! zR
587  4,5fold
588  call assert_equal([-1, -1, -1, 4, 4, -1, -1],
589        \           map(range(1, 7), 'foldclosed(v:val)'))
590
591  " Click in "+" of inner fold in foldcolumn should open it.
592  redraw
593  let row = 4
594  let col = 2
595  call MouseLeftClick(row, col)
596  call MouseLeftRelease(row, col)
597  call assert_equal([-1, -1, -1, -1, -1, -1, -1],
598        \           map(range(1, 7), 'foldclosed(v:val)'))
599
600  " Click in "-" of outer fold in foldcolumn should close it.
601  redraw
602  let row = 2
603  let col = 1
604  call MouseLeftClick(row, col)
605  call MouseLeftRelease(row, col)
606  call assert_equal([-1, 2, 2, 2, 2, 2, -1],
607        \           map(range(1, 7), 'foldclosed(v:val)'))
608  norm! zR
609
610  " Click in "|" of inner fold in foldcolumn should close it.
611  redraw
612  let row = 5
613  let col = 2
614  call MouseLeftClick(row, col)
615  call MouseLeftRelease(row, col)
616  call assert_equal([-1, -1, -1, 4, 4, -1, -1],
617        \           map(range(1, 7), 'foldclosed(v:val)'))
618
619  let &foldcolumn = save_foldcolumn
620  let &ttymouse = save_ttymouse
621  let &term = save_term
622  let &mouse = save_mouse
623  bwipe!
624endfunc
625
626" This only checks if the sequence is recognized.
627func Test_term_rgb_response()
628  set t_RF=x
629  set t_RB=y
630
631  " response to t_RF, 4 digits
632  let red = 0x12
633  let green = 0x34
634  let blue = 0x56
635  let seq = printf("\<Esc>]10;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
636  call feedkeys(seq, 'Lx!')
637  call assert_equal(seq, v:termrfgresp)
638
639  " response to t_RF, 2 digits
640  let red = 0x78
641  let green = 0x9a
642  let blue = 0xbc
643  let seq = printf("\<Esc>]10;rgb:%02x/%02x/%02x\x07", red, green, blue)
644  call feedkeys(seq, 'Lx!')
645  call assert_equal(seq, v:termrfgresp)
646
647  " response to t_RB, 4 digits, dark
648  set background=light
649  eval 'background'->test_option_not_set()
650  let red = 0x29
651  let green = 0x4a
652  let blue = 0x6b
653  let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
654  call feedkeys(seq, 'Lx!')
655  call assert_equal(seq, v:termrbgresp)
656  call assert_equal('dark', &background)
657
658  " response to t_RB, 4 digits, light
659  set background=dark
660  call test_option_not_set('background')
661  let red = 0x81
662  let green = 0x63
663  let blue = 0x65
664  let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
665  call feedkeys(seq, 'Lx!')
666  call assert_equal(seq, v:termrbgresp)
667  call assert_equal('light', &background)
668
669  " response to t_RB, 2 digits, dark
670  set background=light
671  call test_option_not_set('background')
672  let red = 0x47
673  let green = 0x59
674  let blue = 0x5b
675  let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
676  call feedkeys(seq, 'Lx!')
677  call assert_equal(seq, v:termrbgresp)
678  call assert_equal('dark', &background)
679
680  " response to t_RB, 2 digits, light
681  set background=dark
682  call test_option_not_set('background')
683  let red = 0x83
684  let green = 0xa4
685  let blue = 0xc2
686  let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
687  call feedkeys(seq, 'Lx!')
688  call assert_equal(seq, v:termrbgresp)
689  call assert_equal('light', &background)
690
691  set t_RF= t_RB=
692endfunc
693
694" This only checks if the sequence is recognized.
695" This must be last, because it has side effects to xterm properties.
696" TODO: check that the values were parsed properly
697func Test_xx_term_style_response()
698  " Termresponse is only parsed when t_RV is not empty.
699  set t_RV=x
700
701  " send the termresponse to trigger requesting the XT codes
702  let seq = "\<Esc>[>41;337;0c"
703  call feedkeys(seq, 'Lx!')
704  call assert_equal(seq, v:termresponse)
705
706  let seq = "\<Esc>P1$r2 q\<Esc>\\"
707  call feedkeys(seq, 'Lx!')
708  call assert_equal(seq, v:termstyleresp)
709
710  set t_RV=
711endfunc
712
713func Test_get_termcode()
714  let k1 = &t_k1
715  set t_k1=
716  set t_k1&
717  call assert_equal(k1, &t_k1)
718
719  " use external termcap first
720  set nottybuiltin
721  set t_k1=
722  set t_k1&
723  " when using external termcap may get something else, but it must not be
724  " empty, since we would fallback to the builtin one.
725  call assert_notequal('', &t_k1)
726
727  if &term =~ 'xterm'
728    " use internal termcap first
729    let term_save = &term
730    let &term = 'builtin_' .. &term
731    set t_k1=
732    set t_k1&
733    call assert_equal(k1, &t_k1)
734    let &term = term_save
735  endif
736
737  set ttybuiltin
738endfunc
739