neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

test_termcodes.vim (33702B)


      1 source check.vim
      2 " CheckNotGui
      3 " CheckUnix
      4 
      5 source shared.vim
      6 source mouse.vim
      7 source view_util.vim
      8 source term_util.vim
      9 
     10 func Test_term_mouse_left_click()
     11  new
     12  let save_mouse = &mouse
     13  let save_term = &term
     14  " let save_ttymouse = &ttymouse
     15  " call test_override('no_query_mouse', 1)
     16  " set mouse=a term=xterm
     17  set mouse=a
     18  call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer'])
     19  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
     20    let msg = 'ttymouse=' .. ttymouse_val
     21    " exe 'set ttymouse=' .. ttymouse_val
     22    go
     23    call assert_equal([0, 1, 1, 0], getpos('.'), msg)
     24    let row = 2
     25    let col = 6
     26    call MouseLeftClick(row, col)
     27    call MouseLeftRelease(row, col)
     28    call assert_equal([0, 2, 6, 0], getpos('.'), msg)
     29  endfor
     30 
     31  let &mouse = save_mouse
     32  " let &term = save_term
     33  " let &ttymouse = save_ttymouse
     34  " call test_override('no_query_mouse', 0)
     35  bwipe!
     36 endfunc
     37 
     38 func Test_xterm_mouse_right_click_extends_visual()
     39  if has('mac')
     40    " throw "Skipped: test right click in visual mode does not work on macOs (why?)"
     41  endif
     42  let save_mouse = &mouse
     43  let save_term = &term
     44  " let save_ttymouse = &ttymouse
     45  " call test_override('no_query_mouse', 1)
     46  " set mouse=a term=xterm
     47  set mouse=a
     48 
     49  for visual_mode in ["v", "V", "\<C-V>"]
     50    for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
     51      let msg = 'visual=' .. visual_mode .. ' ttymouse=' .. ttymouse_val
     52      " exe 'set ttymouse=' .. ttymouse_val
     53 
     54      call setline(1, repeat([repeat('-', 7)], 7))
     55      call MouseLeftClick(4, 4)
     56      call MouseLeftRelease(4, 4)
     57      exe  "norm! " .. visual_mode
     58 
     59      " Right click extends top left of visual area.
     60      call MouseRightClick(2, 2)
     61      call MouseRightRelease(2, 2)
     62 
     63      " Right click extends bottom right of visual area.
     64      call MouseRightClick(6, 6)
     65      call MouseRightRelease(6, 6)
     66      norm! r1gv
     67 
     68      " Right click shrinks top left of visual area.
     69      call MouseRightClick(3, 3)
     70      call MouseRightRelease(3, 3)
     71 
     72      " Right click shrinks bottom right of visual area.
     73      call MouseRightClick(5, 5)
     74      call MouseRightRelease(5, 5)
     75      norm! r2
     76 
     77      if visual_mode ==# 'v'
     78        call assert_equal(['-------',
     79              \            '-111111',
     80              \            '1122222',
     81              \            '2222222',
     82              \            '2222211',
     83              \            '111111-',
     84              \            '-------'], getline(1, '$'), msg)
     85      elseif visual_mode ==# 'V'
     86        call assert_equal(['-------',
     87              \            '1111111',
     88              \            '2222222',
     89              \            '2222222',
     90              \            '2222222',
     91              \            '1111111',
     92              \            '-------'], getline(1, '$'), msg)
     93      else
     94        call assert_equal(['-------',
     95              \            '-11111-',
     96              \            '-12221-',
     97              \            '-12221-',
     98              \            '-12221-',
     99              \            '-11111-',
    100              \            '-------'], getline(1, '$'), msg)
    101      endif
    102    endfor
    103  endfor
    104 
    105  let &mouse = save_mouse
    106  " let &term = save_term
    107  " let &ttymouse = save_ttymouse
    108  " call test_override('no_query_mouse', 0)
    109  bwipe!
    110 endfunc
    111 
    112 " Test that <C-LeftMouse> jumps to help tag and <C-RightMouse> jumps back.
    113 func Test_xterm_mouse_ctrl_click()
    114  let save_mouse = &mouse
    115  let save_term = &term
    116  " let save_ttymouse = &ttymouse
    117  " set mouse=a term=xterm
    118  set mouse=a
    119 
    120  for ttymouse_val in g:Ttymouse_values
    121    let msg = 'ttymouse=' .. ttymouse_val
    122    " exe 'set ttymouse=' .. ttymouse_val
    123    " help
    124    help usr_toc.txt
    125    /usr_02.txt
    126    norm! zt
    127    let row = 1
    128    let col = 1
    129    call MouseCtrlLeftClick(row, col)
    130    call MouseLeftRelease(row, col)
    131    call assert_match('usr_02.txt$', bufname('%'), msg)
    132    call assert_equal('*usr_02.txt*', expand('<cWORD>'), msg)
    133 
    134    call MouseCtrlRightClick(row, col)
    135    call MouseRightRelease(row, col)
    136    " call assert_match('help.txt$', bufname('%'), msg)
    137    call assert_match('usr_toc.txt$', bufname('%'), msg)
    138    call assert_equal('|usr_02.txt|', expand('<cWORD>'), msg)
    139 
    140    helpclose
    141  endfor
    142 
    143  let &mouse = save_mouse
    144  " let &term = save_term
    145  " let &ttymouse = save_ttymouse
    146 endfunc
    147 
    148 func Test_term_mouse_middle_click()
    149  CheckFeature clipboard_working
    150 
    151  new
    152  let save_mouse = &mouse
    153  let save_term = &term
    154  " let save_ttymouse = &ttymouse
    155  " call test_override('no_query_mouse', 1)
    156  let save_quotestar = @*
    157  let @* = 'abc'
    158  " set mouse=a term=xterm
    159  set mouse=a
    160 
    161  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
    162    let msg = 'ttymouse=' .. ttymouse_val
    163    " exe 'set ttymouse=' .. ttymouse_val
    164    call setline(1, ['123456789', '123456789'])
    165 
    166    " Middle-click in the middle of the line pastes text where clicked.
    167    let row = 1
    168    let col = 6
    169    call MouseMiddleClick(row, col)
    170    call MouseMiddleRelease(row, col)
    171    call assert_equal(['12345abc6789', '123456789'], getline(1, '$'), msg)
    172 
    173    " Middle-click beyond end of the line pastes text at the end of the line.
    174    let col = 20
    175    call MouseMiddleClick(row, col)
    176    call MouseMiddleRelease(row, col)
    177    call assert_equal(['12345abc6789abc', '123456789'], getline(1, '$'), msg)
    178 
    179    " Middle-click beyond the last line pastes in the last line.
    180    let row = 5
    181    let col = 3
    182    call MouseMiddleClick(row, col)
    183    call MouseMiddleRelease(row, col)
    184    call assert_equal(['12345abc6789abc', '12abc3456789'], getline(1, '$'), msg)
    185  endfor
    186 
    187  let &mouse = save_mouse
    188  " let &term = save_term
    189  " let &ttymouse = save_ttymouse
    190  " call test_override('no_query_mouse', 0)
    191  let @* = save_quotestar
    192  bwipe!
    193 endfunc
    194 
    195 " TODO: for unclear reasons this test fails if it comes after
    196 " Test_xterm_mouse_ctrl_click()
    197 func Test_1xterm_mouse_wheel()
    198  new
    199  let save_mouse = &mouse
    200  let save_term = &term
    201  let save_wrap = &wrap
    202  " let save_ttymouse = &ttymouse
    203  " set mouse=a term=xterm nowrap
    204  set mouse=a nowrap
    205  call setline(1, range(100000000000000, 100000000000100))
    206 
    207  for ttymouse_val in g:Ttymouse_values
    208    let msg = 'ttymouse=' .. ttymouse_val
    209    " exe 'set ttymouse=' .. ttymouse_val
    210    go
    211    call assert_equal(1, line('w0'), msg)
    212    call assert_equal([0, 1, 1, 0], getpos('.'), msg)
    213 
    214    call MouseWheelDown(1, 1)
    215    call assert_equal(4, line('w0'), msg)
    216    call assert_equal([0, 4, 1, 0], getpos('.'), msg)
    217 
    218    call MouseWheelDown(1, 1)
    219    call assert_equal(7, line('w0'), msg)
    220    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
    221 
    222    call MouseWheelUp(1, 1)
    223    call assert_equal(4, line('w0'), msg)
    224    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
    225 
    226    call MouseWheelUp(1, 1)
    227    call assert_equal(1, line('w0'), msg)
    228    call assert_equal([0, 7, 1, 0], getpos('.'), msg)
    229 
    230    call MouseWheelRight(1, 1)
    231    call assert_equal(7, 1 + virtcol(".") - wincol(), msg)
    232    call assert_equal([0, 7, 7, 0], getpos('.'), msg)
    233 
    234    call MouseWheelRight(1, 1)
    235    call assert_equal(13, 1 + virtcol(".") - wincol(), msg)
    236    call assert_equal([0, 7, 13, 0], getpos('.'), msg)
    237 
    238    call MouseWheelLeft(1, 1)
    239    call assert_equal(7, 1 + virtcol(".") - wincol(), msg)
    240    call assert_equal([0, 7, 13, 0], getpos('.'), msg)
    241 
    242    call MouseWheelLeft(1, 1)
    243    call assert_equal(1, 1 + virtcol(".") - wincol(), msg)
    244    call assert_equal([0, 7, 13, 0], getpos('.'), msg)
    245 
    246  endfor
    247 
    248  let &mouse = save_mouse
    249  " let &term = save_term
    250  let &wrap = save_wrap
    251  " let &ttymouse = save_ttymouse
    252  bwipe!
    253 endfunc
    254 
    255 " Test that dragging beyond the window (at the bottom and at the top)
    256 " scrolls window content by the number of lines beyond the window.
    257 func Test_term_mouse_drag_beyond_window()
    258  let save_mouse = &mouse
    259  let save_term = &term
    260  " let save_ttymouse = &ttymouse
    261  " call test_override('no_query_mouse', 1)
    262  " set mouse=a term=xterm
    263  set mouse=a
    264  let col = 1
    265  call setline(1, range(1, 100))
    266 
    267  " Split into 3 windows, and go into the middle window
    268  " so we test dragging mouse below and above the window.
    269  2split
    270  wincmd j
    271  2split
    272 
    273  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
    274    let msg = 'ttymouse=' .. ttymouse_val
    275    " exe 'set ttymouse=' .. ttymouse_val
    276 
    277    " Line #10 at the top.
    278    norm! 10zt
    279    redraw
    280    call assert_equal(10, winsaveview().topline, msg)
    281    call assert_equal(2, winheight(0), msg)
    282 
    283    let row = 4
    284    call MouseLeftClick(row, col)
    285    call assert_equal(10, winsaveview().topline, msg)
    286 
    287    " Drag downwards. We're still in the window so topline should
    288    " not change yet.
    289    let row += 1
    290    call MouseLeftDrag(row, col)
    291    call assert_equal(10, winsaveview().topline, msg)
    292 
    293    " We now leave the window at the bottom, so the window content should
    294    " scroll by 1 line, then 2 lines (etc) as we drag further away.
    295    let row += 1
    296    call MouseLeftDrag(row, col)
    297    call assert_equal(11, winsaveview().topline, msg)
    298 
    299    let row += 1
    300    call MouseLeftDrag(row, col)
    301    call assert_equal(13, winsaveview().topline, msg)
    302 
    303    " Now drag upwards.
    304    let row -= 1
    305    call MouseLeftDrag(row, col)
    306    call assert_equal(14, winsaveview().topline, msg)
    307 
    308    " We're now back in the window so the topline should not change.
    309    let row -= 1
    310    call MouseLeftDrag(row, col)
    311    call assert_equal(14, winsaveview().topline, msg)
    312 
    313    let row -= 1
    314    call MouseLeftDrag(row, col)
    315    call assert_equal(14, winsaveview().topline, msg)
    316 
    317    " We now leave the window at the top so the window content should
    318    " scroll by 1 line, then 2, then 3 (etc) in the opposite direction.
    319    let row -= 1
    320    call MouseLeftDrag(row, col)
    321    call assert_equal(13, winsaveview().topline, msg)
    322 
    323    let row -= 1
    324    call MouseLeftDrag(row, col)
    325    call assert_equal(11, winsaveview().topline, msg)
    326 
    327    let row -= 1
    328    call MouseLeftDrag(row, col)
    329    call assert_equal(8, winsaveview().topline, msg)
    330 
    331    call MouseLeftRelease(row, col)
    332    call assert_equal(8, winsaveview().topline, msg)
    333    call assert_equal(2, winheight(0), msg)
    334  endfor
    335 
    336  let &mouse = save_mouse
    337  " let &term = save_term
    338  " let &ttymouse = save_ttymouse
    339  " call test_override('no_query_mouse', 0)
    340  bwipe!
    341 endfunc
    342 
    343 func Test_term_mouse_drag_window_separator()
    344  let save_mouse = &mouse
    345  let save_term = &term
    346  " let save_ttymouse = &ttymouse
    347  " call test_override('no_query_mouse', 1)
    348  " set mouse=a term=xterm
    349  set mouse=a
    350 
    351  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
    352    let msg = 'ttymouse=' .. ttymouse_val
    353    " exe 'set ttymouse=' .. ttymouse_val
    354 
    355    " Split horizontally and test dragging the horizontal window separator.
    356    split
    357    let rowseparator = winheight(0) + 1
    358    let row = rowseparator
    359    let col = 1
    360 
    361    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
    362    if ttymouse_val !=# 'xterm2' || row <= 223
    363      call MouseLeftClick(row, col)
    364      let row -= 1
    365      call MouseLeftDrag(row, col)
    366      call assert_equal(rowseparator - 1, winheight(0) + 1, msg)
    367      let row += 1
    368      call MouseLeftDrag(row, col)
    369      call assert_equal(rowseparator, winheight(0) + 1, msg)
    370      call MouseLeftRelease(row, col)
    371      call assert_equal(rowseparator, winheight(0) + 1, msg)
    372    endif
    373    bwipe!
    374 
    375    " Split vertically and test dragging the vertical window separator.
    376    vsplit
    377    let colseparator = winwidth(0) + 1
    378    let row = 1
    379    let col = colseparator
    380 
    381    " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
    382    if ttymouse_val !=# 'xterm2' || col <= 223
    383      call MouseLeftClick(row, col)
    384      let col -= 1
    385      call MouseLeftDrag(row, col)
    386      call assert_equal(colseparator - 1, winwidth(0) + 1, msg)
    387      let col += 1
    388      call MouseLeftDrag(row, col)
    389      call assert_equal(colseparator, winwidth(0) + 1, msg)
    390      call MouseLeftRelease(row, col)
    391      call assert_equal(colseparator, winwidth(0) + 1, msg)
    392    endif
    393    bwipe!
    394  endfor
    395 
    396  let &mouse = save_mouse
    397  " let &term = save_term
    398  " let &ttymouse = save_ttymouse
    399  " call test_override('no_query_mouse', 0)
    400 endfunc
    401 
    402 func Test_term_mouse_drag_statusline()
    403  let save_mouse = &mouse
    404  let save_term = &term
    405  " let save_ttymouse = &ttymouse
    406  " call test_override('no_query_mouse', 1)
    407  let save_laststatus = &laststatus
    408  " set mouse=a term=xterm laststatus=2
    409  set mouse=a laststatus=2
    410 
    411  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
    412    let msg = 'ttymouse=' .. ttymouse_val
    413    " exe 'set ttymouse=' .. ttymouse_val
    414 
    415    call assert_equal(1, &cmdheight, msg)
    416    let rowstatusline = winheight(0) + 1
    417    let row = rowstatusline
    418    let col = 1
    419 
    420    if ttymouse_val ==# 'xterm2' && row > 223
    421      " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
    422      continue
    423    endif
    424 
    425    call MouseLeftClick(row, col)
    426    let row -= 1
    427    call MouseLeftDrag(row, col)
    428    call assert_equal(2, &cmdheight, msg)
    429    call assert_equal(rowstatusline - 1, winheight(0) + 1, msg)
    430    let row += 1
    431    call MouseLeftDrag(row, col)
    432    call assert_equal(1, &cmdheight, msg)
    433    call assert_equal(rowstatusline, winheight(0) + 1, msg)
    434    call MouseLeftRelease(row, col)
    435    call assert_equal(1, &cmdheight, msg)
    436    call assert_equal(rowstatusline, winheight(0) + 1, msg)
    437  endfor
    438 
    439  let &mouse = save_mouse
    440  " let &term = save_term
    441  " let &ttymouse = save_ttymouse
    442  " call test_override('no_query_mouse', 0)
    443  let &laststatus = save_laststatus
    444 endfunc
    445 
    446 func Test_term_mouse_click_tab()
    447  let save_mouse = &mouse
    448  let save_term = &term
    449  " let save_ttymouse = &ttymouse
    450  " call test_override('no_query_mouse', 1)
    451  " set mouse=a term=xterm
    452  set mouse=a
    453  let row = 1
    454 
    455  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
    456    let msg = 'ttymouse=' .. ttymouse_val
    457    " exe 'set ttymouse=' .. ttymouse_val
    458    e Xfoo
    459    tabnew Xbar
    460 
    461    let a = split(execute(':tabs'), "\n")
    462    call assert_equal(['Tab page 1',
    463        \              '#   Xfoo',
    464        \              'Tab page 2',
    465        \              '>   Xbar'], a, msg)
    466 
    467    " Test clicking on tab names in the tabline at the top.
    468    let col = 2
    469    redraw
    470    call MouseLeftClick(row, col)
    471    call MouseLeftRelease(row, col)
    472    let a = split(execute(':tabs'), "\n")
    473    call assert_equal(['Tab page 1',
    474        \              '>   Xfoo',
    475        \              'Tab page 2',
    476        \              '#   Xbar'], a, msg)
    477 
    478    let col = 9
    479    call MouseLeftClick(row, col)
    480    call MouseLeftRelease(row, col)
    481    let a = split(execute(':tabs'), "\n")
    482    call assert_equal(['Tab page 1',
    483        \              '#   Xfoo',
    484        \              'Tab page 2',
    485        \              '>   Xbar'], a, msg)
    486 
    487    %bwipe!
    488  endfor
    489 
    490  let &mouse = save_mouse
    491  " let &term = save_term
    492  " let &ttymouse = save_ttymouse
    493  " call test_override('no_query_mouse', 0)
    494 endfunc
    495 
    496 func Test_term_mouse_click_X_to_close_tab()
    497  let save_mouse = &mouse
    498  let save_term = &term
    499  " let save_ttymouse = &ttymouse
    500  " call test_override('no_query_mouse', 1)
    501  " set mouse=a term=xterm
    502  set mouse=a
    503  let row = 1
    504  let col = &columns
    505 
    506  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
    507    if ttymouse_val ==# 'xterm2' && col > 223
    508      " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
    509      continue
    510    endif
    511    let msg = 'ttymouse=' .. ttymouse_val
    512    " exe 'set ttymouse=' .. ttymouse_val
    513    e Xtab1
    514    tabnew Xtab2
    515    tabnew Xtab3
    516    tabn 2
    517 
    518    let a = split(execute(':tabs'), "\n")
    519    call assert_equal(['Tab page 1',
    520        \              '    Xtab1',
    521        \              'Tab page 2',
    522        \              '>   Xtab2',
    523        \              'Tab page 3',
    524        \              '#   Xtab3'], a, msg)
    525 
    526    " Click on "X" in tabline to close current tab i.e. Xtab2.
    527    redraw
    528    call MouseLeftClick(row, col)
    529    call MouseLeftRelease(row, col)
    530    let a = split(execute(':tabs'), "\n")
    531    call assert_equal(['Tab page 1',
    532        \              '    Xtab1',
    533        \              'Tab page 2',
    534        \              '>   Xtab3'], a, msg)
    535 
    536    %bwipe!
    537  endfor
    538 
    539  let &mouse = save_mouse
    540  " let &term = save_term
    541  " let &ttymouse = save_ttymouse
    542  " call test_override('no_query_mouse', 0)
    543 endfunc
    544 
    545 func Test_term_mouse_drag_to_move_tab()
    546  let save_mouse = &mouse
    547  let save_term = &term
    548  " let save_ttymouse = &ttymouse
    549  " call test_override('no_query_mouse', 1)
    550  " Set 'mousetime' to 1 to avoid recognizing a double-click in the loop
    551  " set mouse=a term=xterm mousetime=1
    552  set mouse=a mousetime=0
    553  let row = 1
    554 
    555  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
    556    let msg = 'ttymouse=' .. ttymouse_val
    557    " exe 'set ttymouse=' .. ttymouse_val
    558    e Xtab1
    559    tabnew Xtab2
    560 
    561    let a = split(execute(':tabs'), "\n")
    562    call assert_equal(['Tab page 1',
    563        \              '#   Xtab1',
    564        \              'Tab page 2',
    565        \              '>   Xtab2'], a, msg)
    566    redraw
    567 
    568    " Click in tab2 and drag it to tab1.
    569    " Check getcharmod() to verify that click is not
    570    " interpreted as a spurious double-click.
    571    call MouseLeftClick(row, 10)
    572    call assert_equal(0, getcharmod(), msg)
    573    for col in [9, 8, 7, 6]
    574      call MouseLeftDrag(row, col)
    575    endfor
    576    call MouseLeftRelease(row, col)
    577    let a = split(execute(':tabs'), "\n")
    578    call assert_equal(['Tab page 1',
    579        \              '>   Xtab2',
    580        \              'Tab page 2',
    581        \              '#   Xtab1'], a, msg)
    582 
    583    " Switch to tab1
    584    tabnext
    585    let a = split(execute(':tabs'), "\n")
    586    call assert_equal(['Tab page 1',
    587        \              '#   Xtab2',
    588        \              'Tab page 2',
    589        \              '>   Xtab1'], a, msg)
    590 
    591    " Click in tab2 and drag it to tab1.
    592    " This time it is non-current tab.
    593    call MouseLeftClick(row, 6)
    594    call assert_equal(0, getcharmod(), msg)
    595    for col in [7, 8, 9, 10]
    596      call MouseLeftDrag(row, col)
    597    endfor
    598    call MouseLeftRelease(row, col)
    599    let a = split(execute(':tabs'), "\n")
    600    call assert_equal(['Tab page 1',
    601        \              '#   Xtab1',
    602        \              'Tab page 2',
    603        \              '>   Xtab2'], a, msg)
    604 
    605    " Click elsewhere so that click in next iteration is not
    606    " interpreted as unwanted double-click.
    607    call MouseLeftClick(row, 11)
    608    call MouseLeftRelease(row, 11)
    609 
    610    %bwipe!
    611  endfor
    612 
    613  let &mouse = save_mouse
    614  " let &term = save_term
    615  " let &ttymouse = save_ttymouse
    616  " call test_override('no_query_mouse', 0)
    617  set mousetime&
    618 endfunc
    619 
    620 func Test_term_mouse_double_click_to_create_tab()
    621  let save_mouse = &mouse
    622  let save_term = &term
    623  " let save_ttymouse = &ttymouse
    624  " call test_override('no_query_mouse', 1)
    625  " Set 'mousetime' to a small value, so that double-click works but we don't
    626  " have to wait long to avoid a triple-click.
    627  " set mouse=a term=xterm mousetime=200
    628  set mouse=a mousetime=200
    629  let row = 1
    630  let col = 10
    631 
    632  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
    633    let msg = 'ttymouse=' .. ttymouse_val
    634    " exe 'set ttymouse=' .. ttymouse_val
    635    e Xtab1
    636    tabnew Xtab2
    637 
    638    let a = split(execute(':tabs'), "\n")
    639    call assert_equal(['Tab page 1',
    640        \              '#   Xtab1',
    641        \              'Tab page 2',
    642        \              '>   Xtab2'], a, msg)
    643 
    644    redraw
    645    call MouseLeftClick(row, col)
    646    " Check getcharmod() to verify that first click is not
    647    " interpreted as a spurious double-click.
    648    call assert_equal(0, getcharmod(), msg)
    649    call MouseLeftRelease(row, col)
    650    call MouseLeftClick(row, col)
    651    call assert_equal(32, getcharmod(), msg) " double-click
    652    call MouseLeftRelease(row, col)
    653    let a = split(execute(':tabs'), "\n")
    654    call assert_equal(['Tab page 1',
    655        \              '    Xtab1',
    656        \              'Tab page 2',
    657        \              '>   [No Name]',
    658        \              'Tab page 3',
    659        \              '#   Xtab2'], a, msg)
    660 
    661    " Click elsewhere so that click in next iteration is not
    662    " interpreted as unwanted double click.
    663    call MouseLeftClick(row, col + 1)
    664    call MouseLeftRelease(row, col + 1)
    665 
    666    %bwipe!
    667  endfor
    668 
    669  let &mouse = save_mouse
    670  " let &term = save_term
    671  " let &ttymouse = save_ttymouse
    672  " call test_override('no_query_mouse', 0)
    673  set mousetime&
    674 endfunc
    675 
    676 " Test double/triple/quadruple click in normal mode to visually select.
    677 func Test_term_mouse_multiple_clicks_to_visually_select()
    678  let save_mouse = &mouse
    679  let save_term = &term
    680  " let save_ttymouse = &ttymouse
    681  " call test_override('no_query_mouse', 1)
    682 
    683  " 'mousetime' must be sufficiently large, or else the test is flaky when
    684  " using a ssh connection with X forwarding; i.e. ssh -X (issue #7563).
    685  " set mouse=a term=xterm mousetime=600
    686  set mouse=a mousetime=600
    687  new
    688 
    689  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
    690    let msg = 'ttymouse=' .. ttymouse_val
    691    " exe 'set ttymouse=' .. ttymouse_val
    692    call setline(1, ['foo [foo bar] foo', 'foo'])
    693 
    694    " Double-click on word should visually select the word.
    695    call MouseLeftClick(1, 2)
    696    call assert_equal(0, getcharmod(), msg)
    697    call MouseLeftRelease(1, 2)
    698    call MouseLeftClick(1, 2)
    699    call assert_equal(32, getcharmod(), msg) " double-click
    700    call MouseLeftRelease(1, 2)
    701    call assert_equal('v', mode(), msg)
    702    norm! r1
    703    call assert_equal(['111 [foo bar] foo', 'foo'], getline(1, '$'), msg)
    704 
    705    " Double-click on opening square bracket should visually
    706    " select the whole [foo bar].
    707    call MouseLeftClick(1, 5)
    708    call assert_equal(0, getcharmod(), msg)
    709    call MouseLeftRelease(1, 5)
    710    call MouseLeftClick(1, 5)
    711    call assert_equal(32, getcharmod(), msg) " double-click
    712    call MouseLeftRelease(1, 5)
    713    call assert_equal('v', mode(), msg)
    714    norm! r2
    715    call assert_equal(['111 222222222 foo', 'foo'], getline(1, '$'), msg)
    716 
    717    " Triple-click should visually select the whole line.
    718    call MouseLeftClick(1, 3)
    719    call assert_equal(0, getcharmod(), msg)
    720    call MouseLeftRelease(1, 3)
    721    call MouseLeftClick(1, 3)
    722    call assert_equal(32, getcharmod(), msg) " double-click
    723    call MouseLeftRelease(1, 3)
    724    call MouseLeftClick(1, 3)
    725    call assert_equal(64, getcharmod(), msg) " triple-click
    726    call MouseLeftRelease(1, 3)
    727    call assert_equal('V', mode(), msg)
    728    norm! r3
    729    call assert_equal(['33333333333333333', 'foo'], getline(1, '$'), msg)
    730 
    731    " Quadruple-click should start visual block select.
    732    call MouseLeftClick(1, 2)
    733    call assert_equal(0, getcharmod(), msg)
    734    call MouseLeftRelease(1, 2)
    735    call MouseLeftClick(1, 2)
    736    call assert_equal(32, getcharmod(), msg) " double-click
    737    call MouseLeftRelease(1, 2)
    738    call MouseLeftClick(1, 2)
    739    call assert_equal(64, getcharmod(), msg) " triple-click
    740    call MouseLeftRelease(1, 2)
    741    call MouseLeftClick(1, 2)
    742    call assert_equal(96, getcharmod(), msg) " quadruple-click
    743    call MouseLeftRelease(1, 2)
    744    call assert_equal("\<c-v>", mode(), msg)
    745    norm! r4
    746    call assert_equal(['34333333333333333', 'foo'], getline(1, '$'), msg)
    747 
    748    " Double-click on a space character should visually select all the
    749    " consecutive space characters.
    750    %d
    751    call setline(1, '    one two')
    752    call MouseLeftClick(1, 2)
    753    call MouseLeftRelease(1, 2)
    754    call MouseLeftClick(1, 2)
    755    call MouseLeftRelease(1, 2)
    756    call assert_equal('v', mode(), msg)
    757    norm! r1
    758    call assert_equal(['1111one two'], getline(1, '$'), msg)
    759 
    760    " Double-click on a word with exclusive selection
    761    set selection=exclusive
    762    let @" = ''
    763    call MouseLeftClick(1, 10)
    764    call MouseLeftRelease(1, 10)
    765    call MouseLeftClick(1, 10)
    766    call MouseLeftRelease(1, 10)
    767    norm! y
    768    call assert_equal('two', @", msg)
    769 
    770    " Double click to select a block of text with exclusive selection
    771    %d
    772    call setline(1, 'one (two) three')
    773    call MouseLeftClick(1, 5)
    774    call MouseLeftRelease(1, 5)
    775    call MouseLeftClick(1, 5)
    776    call MouseLeftRelease(1, 5)
    777    norm! y
    778    call assert_equal(5, col("'<"), msg)
    779    call assert_equal(10, col("'>"), msg)
    780 
    781    call MouseLeftClick(1, 9)
    782    call MouseLeftRelease(1, 9)
    783    call MouseLeftClick(1, 9)
    784    call MouseLeftRelease(1, 9)
    785    norm! y
    786    call assert_equal(5, col("'<"), msg)
    787    call assert_equal(10, col("'>"), msg)
    788    set selection&
    789 
    790    " Click somewhere else so that the clicks above is not combined with the
    791    " clicks in the next iteration.
    792    call MouseRightClick(3, 10)
    793    call MouseRightRelease(3, 10)
    794  endfor
    795 
    796  let &mouse = save_mouse
    797  " let &term = save_term
    798  " let &ttymouse = save_ttymouse
    799  set mousetime&
    800  " call test_override('no_query_mouse', 0)
    801  bwipe!
    802 endfunc
    803 
    804 " Test for selecting text in visual blockwise mode using Alt-LeftClick
    805 func Test_mouse_alt_leftclick()
    806  let save_mouse = &mouse
    807  let save_term = &term
    808  " let save_ttymouse = &ttymouse
    809  " call test_override('no_query_mouse', 1)
    810  " set mouse=a term=xterm mousetime=200
    811  set mouse=a mousetime=200
    812  set mousemodel=popup
    813  new
    814  call setline(1, 'one (two) three')
    815 
    816  for ttymouse_val in g:Ttymouse_values
    817    let msg = 'ttymouse=' .. ttymouse_val
    818    " exe 'set ttymouse=' .. ttymouse_val
    819 
    820    " Left click with the Alt modifier key should extend the selection in
    821    " blockwise visual mode.
    822    let @" = ''
    823    call MouseLeftClick(1, 3)
    824    call MouseLeftRelease(1, 3)
    825    call MouseAltLeftClick(1, 11)
    826    call MouseLeftRelease(1, 11)
    827    call assert_equal("\<C-V>", mode(), msg)
    828    normal! y
    829    call assert_equal('e (two) t', @")
    830  endfor
    831 
    832  let &mouse = save_mouse
    833  " let &term = save_term
    834  " let &ttymouse = save_ttymouse
    835  set mousetime& mousemodel&
    836  " call test_override('no_query_mouse', 0)
    837  bw!
    838 endfunc
    839 
    840 func Run_test_xterm_mouse_click_in_fold_columns()
    841  new
    842  let save_mouse = &mouse
    843  let save_term = &term
    844  " let save_ttymouse = &ttymouse
    845  let save_foldcolumn = &foldcolumn
    846  " set mouse=a term=xterm foldcolumn=3 ttymouse=xterm2
    847  set mouse=a foldcolumn=3
    848 
    849  " Create 2 nested folds.
    850  call setline(1, range(1, 7))
    851  2,6fold
    852  norm! zR
    853  4,5fold
    854  call assert_equal([-1, -1, -1, 4, 4, -1, -1],
    855        \           map(range(1, 7), 'foldclosed(v:val)'))
    856 
    857  " Click in "+" of inner fold in foldcolumn should open it.
    858  redraw
    859  let row = 4
    860  let col = 2
    861  call MouseLeftClick(row, col)
    862  call MouseLeftRelease(row, col)
    863  call assert_equal([-1, -1, -1, -1, -1, -1, -1],
    864        \           map(range(1, 7), 'foldclosed(v:val)'))
    865 
    866  " Click in "-" of outer fold in foldcolumn should close it.
    867  redraw
    868  let row = 2
    869  let col = 1
    870  call MouseLeftClick(row, col)
    871  call MouseLeftRelease(row, col)
    872  call assert_equal([-1, 2, 2, 2, 2, 2, -1],
    873        \           map(range(1, 7), 'foldclosed(v:val)'))
    874  norm! zR
    875 
    876  " Click in "|" of inner fold in foldcolumn should close it.
    877  redraw
    878  let row = 5
    879  let col = 2
    880  call MouseLeftClick(row, col)
    881  call MouseLeftRelease(row, col)
    882  call assert_equal([-1, -1, -1, 4, 4, -1, -1],
    883        \           map(range(1, 7), 'foldclosed(v:val)'))
    884 
    885  let &foldcolumn = save_foldcolumn
    886  " Redraw at the end of the test to avoid interfering with other tests.
    887  defer execute('redraw')
    888  " let &ttymouse = save_ttymouse
    889  " let &term = save_term
    890  let &mouse = save_mouse
    891  bwipe!
    892 endfunc
    893 
    894 func Test_xterm_mouse_click_in_fold_columns()
    895  call Run_test_xterm_mouse_click_in_fold_columns()
    896  set fillchars+=foldclose:▶
    897  call Run_test_xterm_mouse_click_in_fold_columns()
    898  set fillchars-=foldclose:▶ fillchars+=foldclose:!
    899  call Run_test_xterm_mouse_click_in_fold_columns()
    900  set fillchars&
    901 endfunc
    902 
    903 " Test for the 'h' flag in the 'mouse' option. Using mouse in the help window.
    904 func Test_term_mouse_help_window()
    905  let save_mouse = &mouse
    906  let save_term = &term
    907  " let save_ttymouse = &ttymouse
    908  " call test_override('no_query_mouse', 1)
    909  " set mouse=h term=xterm mousetime=200
    910  set mouse=h mousetime=200
    911 
    912  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
    913    let msg = 'ttymouse=' .. ttymouse_val
    914    " exe 'set ttymouse=' .. ttymouse_val
    915    help
    916    let @" = ''
    917    call MouseLeftClick(2, 5)
    918    call MouseLeftRelease(2, 5)
    919    call MouseLeftClick(1, 1)
    920    call MouseLeftDrag(1, 10)
    921    call MouseLeftRelease(1, 10)
    922    norm! y
    923    call assert_equal('*help.txt*', @", msg)
    924    helpclose
    925 
    926    " Click somewhere else to make sure the left click above is not combined
    927    " with the next left click and treated as a double click
    928    call MouseRightClick(5, 10)
    929    call MouseRightRelease(5, 10)
    930  endfor
    931 
    932  let &mouse = save_mouse
    933  " let &term = save_term
    934  " let &ttymouse = save_ttymouse
    935  set mousetime&
    936  " call test_override('no_query_mouse', 0)
    937  %bw!
    938 endfunc
    939 
    940 " Test for the translation of various mouse terminal codes
    941 func Test_mouse_termcodes()
    942  let save_mouse = &mouse
    943  let save_term = &term
    944  " let save_ttymouse = &ttymouse
    945  " call test_override('no_query_mouse', 1)
    946  " set mouse=a term=xterm mousetime=200
    947 
    948  new
    949  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
    950    let msg = 'ttymouse=' .. ttymouse_val
    951    " exe 'set ttymouse=' .. ttymouse_val
    952 
    953    let mouse_codes = [
    954          \ ["\<LeftMouse>", "<LeftMouse>"],
    955          \ ["\<MiddleMouse>", "<MiddleMouse>"],
    956          \ ["\<RightMouse>", "<RightMouse>"],
    957          \ ["\<S-LeftMouse>", "<S-LeftMouse>"],
    958          \ ["\<S-MiddleMouse>", "<S-MiddleMouse>"],
    959          \ ["\<S-RightMouse>", "<S-RightMouse>"],
    960          \ ["\<C-LeftMouse>", "<C-LeftMouse>"],
    961          \ ["\<C-MiddleMouse>", "<C-MiddleMouse>"],
    962          \ ["\<C-RightMouse>", "<C-RightMouse>"],
    963          \ ["\<M-LeftMouse>", "<M-LeftMouse>"],
    964          \ ["\<M-MiddleMouse>", "<M-MiddleMouse>"],
    965          \ ["\<M-RightMouse>", "<M-RightMouse>"],
    966          \ ["\<2-LeftMouse>", "<2-LeftMouse>"],
    967          \ ["\<2-MiddleMouse>", "<2-MiddleMouse>"],
    968          \ ["\<2-RightMouse>", "<2-RightMouse>"],
    969          \ ["\<3-LeftMouse>", "<3-LeftMouse>"],
    970          \ ["\<3-MiddleMouse>", "<3-MiddleMouse>"],
    971          \ ["\<3-RightMouse>", "<3-RightMouse>"],
    972          \ ["\<4-LeftMouse>", "<4-LeftMouse>"],
    973          \ ["\<4-MiddleMouse>", "<4-MiddleMouse>"],
    974          \ ["\<4-RightMouse>", "<4-RightMouse>"],
    975          \ ["\<LeftDrag>", "<LeftDrag>"],
    976          \ ["\<MiddleDrag>", "<MiddleDrag>"],
    977          \ ["\<RightDrag>", "<RightDrag>"],
    978          \ ["\<LeftRelease>", "<LeftRelease>"],
    979          \ ["\<MiddleRelease>", "<MiddleRelease>"],
    980          \ ["\<RightRelease>", "<RightRelease>"],
    981          \ ["\<ScrollWheelUp>", "<ScrollWheelUp>"],
    982          \ ["\<S-ScrollWheelUp>", "<S-ScrollWheelUp>"],
    983          \ ["\<C-ScrollWheelUp>", "<C-ScrollWheelUp>"],
    984          \ ["\<ScrollWheelDown>", "<ScrollWheelDown>"],
    985          \ ["\<S-ScrollWheelDown>", "<S-ScrollWheelDown>"],
    986          \ ["\<C-ScrollWheelDown>", "<C-ScrollWheelDown>"],
    987          \ ["\<ScrollWheelLeft>", "<ScrollWheelLeft>"],
    988          \ ["\<S-ScrollWheelLeft>", "<S-ScrollWheelLeft>"],
    989          \ ["\<C-ScrollWheelLeft>", "<C-ScrollWheelLeft>"],
    990          \ ["\<ScrollWheelRight>", "<ScrollWheelRight>"],
    991          \ ["\<S-ScrollWheelRight>", "<S-ScrollWheelRight>"],
    992          \ ["\<C-ScrollWheelRight>", "<C-ScrollWheelRight>"]
    993          \ ]
    994 
    995    for [code, outstr] in mouse_codes
    996      exe "normal ggC\<C-K>" . code
    997      call assert_equal(outstr, getline(1), msg)
    998    endfor
    999  endfor
   1000 
   1001  let &mouse = save_mouse
   1002  " let &term = save_term
   1003  " let &ttymouse = save_ttymouse
   1004  set mousetime&
   1005  " call test_override('no_query_mouse', 0)
   1006  %bw!
   1007 endfunc
   1008 
   1009 " Test for translation of special key codes (<xF1>, <xF2>, etc.)
   1010 func Test_Keycode_Translation()
   1011  let keycodes = [
   1012        \ ["<xUp>", "<Up>"],
   1013        \ ["<xDown>", "<Down>"],
   1014        \ ["<xLeft>", "<Left>"],
   1015        \ ["<xRight>", "<Right>"],
   1016        \ ["<xHome>", "<Home>"],
   1017        \ ["<xEnd>", "<End>"],
   1018        \ ["<zHome>", "<Home>"],
   1019        \ ["<zEnd>", "<End>"],
   1020        \ ["<xF1>", "<F1>"],
   1021        \ ["<xF2>", "<F2>"],
   1022        \ ["<xF3>", "<F3>"],
   1023        \ ["<xF4>", "<F4>"],
   1024        \ ["<S-xF1>", "<S-F1>"],
   1025        \ ["<S-xF2>", "<S-F2>"],
   1026        \ ["<S-xF3>", "<S-F3>"],
   1027        \ ["<S-xF4>", "<S-F4>"]]
   1028  for [k1, k2] in keycodes
   1029    exe "nnoremap " .. k1 .. " 2wx"
   1030    call assert_true(maparg(k1, 'n', 0, 1).lhs == k2)
   1031    exe "nunmap " .. k1
   1032  endfor
   1033 endfunc
   1034 
   1035 " Test for terminal keycodes that doesn't have termcap entries
   1036 func Test_special_term_keycodes()
   1037  new
   1038  " Test for <xHome>, <S-xHome> and <C-xHome>
   1039  " send <K_SPECIAL> <KS_EXTRA> keycode
   1040  call feedkeys("i\<C-K>\x80\xfd\x3f\n", 'xt')
   1041  " send <K_SPECIAL> <KS_MODIFIER> bitmap <K_SPECIAL> <KS_EXTRA> keycode
   1042  call feedkeys("i\<C-K>\x80\xfc\x2\x80\xfd\x3f\n", 'xt')
   1043  call feedkeys("i\<C-K>\x80\xfc\x4\x80\xfd\x3f\n", 'xt')
   1044  " Test for <xEnd>, <S-xEnd> and <C-xEnd>
   1045  call feedkeys("i\<C-K>\x80\xfd\x3d\n", 'xt')
   1046  call feedkeys("i\<C-K>\x80\xfc\x2\x80\xfd\x3d\n", 'xt')
   1047  call feedkeys("i\<C-K>\x80\xfc\x4\x80\xfd\x3d\n", 'xt')
   1048  " Test for <zHome>, <S-zHome> and <C-zHome>
   1049  call feedkeys("i\<C-K>\x80\xfd\x40\n", 'xt')
   1050  call feedkeys("i\<C-K>\x80\xfc\x2\x80\xfd\x40\n", 'xt')
   1051  call feedkeys("i\<C-K>\x80\xfc\x4\x80\xfd\x40\n", 'xt')
   1052  " Test for <zEnd>, <S-zEnd> and <C-zEnd>
   1053  call feedkeys("i\<C-K>\x80\xfd\x3e\n", 'xt')
   1054  call feedkeys("i\<C-K>\x80\xfc\x2\x80\xfd\x3e\n", 'xt')
   1055  call feedkeys("i\<C-K>\x80\xfc\x4\x80\xfd\x3e\n", 'xt')
   1056  " Test for <xUp>, <xDown>, <xLeft> and <xRight>
   1057  call feedkeys("i\<C-K>\x80\xfd\x41\n", 'xt')
   1058  call feedkeys("i\<C-K>\x80\xfd\x42\n", 'xt')
   1059  call feedkeys("i\<C-K>\x80\xfd\x43\n", 'xt')
   1060  call feedkeys("i\<C-K>\x80\xfd\x44\n", 'xt')
   1061  call assert_equal(['<Home>', '<S-Home>', '<C-Home>',
   1062        \ '<End>', '<S-End>', '<C-End>',
   1063        \ '<Home>', '<S-Home>', '<C-Home>',
   1064        \ '<End>', '<S-End>', '<C-End>',
   1065        \ '<Up>', '<Down>', '<Left>', '<Right>', ''], getline(1, '$'))
   1066  bw!
   1067 endfunc
   1068 
   1069 
   1070 " vim: shiftwidth=2 sts=2 expandtab