1991dea3aSBram Moolenaar" Tests for window cmd (:wincmd, :split, :vsplit, :resize and etc...)
2991dea3aSBram Moolenaar
36d91bcb4SBram Moolenaarsource check.vim
4a27e1dcdSBram Moolenaar
5991dea3aSBram Moolenaarfunc Test_window_cmd_ls0_with_split()
6991dea3aSBram Moolenaar  set ls=0
7991dea3aSBram Moolenaar  set splitbelow
8991dea3aSBram Moolenaar  split
9991dea3aSBram Moolenaar  quit
10991dea3aSBram Moolenaar  call assert_equal(0, &lines - &cmdheight - winheight(0))
11991dea3aSBram Moolenaar  new | only!
12991dea3aSBram Moolenaar  "
13991dea3aSBram Moolenaar  set splitbelow&vim
14991dea3aSBram Moolenaar  botright split
15991dea3aSBram Moolenaar  quit
16991dea3aSBram Moolenaar  call assert_equal(0, &lines - &cmdheight - winheight(0))
17991dea3aSBram Moolenaar  new | only!
18991dea3aSBram Moolenaar  set ls&vim
19991dea3aSBram Moolenaarendfunc
20991dea3aSBram Moolenaar
21991dea3aSBram Moolenaarfunc Test_window_cmd_cmdwin_with_vsp()
2221829c5fSBram Moolenaar  CheckFeature cmdwin
2321829c5fSBram Moolenaar
24991dea3aSBram Moolenaar  let efmt = 'Expected 0 but got %d (in ls=%d, %s window)'
25991dea3aSBram Moolenaar  for v in range(0, 2)
26991dea3aSBram Moolenaar    exec "set ls=" . v
27991dea3aSBram Moolenaar    vsplit
28991dea3aSBram Moolenaar    call feedkeys("q:\<CR>")
29991dea3aSBram Moolenaar    let ac = &lines - (&cmdheight + winheight(0) + !!v)
30991dea3aSBram Moolenaar    let emsg = printf(efmt, ac, v, 'left')
31991dea3aSBram Moolenaar    call assert_equal(0, ac, emsg)
32991dea3aSBram Moolenaar    wincmd w
33991dea3aSBram Moolenaar    let ac = &lines - (&cmdheight + winheight(0) + !!v)
34991dea3aSBram Moolenaar    let emsg = printf(efmt, ac, v, 'right')
35991dea3aSBram Moolenaar    call assert_equal(0, ac, emsg)
36991dea3aSBram Moolenaar    new | only!
37991dea3aSBram Moolenaar  endfor
38991dea3aSBram Moolenaar  set ls&vim
39991dea3aSBram Moolenaarendfunc
40991dea3aSBram Moolenaar
415d3c9f8cSBram Moolenaar" Test for jumping to windows
425d3c9f8cSBram Moolenaarfunc Test_window_jump()
435d3c9f8cSBram Moolenaar  new
445d3c9f8cSBram Moolenaar  " jumping to a window with a count greater than the max windows
455d3c9f8cSBram Moolenaar  exe "normal 4\<C-W>w"
465d3c9f8cSBram Moolenaar  call assert_equal(2, winnr())
475d3c9f8cSBram Moolenaar  only
485d3c9f8cSBram Moolenaarendfunc
495d3c9f8cSBram Moolenaar
505d3c9f8cSBram Moolenaarfunc Test_window_cmd_wincmd_gf()
515d2ca040SBram Moolenaar  let fname = 'test_gf.txt'
525d2ca040SBram Moolenaar  let swp_fname = '.' . fname . '.swp'
535d2ca040SBram Moolenaar  call writefile([], fname)
545d2ca040SBram Moolenaar  call writefile([], swp_fname)
555d2ca040SBram Moolenaar  function s:swap_exists()
565d2ca040SBram Moolenaar    let v:swapchoice = s:swap_choice
575d2ca040SBram Moolenaar  endfunc
58eaa49e40SBram Moolenaar  " Remove the catch-all that runtest.vim adds
59eaa49e40SBram Moolenaar  au! SwapExists
605d2ca040SBram Moolenaar  augroup test_window_cmd_wincmd_gf
615d2ca040SBram Moolenaar    autocmd!
625d2ca040SBram Moolenaar    exec "autocmd SwapExists " . fname . " call s:swap_exists()"
635d2ca040SBram Moolenaar  augroup END
645d2ca040SBram Moolenaar
655d2ca040SBram Moolenaar  call setline(1, fname)
665d2ca040SBram Moolenaar  " (E)dit anyway
675d2ca040SBram Moolenaar  let s:swap_choice = 'e'
685d2ca040SBram Moolenaar  wincmd gf
695d2ca040SBram Moolenaar  call assert_equal(2, tabpagenr())
705d2ca040SBram Moolenaar  call assert_equal(fname, bufname("%"))
715d2ca040SBram Moolenaar  quit!
725d2ca040SBram Moolenaar
735d2ca040SBram Moolenaar  " (Q)uit
745d2ca040SBram Moolenaar  let s:swap_choice = 'q'
755d2ca040SBram Moolenaar  wincmd gf
765d2ca040SBram Moolenaar  call assert_equal(1, tabpagenr())
775d2ca040SBram Moolenaar  call assert_notequal(fname, bufname("%"))
785d2ca040SBram Moolenaar  new | only!
795d2ca040SBram Moolenaar
805d2ca040SBram Moolenaar  call delete(fname)
815d2ca040SBram Moolenaar  call delete(swp_fname)
825d2ca040SBram Moolenaar  augroup! test_window_cmd_wincmd_gf
835d2ca040SBram Moolenaarendfunc
845d2ca040SBram Moolenaar
854520d440SBram Moolenaarfunc Test_window_quit()
864520d440SBram Moolenaar  e Xa
874520d440SBram Moolenaar  split Xb
88f92e58caSBram Moolenaar  call assert_equal(2, '$'->winnr())
894520d440SBram Moolenaar  call assert_equal('Xb', bufname(winbufnr(1)))
904520d440SBram Moolenaar  call assert_equal('Xa', bufname(winbufnr(2)))
914520d440SBram Moolenaar
924520d440SBram Moolenaar  wincmd q
934520d440SBram Moolenaar  call assert_equal(1, winnr('$'))
944520d440SBram Moolenaar  call assert_equal('Xa', bufname(winbufnr(1)))
954520d440SBram Moolenaar
964520d440SBram Moolenaar  bw Xa Xb
974520d440SBram Moolenaarendfunc
984520d440SBram Moolenaar
994520d440SBram Moolenaarfunc Test_window_horizontal_split()
1004520d440SBram Moolenaar  call assert_equal(1, winnr('$'))
1014520d440SBram Moolenaar  3wincmd s
1024520d440SBram Moolenaar  call assert_equal(2, winnr('$'))
1034520d440SBram Moolenaar  call assert_equal(3, winheight(0))
104f92e58caSBram Moolenaar  call assert_equal(winwidth(1), 2->winwidth())
1054520d440SBram Moolenaar
1064520d440SBram Moolenaar  call assert_fails('botright topleft wincmd s', 'E442:')
1074520d440SBram Moolenaar  bw
1084520d440SBram Moolenaarendfunc
1094520d440SBram Moolenaar
1104520d440SBram Moolenaarfunc Test_window_vertical_split()
1114520d440SBram Moolenaar  call assert_equal(1, winnr('$'))
1124520d440SBram Moolenaar  3wincmd v
1134520d440SBram Moolenaar  call assert_equal(2, winnr('$'))
1144520d440SBram Moolenaar  call assert_equal(3, winwidth(0))
1154520d440SBram Moolenaar  call assert_equal(winheight(1), winheight(2))
1164520d440SBram Moolenaar
1174520d440SBram Moolenaar  call assert_fails('botright topleft wincmd v', 'E442:')
1184520d440SBram Moolenaar  bw
1194520d440SBram Moolenaarendfunc
1204520d440SBram Moolenaar
1211bbb6194SBram Moolenaar" Test the ":wincmd ^" and "<C-W>^" commands.
1224520d440SBram Moolenaarfunc Test_window_split_edit_alternate()
1234520d440SBram Moolenaar
1241bbb6194SBram Moolenaar  " Test for failure when the alternate buffer/file no longer exists.
1251bbb6194SBram Moolenaar  edit Xfoo | %bw
126e2e4075fSBram Moolenaar  call assert_fails(':wincmd ^', 'E23:')
1271bbb6194SBram Moolenaar
1281bbb6194SBram Moolenaar  " Test for the expected behavior when we have two named buffers.
1291bbb6194SBram Moolenaar  edit Xfoo | edit Xbar
1304520d440SBram Moolenaar  wincmd ^
1311bbb6194SBram Moolenaar  call assert_equal('Xfoo', bufname(winbufnr(1)))
1321bbb6194SBram Moolenaar  call assert_equal('Xbar', bufname(winbufnr(2)))
1331bbb6194SBram Moolenaar  only
1344520d440SBram Moolenaar
1351bbb6194SBram Moolenaar  " Test for the expected behavior when the alternate buffer is not named.
1361bbb6194SBram Moolenaar  enew | let l:nr1 = bufnr('%')
1371bbb6194SBram Moolenaar  edit Xfoo | let l:nr2 = bufnr('%')
1381bbb6194SBram Moolenaar  wincmd ^
1391bbb6194SBram Moolenaar  call assert_equal(l:nr1, winbufnr(1))
1401bbb6194SBram Moolenaar  call assert_equal(l:nr2, winbufnr(2))
1411bbb6194SBram Moolenaar  only
1421bbb6194SBram Moolenaar
143d42333d8SBram Moolenaar  " FIXME: this currently fails on AppVeyor, but passes locally
144d42333d8SBram Moolenaar  if !has('win32')
1451bbb6194SBram Moolenaar    " Test the Normal mode command.
1461bbb6194SBram Moolenaar    call feedkeys("\<C-W>\<C-^>", 'tx')
1471bbb6194SBram Moolenaar    call assert_equal(l:nr2, winbufnr(1))
1481bbb6194SBram Moolenaar    call assert_equal(l:nr1, winbufnr(2))
149d42333d8SBram Moolenaar  endif
1501bbb6194SBram Moolenaar
1511bbb6194SBram Moolenaar  %bw!
1521bbb6194SBram Moolenaarendfunc
1531bbb6194SBram Moolenaar
1541bbb6194SBram Moolenaar" Test the ":[count]wincmd ^" and "[count]<C-W>^" commands.
1551bbb6194SBram Moolenaarfunc Test_window_split_edit_bufnr()
1561bbb6194SBram Moolenaar
1571bbb6194SBram Moolenaar  %bwipeout
1581bbb6194SBram Moolenaar  let l:nr = bufnr('%') + 1
159e2e4075fSBram Moolenaar  call assert_fails(':execute "normal! ' . l:nr . '\<C-W>\<C-^>"', 'E92:')
160e2e4075fSBram Moolenaar  call assert_fails(':' . l:nr . 'wincmd ^', 'E16:')
161e2e4075fSBram Moolenaar  call assert_fails(':0wincmd ^', 'E16:')
1621bbb6194SBram Moolenaar
1631bbb6194SBram Moolenaar  edit Xfoo | edit Xbar | edit Xbaz
1641bbb6194SBram Moolenaar  let l:foo_nr = bufnr('Xfoo')
1651bbb6194SBram Moolenaar  let l:bar_nr = bufnr('Xbar')
1661bbb6194SBram Moolenaar  let l:baz_nr = bufnr('Xbaz')
1671bbb6194SBram Moolenaar
1688617b401SBram Moolenaar  " FIXME: this currently fails on AppVeyor, but passes locally
1698617b401SBram Moolenaar  if !has('win32')
1701bbb6194SBram Moolenaar    call feedkeys(l:foo_nr . "\<C-W>\<C-^>", 'tx')
1711bbb6194SBram Moolenaar    call assert_equal('Xfoo', bufname(winbufnr(1)))
1721bbb6194SBram Moolenaar    call assert_equal('Xbaz', bufname(winbufnr(2)))
1731bbb6194SBram Moolenaar    only
1741bbb6194SBram Moolenaar
1751bbb6194SBram Moolenaar    call feedkeys(l:bar_nr . "\<C-W>\<C-^>", 'tx')
1761bbb6194SBram Moolenaar    call assert_equal('Xbar', bufname(winbufnr(1)))
1771bbb6194SBram Moolenaar    call assert_equal('Xfoo', bufname(winbufnr(2)))
1781bbb6194SBram Moolenaar    only
1791bbb6194SBram Moolenaar
1801bbb6194SBram Moolenaar    execute l:baz_nr . 'wincmd ^'
1811bbb6194SBram Moolenaar    call assert_equal('Xbaz', bufname(winbufnr(1)))
1821bbb6194SBram Moolenaar    call assert_equal('Xbar', bufname(winbufnr(2)))
1838617b401SBram Moolenaar  endif
1841bbb6194SBram Moolenaar
1851bbb6194SBram Moolenaar  %bw!
1864520d440SBram Moolenaarendfunc
1874520d440SBram Moolenaar
1889b9be007SBram Moolenaarfunc Test_window_split_no_room()
1899b9be007SBram Moolenaar  " N horizontal windows need >= 2*N + 1 lines:
1909b9be007SBram Moolenaar  " - 1 line + 1 status line in each window
1919b9be007SBram Moolenaar  " - 1 Ex command line
1929b9be007SBram Moolenaar  "
1939b9be007SBram Moolenaar  " 2*N + 1 <= &lines
1949b9be007SBram Moolenaar  " N <= (lines - 1)/2
1959b9be007SBram Moolenaar  "
1969b9be007SBram Moolenaar  " Beyond that number of windows, E36: Not enough room is expected.
1979b9be007SBram Moolenaar  let hor_win_count = (&lines - 1)/2
1989b9be007SBram Moolenaar  let hor_split_count = hor_win_count - 1
1999b9be007SBram Moolenaar  for s in range(1, hor_split_count) | split | endfor
2009b9be007SBram Moolenaar  call assert_fails('split', 'E36:')
2019b9be007SBram Moolenaar
2029b9be007SBram Moolenaar  " N vertical windows need >= 2*(N - 1) + 1 columns:
2039b9be007SBram Moolenaar  " - 1 column + 1 separator for each window (except last window)
2049b9be007SBram Moolenaar  " - 1 column for the last window which does not have separator
2059b9be007SBram Moolenaar  "
2069b9be007SBram Moolenaar  " 2*(N - 1) + 1 <= &columns
2079b9be007SBram Moolenaar  " 2*N - 1 <= &columns
2089b9be007SBram Moolenaar  " N <= (&columns + 1)/2
2099b9be007SBram Moolenaar  let ver_win_count = (&columns + 1)/2
2109b9be007SBram Moolenaar  let ver_split_count = ver_win_count - 1
2119b9be007SBram Moolenaar  for s in range(1, ver_split_count) | vsplit | endfor
2129b9be007SBram Moolenaar  call assert_fails('vsplit', 'E36:')
2139b9be007SBram Moolenaar
2149b9be007SBram Moolenaar  %bw!
2159b9be007SBram Moolenaarendfunc
2169b9be007SBram Moolenaar
2174520d440SBram Moolenaarfunc Test_window_exchange()
2184520d440SBram Moolenaar  e Xa
2194520d440SBram Moolenaar
2204520d440SBram Moolenaar  " Nothing happens with window exchange when there is 1 window
2214520d440SBram Moolenaar  wincmd x
2224520d440SBram Moolenaar  call assert_equal(1, winnr('$'))
2234520d440SBram Moolenaar
2244520d440SBram Moolenaar  split Xb
2254520d440SBram Moolenaar  split Xc
2264520d440SBram Moolenaar
2274520d440SBram Moolenaar  call assert_equal('Xc', bufname(winbufnr(1)))
2284520d440SBram Moolenaar  call assert_equal('Xb', bufname(winbufnr(2)))
2294520d440SBram Moolenaar  call assert_equal('Xa', bufname(winbufnr(3)))
2304520d440SBram Moolenaar
2314520d440SBram Moolenaar  " Exchange current window 1 with window 3
2324520d440SBram Moolenaar  3wincmd x
2334520d440SBram Moolenaar  call assert_equal('Xa', bufname(winbufnr(1)))
2344520d440SBram Moolenaar  call assert_equal('Xb', bufname(winbufnr(2)))
2354520d440SBram Moolenaar  call assert_equal('Xc', bufname(winbufnr(3)))
2364520d440SBram Moolenaar
2374520d440SBram Moolenaar  " Exchange window with next when at the top window
2384520d440SBram Moolenaar  wincmd x
2394520d440SBram Moolenaar  call assert_equal('Xb', bufname(winbufnr(1)))
2404520d440SBram Moolenaar  call assert_equal('Xa', bufname(winbufnr(2)))
2414520d440SBram Moolenaar  call assert_equal('Xc', bufname(winbufnr(3)))
2424520d440SBram Moolenaar
2434520d440SBram Moolenaar  " Exchange window with next when at the middle window
2444520d440SBram Moolenaar  wincmd j
2454520d440SBram Moolenaar  wincmd x
2464520d440SBram Moolenaar  call assert_equal('Xb', bufname(winbufnr(1)))
2474520d440SBram Moolenaar  call assert_equal('Xc', bufname(winbufnr(2)))
2484520d440SBram Moolenaar  call assert_equal('Xa', bufname(winbufnr(3)))
2494520d440SBram Moolenaar
2504520d440SBram Moolenaar  " Exchange window with next when at the bottom window.
2514520d440SBram Moolenaar  " When there is no next window, it exchanges with the previous window.
2524520d440SBram Moolenaar  wincmd j
2534520d440SBram Moolenaar  wincmd x
2544520d440SBram Moolenaar  call assert_equal('Xb', bufname(winbufnr(1)))
2554520d440SBram Moolenaar  call assert_equal('Xa', bufname(winbufnr(2)))
2564520d440SBram Moolenaar  call assert_equal('Xc', bufname(winbufnr(3)))
2574520d440SBram Moolenaar
2584520d440SBram Moolenaar  bw Xa Xb Xc
2594520d440SBram Moolenaarendfunc
2604520d440SBram Moolenaar
2614520d440SBram Moolenaarfunc Test_window_rotate()
2624520d440SBram Moolenaar  e Xa
2634520d440SBram Moolenaar  split Xb
2644520d440SBram Moolenaar  split Xc
2654520d440SBram Moolenaar  call assert_equal('Xc', bufname(winbufnr(1)))
2664520d440SBram Moolenaar  call assert_equal('Xb', bufname(winbufnr(2)))
2674520d440SBram Moolenaar  call assert_equal('Xa', bufname(winbufnr(3)))
2684520d440SBram Moolenaar
2694520d440SBram Moolenaar  " Rotate downwards
2704520d440SBram Moolenaar  wincmd r
2714520d440SBram Moolenaar  call assert_equal('Xa', bufname(winbufnr(1)))
2724520d440SBram Moolenaar  call assert_equal('Xc', bufname(winbufnr(2)))
2734520d440SBram Moolenaar  call assert_equal('Xb', bufname(winbufnr(3)))
2744520d440SBram Moolenaar
2754520d440SBram Moolenaar  2wincmd r
2764520d440SBram Moolenaar  call assert_equal('Xc', bufname(winbufnr(1)))
2774520d440SBram Moolenaar  call assert_equal('Xb', bufname(winbufnr(2)))
2784520d440SBram Moolenaar  call assert_equal('Xa', bufname(winbufnr(3)))
2794520d440SBram Moolenaar
2804520d440SBram Moolenaar  " Rotate upwards
2814520d440SBram Moolenaar  wincmd R
2824520d440SBram Moolenaar  call assert_equal('Xb', bufname(winbufnr(1)))
2834520d440SBram Moolenaar  call assert_equal('Xa', bufname(winbufnr(2)))
2844520d440SBram Moolenaar  call assert_equal('Xc', bufname(winbufnr(3)))
2854520d440SBram Moolenaar
2864520d440SBram Moolenaar  2wincmd R
2874520d440SBram Moolenaar  call assert_equal('Xc', bufname(winbufnr(1)))
2884520d440SBram Moolenaar  call assert_equal('Xb', bufname(winbufnr(2)))
2894520d440SBram Moolenaar  call assert_equal('Xa', bufname(winbufnr(3)))
2904520d440SBram Moolenaar
2914520d440SBram Moolenaar  bot vsplit
2924520d440SBram Moolenaar  call assert_fails('wincmd R', 'E443:')
2934520d440SBram Moolenaar
2944520d440SBram Moolenaar  bw Xa Xb Xc
2954520d440SBram Moolenaarendfunc
2964520d440SBram Moolenaar
2974520d440SBram Moolenaarfunc Test_window_height()
2984520d440SBram Moolenaar  e Xa
2994520d440SBram Moolenaar  split Xb
3004520d440SBram Moolenaar
3014520d440SBram Moolenaar  let [wh1, wh2] = [winheight(1), winheight(2)]
3024520d440SBram Moolenaar  " Active window (1) should have the same height or 1 more
3034520d440SBram Moolenaar  " than the other window.
3044520d440SBram Moolenaar  call assert_inrange(wh2, wh2 + 1, wh1)
3054520d440SBram Moolenaar
3064520d440SBram Moolenaar  wincmd -
3074520d440SBram Moolenaar  call assert_equal(wh1 - 1, winheight(1))
3084520d440SBram Moolenaar  call assert_equal(wh2 + 1, winheight(2))
3094520d440SBram Moolenaar
3104520d440SBram Moolenaar  wincmd +
3114520d440SBram Moolenaar  call assert_equal(wh1, winheight(1))
312f92e58caSBram Moolenaar  call assert_equal(wh2, 2->winheight())
3134520d440SBram Moolenaar
3144520d440SBram Moolenaar  2wincmd _
3154520d440SBram Moolenaar  call assert_equal(2, winheight(1))
3164520d440SBram Moolenaar  call assert_equal(wh1 + wh2 - 2, winheight(2))
3174520d440SBram Moolenaar
3184520d440SBram Moolenaar  wincmd =
3194520d440SBram Moolenaar  call assert_equal(wh1, winheight(1))
3204520d440SBram Moolenaar  call assert_equal(wh2, winheight(2))
3214520d440SBram Moolenaar
3224520d440SBram Moolenaar  2wincmd _
3234520d440SBram Moolenaar  set winfixheight
3244520d440SBram Moolenaar  split Xc
3254520d440SBram Moolenaar  let [wh1, wh2, wh3] = [winheight(1), winheight(2), winheight(3)]
3264520d440SBram Moolenaar  call assert_equal(2, winheight(2))
3274520d440SBram Moolenaar  call assert_inrange(wh3, wh3 + 1, wh1)
3284520d440SBram Moolenaar  3wincmd +
3294520d440SBram Moolenaar  call assert_equal(2,       winheight(2))
3304520d440SBram Moolenaar  call assert_equal(wh1 + 3, winheight(1))
3314520d440SBram Moolenaar  call assert_equal(wh3 - 3, winheight(3))
3324520d440SBram Moolenaar  wincmd =
3334520d440SBram Moolenaar  call assert_equal(2,   winheight(2))
3344520d440SBram Moolenaar  call assert_equal(wh1, winheight(1))
3354520d440SBram Moolenaar  call assert_equal(wh3, winheight(3))
3364520d440SBram Moolenaar
3374520d440SBram Moolenaar  wincmd j
3384520d440SBram Moolenaar  set winfixheight&
3394520d440SBram Moolenaar
3404520d440SBram Moolenaar  wincmd =
3414520d440SBram Moolenaar  let [wh1, wh2, wh3] = [winheight(1), winheight(2), winheight(3)]
3424520d440SBram Moolenaar  " Current window (2) should have the same height or 1 more
3434520d440SBram Moolenaar  " than the other windows.
3444520d440SBram Moolenaar  call assert_inrange(wh1, wh1 + 1, wh2)
3454520d440SBram Moolenaar  call assert_inrange(wh3, wh3 + 1, wh2)
3464520d440SBram Moolenaar
3474520d440SBram Moolenaar  bw Xa Xb Xc
3484520d440SBram Moolenaarendfunc
3494520d440SBram Moolenaar
3504520d440SBram Moolenaarfunc Test_window_width()
3514520d440SBram Moolenaar  e Xa
3524520d440SBram Moolenaar  vsplit Xb
3534520d440SBram Moolenaar
3544520d440SBram Moolenaar  let [ww1, ww2] = [winwidth(1), winwidth(2)]
3554520d440SBram Moolenaar  " Active window (1) should have the same width or 1 more
3564520d440SBram Moolenaar  " than the other window.
3574520d440SBram Moolenaar  call assert_inrange(ww2, ww2 + 1, ww1)
3584520d440SBram Moolenaar
3594520d440SBram Moolenaar  wincmd <
3604520d440SBram Moolenaar  call assert_equal(ww1 - 1, winwidth(1))
3614520d440SBram Moolenaar  call assert_equal(ww2 + 1, winwidth(2))
3624520d440SBram Moolenaar
3634520d440SBram Moolenaar  wincmd >
3644520d440SBram Moolenaar  call assert_equal(ww1, winwidth(1))
3654520d440SBram Moolenaar  call assert_equal(ww2, winwidth(2))
3664520d440SBram Moolenaar
3674520d440SBram Moolenaar  2wincmd |
3684520d440SBram Moolenaar  call assert_equal(2, winwidth(1))
3694520d440SBram Moolenaar  call assert_equal(ww1 + ww2 - 2, winwidth(2))
3704520d440SBram Moolenaar
3714520d440SBram Moolenaar  wincmd =
3724520d440SBram Moolenaar  call assert_equal(ww1, winwidth(1))
3734520d440SBram Moolenaar  call assert_equal(ww2, winwidth(2))
3744520d440SBram Moolenaar
3754520d440SBram Moolenaar  2wincmd |
3764520d440SBram Moolenaar  set winfixwidth
3774520d440SBram Moolenaar  vsplit Xc
3784520d440SBram Moolenaar  let [ww1, ww2, ww3] = [winwidth(1), winwidth(2), winwidth(3)]
37938e34836SBram Moolenaar  call assert_equal(2, winwidth(2))
3804520d440SBram Moolenaar  call assert_inrange(ww3, ww3 + 1, ww1)
3814520d440SBram Moolenaar  3wincmd >
38238e34836SBram Moolenaar  call assert_equal(2,       winwidth(2))
3834520d440SBram Moolenaar  call assert_equal(ww1 + 3, winwidth(1))
3844520d440SBram Moolenaar  call assert_equal(ww3 - 3, winwidth(3))
3854520d440SBram Moolenaar  wincmd =
38638e34836SBram Moolenaar  call assert_equal(2,   winwidth(2))
3874520d440SBram Moolenaar  call assert_equal(ww1, winwidth(1))
3884520d440SBram Moolenaar  call assert_equal(ww3, winwidth(3))
3894520d440SBram Moolenaar
3904520d440SBram Moolenaar  wincmd l
3914520d440SBram Moolenaar  set winfixwidth&
3924520d440SBram Moolenaar
3934520d440SBram Moolenaar  wincmd =
3944520d440SBram Moolenaar  let [ww1, ww2, ww3] = [winwidth(1), winwidth(2), winwidth(3)]
3954520d440SBram Moolenaar  " Current window (2) should have the same width or 1 more
3964520d440SBram Moolenaar  " than the other windows.
3974520d440SBram Moolenaar  call assert_inrange(ww1, ww1 + 1, ww2)
3984520d440SBram Moolenaar  call assert_inrange(ww3, ww3 + 1, ww2)
3994520d440SBram Moolenaar
400*59585497SYegappan Lakshmanan  " when the current window width is less than the new 'winwidth', the current
401*59585497SYegappan Lakshmanan  " window width should be increased.
402*59585497SYegappan Lakshmanan  enew | only
403*59585497SYegappan Lakshmanan  split
404*59585497SYegappan Lakshmanan  10vnew
405*59585497SYegappan Lakshmanan  set winwidth=15
406*59585497SYegappan Lakshmanan  call assert_equal(15, winwidth(0))
407*59585497SYegappan Lakshmanan
408*59585497SYegappan Lakshmanan  %bw!
4094520d440SBram Moolenaarendfunc
4104520d440SBram Moolenaar
4118eeeba8cSBram Moolenaarfunc Test_equalalways_on_close()
4128eeeba8cSBram Moolenaar  set equalalways
4138eeeba8cSBram Moolenaar  vsplit
4148eeeba8cSBram Moolenaar  windo split
4158eeeba8cSBram Moolenaar  split
4168eeeba8cSBram Moolenaar  wincmd J
4178eeeba8cSBram Moolenaar  " now we have a frame top-left with two windows, a frame top-right with two
4188eeeba8cSBram Moolenaar  " windows and a frame at the bottom, full-width.
4198eeeba8cSBram Moolenaar  let height_1 = winheight(1)
4208eeeba8cSBram Moolenaar  let height_2 = winheight(2)
4218eeeba8cSBram Moolenaar  let height_3 = winheight(3)
4228eeeba8cSBram Moolenaar  let height_4 = winheight(4)
4238eeeba8cSBram Moolenaar  " closing the bottom window causes all windows to be resized.
4248eeeba8cSBram Moolenaar  close
4258eeeba8cSBram Moolenaar  call assert_notequal(height_1, winheight(1))
4268eeeba8cSBram Moolenaar  call assert_notequal(height_2, winheight(2))
4278eeeba8cSBram Moolenaar  call assert_notequal(height_3, winheight(3))
4288eeeba8cSBram Moolenaar  call assert_notequal(height_4, winheight(4))
4298eeeba8cSBram Moolenaar  call assert_equal(winheight(1), winheight(3))
4308eeeba8cSBram Moolenaar  call assert_equal(winheight(2), winheight(4))
4318eeeba8cSBram Moolenaar
4328eeeba8cSBram Moolenaar  1wincmd w
4338eeeba8cSBram Moolenaar  split
4348eeeba8cSBram Moolenaar  4wincmd w
4358eeeba8cSBram Moolenaar  resize + 5
4368eeeba8cSBram Moolenaar  " left column has three windows, equalized heights.
4378eeeba8cSBram Moolenaar  " right column has two windows, top one a bit higher
4388eeeba8cSBram Moolenaar  let height_1 = winheight(1)
4398eeeba8cSBram Moolenaar  let height_2 = winheight(2)
4408eeeba8cSBram Moolenaar  let height_4 = winheight(4)
4418eeeba8cSBram Moolenaar  let height_5 = winheight(5)
4428eeeba8cSBram Moolenaar  3wincmd w
4438eeeba8cSBram Moolenaar  " closing window in left column equalizes heights in left column but not in
4448eeeba8cSBram Moolenaar  " the right column
4458eeeba8cSBram Moolenaar  close
4468eeeba8cSBram Moolenaar  call assert_notequal(height_1, winheight(1))
4478eeeba8cSBram Moolenaar  call assert_notequal(height_2, winheight(2))
4488eeeba8cSBram Moolenaar  call assert_equal(height_4, winheight(3))
4498eeeba8cSBram Moolenaar  call assert_equal(height_5, winheight(4))
4508eeeba8cSBram Moolenaar
4518eeeba8cSBram Moolenaar  only
4528eeeba8cSBram Moolenaar  set equalalways&
4538eeeba8cSBram Moolenaarendfunc
4548eeeba8cSBram Moolenaar
45522044dc3SBram Moolenaarfunc Test_win_screenpos()
4565a4c3082SBram Moolenaar  CheckFeature quickfix
4575a4c3082SBram Moolenaar
45822044dc3SBram Moolenaar  call assert_equal(1, winnr('$'))
45922044dc3SBram Moolenaar  split
46022044dc3SBram Moolenaar  vsplit
46122044dc3SBram Moolenaar  10wincmd _
46222044dc3SBram Moolenaar  30wincmd |
46322044dc3SBram Moolenaar  call assert_equal([1, 1], win_screenpos(1))
46422044dc3SBram Moolenaar  call assert_equal([1, 32], win_screenpos(2))
46522044dc3SBram Moolenaar  call assert_equal([12, 1], win_screenpos(3))
46622044dc3SBram Moolenaar  call assert_equal([0, 0], win_screenpos(4))
46799fa7219SBram Moolenaar  call assert_fails('let l = win_screenpos([])', 'E745:')
46822044dc3SBram Moolenaar  only
46922044dc3SBram Moolenaarendfunc
47022044dc3SBram Moolenaar
4714520d440SBram Moolenaarfunc Test_window_jump_tag()
4725a4c3082SBram Moolenaar  CheckFeature quickfix
4735a4c3082SBram Moolenaar
4744520d440SBram Moolenaar  help
4754520d440SBram Moolenaar  /iccf
4764520d440SBram Moolenaar  call assert_match('^|iccf|',  getline('.'))
4774520d440SBram Moolenaar  call assert_equal(2, winnr('$'))
4784520d440SBram Moolenaar  2wincmd }
4794520d440SBram Moolenaar  call assert_equal(3, winnr('$'))
4804520d440SBram Moolenaar  call assert_match('^|iccf|',  getline('.'))
4814520d440SBram Moolenaar  wincmd k
4824520d440SBram Moolenaar  call assert_match('\*iccf\*',  getline('.'))
4834520d440SBram Moolenaar  call assert_equal(2, winheight(0))
4844520d440SBram Moolenaar
4854520d440SBram Moolenaar  wincmd z
4864520d440SBram Moolenaar  set previewheight=4
4874520d440SBram Moolenaar  help
4884520d440SBram Moolenaar  /bugs
4894520d440SBram Moolenaar  wincmd }
4904520d440SBram Moolenaar  wincmd k
4914520d440SBram Moolenaar  call assert_match('\*bugs\*',  getline('.'))
4924520d440SBram Moolenaar  call assert_equal(4, winheight(0))
4934520d440SBram Moolenaar  set previewheight&
4944520d440SBram Moolenaar
4954520d440SBram Moolenaar  %bw!
4964520d440SBram Moolenaarendfunc
4974520d440SBram Moolenaar
4984520d440SBram Moolenaarfunc Test_window_newtab()
4994520d440SBram Moolenaar  e Xa
5004520d440SBram Moolenaar
5014520d440SBram Moolenaar  call assert_equal(1, tabpagenr('$'))
5024520d440SBram Moolenaar  call assert_equal("\nAlready only one window", execute('wincmd T'))
5034520d440SBram Moolenaar
5044520d440SBram Moolenaar  split Xb
5054520d440SBram Moolenaar  split Xc
5064520d440SBram Moolenaar
5074520d440SBram Moolenaar  wincmd T
5084520d440SBram Moolenaar  call assert_equal(2, tabpagenr('$'))
5094520d440SBram Moolenaar  call assert_equal(['Xb', 'Xa'], map(tabpagebuflist(1), 'bufname(v:val)'))
510ce90e36fSBram Moolenaar  call assert_equal(['Xc'      ], map(2->tabpagebuflist(), 'bufname(v:val)'))
5110e05de46SBram Moolenaar  call assert_equal(['Xc'      ], map(tabpagebuflist(), 'bufname(v:val)'))
5124520d440SBram Moolenaar
5134520d440SBram Moolenaar  %bw!
5144520d440SBram Moolenaarendfunc
5154520d440SBram Moolenaar
516f79225edSBram Moolenaarfunc Test_next_split_all()
517f79225edSBram Moolenaar  " This was causing an illegal memory access.
518f79225edSBram Moolenaar  n x
519f79225edSBram Moolenaar  norm axxx
520f79225edSBram Moolenaar  split
521f79225edSBram Moolenaar  split
522f79225edSBram Moolenaar  s/x
523f79225edSBram Moolenaar  s/x
524f79225edSBram Moolenaar  all
525f79225edSBram Moolenaar  bwipe!
526f79225edSBram Moolenaarendfunc
527f79225edSBram Moolenaar
52875373f38SBram Moolenaar" Tests for adjusting window and contents
52975373f38SBram Moolenaarfunc GetScreenStr(row)
53075373f38SBram Moolenaar   let str = ""
53175373f38SBram Moolenaar   for c in range(1,3)
53275373f38SBram Moolenaar       let str .= nr2char(screenchar(a:row, c))
53375373f38SBram Moolenaar   endfor
53475373f38SBram Moolenaar   return str
53575373f38SBram Moolenaarendfunc
53675373f38SBram Moolenaar
53775373f38SBram Moolenaarfunc Test_window_contents()
53875373f38SBram Moolenaar  enew! | only | new
53975373f38SBram Moolenaar  call setline(1, range(1,256))
54075373f38SBram Moolenaar
54175373f38SBram Moolenaar  exe "norm! \<C-W>t\<C-W>=1Gzt\<C-W>w\<C-W>+"
54275373f38SBram Moolenaar  redraw
54375373f38SBram Moolenaar  let s3 = GetScreenStr(1)
54475373f38SBram Moolenaar  wincmd p
54575373f38SBram Moolenaar  call assert_equal(1, line("w0"))
54675373f38SBram Moolenaar  call assert_equal('1  ', s3)
54775373f38SBram Moolenaar
54875373f38SBram Moolenaar  exe "norm! \<C-W>t\<C-W>=50Gzt\<C-W>w\<C-W>+"
54975373f38SBram Moolenaar  redraw
55075373f38SBram Moolenaar  let s3 = GetScreenStr(1)
55175373f38SBram Moolenaar  wincmd p
55275373f38SBram Moolenaar  call assert_equal(50, line("w0"))
55375373f38SBram Moolenaar  call assert_equal('50 ', s3)
55475373f38SBram Moolenaar
55575373f38SBram Moolenaar  exe "norm! \<C-W>t\<C-W>=59Gzt\<C-W>w\<C-W>+"
55675373f38SBram Moolenaar  redraw
55775373f38SBram Moolenaar  let s3 = GetScreenStr(1)
55875373f38SBram Moolenaar  wincmd p
55975373f38SBram Moolenaar  call assert_equal(59, line("w0"))
56075373f38SBram Moolenaar  call assert_equal('59 ', s3)
56175373f38SBram Moolenaar
5628b633135SBram Moolenaar  %d
5638b633135SBram Moolenaar  call setline(1, ['one', 'two', 'three'])
5648b633135SBram Moolenaar  call assert_equal(1, line('w0'))
5658b633135SBram Moolenaar  call assert_equal(3, line('w$'))
5668b633135SBram Moolenaar
56775373f38SBram Moolenaar  bwipeout!
56875373f38SBram Moolenaar  call test_garbagecollect_now()
56975373f38SBram Moolenaarendfunc
57075373f38SBram Moolenaar
5712efb323eSBram Moolenaarfunc Test_window_colon_command()
5722efb323eSBram Moolenaar  " This was reading invalid memory.
5732efb323eSBram Moolenaar  exe "norm! v\<C-W>:\<C-U>echo v:version"
5742efb323eSBram Moolenaarendfunc
5752efb323eSBram Moolenaar
5766f361c99SBram Moolenaarfunc Test_access_freed_mem()
5771417c766SBram Moolenaar  call assert_equal(&columns, winwidth(0))
5789a046fd0SBram Moolenaar  " This was accessing freed memory (but with what events?)
5799a046fd0SBram Moolenaar  au BufEnter,BufLeave,WinEnter,WinLeave 0 vs xxx
5806f361c99SBram Moolenaar  arg 0
5816f361c99SBram Moolenaar  argadd
5829b7bf9e9SBram Moolenaar  call assert_fails("all", "E242:")
5836f361c99SBram Moolenaar  au!
5846f361c99SBram Moolenaar  bwipe xxx
5851417c766SBram Moolenaar  call assert_equal(&columns, winwidth(0))
5866f361c99SBram Moolenaarendfunc
5876f361c99SBram Moolenaar
588a27e1dcdSBram Moolenaarfunc Test_insert_cleared_on_switch_to_term()
589a27e1dcdSBram Moolenaar  CheckFeature terminal
590a27e1dcdSBram Moolenaar
591a27e1dcdSBram Moolenaar  set showmode
592a27e1dcdSBram Moolenaar  terminal
593a27e1dcdSBram Moolenaar  wincmd p
594a27e1dcdSBram Moolenaar
595a27e1dcdSBram Moolenaar  call feedkeys("i\<C-O>", 'ntx')
596a27e1dcdSBram Moolenaar  redraw
597a27e1dcdSBram Moolenaar
598a27e1dcdSBram Moolenaar  " The "-- (insert) --" indicator should be visible.
599a27e1dcdSBram Moolenaar  let chars = map(range(1, &columns), 'nr2char(screenchar(&lines, v:val))')
600a27e1dcdSBram Moolenaar  let str = trim(join(chars, ''))
601a27e1dcdSBram Moolenaar  call assert_equal('-- (insert) --', str)
602a27e1dcdSBram Moolenaar
603a27e1dcdSBram Moolenaar  call feedkeys("\<C-W>p", 'ntx')
604a27e1dcdSBram Moolenaar  redraw
605a27e1dcdSBram Moolenaar
606a27e1dcdSBram Moolenaar  " The "-- (insert) --" indicator should have been cleared.
607a27e1dcdSBram Moolenaar  let chars = map(range(1, &columns), 'nr2char(screenchar(&lines, v:val))')
608a27e1dcdSBram Moolenaar  let str = trim(join(chars, ''))
609a27e1dcdSBram Moolenaar  call assert_equal('', str)
610a27e1dcdSBram Moolenaar
611a27e1dcdSBram Moolenaar  set showmode&
612a27e1dcdSBram Moolenaar  %bw!
613a27e1dcdSBram Moolenaarendfunc
614a27e1dcdSBram Moolenaar
6155bab555cSBram Moolenaarfunc Test_visual_cleared_after_window_split()
6165bab555cSBram Moolenaar  new | only!
6175bab555cSBram Moolenaar  let smd_save = &showmode
6185bab555cSBram Moolenaar  set showmode
6195bab555cSBram Moolenaar  let ls_save = &laststatus
6205bab555cSBram Moolenaar  set laststatus=1
6215bab555cSBram Moolenaar  call setline(1, ['a', 'b', 'c', 'd', ''])
6225bab555cSBram Moolenaar  norm! G
6235bab555cSBram Moolenaar  exe "norm! kkvk"
6245bab555cSBram Moolenaar  redraw
6255bab555cSBram Moolenaar  exe "norm! \<C-W>v"
6265bab555cSBram Moolenaar  redraw
6275bab555cSBram Moolenaar  " check if '-- VISUAL --' disappeared from command line
6285bab555cSBram Moolenaar  let columns = range(1, &columns)
6295bab555cSBram Moolenaar  let cmdlinechars = map(columns, 'nr2char(screenchar(&lines, v:val))')
6305bab555cSBram Moolenaar  let cmdline = join(cmdlinechars, '')
6315bab555cSBram Moolenaar  let cmdline_ltrim = substitute(cmdline, '^\s*', "", "")
6325bab555cSBram Moolenaar  let mode_shown = substitute(cmdline_ltrim, '\s*$', "", "")
6335bab555cSBram Moolenaar  call assert_equal('', mode_shown)
6345bab555cSBram Moolenaar  let &showmode = smd_save
6355bab555cSBram Moolenaar  let &laststatus = ls_save
6365bab555cSBram Moolenaar  bwipe!
63772cf47a2SBram Moolenaarendfunc
63872cf47a2SBram Moolenaar
63972cf47a2SBram Moolenaarfunc Test_winrestcmd()
64072cf47a2SBram Moolenaar  2split
64172cf47a2SBram Moolenaar  3vsplit
642a0c8aea4SBram Moolenaar  let restcmd = winrestcmd()
64372cf47a2SBram Moolenaar  call assert_equal(2, winheight(0))
64472cf47a2SBram Moolenaar  call assert_equal(3, winwidth(0))
64572cf47a2SBram Moolenaar  wincmd =
64672cf47a2SBram Moolenaar  call assert_notequal(2, winheight(0))
64772cf47a2SBram Moolenaar  call assert_notequal(3, winwidth(0))
648a0c8aea4SBram Moolenaar  exe restcmd
64972cf47a2SBram Moolenaar  call assert_equal(2, winheight(0))
65072cf47a2SBram Moolenaar  call assert_equal(3, winwidth(0))
65172cf47a2SBram Moolenaar  only
652a0c8aea4SBram Moolenaar
653a0c8aea4SBram Moolenaar  wincmd v
654a0c8aea4SBram Moolenaar  wincmd s
655a0c8aea4SBram Moolenaar  wincmd v
656a0c8aea4SBram Moolenaar  redraw
657a0c8aea4SBram Moolenaar  let restcmd = winrestcmd()
658a0c8aea4SBram Moolenaar  wincmd _
659a0c8aea4SBram Moolenaar  wincmd |
660a0c8aea4SBram Moolenaar  exe restcmd
661a0c8aea4SBram Moolenaar  redraw
662a0c8aea4SBram Moolenaar  call assert_equal(restcmd, winrestcmd())
663a0c8aea4SBram Moolenaar
664a0c8aea4SBram Moolenaar  only
6655bab555cSBram Moolenaarendfunc
6665bab555cSBram Moolenaar
6671e115360SBram Moolenaarfunc Fun_RenewFile()
668026587b3SBram Moolenaar  " Need to wait a bit for the timestamp to be older.
669ce90e36fSBram Moolenaar  let old_ftime = getftime("tmp.txt")
670ce90e36fSBram Moolenaar  while getftime("tmp.txt") == old_ftime
671ce90e36fSBram Moolenaar    sleep 100m
672a42df593SBram Moolenaar    silent execute '!echo "1" > tmp.txt'
673ce90e36fSBram Moolenaar  endwhile
674a42df593SBram Moolenaar  sp
675a42df593SBram Moolenaar  wincmd p
676a42df593SBram Moolenaar  edit! tmp.txt
6771e115360SBram Moolenaarendfunc
678a42df593SBram Moolenaar
679a42df593SBram Moolenaarfunc Test_window_prevwin()
680a42df593SBram Moolenaar  " Can we make this work on MS-Windows?
6816d91bcb4SBram Moolenaar  CheckUnix
682a42df593SBram Moolenaar
683a42df593SBram Moolenaar  set hidden autoread
684a42df593SBram Moolenaar  call writefile(['2'], 'tmp.txt')
685a42df593SBram Moolenaar  new tmp.txt
686a42df593SBram Moolenaar  q
687a42df593SBram Moolenaar  call Fun_RenewFile()
688a42df593SBram Moolenaar  call assert_equal(2, winnr())
689a42df593SBram Moolenaar  wincmd p
690a42df593SBram Moolenaar  call assert_equal(1, winnr())
691a42df593SBram Moolenaar  wincmd p
692a42df593SBram Moolenaar  q
693a42df593SBram Moolenaar  call Fun_RenewFile()
694a42df593SBram Moolenaar  call assert_equal(2, winnr())
695a42df593SBram Moolenaar  wincmd p
696a42df593SBram Moolenaar  call assert_equal(1, winnr())
697a42df593SBram Moolenaar  wincmd p
698a42df593SBram Moolenaar  " reset
699a42df593SBram Moolenaar  q
700a42df593SBram Moolenaar  call delete('tmp.txt')
701a42df593SBram Moolenaar  set hidden&vim autoread&vim
702a42df593SBram Moolenaar  delfunc Fun_RenewFile
703a42df593SBram Moolenaarendfunc
704a42df593SBram Moolenaar
7058fcb60f9SBram Moolenaarfunc Test_relative_cursor_position_in_one_line_window()
7068fcb60f9SBram Moolenaar  new
7078fcb60f9SBram Moolenaar  only
7088fcb60f9SBram Moolenaar  call setline(1, range(1, 10000))
7098fcb60f9SBram Moolenaar  normal 50%
7108fcb60f9SBram Moolenaar  let lnum = getcurpos()[1]
7118fcb60f9SBram Moolenaar  split
7128fcb60f9SBram Moolenaar  split
7138fcb60f9SBram Moolenaar  " make third window take as many lines as possible, other windows will
7148fcb60f9SBram Moolenaar  " become one line
7158fcb60f9SBram Moolenaar  3wincmd w
7168fcb60f9SBram Moolenaar  for i in range(1, &lines - 6)
7178fcb60f9SBram Moolenaar    wincmd +
7188fcb60f9SBram Moolenaar    redraw!
7198fcb60f9SBram Moolenaar  endfor
7208fcb60f9SBram Moolenaar
7218fcb60f9SBram Moolenaar  " first and second window should show cursor line
7228fcb60f9SBram Moolenaar  let wininfo = getwininfo()
7238fcb60f9SBram Moolenaar  call assert_equal(lnum, wininfo[0].topline)
7248fcb60f9SBram Moolenaar  call assert_equal(lnum, wininfo[1].topline)
7258fcb60f9SBram Moolenaar
7268fcb60f9SBram Moolenaar  only!
7278fcb60f9SBram Moolenaar  bwipe!
72899fa7219SBram Moolenaar  call assert_fails('call winrestview(test_null_dict())', 'E474:')
7298fcb60f9SBram Moolenaarendfunc
7308fcb60f9SBram Moolenaar
7318fcb60f9SBram Moolenaarfunc Test_relative_cursor_position_after_move_and_resize()
7328fcb60f9SBram Moolenaar  let so_save = &so
7338fcb60f9SBram Moolenaar  set so=0
7348fcb60f9SBram Moolenaar  enew
7358fcb60f9SBram Moolenaar  call setline(1, range(1, 10000))
7368fcb60f9SBram Moolenaar  normal 50%
7378fcb60f9SBram Moolenaar  split
7388fcb60f9SBram Moolenaar  1wincmd w
7398fcb60f9SBram Moolenaar  " Move cursor to first line in window
7408fcb60f9SBram Moolenaar  normal H
7418fcb60f9SBram Moolenaar  redraw!
7428fcb60f9SBram Moolenaar  " Reduce window height to two lines
7438fcb60f9SBram Moolenaar  let height = winheight(0)
7448fcb60f9SBram Moolenaar  while winheight(0) > 2
7458fcb60f9SBram Moolenaar    wincmd -
7468fcb60f9SBram Moolenaar    redraw!
7478fcb60f9SBram Moolenaar  endwhile
7488fcb60f9SBram Moolenaar  " move cursor to second/last line in window
7498fcb60f9SBram Moolenaar  normal j
7508fcb60f9SBram Moolenaar  " restore previous height
7518fcb60f9SBram Moolenaar  while winheight(0) < height
7528fcb60f9SBram Moolenaar    wincmd +
7538fcb60f9SBram Moolenaar    redraw!
7548fcb60f9SBram Moolenaar  endwhile
7558fcb60f9SBram Moolenaar  " make window two lines again
7568fcb60f9SBram Moolenaar  while winheight(0) > 2
7578fcb60f9SBram Moolenaar    wincmd -
7588fcb60f9SBram Moolenaar    redraw!
7598fcb60f9SBram Moolenaar  endwhile
7608fcb60f9SBram Moolenaar
7618fcb60f9SBram Moolenaar  " cursor should be at bottom line
7628fcb60f9SBram Moolenaar  let info = getwininfo(win_getid())[0]
7638fcb60f9SBram Moolenaar  call assert_equal(info.topline + 1, getcurpos()[1])
7648fcb60f9SBram Moolenaar
7658fcb60f9SBram Moolenaar  only!
7668fcb60f9SBram Moolenaar  bwipe!
7678fcb60f9SBram Moolenaar  let &so = so_save
7688fcb60f9SBram Moolenaarendfunc
7698fcb60f9SBram Moolenaar
7708fcb60f9SBram Moolenaarfunc Test_relative_cursor_position_after_resize()
7718fcb60f9SBram Moolenaar  let so_save = &so
7728fcb60f9SBram Moolenaar  set so=0
7738fcb60f9SBram Moolenaar  enew
7748fcb60f9SBram Moolenaar  call setline(1, range(1, 10000))
7758fcb60f9SBram Moolenaar  normal 50%
7768fcb60f9SBram Moolenaar  split
7778fcb60f9SBram Moolenaar  1wincmd w
7788fcb60f9SBram Moolenaar  let winid1 = win_getid()
7798fcb60f9SBram Moolenaar  let info = getwininfo(winid1)[0]
7808fcb60f9SBram Moolenaar  " Move cursor to second line in window
7818fcb60f9SBram Moolenaar  exe "normal " . (info.topline + 1) . "G"
7828fcb60f9SBram Moolenaar  redraw!
7838fcb60f9SBram Moolenaar  let lnum = getcurpos()[1]
7848fcb60f9SBram Moolenaar
7858fcb60f9SBram Moolenaar  " Make the window only two lines high, cursor should end up in top line
7868fcb60f9SBram Moolenaar  2wincmd w
7878fcb60f9SBram Moolenaar  exe (info.height - 2) . "wincmd +"
7888fcb60f9SBram Moolenaar  redraw!
7898fcb60f9SBram Moolenaar  let info = getwininfo(winid1)[0]
7908fcb60f9SBram Moolenaar  call assert_equal(lnum, info.topline)
7918fcb60f9SBram Moolenaar
7928fcb60f9SBram Moolenaar  only!
7938fcb60f9SBram Moolenaar  bwipe!
7948fcb60f9SBram Moolenaar  let &so = so_save
7958fcb60f9SBram Moolenaarendfunc
7968fcb60f9SBram Moolenaar
7978fcb60f9SBram Moolenaarfunc Test_relative_cursor_second_line_after_resize()
7988fcb60f9SBram Moolenaar  let so_save = &so
7998fcb60f9SBram Moolenaar  set so=0
8008fcb60f9SBram Moolenaar  enew
8018fcb60f9SBram Moolenaar  call setline(1, range(1, 10000))
8028fcb60f9SBram Moolenaar  normal 50%
8038fcb60f9SBram Moolenaar  split
8048fcb60f9SBram Moolenaar  1wincmd w
8058fcb60f9SBram Moolenaar  let winid1 = win_getid()
8068fcb60f9SBram Moolenaar  let info = getwininfo(winid1)[0]
8078fcb60f9SBram Moolenaar
8088fcb60f9SBram Moolenaar  " Make the window only two lines high
8098fcb60f9SBram Moolenaar  2wincmd _
8108fcb60f9SBram Moolenaar
8118fcb60f9SBram Moolenaar  " Move cursor to second line in window
8128fcb60f9SBram Moolenaar  normal H
8138fcb60f9SBram Moolenaar  normal j
8148fcb60f9SBram Moolenaar
8158fcb60f9SBram Moolenaar  " Make window size bigger, then back to 2 lines
8168fcb60f9SBram Moolenaar  for i in range(1, 10)
8178fcb60f9SBram Moolenaar    wincmd +
8188fcb60f9SBram Moolenaar    redraw!
8198fcb60f9SBram Moolenaar  endfor
8208fcb60f9SBram Moolenaar  for i in range(1, 10)
8218fcb60f9SBram Moolenaar    wincmd -
8228fcb60f9SBram Moolenaar    redraw!
8238fcb60f9SBram Moolenaar  endfor
8248fcb60f9SBram Moolenaar
8258fcb60f9SBram Moolenaar  " cursor should end up in bottom line
8268fcb60f9SBram Moolenaar  let info = getwininfo(winid1)[0]
8278fcb60f9SBram Moolenaar  call assert_equal(info.topline + 1, getcurpos()[1])
8288fcb60f9SBram Moolenaar
8298fcb60f9SBram Moolenaar  only!
8308fcb60f9SBram Moolenaar  bwipe!
8318fcb60f9SBram Moolenaar  let &so = so_save
8328fcb60f9SBram Moolenaarendfunc
8338fcb60f9SBram Moolenaar
834a9b2535fSBram Moolenaarfunc Test_split_noscroll()
835a9b2535fSBram Moolenaar  let so_save = &so
836bd2d68c2SBram Moolenaar  enew
837a9b2535fSBram Moolenaar  call setline(1, range(1, 8))
838a9b2535fSBram Moolenaar  normal 100%
839a9b2535fSBram Moolenaar  split
840a9b2535fSBram Moolenaar
841a9b2535fSBram Moolenaar  1wincmd w
842a9b2535fSBram Moolenaar  let winid1 = win_getid()
843a9b2535fSBram Moolenaar  let info1 = getwininfo(winid1)[0]
844a9b2535fSBram Moolenaar
845a9b2535fSBram Moolenaar  2wincmd w
846a9b2535fSBram Moolenaar  let winid2 = win_getid()
847a9b2535fSBram Moolenaar  let info2 = getwininfo(winid2)[0]
848a9b2535fSBram Moolenaar
849a9b2535fSBram Moolenaar  call assert_equal(1, info1.topline)
850a9b2535fSBram Moolenaar  call assert_equal(1, info2.topline)
851a9b2535fSBram Moolenaar
852bd2d68c2SBram Moolenaar  " window that fits all lines by itself, but not when split: closing other
853bd2d68c2SBram Moolenaar  " window should restore fraction.
854a9b2535fSBram Moolenaar  only!
855bd2d68c2SBram Moolenaar  call setline(1, range(1, &lines - 10))
856bd2d68c2SBram Moolenaar  exe &lines / 4
857bd2d68c2SBram Moolenaar  let winid1 = win_getid()
858bd2d68c2SBram Moolenaar  let info1 = getwininfo(winid1)[0]
859bd2d68c2SBram Moolenaar  call assert_equal(1, info1.topline)
860bd2d68c2SBram Moolenaar  new
861bd2d68c2SBram Moolenaar  redraw
862bd2d68c2SBram Moolenaar  close
863bd2d68c2SBram Moolenaar  let info1 = getwininfo(winid1)[0]
864bd2d68c2SBram Moolenaar  call assert_equal(1, info1.topline)
865bd2d68c2SBram Moolenaar
866a9b2535fSBram Moolenaar  bwipe!
867a9b2535fSBram Moolenaar  let &so = so_save
868a9b2535fSBram Moolenaarendfunc
869a9b2535fSBram Moolenaar
87046ad288bSBram Moolenaar" Tests for the winnr() function
87146ad288bSBram Moolenaarfunc Test_winnr()
87246ad288bSBram Moolenaar  only | tabonly
87346ad288bSBram Moolenaar  call assert_equal(1, winnr('j'))
87446ad288bSBram Moolenaar  call assert_equal(1, winnr('k'))
87546ad288bSBram Moolenaar  call assert_equal(1, winnr('h'))
87646ad288bSBram Moolenaar  call assert_equal(1, winnr('l'))
87746ad288bSBram Moolenaar
87846ad288bSBram Moolenaar  " create a set of horizontally and vertically split windows
87946ad288bSBram Moolenaar  leftabove new | wincmd p
88046ad288bSBram Moolenaar  leftabove new | wincmd p
88146ad288bSBram Moolenaar  rightbelow new | wincmd p
88246ad288bSBram Moolenaar  rightbelow new | wincmd p
88346ad288bSBram Moolenaar  leftabove vnew | wincmd p
88446ad288bSBram Moolenaar  leftabove vnew | wincmd p
88546ad288bSBram Moolenaar  rightbelow vnew | wincmd p
88646ad288bSBram Moolenaar  rightbelow vnew | wincmd p
88746ad288bSBram Moolenaar
88846ad288bSBram Moolenaar  call assert_equal(8, winnr('j'))
88946ad288bSBram Moolenaar  call assert_equal(2, winnr('k'))
89046ad288bSBram Moolenaar  call assert_equal(4, winnr('h'))
89146ad288bSBram Moolenaar  call assert_equal(6, winnr('l'))
89246ad288bSBram Moolenaar  call assert_equal(9, winnr('2j'))
89346ad288bSBram Moolenaar  call assert_equal(1, winnr('2k'))
89446ad288bSBram Moolenaar  call assert_equal(3, winnr('2h'))
89546ad288bSBram Moolenaar  call assert_equal(7, winnr('2l'))
89646ad288bSBram Moolenaar
89746ad288bSBram Moolenaar  " Error cases
89846ad288bSBram Moolenaar  call assert_fails("echo winnr('0.2k')", 'E15:')
89946ad288bSBram Moolenaar  call assert_equal(2, winnr('-2k'))
90046ad288bSBram Moolenaar  call assert_fails("echo winnr('-2xj')", 'E15:')
90146ad288bSBram Moolenaar  call assert_fails("echo winnr('j2j')", 'E15:')
90246ad288bSBram Moolenaar  call assert_fails("echo winnr('ll')", 'E15:')
90346ad288bSBram Moolenaar  call assert_fails("echo winnr('5')", 'E15:')
90446ad288bSBram Moolenaar  call assert_equal(4, winnr('0h'))
90599fa7219SBram Moolenaar  call assert_fails("let w = winnr([])", 'E730:')
90699fa7219SBram Moolenaar  call assert_equal('unknown', win_gettype(-1))
90799fa7219SBram Moolenaar  call assert_equal(-1, winheight(-1))
90899fa7219SBram Moolenaar  call assert_equal(-1, winwidth(-1))
90946ad288bSBram Moolenaar
91046ad288bSBram Moolenaar  tabnew
91146ad288bSBram Moolenaar  call assert_equal(8, tabpagewinnr(1, 'j'))
912ce90e36fSBram Moolenaar  call assert_equal(2, 1->tabpagewinnr('k'))
91346ad288bSBram Moolenaar  call assert_equal(4, tabpagewinnr(1, 'h'))
91446ad288bSBram Moolenaar  call assert_equal(6, tabpagewinnr(1, 'l'))
91546ad288bSBram Moolenaar
91646ad288bSBram Moolenaar  only | tabonly
91746ad288bSBram Moolenaarendfunc
91846ad288bSBram Moolenaar
919f92e58caSBram Moolenaarfunc Test_winrestview()
920f92e58caSBram Moolenaar  split runtest.vim
921f92e58caSBram Moolenaar  normal 50%
922f92e58caSBram Moolenaar  let view = winsaveview()
923f92e58caSBram Moolenaar  close
924f92e58caSBram Moolenaar  split runtest.vim
925f92e58caSBram Moolenaar  eval view->winrestview()
926f92e58caSBram Moolenaar  call assert_equal(view, winsaveview())
927f92e58caSBram Moolenaar
928f92e58caSBram Moolenaar  bwipe!
92999fa7219SBram Moolenaar  call assert_fails('call winrestview(test_null_dict())', 'E474:')
930f92e58caSBram Moolenaarendfunc
931f92e58caSBram Moolenaar
932d20dcb3dSBram Moolenaarfunc Test_win_splitmove()
9335a4c3082SBram Moolenaar  CheckFeature quickfix
9345a4c3082SBram Moolenaar
935d20dcb3dSBram Moolenaar  edit a
936d20dcb3dSBram Moolenaar  leftabove split b
937d20dcb3dSBram Moolenaar  leftabove vsplit c
938d20dcb3dSBram Moolenaar  leftabove split d
939d20dcb3dSBram Moolenaar  call assert_equal(0, win_splitmove(winnr(), winnr('l')))
940d20dcb3dSBram Moolenaar  call assert_equal(bufname(winbufnr(1)), 'c')
941d20dcb3dSBram Moolenaar  call assert_equal(bufname(winbufnr(2)), 'd')
942d20dcb3dSBram Moolenaar  call assert_equal(bufname(winbufnr(3)), 'b')
943d20dcb3dSBram Moolenaar  call assert_equal(bufname(winbufnr(4)), 'a')
944d20dcb3dSBram Moolenaar  call assert_equal(0, win_splitmove(winnr(), winnr('j'), {'vertical': 1}))
945d20dcb3dSBram Moolenaar  call assert_equal(0, win_splitmove(winnr(), winnr('j'), {'vertical': 1}))
946d20dcb3dSBram Moolenaar  call assert_equal(bufname(winbufnr(1)), 'c')
947d20dcb3dSBram Moolenaar  call assert_equal(bufname(winbufnr(2)), 'b')
948d20dcb3dSBram Moolenaar  call assert_equal(bufname(winbufnr(3)), 'd')
949d20dcb3dSBram Moolenaar  call assert_equal(bufname(winbufnr(4)), 'a')
950d20dcb3dSBram Moolenaar  call assert_equal(0, win_splitmove(winnr(), winnr('k'), {'vertical': 1}))
951d20dcb3dSBram Moolenaar  call assert_equal(bufname(winbufnr(1)), 'd')
952d20dcb3dSBram Moolenaar  call assert_equal(bufname(winbufnr(2)), 'c')
953d20dcb3dSBram Moolenaar  call assert_equal(bufname(winbufnr(3)), 'b')
954d20dcb3dSBram Moolenaar  call assert_equal(bufname(winbufnr(4)), 'a')
955d20dcb3dSBram Moolenaar  call assert_equal(0, win_splitmove(winnr(), winnr('j'), {'rightbelow': v:true}))
956d20dcb3dSBram Moolenaar  call assert_equal(bufname(winbufnr(1)), 'c')
957d20dcb3dSBram Moolenaar  call assert_equal(bufname(winbufnr(2)), 'b')
958d20dcb3dSBram Moolenaar  call assert_equal(bufname(winbufnr(3)), 'a')
959d20dcb3dSBram Moolenaar  call assert_equal(bufname(winbufnr(4)), 'd')
96099fa7219SBram Moolenaar  call assert_fails('call win_splitmove(winnr(), winnr("k"), test_null_dict())', 'E474:')
961d20dcb3dSBram Moolenaar  only | bd
962d20dcb3dSBram Moolenaar
963d20dcb3dSBram Moolenaar  call assert_fails('call win_splitmove(winnr(), 123)', 'E957:')
964d20dcb3dSBram Moolenaar  call assert_fails('call win_splitmove(123, winnr())', 'E957:')
965d20dcb3dSBram Moolenaar  call assert_fails('call win_splitmove(winnr(), winnr())', 'E957:')
9667b94e771SBram Moolenaar
9677b94e771SBram Moolenaar  tabnew
9687b94e771SBram Moolenaar  call assert_fails('call win_splitmove(1, win_getid(1, 1))', 'E957:')
9697b94e771SBram Moolenaar  tabclose
970d20dcb3dSBram Moolenaarendfunc
971d20dcb3dSBram Moolenaar
972e20b9eceSBram Moolenaar" Test for the :only command
973e20b9eceSBram Moolenaarfunc Test_window_only()
974e20b9eceSBram Moolenaar  new
975e20b9eceSBram Moolenaar  set modified
976e20b9eceSBram Moolenaar  new
977e20b9eceSBram Moolenaar  call assert_fails('only', 'E445:')
978e20b9eceSBram Moolenaar  only!
979bc2b71d4SBram Moolenaar  " Test for :only with a count
980bc2b71d4SBram Moolenaar  let wid = win_getid()
981bc2b71d4SBram Moolenaar  new
982bc2b71d4SBram Moolenaar  new
983bc2b71d4SBram Moolenaar  3only
984bc2b71d4SBram Moolenaar  call assert_equal(1, winnr('$'))
985bc2b71d4SBram Moolenaar  call assert_equal(wid, win_getid())
986bc2b71d4SBram Moolenaar  call assert_fails('close', 'E444:')
987bc2b71d4SBram Moolenaar  call assert_fails('%close', 'E16:')
988e20b9eceSBram Moolenaarendfunc
989e20b9eceSBram Moolenaar
9909f6277bdSBram Moolenaar" Test for errors with :wincmd
9919f6277bdSBram Moolenaarfunc Test_wincmd_errors()
9929f6277bdSBram Moolenaar  call assert_fails('wincmd g', 'E474:')
9939f6277bdSBram Moolenaar  call assert_fails('wincmd ab', 'E474:')
9949f6277bdSBram Moolenaarendfunc
9959f6277bdSBram Moolenaar
9969f6277bdSBram Moolenaar" Test for errors with :winpos
9979f6277bdSBram Moolenaarfunc Test_winpos_errors()
9989f6277bdSBram Moolenaar  if !has("gui_running") && !has('win32')
9999f6277bdSBram Moolenaar    call assert_fails('winpos', 'E188:')
10009f6277bdSBram Moolenaar  endif
10019f6277bdSBram Moolenaar  call assert_fails('winpos 10', 'E466:')
10029f6277bdSBram Moolenaarendfunc
10039f6277bdSBram Moolenaar
1004406cd90fSBram Moolenaar" Test for +cmd in a :split command
1005406cd90fSBram Moolenaarfunc Test_split_cmd()
1006406cd90fSBram Moolenaar  split +set\ readonly
1007406cd90fSBram Moolenaar  call assert_equal(1, &readonly)
1008406cd90fSBram Moolenaar  call assert_equal(2, winnr('$'))
1009406cd90fSBram Moolenaar  close
1010406cd90fSBram Moolenaarendfunc
1011406cd90fSBram Moolenaar
10125080b0a0SBram Moolenaar" Create maximum number of horizontally or vertically split windows and then
10135080b0a0SBram Moolenaar" run commands that create a new horizontally/vertically split window
10145080b0a0SBram Moolenaarfunc Run_noroom_for_newwindow_test(dir_arg)
10155080b0a0SBram Moolenaar  let dir = (a:dir_arg == 'v') ? 'vert ' : ''
10165080b0a0SBram Moolenaar
10175080b0a0SBram Moolenaar  " Open as many windows as possible
1018ab505b1aSBram Moolenaar  while v:true
10195080b0a0SBram Moolenaar    try
10205080b0a0SBram Moolenaar      exe dir . 'new'
10215080b0a0SBram Moolenaar    catch /E36:/
10225080b0a0SBram Moolenaar      break
10235080b0a0SBram Moolenaar    endtry
1024ab505b1aSBram Moolenaar  endwhile
10255080b0a0SBram Moolenaar
10265080b0a0SBram Moolenaar  call writefile(['first', 'second', 'third'], 'Xfile1')
10275080b0a0SBram Moolenaar  call writefile([], 'Xfile2')
10285080b0a0SBram Moolenaar  call writefile([], 'Xfile3')
10295080b0a0SBram Moolenaar
10305080b0a0SBram Moolenaar  " Argument list related commands
10315080b0a0SBram Moolenaar  args Xfile1 Xfile2 Xfile3
10325080b0a0SBram Moolenaar  next
10335080b0a0SBram Moolenaar  for cmd in ['sargument 2', 'snext', 'sprevious', 'sNext', 'srewind',
10345080b0a0SBram Moolenaar			\ 'sfirst', 'slast']
10355080b0a0SBram Moolenaar    call assert_fails(dir .. cmd, 'E36:')
10365080b0a0SBram Moolenaar  endfor
10375080b0a0SBram Moolenaar  %argdelete
10385080b0a0SBram Moolenaar
10395080b0a0SBram Moolenaar  " Buffer related commands
10405080b0a0SBram Moolenaar  set modified
10415080b0a0SBram Moolenaar  hide enew
10425080b0a0SBram Moolenaar  for cmd in ['sbuffer Xfile1', 'sbnext', 'sbprevious', 'sbNext', 'sbrewind',
10435080b0a0SBram Moolenaar		\ 'sbfirst', 'sblast', 'sball', 'sbmodified', 'sunhide']
10445080b0a0SBram Moolenaar    call assert_fails(dir .. cmd, 'E36:')
10455080b0a0SBram Moolenaar  endfor
10465080b0a0SBram Moolenaar
10475080b0a0SBram Moolenaar  " Window related commands
10485080b0a0SBram Moolenaar  for cmd in ['split', 'split Xfile2', 'new', 'new Xfile3', 'sview Xfile1',
10495080b0a0SBram Moolenaar		\ 'sfind runtest.vim']
10505080b0a0SBram Moolenaar    call assert_fails(dir .. cmd, 'E36:')
10515080b0a0SBram Moolenaar  endfor
10525080b0a0SBram Moolenaar
10535080b0a0SBram Moolenaar  " Help
10545080b0a0SBram Moolenaar  call assert_fails(dir .. 'help', 'E36:')
10555080b0a0SBram Moolenaar  call assert_fails(dir .. 'helpgrep window', 'E36:')
10565080b0a0SBram Moolenaar
10575080b0a0SBram Moolenaar  " Command-line window
10585080b0a0SBram Moolenaar  if a:dir_arg == 'h'
10595080b0a0SBram Moolenaar    " Cmd-line window is always a horizontally split window
10605080b0a0SBram Moolenaar    call assert_beeps('call feedkeys("q:\<CR>", "xt")')
10615080b0a0SBram Moolenaar  endif
10625080b0a0SBram Moolenaar
10635080b0a0SBram Moolenaar  " Quickfix and location list window
10645080b0a0SBram Moolenaar  if has('quickfix')
10655080b0a0SBram Moolenaar    cexpr ''
10665080b0a0SBram Moolenaar    call assert_fails(dir .. 'copen', 'E36:')
10675080b0a0SBram Moolenaar    lexpr ''
10685080b0a0SBram Moolenaar    call assert_fails(dir .. 'lopen', 'E36:')
10695080b0a0SBram Moolenaar
10705080b0a0SBram Moolenaar    " Preview window
10715080b0a0SBram Moolenaar    call assert_fails(dir .. 'pedit Xfile2', 'E36:')
10725080b0a0SBram Moolenaar    call setline(1, 'abc')
10735080b0a0SBram Moolenaar    call assert_fails(dir .. 'psearch abc', 'E36:')
10745080b0a0SBram Moolenaar  endif
10755080b0a0SBram Moolenaar
10765080b0a0SBram Moolenaar  " Window commands (CTRL-W ^ and CTRL-W f)
10775080b0a0SBram Moolenaar  if a:dir_arg == 'h'
10785080b0a0SBram Moolenaar    call assert_fails('call feedkeys("\<C-W>^", "xt")', 'E36:')
10795080b0a0SBram Moolenaar    call setline(1, 'Xfile1')
10805080b0a0SBram Moolenaar    call assert_fails('call feedkeys("gg\<C-W>f", "xt")', 'E36:')
10815080b0a0SBram Moolenaar  endif
10825080b0a0SBram Moolenaar  enew!
10835080b0a0SBram Moolenaar
10845080b0a0SBram Moolenaar  " Tag commands (:stag, :stselect and :stjump)
10855080b0a0SBram Moolenaar  call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
10865080b0a0SBram Moolenaar        \ "second\tXfile1\t2",
10875080b0a0SBram Moolenaar        \ "third\tXfile1\t3",],
10885080b0a0SBram Moolenaar        \ 'Xtags')
10895080b0a0SBram Moolenaar  set tags=Xtags
10905080b0a0SBram Moolenaar  call assert_fails(dir .. 'stag second', 'E36:')
10915080b0a0SBram Moolenaar  call assert_fails('call feedkeys(":" .. dir .. "stselect second\n1\n", "xt")', 'E36:')
10925080b0a0SBram Moolenaar  call assert_fails(dir .. 'stjump second', 'E36:')
10935080b0a0SBram Moolenaar  call assert_fails(dir .. 'ptag second', 'E36:')
10945080b0a0SBram Moolenaar  set tags&
10955080b0a0SBram Moolenaar  call delete('Xtags')
10965080b0a0SBram Moolenaar
10975080b0a0SBram Moolenaar  " :isplit and :dsplit
10985080b0a0SBram Moolenaar  call setline(1, ['#define FOO 1', 'FOO'])
10995080b0a0SBram Moolenaar  normal 2G
11005080b0a0SBram Moolenaar  call assert_fails(dir .. 'isplit FOO', 'E36:')
11015080b0a0SBram Moolenaar  call assert_fails(dir .. 'dsplit FOO', 'E36:')
11025080b0a0SBram Moolenaar
11035080b0a0SBram Moolenaar  " terminal
11045080b0a0SBram Moolenaar  if has('terminal')
11055080b0a0SBram Moolenaar    call assert_fails(dir .. 'terminal', 'E36:')
11065080b0a0SBram Moolenaar  endif
11075080b0a0SBram Moolenaar
11085080b0a0SBram Moolenaar  %bwipe!
11095080b0a0SBram Moolenaar  call delete('Xfile1')
11105080b0a0SBram Moolenaar  call delete('Xfile2')
11115080b0a0SBram Moolenaar  call delete('Xfile3')
11125080b0a0SBram Moolenaar  only
11135080b0a0SBram Moolenaarendfunc
11145080b0a0SBram Moolenaar
11155080b0a0SBram Moolenaarfunc Test_split_cmds_with_no_room()
11165080b0a0SBram Moolenaar  call Run_noroom_for_newwindow_test('h')
11175080b0a0SBram Moolenaar  call Run_noroom_for_newwindow_test('v')
11185080b0a0SBram Moolenaarendfunc
11195080b0a0SBram Moolenaar
1120ad48e6c1SBram Moolenaar" Test for various wincmd failures
1121ad48e6c1SBram Moolenaarfunc Test_wincmd_fails()
1122ad48e6c1SBram Moolenaar  only!
1123ad48e6c1SBram Moolenaar  call assert_beeps("normal \<C-W>w")
1124ad48e6c1SBram Moolenaar  call assert_beeps("normal \<C-W>p")
1125ad48e6c1SBram Moolenaar  call assert_beeps("normal \<C-W>gk")
1126ad48e6c1SBram Moolenaar  call assert_beeps("normal \<C-W>r")
1127ad48e6c1SBram Moolenaar  call assert_beeps("normal \<C-W>K")
1128ad48e6c1SBram Moolenaar  call assert_beeps("normal \<C-W>H")
1129ad48e6c1SBram Moolenaar  call assert_beeps("normal \<C-W>2gt")
1130ad48e6c1SBram Moolenaarendfunc
1131ad48e6c1SBram Moolenaar
1132fe6dce87SBram Moolenaarfunc Test_window_resize()
1133fe6dce87SBram Moolenaar  " Vertical :resize (absolute, relative, min and max size).
1134fe6dce87SBram Moolenaar  vsplit
1135fe6dce87SBram Moolenaar  vert resize 8
1136fe6dce87SBram Moolenaar  call assert_equal(8, winwidth(0))
1137fe6dce87SBram Moolenaar  vert resize +2
1138fe6dce87SBram Moolenaar  call assert_equal(10, winwidth(0))
1139fe6dce87SBram Moolenaar  vert resize -2
1140fe6dce87SBram Moolenaar  call assert_equal(8, winwidth(0))
1141fe6dce87SBram Moolenaar  vert resize
1142fe6dce87SBram Moolenaar  call assert_equal(&columns - 2, winwidth(0))
1143fe6dce87SBram Moolenaar  vert resize 0
1144fe6dce87SBram Moolenaar  call assert_equal(1, winwidth(0))
1145fe6dce87SBram Moolenaar  vert resize 99999
1146fe6dce87SBram Moolenaar  call assert_equal(&columns - 2, winwidth(0))
1147fe6dce87SBram Moolenaar
1148fe6dce87SBram Moolenaar  %bwipe!
1149fe6dce87SBram Moolenaar
1150fe6dce87SBram Moolenaar  " Horizontal :resize (with absolute, relative size, min and max size).
1151fe6dce87SBram Moolenaar  split
1152fe6dce87SBram Moolenaar  resize 8
1153fe6dce87SBram Moolenaar  call assert_equal(8, winheight(0))
1154fe6dce87SBram Moolenaar  resize +2
1155fe6dce87SBram Moolenaar  call assert_equal(10, winheight(0))
1156fe6dce87SBram Moolenaar  resize -2
1157fe6dce87SBram Moolenaar  call assert_equal(8, winheight(0))
1158fe6dce87SBram Moolenaar  resize
1159fe6dce87SBram Moolenaar  call assert_equal(&lines - 4, winheight(0))
1160fe6dce87SBram Moolenaar  resize 0
1161fe6dce87SBram Moolenaar  call assert_equal(1, winheight(0))
1162fe6dce87SBram Moolenaar  resize 99999
1163fe6dce87SBram Moolenaar  call assert_equal(&lines - 4, winheight(0))
1164fe6dce87SBram Moolenaar
1165fe6dce87SBram Moolenaar  " :resize with explicit window number.
1166fe6dce87SBram Moolenaar  let other_winnr = winnr('j')
1167fe6dce87SBram Moolenaar  exe other_winnr .. 'resize 10'
1168fe6dce87SBram Moolenaar  call assert_equal(10, winheight(other_winnr))
1169fe6dce87SBram Moolenaar  call assert_equal(&lines - 10 - 3, winheight(0))
11709668cc57SBram Moolenaar  exe other_winnr .. 'resize +1'
11719668cc57SBram Moolenaar  exe other_winnr .. 'resize +1'
11729668cc57SBram Moolenaar  call assert_equal(12, winheight(other_winnr))
11739668cc57SBram Moolenaar  call assert_equal(&lines - 10 - 3 -2, winheight(0))
117489015a67SBram Moolenaar  close
117589015a67SBram Moolenaar
117689015a67SBram Moolenaar  vsplit
117789015a67SBram Moolenaar  wincmd l
117889015a67SBram Moolenaar  let other_winnr = winnr('h')
117989015a67SBram Moolenaar  call assert_notequal(winnr(), other_winnr)
11805efe0e5dSBram Moolenaar  exe 'vert ' .. other_winnr .. 'resize -' .. &columns
118189015a67SBram Moolenaar  call assert_equal(0, winwidth(other_winnr))
1182fe6dce87SBram Moolenaar
1183fe6dce87SBram Moolenaar  %bwipe!
1184fe6dce87SBram Moolenaarendfunc
1185fe6dce87SBram Moolenaar
11865d3c9f8cSBram Moolenaar" Test for adjusting the window width when a window is closed with some
11875d3c9f8cSBram Moolenaar" windows using 'winfixwidth'
11885d3c9f8cSBram Moolenaarfunc Test_window_width_adjust()
11895d3c9f8cSBram Moolenaar  only
11905d3c9f8cSBram Moolenaar  " Three vertical windows. Windows 1 and 2 have 'winfixwidth' set and close
11915d3c9f8cSBram Moolenaar  " window 2.
11925d3c9f8cSBram Moolenaar  wincmd v
11935d3c9f8cSBram Moolenaar  vert resize 10
11945d3c9f8cSBram Moolenaar  set winfixwidth
11955d3c9f8cSBram Moolenaar  wincmd v
11965d3c9f8cSBram Moolenaar  set winfixwidth
11975d3c9f8cSBram Moolenaar  wincmd c
11985d3c9f8cSBram Moolenaar  call assert_inrange(10, 12, winwidth(1))
11995d3c9f8cSBram Moolenaar  " Three vertical windows. Windows 2 and 3 have 'winfixwidth' set and close
12005d3c9f8cSBram Moolenaar  " window 3.
12015d3c9f8cSBram Moolenaar  only
12025d3c9f8cSBram Moolenaar  set winfixwidth
12035d3c9f8cSBram Moolenaar  wincmd v
12045d3c9f8cSBram Moolenaar  vert resize 10
12055d3c9f8cSBram Moolenaar  set winfixwidth
12065d3c9f8cSBram Moolenaar  wincmd v
12075d3c9f8cSBram Moolenaar  set nowinfixwidth
12085d3c9f8cSBram Moolenaar  wincmd b
12095d3c9f8cSBram Moolenaar  wincmd c
12105d3c9f8cSBram Moolenaar  call assert_inrange(10, 12, winwidth(2))
12115d3c9f8cSBram Moolenaar
12125d3c9f8cSBram Moolenaar  new | only
12135d3c9f8cSBram Moolenaarendfunc
12145d3c9f8cSBram Moolenaar
12155d3c9f8cSBram Moolenaar" Test for jumping to a vertical/horizontal neighbor window based on the
12165d3c9f8cSBram Moolenaar" current cursor position
12175d3c9f8cSBram Moolenaarfunc Test_window_goto_neightbor()
12185d3c9f8cSBram Moolenaar  %bw!
12195d3c9f8cSBram Moolenaar
12205d3c9f8cSBram Moolenaar  " Vertical window movement
12215d3c9f8cSBram Moolenaar
12225d3c9f8cSBram Moolenaar  " create the following window layout:
12235d3c9f8cSBram Moolenaar  "     +--+--+
12245d3c9f8cSBram Moolenaar  "     |w1|w3|
12255d3c9f8cSBram Moolenaar  "     +--+  |
12265d3c9f8cSBram Moolenaar  "     |w2|  |
12275d3c9f8cSBram Moolenaar  "     +--+--+
12285d3c9f8cSBram Moolenaar  "     |w4   |
12295d3c9f8cSBram Moolenaar  "     +-----+
12305d3c9f8cSBram Moolenaar  new
12315d3c9f8cSBram Moolenaar  vsplit
12325d3c9f8cSBram Moolenaar  split
12335d3c9f8cSBram Moolenaar  " vertically jump from w4
12345d3c9f8cSBram Moolenaar  wincmd b
12355d3c9f8cSBram Moolenaar  call setline(1, repeat(' ', &columns))
12365d3c9f8cSBram Moolenaar  call cursor(1, 1)
12375d3c9f8cSBram Moolenaar  wincmd k
12385d3c9f8cSBram Moolenaar  call assert_equal(2, winnr())
12395d3c9f8cSBram Moolenaar  wincmd b
12405d3c9f8cSBram Moolenaar  call cursor(1, &columns)
12415d3c9f8cSBram Moolenaar  redraw!
12425d3c9f8cSBram Moolenaar  wincmd k
12435d3c9f8cSBram Moolenaar  call assert_equal(3, winnr())
12445d3c9f8cSBram Moolenaar  %bw!
12455d3c9f8cSBram Moolenaar
12465d3c9f8cSBram Moolenaar  " create the following window layout:
12475d3c9f8cSBram Moolenaar  "     +--+--+--+
12485d3c9f8cSBram Moolenaar  "     |w1|w2|w3|
12495d3c9f8cSBram Moolenaar  "     +--+--+--+
12505d3c9f8cSBram Moolenaar  "     |w4      |
12515d3c9f8cSBram Moolenaar  "     +--------+
12525d3c9f8cSBram Moolenaar  new
12535d3c9f8cSBram Moolenaar  vsplit
12545d3c9f8cSBram Moolenaar  vsplit
12555d3c9f8cSBram Moolenaar  wincmd b
12565d3c9f8cSBram Moolenaar  call setline(1, repeat(' ', &columns))
12575d3c9f8cSBram Moolenaar  call cursor(1, 1)
12585d3c9f8cSBram Moolenaar  wincmd k
12595d3c9f8cSBram Moolenaar  call assert_equal(1, winnr())
12605d3c9f8cSBram Moolenaar  wincmd b
12615d3c9f8cSBram Moolenaar  call cursor(1, &columns / 2)
12625d3c9f8cSBram Moolenaar  redraw!
12635d3c9f8cSBram Moolenaar  wincmd k
12645d3c9f8cSBram Moolenaar  call assert_equal(2, winnr())
12655d3c9f8cSBram Moolenaar  wincmd b
12665d3c9f8cSBram Moolenaar  call cursor(1, &columns)
12675d3c9f8cSBram Moolenaar  redraw!
12685d3c9f8cSBram Moolenaar  wincmd k
12695d3c9f8cSBram Moolenaar  call assert_equal(3, winnr())
12705d3c9f8cSBram Moolenaar  %bw!
12715d3c9f8cSBram Moolenaar
12725d3c9f8cSBram Moolenaar  " Horizontal window movement
12735d3c9f8cSBram Moolenaar
12745d3c9f8cSBram Moolenaar  " create the following window layout:
12755d3c9f8cSBram Moolenaar  "     +--+--+--+
12765d3c9f8cSBram Moolenaar  "     |w1|w2|w4|
12775d3c9f8cSBram Moolenaar  "     +--+--+  |
12785d3c9f8cSBram Moolenaar  "     |w3   |  |
12795d3c9f8cSBram Moolenaar  "     +-----+--+
12805d3c9f8cSBram Moolenaar  vsplit
12815d3c9f8cSBram Moolenaar  split
12825d3c9f8cSBram Moolenaar  vsplit
12835d3c9f8cSBram Moolenaar  4wincmd l
12845d3c9f8cSBram Moolenaar  call setline(1, repeat([' '], &lines))
12855d3c9f8cSBram Moolenaar  call cursor(1, 1)
12865d3c9f8cSBram Moolenaar  redraw!
12875d3c9f8cSBram Moolenaar  wincmd h
12885d3c9f8cSBram Moolenaar  call assert_equal(2, winnr())
12895d3c9f8cSBram Moolenaar  4wincmd l
12905d3c9f8cSBram Moolenaar  call cursor(&lines, 1)
12915d3c9f8cSBram Moolenaar  redraw!
12925d3c9f8cSBram Moolenaar  wincmd h
12935d3c9f8cSBram Moolenaar  call assert_equal(3, winnr())
12945d3c9f8cSBram Moolenaar  %bw!
12955d3c9f8cSBram Moolenaar
12965d3c9f8cSBram Moolenaar  " create the following window layout:
12975d3c9f8cSBram Moolenaar  "     +--+--+
12985d3c9f8cSBram Moolenaar  "     |w1|w4|
12995d3c9f8cSBram Moolenaar  "     +--+  +
13005d3c9f8cSBram Moolenaar  "     |w2|  |
13015d3c9f8cSBram Moolenaar  "     +--+  +
13025d3c9f8cSBram Moolenaar  "     |w3|  |
13035d3c9f8cSBram Moolenaar  "     +--+--+
13045d3c9f8cSBram Moolenaar  vsplit
13055d3c9f8cSBram Moolenaar  split
13065d3c9f8cSBram Moolenaar  split
13075d3c9f8cSBram Moolenaar  wincmd l
13085d3c9f8cSBram Moolenaar  call setline(1, repeat([' '], &lines))
13095d3c9f8cSBram Moolenaar  call cursor(1, 1)
13105d3c9f8cSBram Moolenaar  redraw!
13115d3c9f8cSBram Moolenaar  wincmd h
13125d3c9f8cSBram Moolenaar  call assert_equal(1, winnr())
13135d3c9f8cSBram Moolenaar  wincmd l
13145d3c9f8cSBram Moolenaar  call cursor(&lines / 2, 1)
13155d3c9f8cSBram Moolenaar  redraw!
13165d3c9f8cSBram Moolenaar  wincmd h
13175d3c9f8cSBram Moolenaar  call assert_equal(2, winnr())
13185d3c9f8cSBram Moolenaar  wincmd l
13195d3c9f8cSBram Moolenaar  call cursor(&lines, 1)
13205d3c9f8cSBram Moolenaar  redraw!
13215d3c9f8cSBram Moolenaar  wincmd h
13225d3c9f8cSBram Moolenaar  call assert_equal(3, winnr())
13235d3c9f8cSBram Moolenaar  %bw!
13245d3c9f8cSBram Moolenaarendfunc
13255d3c9f8cSBram Moolenaar
13265d3c9f8cSBram Moolenaar" Test for an autocmd closing the destination window when jumping from one
13275d3c9f8cSBram Moolenaar" window to another.
13285d3c9f8cSBram Moolenaarfunc Test_close_dest_window()
13295d3c9f8cSBram Moolenaar  split
13305d3c9f8cSBram Moolenaar  edit Xfile
13315d3c9f8cSBram Moolenaar
13325d3c9f8cSBram Moolenaar  " Test for BufLeave
13335d3c9f8cSBram Moolenaar  augroup T1
13345d3c9f8cSBram Moolenaar    au!
13355d3c9f8cSBram Moolenaar    au BufLeave Xfile $wincmd c
13365d3c9f8cSBram Moolenaar  augroup END
13375d3c9f8cSBram Moolenaar  wincmd b
13385d3c9f8cSBram Moolenaar  call assert_equal(1, winnr('$'))
13395d3c9f8cSBram Moolenaar  call assert_equal('Xfile', @%)
13405d3c9f8cSBram Moolenaar  augroup T1
13415d3c9f8cSBram Moolenaar    au!
13425d3c9f8cSBram Moolenaar  augroup END
13435d3c9f8cSBram Moolenaar
13445d3c9f8cSBram Moolenaar  " Test for WinLeave
13455d3c9f8cSBram Moolenaar  new
13465d3c9f8cSBram Moolenaar  wincmd p
13475d3c9f8cSBram Moolenaar  augroup T1
13485d3c9f8cSBram Moolenaar    au!
13495d3c9f8cSBram Moolenaar    au WinLeave * 1wincmd c
13505d3c9f8cSBram Moolenaar  augroup END
13515d3c9f8cSBram Moolenaar  wincmd t
13525d3c9f8cSBram Moolenaar  call assert_equal(1, winnr('$'))
13535d3c9f8cSBram Moolenaar  call assert_equal('Xfile', @%)
13545d3c9f8cSBram Moolenaar  augroup T1
13555d3c9f8cSBram Moolenaar    au!
13565d3c9f8cSBram Moolenaar  augroup END
13575d3c9f8cSBram Moolenaar  augroup! T1
13585d3c9f8cSBram Moolenaar  %bw!
13595d3c9f8cSBram Moolenaarendfunc
13605d3c9f8cSBram Moolenaar
13619e4d8215SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
1362