blob: 001bbaca48fc87febb88412d9892399b1f5c7f31 [file] [log] [blame]
Bram Moolenaar991dea32016-05-24 11:31:32 +02001" Tests for window cmd (:wincmd, :split, :vsplit, :resize and etc...)
2
Bram Moolenaara27e1dc2019-10-07 22:27:36 +02003so check.vim
4
Bram Moolenaar991dea32016-05-24 11:31:32 +02005func Test_window_cmd_ls0_with_split()
6 set ls=0
7 set splitbelow
8 split
9 quit
10 call assert_equal(0, &lines - &cmdheight - winheight(0))
11 new | only!
12 "
13 set splitbelow&vim
14 botright split
15 quit
16 call assert_equal(0, &lines - &cmdheight - winheight(0))
17 new | only!
18 set ls&vim
19endfunc
20
21func Test_window_cmd_cmdwin_with_vsp()
Bram Moolenaar72cf47a2018-05-10 18:23:29 +020022 let efmt = 'Expected 0 but got %d (in ls=%d, %s window)'
Bram Moolenaar991dea32016-05-24 11:31:32 +020023 for v in range(0, 2)
24 exec "set ls=" . v
25 vsplit
26 call feedkeys("q:\<CR>")
27 let ac = &lines - (&cmdheight + winheight(0) + !!v)
28 let emsg = printf(efmt, ac, v, 'left')
29 call assert_equal(0, ac, emsg)
30 wincmd w
31 let ac = &lines - (&cmdheight + winheight(0) + !!v)
32 let emsg = printf(efmt, ac, v, 'right')
33 call assert_equal(0, ac, emsg)
34 new | only!
35 endfor
36 set ls&vim
37endfunc
38
Bram Moolenaar5d2ca042016-06-26 17:11:21 +020039function Test_window_cmd_wincmd_gf()
40 let fname = 'test_gf.txt'
41 let swp_fname = '.' . fname . '.swp'
42 call writefile([], fname)
43 call writefile([], swp_fname)
44 function s:swap_exists()
45 let v:swapchoice = s:swap_choice
46 endfunc
Bram Moolenaareaa49e42019-07-13 18:08:59 +020047 " Remove the catch-all that runtest.vim adds
48 au! SwapExists
Bram Moolenaar5d2ca042016-06-26 17:11:21 +020049 augroup test_window_cmd_wincmd_gf
50 autocmd!
51 exec "autocmd SwapExists " . fname . " call s:swap_exists()"
52 augroup END
53
54 call setline(1, fname)
55 " (E)dit anyway
56 let s:swap_choice = 'e'
57 wincmd gf
58 call assert_equal(2, tabpagenr())
59 call assert_equal(fname, bufname("%"))
60 quit!
61
62 " (Q)uit
63 let s:swap_choice = 'q'
64 wincmd gf
65 call assert_equal(1, tabpagenr())
66 call assert_notequal(fname, bufname("%"))
67 new | only!
68
69 call delete(fname)
70 call delete(swp_fname)
71 augroup! test_window_cmd_wincmd_gf
72endfunc
73
Bram Moolenaar4520d442017-03-19 16:09:46 +010074func Test_window_quit()
75 e Xa
76 split Xb
Bram Moolenaarf92e58c2019-09-08 21:51:41 +020077 call assert_equal(2, '$'->winnr())
Bram Moolenaar4520d442017-03-19 16:09:46 +010078 call assert_equal('Xb', bufname(winbufnr(1)))
79 call assert_equal('Xa', bufname(winbufnr(2)))
80
81 wincmd q
82 call assert_equal(1, winnr('$'))
83 call assert_equal('Xa', bufname(winbufnr(1)))
84
85 bw Xa Xb
86endfunc
87
88func Test_window_horizontal_split()
89 call assert_equal(1, winnr('$'))
90 3wincmd s
91 call assert_equal(2, winnr('$'))
92 call assert_equal(3, winheight(0))
Bram Moolenaarf92e58c2019-09-08 21:51:41 +020093 call assert_equal(winwidth(1), 2->winwidth())
Bram Moolenaar4520d442017-03-19 16:09:46 +010094
95 call assert_fails('botright topleft wincmd s', 'E442:')
96 bw
97endfunc
98
99func Test_window_vertical_split()
100 call assert_equal(1, winnr('$'))
101 3wincmd v
102 call assert_equal(2, winnr('$'))
103 call assert_equal(3, winwidth(0))
104 call assert_equal(winheight(1), winheight(2))
105
106 call assert_fails('botright topleft wincmd v', 'E442:')
107 bw
108endfunc
109
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100110" Test the ":wincmd ^" and "<C-W>^" commands.
Bram Moolenaar4520d442017-03-19 16:09:46 +0100111func Test_window_split_edit_alternate()
Bram Moolenaar4520d442017-03-19 16:09:46 +0100112
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100113 " Test for failure when the alternate buffer/file no longer exists.
114 edit Xfoo | %bw
115 call assert_fails(':wincmd ^', 'E23')
116
117 " Test for the expected behavior when we have two named buffers.
118 edit Xfoo | edit Xbar
Bram Moolenaar4520d442017-03-19 16:09:46 +0100119 wincmd ^
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100120 call assert_equal('Xfoo', bufname(winbufnr(1)))
121 call assert_equal('Xbar', bufname(winbufnr(2)))
122 only
Bram Moolenaar4520d442017-03-19 16:09:46 +0100123
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100124 " Test for the expected behavior when the alternate buffer is not named.
125 enew | let l:nr1 = bufnr('%')
126 edit Xfoo | let l:nr2 = bufnr('%')
127 wincmd ^
128 call assert_equal(l:nr1, winbufnr(1))
129 call assert_equal(l:nr2, winbufnr(2))
130 only
131
Bram Moolenaard42333d2018-11-10 20:28:19 +0100132 " FIXME: this currently fails on AppVeyor, but passes locally
133 if !has('win32')
134 " Test the Normal mode command.
135 call feedkeys("\<C-W>\<C-^>", 'tx')
136 call assert_equal(l:nr2, winbufnr(1))
137 call assert_equal(l:nr1, winbufnr(2))
138 endif
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100139
140 %bw!
141endfunc
142
143" Test the ":[count]wincmd ^" and "[count]<C-W>^" commands.
144func Test_window_split_edit_bufnr()
145
146 %bwipeout
147 let l:nr = bufnr('%') + 1
148 call assert_fails(':execute "normal! ' . l:nr . '\<C-W>\<C-^>"', 'E92')
149 call assert_fails(':' . l:nr . 'wincmd ^', 'E16')
150 call assert_fails(':0wincmd ^', 'E16')
151
152 edit Xfoo | edit Xbar | edit Xbaz
153 let l:foo_nr = bufnr('Xfoo')
154 let l:bar_nr = bufnr('Xbar')
155 let l:baz_nr = bufnr('Xbaz')
156
Bram Moolenaar8617b402018-11-10 20:47:48 +0100157 " FIXME: this currently fails on AppVeyor, but passes locally
158 if !has('win32')
159 call feedkeys(l:foo_nr . "\<C-W>\<C-^>", 'tx')
160 call assert_equal('Xfoo', bufname(winbufnr(1)))
161 call assert_equal('Xbaz', bufname(winbufnr(2)))
162 only
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100163
Bram Moolenaar8617b402018-11-10 20:47:48 +0100164 call feedkeys(l:bar_nr . "\<C-W>\<C-^>", 'tx')
165 call assert_equal('Xbar', bufname(winbufnr(1)))
166 call assert_equal('Xfoo', bufname(winbufnr(2)))
167 only
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100168
Bram Moolenaar8617b402018-11-10 20:47:48 +0100169 execute l:baz_nr . 'wincmd ^'
170 call assert_equal('Xbaz', bufname(winbufnr(1)))
171 call assert_equal('Xbar', bufname(winbufnr(2)))
172 endif
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100173
174 %bw!
Bram Moolenaar4520d442017-03-19 16:09:46 +0100175endfunc
176
Bram Moolenaar9b9be002020-03-22 14:41:22 +0100177func Test_window_split_no_room()
178 " N horizontal windows need >= 2*N + 1 lines:
179 " - 1 line + 1 status line in each window
180 " - 1 Ex command line
181 "
182 " 2*N + 1 <= &lines
183 " N <= (lines - 1)/2
184 "
185 " Beyond that number of windows, E36: Not enough room is expected.
186 let hor_win_count = (&lines - 1)/2
187 let hor_split_count = hor_win_count - 1
188 for s in range(1, hor_split_count) | split | endfor
189 call assert_fails('split', 'E36:')
190
191 " N vertical windows need >= 2*(N - 1) + 1 columns:
192 " - 1 column + 1 separator for each window (except last window)
193 " - 1 column for the last window which does not have separator
194 "
195 " 2*(N - 1) + 1 <= &columns
196 " 2*N - 1 <= &columns
197 " N <= (&columns + 1)/2
198 let ver_win_count = (&columns + 1)/2
199 let ver_split_count = ver_win_count - 1
200 for s in range(1, ver_split_count) | vsplit | endfor
201 call assert_fails('vsplit', 'E36:')
202
203 %bw!
204endfunc
205
Bram Moolenaar4520d442017-03-19 16:09:46 +0100206func Test_window_preview()
Bram Moolenaar5a4c3082019-12-01 15:23:11 +0100207 CheckFeature quickfix
208
Bram Moolenaar4520d442017-03-19 16:09:46 +0100209 " Open a preview window
210 pedit Xa
211 call assert_equal(2, winnr('$'))
212 call assert_equal(0, &previewwindow)
213
214 " Go to the preview window
215 wincmd P
216 call assert_equal(1, &previewwindow)
217
218 " Close preview window
219 wincmd z
220 call assert_equal(1, winnr('$'))
221 call assert_equal(0, &previewwindow)
222
223 call assert_fails('wincmd P', 'E441:')
224endfunc
225
Bram Moolenaar026587b2019-08-17 15:08:00 +0200226func Test_window_preview_from_help()
Bram Moolenaar5a4c3082019-12-01 15:23:11 +0100227 CheckFeature quickfix
228
Bram Moolenaar026587b2019-08-17 15:08:00 +0200229 filetype on
230 call writefile(['/* some C code */'], 'Xpreview.c')
231 help
232 pedit Xpreview.c
233 wincmd P
234 call assert_equal(1, &previewwindow)
235 call assert_equal('c', &filetype)
236 wincmd z
237
238 filetype off
239 close
240 call delete('Xpreview.c')
241endfunc
242
Bram Moolenaar4520d442017-03-19 16:09:46 +0100243func Test_window_exchange()
244 e Xa
245
246 " Nothing happens with window exchange when there is 1 window
247 wincmd x
248 call assert_equal(1, winnr('$'))
249
250 split Xb
251 split Xc
252
253 call assert_equal('Xc', bufname(winbufnr(1)))
254 call assert_equal('Xb', bufname(winbufnr(2)))
255 call assert_equal('Xa', bufname(winbufnr(3)))
256
257 " Exchange current window 1 with window 3
258 3wincmd x
259 call assert_equal('Xa', bufname(winbufnr(1)))
260 call assert_equal('Xb', bufname(winbufnr(2)))
261 call assert_equal('Xc', bufname(winbufnr(3)))
262
263 " Exchange window with next when at the top window
264 wincmd x
265 call assert_equal('Xb', bufname(winbufnr(1)))
266 call assert_equal('Xa', bufname(winbufnr(2)))
267 call assert_equal('Xc', bufname(winbufnr(3)))
268
269 " Exchange window with next when at the middle window
270 wincmd j
271 wincmd x
272 call assert_equal('Xb', bufname(winbufnr(1)))
273 call assert_equal('Xc', bufname(winbufnr(2)))
274 call assert_equal('Xa', bufname(winbufnr(3)))
275
276 " Exchange window with next when at the bottom window.
277 " When there is no next window, it exchanges with the previous window.
278 wincmd j
279 wincmd x
280 call assert_equal('Xb', bufname(winbufnr(1)))
281 call assert_equal('Xa', bufname(winbufnr(2)))
282 call assert_equal('Xc', bufname(winbufnr(3)))
283
284 bw Xa Xb Xc
285endfunc
286
287func Test_window_rotate()
288 e Xa
289 split Xb
290 split Xc
291 call assert_equal('Xc', bufname(winbufnr(1)))
292 call assert_equal('Xb', bufname(winbufnr(2)))
293 call assert_equal('Xa', bufname(winbufnr(3)))
294
295 " Rotate downwards
296 wincmd r
297 call assert_equal('Xa', bufname(winbufnr(1)))
298 call assert_equal('Xc', bufname(winbufnr(2)))
299 call assert_equal('Xb', bufname(winbufnr(3)))
300
301 2wincmd r
302 call assert_equal('Xc', bufname(winbufnr(1)))
303 call assert_equal('Xb', bufname(winbufnr(2)))
304 call assert_equal('Xa', bufname(winbufnr(3)))
305
306 " Rotate upwards
307 wincmd R
308 call assert_equal('Xb', bufname(winbufnr(1)))
309 call assert_equal('Xa', bufname(winbufnr(2)))
310 call assert_equal('Xc', bufname(winbufnr(3)))
311
312 2wincmd R
313 call assert_equal('Xc', bufname(winbufnr(1)))
314 call assert_equal('Xb', bufname(winbufnr(2)))
315 call assert_equal('Xa', bufname(winbufnr(3)))
316
317 bot vsplit
318 call assert_fails('wincmd R', 'E443:')
319
320 bw Xa Xb Xc
321endfunc
322
323func Test_window_height()
324 e Xa
325 split Xb
326
327 let [wh1, wh2] = [winheight(1), winheight(2)]
328 " Active window (1) should have the same height or 1 more
329 " than the other window.
330 call assert_inrange(wh2, wh2 + 1, wh1)
331
332 wincmd -
333 call assert_equal(wh1 - 1, winheight(1))
334 call assert_equal(wh2 + 1, winheight(2))
335
336 wincmd +
337 call assert_equal(wh1, winheight(1))
Bram Moolenaarf92e58c2019-09-08 21:51:41 +0200338 call assert_equal(wh2, 2->winheight())
Bram Moolenaar4520d442017-03-19 16:09:46 +0100339
340 2wincmd _
341 call assert_equal(2, winheight(1))
342 call assert_equal(wh1 + wh2 - 2, winheight(2))
343
344 wincmd =
345 call assert_equal(wh1, winheight(1))
346 call assert_equal(wh2, winheight(2))
347
348 2wincmd _
349 set winfixheight
350 split Xc
351 let [wh1, wh2, wh3] = [winheight(1), winheight(2), winheight(3)]
352 call assert_equal(2, winheight(2))
353 call assert_inrange(wh3, wh3 + 1, wh1)
354 3wincmd +
355 call assert_equal(2, winheight(2))
356 call assert_equal(wh1 + 3, winheight(1))
357 call assert_equal(wh3 - 3, winheight(3))
358 wincmd =
359 call assert_equal(2, winheight(2))
360 call assert_equal(wh1, winheight(1))
361 call assert_equal(wh3, winheight(3))
362
363 wincmd j
364 set winfixheight&
365
366 wincmd =
367 let [wh1, wh2, wh3] = [winheight(1), winheight(2), winheight(3)]
368 " Current window (2) should have the same height or 1 more
369 " than the other windows.
370 call assert_inrange(wh1, wh1 + 1, wh2)
371 call assert_inrange(wh3, wh3 + 1, wh2)
372
373 bw Xa Xb Xc
374endfunc
375
376func Test_window_width()
377 e Xa
378 vsplit Xb
379
380 let [ww1, ww2] = [winwidth(1), winwidth(2)]
381 " Active window (1) should have the same width or 1 more
382 " than the other window.
383 call assert_inrange(ww2, ww2 + 1, ww1)
384
385 wincmd <
386 call assert_equal(ww1 - 1, winwidth(1))
387 call assert_equal(ww2 + 1, winwidth(2))
388
389 wincmd >
390 call assert_equal(ww1, winwidth(1))
391 call assert_equal(ww2, winwidth(2))
392
393 2wincmd |
394 call assert_equal(2, winwidth(1))
395 call assert_equal(ww1 + ww2 - 2, winwidth(2))
396
397 wincmd =
398 call assert_equal(ww1, winwidth(1))
399 call assert_equal(ww2, winwidth(2))
400
401 2wincmd |
402 set winfixwidth
403 vsplit Xc
404 let [ww1, ww2, ww3] = [winwidth(1), winwidth(2), winwidth(3)]
Bram Moolenaar38e34832017-03-19 20:22:36 +0100405 call assert_equal(2, winwidth(2))
Bram Moolenaar4520d442017-03-19 16:09:46 +0100406 call assert_inrange(ww3, ww3 + 1, ww1)
407 3wincmd >
Bram Moolenaar38e34832017-03-19 20:22:36 +0100408 call assert_equal(2, winwidth(2))
Bram Moolenaar4520d442017-03-19 16:09:46 +0100409 call assert_equal(ww1 + 3, winwidth(1))
410 call assert_equal(ww3 - 3, winwidth(3))
411 wincmd =
Bram Moolenaar38e34832017-03-19 20:22:36 +0100412 call assert_equal(2, winwidth(2))
Bram Moolenaar4520d442017-03-19 16:09:46 +0100413 call assert_equal(ww1, winwidth(1))
414 call assert_equal(ww3, winwidth(3))
415
416 wincmd l
417 set winfixwidth&
418
419 wincmd =
420 let [ww1, ww2, ww3] = [winwidth(1), winwidth(2), winwidth(3)]
421 " Current window (2) should have the same width or 1 more
422 " than the other windows.
423 call assert_inrange(ww1, ww1 + 1, ww2)
424 call assert_inrange(ww3, ww3 + 1, ww2)
425
426 bw Xa Xb Xc
427endfunc
428
Bram Moolenaar8eeeba82017-06-25 22:45:39 +0200429func Test_equalalways_on_close()
430 set equalalways
431 vsplit
432 windo split
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100433 split
Bram Moolenaar8eeeba82017-06-25 22:45:39 +0200434 wincmd J
435 " now we have a frame top-left with two windows, a frame top-right with two
436 " windows and a frame at the bottom, full-width.
437 let height_1 = winheight(1)
438 let height_2 = winheight(2)
439 let height_3 = winheight(3)
440 let height_4 = winheight(4)
441 " closing the bottom window causes all windows to be resized.
442 close
443 call assert_notequal(height_1, winheight(1))
444 call assert_notequal(height_2, winheight(2))
445 call assert_notequal(height_3, winheight(3))
446 call assert_notequal(height_4, winheight(4))
447 call assert_equal(winheight(1), winheight(3))
448 call assert_equal(winheight(2), winheight(4))
449
450 1wincmd w
451 split
452 4wincmd w
453 resize + 5
454 " left column has three windows, equalized heights.
455 " right column has two windows, top one a bit higher
456 let height_1 = winheight(1)
457 let height_2 = winheight(2)
458 let height_4 = winheight(4)
459 let height_5 = winheight(5)
460 3wincmd w
461 " closing window in left column equalizes heights in left column but not in
462 " the right column
463 close
464 call assert_notequal(height_1, winheight(1))
465 call assert_notequal(height_2, winheight(2))
466 call assert_equal(height_4, winheight(3))
467 call assert_equal(height_5, winheight(4))
468
469 only
470 set equalalways&
471endfunc
472
Bram Moolenaar22044dc2017-12-02 15:43:37 +0100473func Test_win_screenpos()
Bram Moolenaar5a4c3082019-12-01 15:23:11 +0100474 CheckFeature quickfix
475
Bram Moolenaar22044dc2017-12-02 15:43:37 +0100476 call assert_equal(1, winnr('$'))
477 split
478 vsplit
479 10wincmd _
480 30wincmd |
481 call assert_equal([1, 1], win_screenpos(1))
482 call assert_equal([1, 32], win_screenpos(2))
483 call assert_equal([12, 1], win_screenpos(3))
484 call assert_equal([0, 0], win_screenpos(4))
485 only
486endfunc
487
Bram Moolenaar4520d442017-03-19 16:09:46 +0100488func Test_window_jump_tag()
Bram Moolenaar5a4c3082019-12-01 15:23:11 +0100489 CheckFeature quickfix
490
Bram Moolenaar4520d442017-03-19 16:09:46 +0100491 help
492 /iccf
493 call assert_match('^|iccf|', getline('.'))
494 call assert_equal(2, winnr('$'))
495 2wincmd }
496 call assert_equal(3, winnr('$'))
497 call assert_match('^|iccf|', getline('.'))
498 wincmd k
499 call assert_match('\*iccf\*', getline('.'))
500 call assert_equal(2, winheight(0))
501
502 wincmd z
503 set previewheight=4
504 help
505 /bugs
506 wincmd }
507 wincmd k
508 call assert_match('\*bugs\*', getline('.'))
509 call assert_equal(4, winheight(0))
510 set previewheight&
511
512 %bw!
513endfunc
514
515func Test_window_newtab()
516 e Xa
517
518 call assert_equal(1, tabpagenr('$'))
519 call assert_equal("\nAlready only one window", execute('wincmd T'))
520
521 split Xb
522 split Xc
523
524 wincmd T
525 call assert_equal(2, tabpagenr('$'))
526 call assert_equal(['Xb', 'Xa'], map(tabpagebuflist(1), 'bufname(v:val)'))
Bram Moolenaarce90e362019-09-08 18:58:44 +0200527 call assert_equal(['Xc' ], map(2->tabpagebuflist(), 'bufname(v:val)'))
Bram Moolenaar0e05de42020-03-25 22:23:46 +0100528 call assert_equal(['Xc' ], map(tabpagebuflist(), 'bufname(v:val)'))
Bram Moolenaar4520d442017-03-19 16:09:46 +0100529
530 %bw!
531endfunc
532
Bram Moolenaarf79225e2017-03-18 23:11:04 +0100533func Test_next_split_all()
534 " This was causing an illegal memory access.
535 n x
536 norm axxx
537 split
538 split
539 s/x
540 s/x
541 all
542 bwipe!
543endfunc
544
Bram Moolenaar75373f32017-08-07 22:02:30 +0200545" Tests for adjusting window and contents
546func GetScreenStr(row)
547 let str = ""
548 for c in range(1,3)
549 let str .= nr2char(screenchar(a:row, c))
550 endfor
551 return str
552endfunc
553
554func Test_window_contents()
555 enew! | only | new
556 call setline(1, range(1,256))
557
558 exe "norm! \<C-W>t\<C-W>=1Gzt\<C-W>w\<C-W>+"
559 redraw
Bram Moolenaar72cf47a2018-05-10 18:23:29 +0200560 let s3 = GetScreenStr(1)
Bram Moolenaar75373f32017-08-07 22:02:30 +0200561 wincmd p
562 call assert_equal(1, line("w0"))
563 call assert_equal('1 ', s3)
564
565 exe "norm! \<C-W>t\<C-W>=50Gzt\<C-W>w\<C-W>+"
566 redraw
Bram Moolenaar72cf47a2018-05-10 18:23:29 +0200567 let s3 = GetScreenStr(1)
Bram Moolenaar75373f32017-08-07 22:02:30 +0200568 wincmd p
569 call assert_equal(50, line("w0"))
570 call assert_equal('50 ', s3)
571
572 exe "norm! \<C-W>t\<C-W>=59Gzt\<C-W>w\<C-W>+"
573 redraw
Bram Moolenaar72cf47a2018-05-10 18:23:29 +0200574 let s3 = GetScreenStr(1)
Bram Moolenaar75373f32017-08-07 22:02:30 +0200575 wincmd p
576 call assert_equal(59, line("w0"))
577 call assert_equal('59 ', s3)
578
Bram Moolenaar8b633132020-03-20 18:20:51 +0100579 %d
580 call setline(1, ['one', 'two', 'three'])
581 call assert_equal(1, line('w0'))
582 call assert_equal(3, line('w$'))
583
Bram Moolenaar75373f32017-08-07 22:02:30 +0200584 bwipeout!
585 call test_garbagecollect_now()
586endfunc
587
Bram Moolenaar2efb3232017-12-19 12:27:23 +0100588func Test_window_colon_command()
589 " This was reading invalid memory.
590 exe "norm! v\<C-W>:\<C-U>echo v:version"
591endfunc
592
Bram Moolenaar6f361c92018-01-31 19:06:50 +0100593func Test_access_freed_mem()
Bram Moolenaar1417c762019-07-27 17:31:36 +0200594 call assert_equal(&columns, winwidth(0))
Bram Moolenaar6f361c92018-01-31 19:06:50 +0100595 " This was accessing freed memory
596 au * 0 vs xxx
597 arg 0
598 argadd
Bram Moolenaar1417c762019-07-27 17:31:36 +0200599 call assert_fails("all", "E249:")
Bram Moolenaar6f361c92018-01-31 19:06:50 +0100600 au!
601 bwipe xxx
Bram Moolenaar1417c762019-07-27 17:31:36 +0200602 call assert_equal(&columns, winwidth(0))
Bram Moolenaar6f361c92018-01-31 19:06:50 +0100603endfunc
604
Bram Moolenaara27e1dc2019-10-07 22:27:36 +0200605func Test_insert_cleared_on_switch_to_term()
606 CheckFeature terminal
607
608 set showmode
609 terminal
610 wincmd p
611
612 call feedkeys("i\<C-O>", 'ntx')
613 redraw
614
615 " The "-- (insert) --" indicator should be visible.
616 let chars = map(range(1, &columns), 'nr2char(screenchar(&lines, v:val))')
617 let str = trim(join(chars, ''))
618 call assert_equal('-- (insert) --', str)
619
620 call feedkeys("\<C-W>p", 'ntx')
621 redraw
622
623 " The "-- (insert) --" indicator should have been cleared.
624 let chars = map(range(1, &columns), 'nr2char(screenchar(&lines, v:val))')
625 let str = trim(join(chars, ''))
626 call assert_equal('', str)
627
628 set showmode&
629 %bw!
630endfunc
631
Bram Moolenaar5bab5552018-04-13 20:41:29 +0200632func Test_visual_cleared_after_window_split()
633 new | only!
634 let smd_save = &showmode
635 set showmode
636 let ls_save = &laststatus
637 set laststatus=1
638 call setline(1, ['a', 'b', 'c', 'd', ''])
639 norm! G
640 exe "norm! kkvk"
641 redraw
642 exe "norm! \<C-W>v"
643 redraw
644 " check if '-- VISUAL --' disappeared from command line
645 let columns = range(1, &columns)
646 let cmdlinechars = map(columns, 'nr2char(screenchar(&lines, v:val))')
647 let cmdline = join(cmdlinechars, '')
648 let cmdline_ltrim = substitute(cmdline, '^\s*', "", "")
649 let mode_shown = substitute(cmdline_ltrim, '\s*$', "", "")
650 call assert_equal('', mode_shown)
651 let &showmode = smd_save
652 let &laststatus = ls_save
653 bwipe!
654endfunc
655
Bram Moolenaar72cf47a2018-05-10 18:23:29 +0200656func Test_winrestcmd()
657 2split
658 3vsplit
659 let a = winrestcmd()
660 call assert_equal(2, winheight(0))
661 call assert_equal(3, winwidth(0))
662 wincmd =
663 call assert_notequal(2, winheight(0))
664 call assert_notequal(3, winwidth(0))
665 exe a
666 call assert_equal(2, winheight(0))
667 call assert_equal(3, winwidth(0))
668 only
669endfunc
670
Bram Moolenaar1e115362019-01-09 23:01:02 +0100671func Fun_RenewFile()
Bram Moolenaar026587b2019-08-17 15:08:00 +0200672 " Need to wait a bit for the timestamp to be older.
Bram Moolenaarce90e362019-09-08 18:58:44 +0200673 let old_ftime = getftime("tmp.txt")
674 while getftime("tmp.txt") == old_ftime
675 sleep 100m
676 silent execute '!echo "1" > tmp.txt'
677 endwhile
Bram Moolenaara42df592018-12-24 00:22:39 +0100678 sp
679 wincmd p
680 edit! tmp.txt
Bram Moolenaar1e115362019-01-09 23:01:02 +0100681endfunc
Bram Moolenaara42df592018-12-24 00:22:39 +0100682
683func Test_window_prevwin()
684 " Can we make this work on MS-Windows?
685 if !has('unix')
686 return
687 endif
688
689 set hidden autoread
690 call writefile(['2'], 'tmp.txt')
691 new tmp.txt
692 q
Bram Moolenaara42df592018-12-24 00:22:39 +0100693 call Fun_RenewFile()
694 call assert_equal(2, winnr())
695 wincmd p
696 call assert_equal(1, winnr())
697 wincmd p
698 q
699 call Fun_RenewFile()
700 call assert_equal(2, winnr())
701 wincmd p
702 call assert_equal(1, winnr())
703 wincmd p
704 " reset
705 q
706 call delete('tmp.txt')
707 set hidden&vim autoread&vim
708 delfunc Fun_RenewFile
709endfunc
710
Bram Moolenaar8fcb60f2019-03-04 13:18:30 +0100711func Test_relative_cursor_position_in_one_line_window()
712 new
713 only
714 call setline(1, range(1, 10000))
715 normal 50%
716 let lnum = getcurpos()[1]
717 split
718 split
719 " make third window take as many lines as possible, other windows will
720 " become one line
721 3wincmd w
722 for i in range(1, &lines - 6)
723 wincmd +
724 redraw!
725 endfor
726
727 " first and second window should show cursor line
728 let wininfo = getwininfo()
729 call assert_equal(lnum, wininfo[0].topline)
730 call assert_equal(lnum, wininfo[1].topline)
731
732 only!
733 bwipe!
734endfunc
735
736func Test_relative_cursor_position_after_move_and_resize()
737 let so_save = &so
738 set so=0
739 enew
740 call setline(1, range(1, 10000))
741 normal 50%
742 split
743 1wincmd w
744 " Move cursor to first line in window
745 normal H
746 redraw!
747 " Reduce window height to two lines
748 let height = winheight(0)
749 while winheight(0) > 2
750 wincmd -
751 redraw!
752 endwhile
753 " move cursor to second/last line in window
754 normal j
755 " restore previous height
756 while winheight(0) < height
757 wincmd +
758 redraw!
759 endwhile
760 " make window two lines again
761 while winheight(0) > 2
762 wincmd -
763 redraw!
764 endwhile
765
766 " cursor should be at bottom line
767 let info = getwininfo(win_getid())[0]
768 call assert_equal(info.topline + 1, getcurpos()[1])
769
770 only!
771 bwipe!
772 let &so = so_save
773endfunc
774
775func Test_relative_cursor_position_after_resize()
776 let so_save = &so
777 set so=0
778 enew
779 call setline(1, range(1, 10000))
780 normal 50%
781 split
782 1wincmd w
783 let winid1 = win_getid()
784 let info = getwininfo(winid1)[0]
785 " Move cursor to second line in window
786 exe "normal " . (info.topline + 1) . "G"
787 redraw!
788 let lnum = getcurpos()[1]
789
790 " Make the window only two lines high, cursor should end up in top line
791 2wincmd w
792 exe (info.height - 2) . "wincmd +"
793 redraw!
794 let info = getwininfo(winid1)[0]
795 call assert_equal(lnum, info.topline)
796
797 only!
798 bwipe!
799 let &so = so_save
800endfunc
801
802func Test_relative_cursor_second_line_after_resize()
803 let so_save = &so
804 set so=0
805 enew
806 call setline(1, range(1, 10000))
807 normal 50%
808 split
809 1wincmd w
810 let winid1 = win_getid()
811 let info = getwininfo(winid1)[0]
812
813 " Make the window only two lines high
814 2wincmd _
815
816 " Move cursor to second line in window
817 normal H
818 normal j
819
820 " Make window size bigger, then back to 2 lines
821 for i in range(1, 10)
822 wincmd +
823 redraw!
824 endfor
825 for i in range(1, 10)
826 wincmd -
827 redraw!
828 endfor
829
830 " cursor should end up in bottom line
831 let info = getwininfo(winid1)[0]
832 call assert_equal(info.topline + 1, getcurpos()[1])
833
834 only!
835 bwipe!
836 let &so = so_save
837endfunc
838
Bram Moolenaara9b25352019-05-12 14:25:30 +0200839func Test_split_noscroll()
840 let so_save = &so
Bram Moolenaarbd2d68c2019-05-18 15:36:11 +0200841 enew
842 call setline(1, range(1, 8))
Bram Moolenaara9b25352019-05-12 14:25:30 +0200843 normal 100%
844 split
845
846 1wincmd w
847 let winid1 = win_getid()
848 let info1 = getwininfo(winid1)[0]
849
850 2wincmd w
851 let winid2 = win_getid()
852 let info2 = getwininfo(winid2)[0]
853
854 call assert_equal(1, info1.topline)
855 call assert_equal(1, info2.topline)
856
Bram Moolenaarbd2d68c2019-05-18 15:36:11 +0200857 " window that fits all lines by itself, but not when split: closing other
858 " window should restore fraction.
Bram Moolenaara9b25352019-05-12 14:25:30 +0200859 only!
Bram Moolenaarbd2d68c2019-05-18 15:36:11 +0200860 call setline(1, range(1, &lines - 10))
861 exe &lines / 4
862 let winid1 = win_getid()
863 let info1 = getwininfo(winid1)[0]
864 call assert_equal(1, info1.topline)
865 new
866 redraw
867 close
868 let info1 = getwininfo(winid1)[0]
869 call assert_equal(1, info1.topline)
870
Bram Moolenaara9b25352019-05-12 14:25:30 +0200871 bwipe!
872 let &so = so_save
873endfunc
874
Bram Moolenaar46ad2882019-04-08 20:01:47 +0200875" Tests for the winnr() function
876func Test_winnr()
877 only | tabonly
878 call assert_equal(1, winnr('j'))
879 call assert_equal(1, winnr('k'))
880 call assert_equal(1, winnr('h'))
881 call assert_equal(1, winnr('l'))
882
883 " create a set of horizontally and vertically split windows
884 leftabove new | wincmd p
885 leftabove new | wincmd p
886 rightbelow new | wincmd p
887 rightbelow new | wincmd p
888 leftabove vnew | wincmd p
889 leftabove vnew | wincmd p
890 rightbelow vnew | wincmd p
891 rightbelow vnew | wincmd p
892
893 call assert_equal(8, winnr('j'))
894 call assert_equal(2, winnr('k'))
895 call assert_equal(4, winnr('h'))
896 call assert_equal(6, winnr('l'))
897 call assert_equal(9, winnr('2j'))
898 call assert_equal(1, winnr('2k'))
899 call assert_equal(3, winnr('2h'))
900 call assert_equal(7, winnr('2l'))
901
902 " Error cases
903 call assert_fails("echo winnr('0.2k')", 'E15:')
904 call assert_equal(2, winnr('-2k'))
905 call assert_fails("echo winnr('-2xj')", 'E15:')
906 call assert_fails("echo winnr('j2j')", 'E15:')
907 call assert_fails("echo winnr('ll')", 'E15:')
908 call assert_fails("echo winnr('5')", 'E15:')
909 call assert_equal(4, winnr('0h'))
910
911 tabnew
912 call assert_equal(8, tabpagewinnr(1, 'j'))
Bram Moolenaarce90e362019-09-08 18:58:44 +0200913 call assert_equal(2, 1->tabpagewinnr('k'))
Bram Moolenaar46ad2882019-04-08 20:01:47 +0200914 call assert_equal(4, tabpagewinnr(1, 'h'))
915 call assert_equal(6, tabpagewinnr(1, 'l'))
916
917 only | tabonly
918endfunc
919
Bram Moolenaarf92e58c2019-09-08 21:51:41 +0200920func Test_winrestview()
921 split runtest.vim
922 normal 50%
923 let view = winsaveview()
924 close
925 split runtest.vim
926 eval view->winrestview()
927 call assert_equal(view, winsaveview())
928
929 bwipe!
930endfunc
931
Bram Moolenaard20dcb32019-09-10 21:22:58 +0200932func Test_win_splitmove()
Bram Moolenaar5a4c3082019-12-01 15:23:11 +0100933 CheckFeature quickfix
934
Bram Moolenaard20dcb32019-09-10 21:22:58 +0200935 edit a
936 leftabove split b
937 leftabove vsplit c
938 leftabove split d
939 call assert_equal(0, win_splitmove(winnr(), winnr('l')))
940 call assert_equal(bufname(winbufnr(1)), 'c')
941 call assert_equal(bufname(winbufnr(2)), 'd')
942 call assert_equal(bufname(winbufnr(3)), 'b')
943 call assert_equal(bufname(winbufnr(4)), 'a')
944 call assert_equal(0, win_splitmove(winnr(), winnr('j'), {'vertical': 1}))
945 call assert_equal(0, win_splitmove(winnr(), winnr('j'), {'vertical': 1}))
946 call assert_equal(bufname(winbufnr(1)), 'c')
947 call assert_equal(bufname(winbufnr(2)), 'b')
948 call assert_equal(bufname(winbufnr(3)), 'd')
949 call assert_equal(bufname(winbufnr(4)), 'a')
950 call assert_equal(0, win_splitmove(winnr(), winnr('k'), {'vertical': 1}))
951 call assert_equal(bufname(winbufnr(1)), 'd')
952 call assert_equal(bufname(winbufnr(2)), 'c')
953 call assert_equal(bufname(winbufnr(3)), 'b')
954 call assert_equal(bufname(winbufnr(4)), 'a')
955 call assert_equal(0, win_splitmove(winnr(), winnr('j'), {'rightbelow': v:true}))
956 call assert_equal(bufname(winbufnr(1)), 'c')
957 call assert_equal(bufname(winbufnr(2)), 'b')
958 call assert_equal(bufname(winbufnr(3)), 'a')
959 call assert_equal(bufname(winbufnr(4)), 'd')
960 only | bd
961
962 call assert_fails('call win_splitmove(winnr(), 123)', 'E957:')
963 call assert_fails('call win_splitmove(123, winnr())', 'E957:')
964 call assert_fails('call win_splitmove(winnr(), winnr())', 'E957:')
Bram Moolenaar7b94e772020-01-06 21:03:24 +0100965
966 tabnew
967 call assert_fails('call win_splitmove(1, win_getid(1, 1))', 'E957:')
968 tabclose
Bram Moolenaard20dcb32019-09-10 21:22:58 +0200969endfunc
970
Bram Moolenaare20b9ec2020-02-03 21:40:04 +0100971" Test for the :only command
972func Test_window_only()
973 new
974 set modified
975 new
976 call assert_fails('only', 'E445:')
977 only!
Bram Moolenaarbc2b71d2020-02-17 21:33:30 +0100978 " Test for :only with a count
979 let wid = win_getid()
980 new
981 new
982 3only
983 call assert_equal(1, winnr('$'))
984 call assert_equal(wid, win_getid())
985 call assert_fails('close', 'E444:')
986 call assert_fails('%close', 'E16:')
Bram Moolenaare20b9ec2020-02-03 21:40:04 +0100987endfunc
988
Bram Moolenaar9f6277b2020-02-11 22:04:02 +0100989" Test for errors with :wincmd
990func Test_wincmd_errors()
991 call assert_fails('wincmd g', 'E474:')
992 call assert_fails('wincmd ab', 'E474:')
993endfunc
994
995" Test for errors with :winpos
996func Test_winpos_errors()
997 if !has("gui_running") && !has('win32')
998 call assert_fails('winpos', 'E188:')
999 endif
1000 call assert_fails('winpos 10', 'E466:')
1001endfunc
1002
Bram Moolenaar406cd902020-02-18 21:54:41 +01001003" Test for +cmd in a :split command
1004func Test_split_cmd()
1005 split +set\ readonly
1006 call assert_equal(1, &readonly)
1007 call assert_equal(2, winnr('$'))
1008 close
1009endfunc
1010
Bram Moolenaar5080b0a2020-03-22 21:23:47 +01001011" Create maximum number of horizontally or vertically split windows and then
1012" run commands that create a new horizontally/vertically split window
1013func Run_noroom_for_newwindow_test(dir_arg)
1014 let dir = (a:dir_arg == 'v') ? 'vert ' : ''
1015
1016 " Open as many windows as possible
Bram Moolenaarab505b12020-03-23 19:28:44 +01001017 while v:true
Bram Moolenaar5080b0a2020-03-22 21:23:47 +01001018 try
1019 exe dir . 'new'
1020 catch /E36:/
1021 break
1022 endtry
Bram Moolenaarab505b12020-03-23 19:28:44 +01001023 endwhile
Bram Moolenaar5080b0a2020-03-22 21:23:47 +01001024
1025 call writefile(['first', 'second', 'third'], 'Xfile1')
1026 call writefile([], 'Xfile2')
1027 call writefile([], 'Xfile3')
1028
1029 " Argument list related commands
1030 args Xfile1 Xfile2 Xfile3
1031 next
1032 for cmd in ['sargument 2', 'snext', 'sprevious', 'sNext', 'srewind',
1033 \ 'sfirst', 'slast']
1034 call assert_fails(dir .. cmd, 'E36:')
1035 endfor
1036 %argdelete
1037
1038 " Buffer related commands
1039 set modified
1040 hide enew
1041 for cmd in ['sbuffer Xfile1', 'sbnext', 'sbprevious', 'sbNext', 'sbrewind',
1042 \ 'sbfirst', 'sblast', 'sball', 'sbmodified', 'sunhide']
1043 call assert_fails(dir .. cmd, 'E36:')
1044 endfor
1045
1046 " Window related commands
1047 for cmd in ['split', 'split Xfile2', 'new', 'new Xfile3', 'sview Xfile1',
1048 \ 'sfind runtest.vim']
1049 call assert_fails(dir .. cmd, 'E36:')
1050 endfor
1051
1052 " Help
1053 call assert_fails(dir .. 'help', 'E36:')
1054 call assert_fails(dir .. 'helpgrep window', 'E36:')
1055
1056 " Command-line window
1057 if a:dir_arg == 'h'
1058 " Cmd-line window is always a horizontally split window
1059 call assert_beeps('call feedkeys("q:\<CR>", "xt")')
1060 endif
1061
1062 " Quickfix and location list window
1063 if has('quickfix')
1064 cexpr ''
1065 call assert_fails(dir .. 'copen', 'E36:')
1066 lexpr ''
1067 call assert_fails(dir .. 'lopen', 'E36:')
1068
1069 " Preview window
1070 call assert_fails(dir .. 'pedit Xfile2', 'E36:')
1071 call setline(1, 'abc')
1072 call assert_fails(dir .. 'psearch abc', 'E36:')
1073 endif
1074
1075 " Window commands (CTRL-W ^ and CTRL-W f)
1076 if a:dir_arg == 'h'
1077 call assert_fails('call feedkeys("\<C-W>^", "xt")', 'E36:')
1078 call setline(1, 'Xfile1')
1079 call assert_fails('call feedkeys("gg\<C-W>f", "xt")', 'E36:')
1080 endif
1081 enew!
1082
1083 " Tag commands (:stag, :stselect and :stjump)
1084 call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
1085 \ "second\tXfile1\t2",
1086 \ "third\tXfile1\t3",],
1087 \ 'Xtags')
1088 set tags=Xtags
1089 call assert_fails(dir .. 'stag second', 'E36:')
1090 call assert_fails('call feedkeys(":" .. dir .. "stselect second\n1\n", "xt")', 'E36:')
1091 call assert_fails(dir .. 'stjump second', 'E36:')
1092 call assert_fails(dir .. 'ptag second', 'E36:')
1093 set tags&
1094 call delete('Xtags')
1095
1096 " :isplit and :dsplit
1097 call setline(1, ['#define FOO 1', 'FOO'])
1098 normal 2G
1099 call assert_fails(dir .. 'isplit FOO', 'E36:')
1100 call assert_fails(dir .. 'dsplit FOO', 'E36:')
1101
1102 " terminal
1103 if has('terminal')
1104 call assert_fails(dir .. 'terminal', 'E36:')
1105 endif
1106
1107 %bwipe!
1108 call delete('Xfile1')
1109 call delete('Xfile2')
1110 call delete('Xfile3')
1111 only
1112endfunc
1113
1114func Test_split_cmds_with_no_room()
1115 call Run_noroom_for_newwindow_test('h')
1116 call Run_noroom_for_newwindow_test('v')
1117endfunc
1118
Bram Moolenaar9e4d8212016-08-18 23:04:48 +02001119" vim: shiftwidth=2 sts=2 expandtab