blob: 423d6f8d2ca35d34105696b2e97cc5e86c2e3fe7 [file] [log] [blame]
Bram Moolenaar991dea32016-05-24 11:31:32 +02001" Tests for window cmd (:wincmd, :split, :vsplit, :resize and etc...)
2
3func Test_window_cmd_ls0_with_split()
4 set ls=0
5 set splitbelow
6 split
7 quit
8 call assert_equal(0, &lines - &cmdheight - winheight(0))
9 new | only!
10 "
11 set splitbelow&vim
12 botright split
13 quit
14 call assert_equal(0, &lines - &cmdheight - winheight(0))
15 new | only!
16 set ls&vim
17endfunc
18
19func Test_window_cmd_cmdwin_with_vsp()
Bram Moolenaar72cf47a2018-05-10 18:23:29 +020020 let efmt = 'Expected 0 but got %d (in ls=%d, %s window)'
Bram Moolenaar991dea32016-05-24 11:31:32 +020021 for v in range(0, 2)
22 exec "set ls=" . v
23 vsplit
24 call feedkeys("q:\<CR>")
25 let ac = &lines - (&cmdheight + winheight(0) + !!v)
26 let emsg = printf(efmt, ac, v, 'left')
27 call assert_equal(0, ac, emsg)
28 wincmd w
29 let ac = &lines - (&cmdheight + winheight(0) + !!v)
30 let emsg = printf(efmt, ac, v, 'right')
31 call assert_equal(0, ac, emsg)
32 new | only!
33 endfor
34 set ls&vim
35endfunc
36
Bram Moolenaar5d2ca042016-06-26 17:11:21 +020037function Test_window_cmd_wincmd_gf()
38 let fname = 'test_gf.txt'
39 let swp_fname = '.' . fname . '.swp'
40 call writefile([], fname)
41 call writefile([], swp_fname)
42 function s:swap_exists()
43 let v:swapchoice = s:swap_choice
44 endfunc
45 augroup test_window_cmd_wincmd_gf
46 autocmd!
47 exec "autocmd SwapExists " . fname . " call s:swap_exists()"
48 augroup END
49
50 call setline(1, fname)
51 " (E)dit anyway
52 let s:swap_choice = 'e'
53 wincmd gf
54 call assert_equal(2, tabpagenr())
55 call assert_equal(fname, bufname("%"))
56 quit!
57
58 " (Q)uit
59 let s:swap_choice = 'q'
60 wincmd gf
61 call assert_equal(1, tabpagenr())
62 call assert_notequal(fname, bufname("%"))
63 new | only!
64
65 call delete(fname)
66 call delete(swp_fname)
67 augroup! test_window_cmd_wincmd_gf
68endfunc
69
Bram Moolenaar4520d442017-03-19 16:09:46 +010070func Test_window_quit()
71 e Xa
72 split Xb
73 call assert_equal(2, winnr('$'))
74 call assert_equal('Xb', bufname(winbufnr(1)))
75 call assert_equal('Xa', bufname(winbufnr(2)))
76
77 wincmd q
78 call assert_equal(1, winnr('$'))
79 call assert_equal('Xa', bufname(winbufnr(1)))
80
81 bw Xa Xb
82endfunc
83
84func Test_window_horizontal_split()
85 call assert_equal(1, winnr('$'))
86 3wincmd s
87 call assert_equal(2, winnr('$'))
88 call assert_equal(3, winheight(0))
89 call assert_equal(winwidth(1), winwidth(2))
90
91 call assert_fails('botright topleft wincmd s', 'E442:')
92 bw
93endfunc
94
95func Test_window_vertical_split()
96 call assert_equal(1, winnr('$'))
97 3wincmd v
98 call assert_equal(2, winnr('$'))
99 call assert_equal(3, winwidth(0))
100 call assert_equal(winheight(1), winheight(2))
101
102 call assert_fails('botright topleft wincmd v', 'E442:')
103 bw
104endfunc
105
106func Test_window_split_edit_alternate()
107 e Xa
108 e Xb
109
110 wincmd ^
111 call assert_equal('Xa', bufname(winbufnr(1)))
112 call assert_equal('Xb', bufname(winbufnr(2)))
113
114 bw Xa Xb
115endfunc
116
117func Test_window_preview()
118 " Open a preview window
119 pedit Xa
120 call assert_equal(2, winnr('$'))
121 call assert_equal(0, &previewwindow)
122
123 " Go to the preview window
124 wincmd P
125 call assert_equal(1, &previewwindow)
126
127 " Close preview window
128 wincmd z
129 call assert_equal(1, winnr('$'))
130 call assert_equal(0, &previewwindow)
131
132 call assert_fails('wincmd P', 'E441:')
133endfunc
134
135func Test_window_exchange()
136 e Xa
137
138 " Nothing happens with window exchange when there is 1 window
139 wincmd x
140 call assert_equal(1, winnr('$'))
141
142 split Xb
143 split Xc
144
145 call assert_equal('Xc', bufname(winbufnr(1)))
146 call assert_equal('Xb', bufname(winbufnr(2)))
147 call assert_equal('Xa', bufname(winbufnr(3)))
148
149 " Exchange current window 1 with window 3
150 3wincmd x
151 call assert_equal('Xa', bufname(winbufnr(1)))
152 call assert_equal('Xb', bufname(winbufnr(2)))
153 call assert_equal('Xc', bufname(winbufnr(3)))
154
155 " Exchange window with next when at the top window
156 wincmd x
157 call assert_equal('Xb', bufname(winbufnr(1)))
158 call assert_equal('Xa', bufname(winbufnr(2)))
159 call assert_equal('Xc', bufname(winbufnr(3)))
160
161 " Exchange window with next when at the middle window
162 wincmd j
163 wincmd x
164 call assert_equal('Xb', bufname(winbufnr(1)))
165 call assert_equal('Xc', bufname(winbufnr(2)))
166 call assert_equal('Xa', bufname(winbufnr(3)))
167
168 " Exchange window with next when at the bottom window.
169 " When there is no next window, it exchanges with the previous window.
170 wincmd j
171 wincmd x
172 call assert_equal('Xb', bufname(winbufnr(1)))
173 call assert_equal('Xa', bufname(winbufnr(2)))
174 call assert_equal('Xc', bufname(winbufnr(3)))
175
176 bw Xa Xb Xc
177endfunc
178
179func Test_window_rotate()
180 e Xa
181 split Xb
182 split Xc
183 call assert_equal('Xc', bufname(winbufnr(1)))
184 call assert_equal('Xb', bufname(winbufnr(2)))
185 call assert_equal('Xa', bufname(winbufnr(3)))
186
187 " Rotate downwards
188 wincmd r
189 call assert_equal('Xa', bufname(winbufnr(1)))
190 call assert_equal('Xc', bufname(winbufnr(2)))
191 call assert_equal('Xb', bufname(winbufnr(3)))
192
193 2wincmd r
194 call assert_equal('Xc', bufname(winbufnr(1)))
195 call assert_equal('Xb', bufname(winbufnr(2)))
196 call assert_equal('Xa', bufname(winbufnr(3)))
197
198 " Rotate upwards
199 wincmd R
200 call assert_equal('Xb', bufname(winbufnr(1)))
201 call assert_equal('Xa', bufname(winbufnr(2)))
202 call assert_equal('Xc', bufname(winbufnr(3)))
203
204 2wincmd R
205 call assert_equal('Xc', bufname(winbufnr(1)))
206 call assert_equal('Xb', bufname(winbufnr(2)))
207 call assert_equal('Xa', bufname(winbufnr(3)))
208
209 bot vsplit
210 call assert_fails('wincmd R', 'E443:')
211
212 bw Xa Xb Xc
213endfunc
214
215func Test_window_height()
216 e Xa
217 split Xb
218
219 let [wh1, wh2] = [winheight(1), winheight(2)]
220 " Active window (1) should have the same height or 1 more
221 " than the other window.
222 call assert_inrange(wh2, wh2 + 1, wh1)
223
224 wincmd -
225 call assert_equal(wh1 - 1, winheight(1))
226 call assert_equal(wh2 + 1, winheight(2))
227
228 wincmd +
229 call assert_equal(wh1, winheight(1))
230 call assert_equal(wh2, winheight(2))
231
232 2wincmd _
233 call assert_equal(2, winheight(1))
234 call assert_equal(wh1 + wh2 - 2, winheight(2))
235
236 wincmd =
237 call assert_equal(wh1, winheight(1))
238 call assert_equal(wh2, winheight(2))
239
240 2wincmd _
241 set winfixheight
242 split Xc
243 let [wh1, wh2, wh3] = [winheight(1), winheight(2), winheight(3)]
244 call assert_equal(2, winheight(2))
245 call assert_inrange(wh3, wh3 + 1, wh1)
246 3wincmd +
247 call assert_equal(2, winheight(2))
248 call assert_equal(wh1 + 3, winheight(1))
249 call assert_equal(wh3 - 3, winheight(3))
250 wincmd =
251 call assert_equal(2, winheight(2))
252 call assert_equal(wh1, winheight(1))
253 call assert_equal(wh3, winheight(3))
254
255 wincmd j
256 set winfixheight&
257
258 wincmd =
259 let [wh1, wh2, wh3] = [winheight(1), winheight(2), winheight(3)]
260 " Current window (2) should have the same height or 1 more
261 " than the other windows.
262 call assert_inrange(wh1, wh1 + 1, wh2)
263 call assert_inrange(wh3, wh3 + 1, wh2)
264
265 bw Xa Xb Xc
266endfunc
267
268func Test_window_width()
269 e Xa
270 vsplit Xb
271
272 let [ww1, ww2] = [winwidth(1), winwidth(2)]
273 " Active window (1) should have the same width or 1 more
274 " than the other window.
275 call assert_inrange(ww2, ww2 + 1, ww1)
276
277 wincmd <
278 call assert_equal(ww1 - 1, winwidth(1))
279 call assert_equal(ww2 + 1, winwidth(2))
280
281 wincmd >
282 call assert_equal(ww1, winwidth(1))
283 call assert_equal(ww2, winwidth(2))
284
285 2wincmd |
286 call assert_equal(2, winwidth(1))
287 call assert_equal(ww1 + ww2 - 2, winwidth(2))
288
289 wincmd =
290 call assert_equal(ww1, winwidth(1))
291 call assert_equal(ww2, winwidth(2))
292
293 2wincmd |
294 set winfixwidth
295 vsplit Xc
296 let [ww1, ww2, ww3] = [winwidth(1), winwidth(2), winwidth(3)]
Bram Moolenaar38e34832017-03-19 20:22:36 +0100297 call assert_equal(2, winwidth(2))
Bram Moolenaar4520d442017-03-19 16:09:46 +0100298 call assert_inrange(ww3, ww3 + 1, ww1)
299 3wincmd >
Bram Moolenaar38e34832017-03-19 20:22:36 +0100300 call assert_equal(2, winwidth(2))
Bram Moolenaar4520d442017-03-19 16:09:46 +0100301 call assert_equal(ww1 + 3, winwidth(1))
302 call assert_equal(ww3 - 3, winwidth(3))
303 wincmd =
Bram Moolenaar38e34832017-03-19 20:22:36 +0100304 call assert_equal(2, winwidth(2))
Bram Moolenaar4520d442017-03-19 16:09:46 +0100305 call assert_equal(ww1, winwidth(1))
306 call assert_equal(ww3, winwidth(3))
307
308 wincmd l
309 set winfixwidth&
310
311 wincmd =
312 let [ww1, ww2, ww3] = [winwidth(1), winwidth(2), winwidth(3)]
313 " Current window (2) should have the same width or 1 more
314 " than the other windows.
315 call assert_inrange(ww1, ww1 + 1, ww2)
316 call assert_inrange(ww3, ww3 + 1, ww2)
317
318 bw Xa Xb Xc
319endfunc
320
Bram Moolenaar8eeeba82017-06-25 22:45:39 +0200321func Test_equalalways_on_close()
322 set equalalways
323 vsplit
324 windo split
325 split
326 wincmd J
327 " now we have a frame top-left with two windows, a frame top-right with two
328 " windows and a frame at the bottom, full-width.
329 let height_1 = winheight(1)
330 let height_2 = winheight(2)
331 let height_3 = winheight(3)
332 let height_4 = winheight(4)
333 " closing the bottom window causes all windows to be resized.
334 close
335 call assert_notequal(height_1, winheight(1))
336 call assert_notequal(height_2, winheight(2))
337 call assert_notequal(height_3, winheight(3))
338 call assert_notequal(height_4, winheight(4))
339 call assert_equal(winheight(1), winheight(3))
340 call assert_equal(winheight(2), winheight(4))
341
342 1wincmd w
343 split
344 4wincmd w
345 resize + 5
346 " left column has three windows, equalized heights.
347 " right column has two windows, top one a bit higher
348 let height_1 = winheight(1)
349 let height_2 = winheight(2)
350 let height_4 = winheight(4)
351 let height_5 = winheight(5)
352 3wincmd w
353 " closing window in left column equalizes heights in left column but not in
354 " the right column
355 close
356 call assert_notequal(height_1, winheight(1))
357 call assert_notequal(height_2, winheight(2))
358 call assert_equal(height_4, winheight(3))
359 call assert_equal(height_5, winheight(4))
360
361 only
362 set equalalways&
363endfunc
364
Bram Moolenaar22044dc2017-12-02 15:43:37 +0100365func Test_win_screenpos()
366 call assert_equal(1, winnr('$'))
367 split
368 vsplit
369 10wincmd _
370 30wincmd |
371 call assert_equal([1, 1], win_screenpos(1))
372 call assert_equal([1, 32], win_screenpos(2))
373 call assert_equal([12, 1], win_screenpos(3))
374 call assert_equal([0, 0], win_screenpos(4))
375 only
376endfunc
377
Bram Moolenaar4520d442017-03-19 16:09:46 +0100378func Test_window_jump_tag()
379 help
380 /iccf
381 call assert_match('^|iccf|', getline('.'))
382 call assert_equal(2, winnr('$'))
383 2wincmd }
384 call assert_equal(3, winnr('$'))
385 call assert_match('^|iccf|', getline('.'))
386 wincmd k
387 call assert_match('\*iccf\*', getline('.'))
388 call assert_equal(2, winheight(0))
389
390 wincmd z
391 set previewheight=4
392 help
393 /bugs
394 wincmd }
395 wincmd k
396 call assert_match('\*bugs\*', getline('.'))
397 call assert_equal(4, winheight(0))
398 set previewheight&
399
400 %bw!
401endfunc
402
403func Test_window_newtab()
404 e Xa
405
406 call assert_equal(1, tabpagenr('$'))
407 call assert_equal("\nAlready only one window", execute('wincmd T'))
408
409 split Xb
410 split Xc
411
412 wincmd T
413 call assert_equal(2, tabpagenr('$'))
414 call assert_equal(['Xb', 'Xa'], map(tabpagebuflist(1), 'bufname(v:val)'))
415 call assert_equal(['Xc' ], map(tabpagebuflist(2), 'bufname(v:val)'))
416
417 %bw!
418endfunc
419
Bram Moolenaarf79225e2017-03-18 23:11:04 +0100420func Test_next_split_all()
421 " This was causing an illegal memory access.
422 n x
423 norm axxx
424 split
425 split
426 s/x
427 s/x
428 all
429 bwipe!
430endfunc
431
Bram Moolenaar75373f32017-08-07 22:02:30 +0200432" Tests for adjusting window and contents
433func GetScreenStr(row)
434 let str = ""
435 for c in range(1,3)
436 let str .= nr2char(screenchar(a:row, c))
437 endfor
438 return str
439endfunc
440
441func Test_window_contents()
442 enew! | only | new
443 call setline(1, range(1,256))
444
445 exe "norm! \<C-W>t\<C-W>=1Gzt\<C-W>w\<C-W>+"
446 redraw
Bram Moolenaar72cf47a2018-05-10 18:23:29 +0200447 let s3 = GetScreenStr(1)
Bram Moolenaar75373f32017-08-07 22:02:30 +0200448 wincmd p
449 call assert_equal(1, line("w0"))
450 call assert_equal('1 ', s3)
451
452 exe "norm! \<C-W>t\<C-W>=50Gzt\<C-W>w\<C-W>+"
453 redraw
Bram Moolenaar72cf47a2018-05-10 18:23:29 +0200454 let s3 = GetScreenStr(1)
Bram Moolenaar75373f32017-08-07 22:02:30 +0200455 wincmd p
456 call assert_equal(50, line("w0"))
457 call assert_equal('50 ', s3)
458
459 exe "norm! \<C-W>t\<C-W>=59Gzt\<C-W>w\<C-W>+"
460 redraw
Bram Moolenaar72cf47a2018-05-10 18:23:29 +0200461 let s3 = GetScreenStr(1)
Bram Moolenaar75373f32017-08-07 22:02:30 +0200462 wincmd p
463 call assert_equal(59, line("w0"))
464 call assert_equal('59 ', s3)
465
466 bwipeout!
467 call test_garbagecollect_now()
468endfunc
469
Bram Moolenaar2efb3232017-12-19 12:27:23 +0100470func Test_window_colon_command()
471 " This was reading invalid memory.
472 exe "norm! v\<C-W>:\<C-U>echo v:version"
473endfunc
474
Bram Moolenaar6f361c92018-01-31 19:06:50 +0100475func Test_access_freed_mem()
476 " This was accessing freed memory
477 au * 0 vs xxx
478 arg 0
479 argadd
480 all
481 all
482 au!
483 bwipe xxx
484endfunc
485
Bram Moolenaar5bab5552018-04-13 20:41:29 +0200486func Test_visual_cleared_after_window_split()
487 new | only!
488 let smd_save = &showmode
489 set showmode
490 let ls_save = &laststatus
491 set laststatus=1
492 call setline(1, ['a', 'b', 'c', 'd', ''])
493 norm! G
494 exe "norm! kkvk"
495 redraw
496 exe "norm! \<C-W>v"
497 redraw
498 " check if '-- VISUAL --' disappeared from command line
499 let columns = range(1, &columns)
500 let cmdlinechars = map(columns, 'nr2char(screenchar(&lines, v:val))')
501 let cmdline = join(cmdlinechars, '')
502 let cmdline_ltrim = substitute(cmdline, '^\s*', "", "")
503 let mode_shown = substitute(cmdline_ltrim, '\s*$', "", "")
504 call assert_equal('', mode_shown)
505 let &showmode = smd_save
506 let &laststatus = ls_save
507 bwipe!
508endfunc
509
Bram Moolenaar72cf47a2018-05-10 18:23:29 +0200510func Test_winrestcmd()
511 2split
512 3vsplit
513 let a = winrestcmd()
514 call assert_equal(2, winheight(0))
515 call assert_equal(3, winwidth(0))
516 wincmd =
517 call assert_notequal(2, winheight(0))
518 call assert_notequal(3, winwidth(0))
519 exe a
520 call assert_equal(2, winheight(0))
521 call assert_equal(3, winwidth(0))
522 only
523endfunc
524
Bram Moolenaar9e4d8212016-08-18 23:04:48 +0200525" vim: shiftwidth=2 sts=2 expandtab