blob: 29d4360f012bff9ddbb83b31b7b6bef868b560de [file] [log] [blame]
Bram Moolenaareca626f2016-12-01 18:47:38 +01001" Test for :mksession, :mkview and :loadview in latin1 encoding
2
3set encoding=latin1
4scriptencoding latin1
5
Bram Moolenaarb46fecd2019-06-15 17:58:09 +02006source check.vim
7CheckFeature mksession
Bram Moolenaareca626f2016-12-01 18:47:38 +01008
Bram Moolenaar4d8bac82018-03-09 21:33:34 +01009source shared.vim
Bram Moolenaar7a39dd72019-06-23 00:50:15 +020010source term_util.vim
Bram Moolenaar4d8bac82018-03-09 21:33:34 +010011
Bram Moolenaar1e15e612019-11-09 17:18:52 +010012" Test for storing global and local argument list in a session file
13" This one must be done first.
14func Test__mksession_arglocal()
15 enew | only
16 n a b c
17 new
18 arglocal
19 mksession! Xtest_mks.out
20
21 %bwipe!
22 %argdelete
23 argglobal
24 source Xtest_mks.out
25 call assert_equal(2, winnr('$'))
26 call assert_equal(2, arglistid(1))
27 call assert_equal(0, arglistid(2))
28
29 %bwipe!
30 %argdelete
31 argglobal
32 call delete('Xtest_mks.out')
33endfunc
34
Bram Moolenaareca626f2016-12-01 18:47:38 +010035func Test_mksession()
36 tabnew
37 let wrap_save = &wrap
38 set sessionoptions=buffers splitbelow fileencoding=latin1
39 call setline(1, [
40 \ 'start:',
41 \ 'no multibyte chAracter',
42 \ ' one leaDing tab',
43 \ ' four leadinG spaces',
44 \ 'two consecutive tabs',
45 \ 'two tabs in one line',
46 \ 'one ä multibyteCharacter',
47 \ 'aä Ä two multiByte characters',
Bram Moolenaar92c1b692018-08-29 21:42:42 +020048 \ 'Aäöü three mulTibyte characters',
49 \ 'short line',
Bram Moolenaareca626f2016-12-01 18:47:38 +010050 \ ])
Bram Moolenaarc9b56b22017-01-29 14:14:09 +010051 let tmpfile = 'Xtemp'
Bram Moolenaareca626f2016-12-01 18:47:38 +010052 exec 'w! ' . tmpfile
53 /^start:
54 set wrap
55 vsplit
56 norm! j16|
57 split
58 norm! j16|
59 split
60 norm! j16|
61 split
62 norm! j8|
63 split
64 norm! j8|
65 split
66 norm! j16|
67 split
68 norm! j16|
69 split
70 norm! j16|
Bram Moolenaar92c1b692018-08-29 21:42:42 +020071 split
72 norm! j$
Bram Moolenaareca626f2016-12-01 18:47:38 +010073 wincmd l
74
75 set nowrap
76 /^start:
77 norm! j16|3zl
78 split
79 norm! j016|3zl
80 split
81 norm! j016|3zl
82 split
83 norm! j08|3zl
84 split
85 norm! j08|3zl
86 split
87 norm! j016|3zl
88 split
89 norm! j016|3zl
90 split
91 norm! j016|3zl
92 split
93 call wincol()
Bram Moolenaarc9b56b22017-01-29 14:14:09 +010094 mksession! Xtest_mks.out
Bram Moolenaar92c1b692018-08-29 21:42:42 +020095 let li = filter(readfile('Xtest_mks.out'), 'v:val =~# "\\(^ *normal! [0$]\\|^ *exe ''normal!\\)"')
Bram Moolenaareca626f2016-12-01 18:47:38 +010096 let expected = [
97 \ 'normal! 016|',
98 \ 'normal! 016|',
99 \ 'normal! 016|',
100 \ 'normal! 08|',
101 \ 'normal! 08|',
102 \ 'normal! 016|',
103 \ 'normal! 016|',
104 \ 'normal! 016|',
Bram Moolenaar92c1b692018-08-29 21:42:42 +0200105 \ 'normal! $',
Bram Moolenaareca626f2016-12-01 18:47:38 +0100106 \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
107 \ " normal! 016|",
108 \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
109 \ " normal! 016|",
110 \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
111 \ " normal! 016|",
112 \ " exe 'normal! ' . s:c . '|zs' . 8 . '|'",
113 \ " normal! 08|",
114 \ " exe 'normal! ' . s:c . '|zs' . 8 . '|'",
115 \ " normal! 08|",
116 \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
117 \ " normal! 016|",
118 \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
119 \ " normal! 016|",
120 \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
121 \ " normal! 016|",
122 \ " exe 'normal! ' . s:c . '|zs' . 16 . '|'",
123 \ " normal! 016|"
124 \ ]
125 call assert_equal(expected, li)
126 tabclose!
127
Bram Moolenaarc9b56b22017-01-29 14:14:09 +0100128 call delete('Xtest_mks.out')
Bram Moolenaareca626f2016-12-01 18:47:38 +0100129 call delete(tmpfile)
130 let &wrap = wrap_save
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100131 set sessionoptions&
Bram Moolenaareca626f2016-12-01 18:47:38 +0100132endfunc
133
Bram Moolenaar36ae89c2017-01-28 17:11:14 +0100134func Test_mksession_winheight()
135 new
Bram Moolenaar1c3c1042018-06-12 16:49:30 +0200136 set winheight=10
137 set winminheight=2
Bram Moolenaarc9b56b22017-01-29 14:14:09 +0100138 mksession! Xtest_mks.out
139 source Xtest_mks.out
Bram Moolenaar36ae89c2017-01-28 17:11:14 +0100140
Bram Moolenaarc9b56b22017-01-29 14:14:09 +0100141 call delete('Xtest_mks.out')
Bram Moolenaar36ae89c2017-01-28 17:11:14 +0100142endfunc
143
Bram Moolenaar1c3c1042018-06-12 16:49:30 +0200144func Test_mksession_large_winheight()
145 set winheight=999
146 mksession! Xtest_mks_winheight.out
147 set winheight&
148 source Xtest_mks_winheight.out
149 call delete('Xtest_mks_winheight.out')
150endfunc
151
Bram Moolenaared18f2c2019-01-24 20:30:52 +0100152func Test_mksession_rtp()
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200153 " TODO: fix problem with backslashes on Win32
154 CheckNotMSWindows
155
Bram Moolenaared18f2c2019-01-24 20:30:52 +0100156 new
157 let _rtp=&rtp
158 " Make a real long (invalid) runtimepath value,
159 " that should exceed PATH_MAX (hopefully)
160 let newrtp=&rtp.',~'.repeat('/foobar', 1000)
161 let newrtp.=",".expand("$HOME")."/.vim"
162 let &rtp=newrtp
163
164 " determine expected value
165 let expected=split(&rtp, ',')
166 let expected = map(expected, '"set runtimepath+=".v:val')
167 let expected = ['set runtimepath='] + expected
168 let expected = map(expected, {v,w -> substitute(w, $HOME, "~", "g")})
169
170 mksession! Xtest_mks.out
171 let &rtp=_rtp
172 let li = filter(readfile('Xtest_mks.out'), 'v:val =~# "runtimepath"')
173 call assert_equal(expected, li)
174
175 call delete('Xtest_mks.out')
176endfunc
177
Bram Moolenaar79da5632017-02-01 22:52:44 +0100178func Test_mksession_arglist()
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200179 %argdel
Bram Moolenaar79da5632017-02-01 22:52:44 +0100180 next file1 file2 file3 file4
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200181 new
182 next | next
Bram Moolenaar79da5632017-02-01 22:52:44 +0100183 mksession! Xtest_mks.out
184 source Xtest_mks.out
185 call assert_equal(['file1', 'file2', 'file3', 'file4'], argv())
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200186 call assert_equal(2, argidx())
187 wincmd w
188 call assert_equal(0, argidx())
Bram Moolenaar79da5632017-02-01 22:52:44 +0100189
190 call delete('Xtest_mks.out')
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200191 enew | only
Bram Moolenaar79da5632017-02-01 22:52:44 +0100192 argdel *
193endfunc
194
Bram Moolenaar4bebc9a2017-08-30 21:07:38 +0200195func Test_mksession_one_buffer_two_windows()
196 edit Xtest1
197 new Xtest2
198 split
199 mksession! Xtest_mks.out
200 let lines = readfile('Xtest_mks.out')
201 let count1 = 0
202 let count2 = 0
203 let count2buf = 0
204 for line in lines
205 if line =~ 'edit \f*Xtest1$'
206 let count1 += 1
207 endif
208 if line =~ 'edit \f\{-}Xtest2'
209 let count2 += 1
210 endif
211 if line =~ 'buffer \f\{-}Xtest2'
212 let count2buf += 1
213 endif
214 endfor
215 call assert_equal(1, count1, 'Xtest1 count')
216 call assert_equal(2, count2, 'Xtest2 count')
217 call assert_equal(2, count2buf, 'Xtest2 buffer count')
218
219 close
220 bwipe!
Bram Moolenaar4bebc9a2017-08-30 21:07:38 +0200221 call delete('Xtest_mks.out')
222endfunc
223
Bram Moolenaar26d4b892018-07-04 22:26:28 +0200224func Test_mksession_lcd_multiple_tabs()
225 tabnew
226 tabnew
Bram Moolenaar81e2ac72018-07-04 22:44:08 +0200227 lcd .
Bram Moolenaar26d4b892018-07-04 22:26:28 +0200228 tabfirst
Bram Moolenaar81e2ac72018-07-04 22:44:08 +0200229 lcd .
Bram Moolenaar26d4b892018-07-04 22:26:28 +0200230 mksession! Xtest_mks.out
231 tabonly
232 source Xtest_mks.out
233 call assert_true(haslocaldir(), 'Tab 1 localdir')
234 tabnext 2
235 call assert_true(!haslocaldir(), 'Tab 2 localdir')
236 tabnext 3
237 call assert_true(haslocaldir(), 'Tab 3 localdir')
238 call delete('Xtest_mks.out')
239endfunc
240
Bram Moolenaar00aa0692019-04-27 20:37:57 +0200241" Test for tabpage-local directory
242func Test_mksession_tcd_multiple_tabs()
243 let save_cwd = getcwd()
244 call mkdir('Xtopdir')
245 cd Xtopdir
246 call mkdir('Xtabdir1')
247 call mkdir('Xtabdir2')
248 call mkdir('Xtabdir3')
249 call mkdir('Xwindir1')
250 call mkdir('Xwindir2')
251 call mkdir('Xwindir3')
252 tcd Xtabdir1
253 botright new
254 wincmd t
255 lcd ../Xwindir1
256 tabnew
257 tcd ../Xtabdir2
258 botright new
259 lcd ../Xwindir2
260 tabnew
261 tcd ../Xtabdir3
262 botright new
263 lcd ../Xwindir3
264 tabfirst
265 1wincmd w
266 mksession! Xtest_mks.out
267 only | tabonly
268 source Xtest_mks.out
269 call assert_equal('Xtabdir1', fnamemodify(getcwd(-1, 1), ':t'))
270 call assert_equal('Xwindir1', fnamemodify(getcwd(1, 1), ':t'))
271 call assert_equal('Xtabdir1', fnamemodify(getcwd(2, 1), ':t'))
272 call assert_equal('Xtabdir2', fnamemodify(getcwd(-1, 2), ':t'))
273 call assert_equal('Xtabdir2', fnamemodify(getcwd(1, 2), ':t'))
274 call assert_equal('Xwindir2', fnamemodify(getcwd(2, 2), ':t'))
275 call assert_equal('Xtabdir3', fnamemodify(getcwd(-1, 3), ':t'))
276 call assert_equal('Xtabdir3', fnamemodify(getcwd(1, 3), ':t'))
277 call assert_equal('Xwindir3', fnamemodify(getcwd(2, 3), ':t'))
Bram Moolenaar5bf46e92019-11-09 18:06:04 +0100278 %bwipe
279 call chdir(save_cwd)
Bram Moolenaar00aa0692019-04-27 20:37:57 +0200280 call delete("Xtopdir", "rf")
281endfunc
282
Bram Moolenaar26d4b892018-07-04 22:26:28 +0200283func Test_mksession_blank_tabs()
284 tabnew
285 tabnew
286 tabnew
287 tabnext 3
288 mksession! Xtest_mks.out
289 tabnew
290 tabnew
291 tabnext 2
292 source Xtest_mks.out
293 call assert_equal(4, tabpagenr('$'), 'session restore should restore number of tabs')
294 call assert_equal(3, tabpagenr(), 'session restore should restore the active tab')
295 call delete('Xtest_mks.out')
296endfunc
297
Bram Moolenaard39e2752019-01-26 20:07:38 +0100298func Test_mksession_buffer_count()
299 set hidden
300
301 " Edit exactly three files in the current session.
302 %bwipe!
303 e Xfoo | tabe Xbar | tabe Xbaz
304 tabdo write
305 mksession! Xtest_mks.out
306
307 " Verify that loading the session does not create additional buffers.
308 %bwipe!
309 source Xtest_mks.out
310 call assert_equal(3, len(getbufinfo()))
311
312 " Clean up.
313 call delete('Xfoo')
314 call delete('Xbar')
315 call delete('Xbaz')
316 call delete('Xtest_mks.out')
317 %bwipe!
318 set hidden&
319endfunc
320
Bram Moolenaare3c74d22019-01-12 16:29:30 +0100321if has('extra_search')
322
323func Test_mksession_hlsearch()
324 set hlsearch
325 mksession! Xtest_mks.out
326 nohlsearch
327 source Xtest_mks.out
328 call assert_equal(1, v:hlsearch, 'session should restore search highlighting state')
329 nohlsearch
330 mksession! Xtest_mks.out
331 source Xtest_mks.out
332 call assert_equal(0, v:hlsearch, 'session should restore search highlighting state')
333 call delete('Xtest_mks.out')
334endfunc
335
336endif
337
338
Bram Moolenaar26d4b892018-07-04 22:26:28 +0200339func Test_mksession_blank_windows()
340 split
341 split
342 split
343 3 wincmd w
344 mksession! Xtest_mks.out
345 split
346 split
347 2 wincmd w
348 source Xtest_mks.out
349 call assert_equal(4, winnr('$'), 'session restore should restore number of windows')
350 call assert_equal(3, winnr(), 'session restore should restore the active window')
351 call delete('Xtest_mks.out')
352endfunc
353
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100354func Test_mksession_terminal_shell()
Bram Moolenaarc2c82052020-09-11 22:10:22 +0200355 CheckFeature terminal
Bram Moolenaar5a4c3082019-12-01 15:23:11 +0100356 CheckFeature quickfix
357
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100358 terminal
359 mksession! Xtest_mks.out
360 let lines = readfile('Xtest_mks.out')
361 let term_cmd = ''
362 for line in lines
363 if line =~ '^terminal'
364 let term_cmd = line
365 elseif line =~ 'badd.*' . &shell
366 call assert_report('unexpected shell line: ' . line)
367 endif
368 endfor
Bram Moolenaaraa5df7e2019-02-03 14:53:10 +0100369 call assert_match('terminal ++curwin ++cols=\d\+ ++rows=\d\+\s*.*$', term_cmd)
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100370
Bram Moolenaar7a39dd72019-06-23 00:50:15 +0200371 call StopShellInTerminal(bufnr('%'))
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100372 call delete('Xtest_mks.out')
373endfunc
374
375func Test_mksession_terminal_no_restore_cmdarg()
Bram Moolenaarc2c82052020-09-11 22:10:22 +0200376 CheckFeature terminal
377
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100378 terminal ++norestore
379 mksession! Xtest_mks.out
380 let lines = readfile('Xtest_mks.out')
381 let term_cmd = ''
382 for line in lines
383 if line =~ '^terminal'
Bram Moolenaarac665c22020-12-08 20:39:15 +0100384 call assert_report('session must not restore terminal')
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100385 endif
386 endfor
387
Bram Moolenaar7a39dd72019-06-23 00:50:15 +0200388 call StopShellInTerminal(bufnr('%'))
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100389 call delete('Xtest_mks.out')
390endfunc
391
392func Test_mksession_terminal_no_restore_funcarg()
Bram Moolenaarc2c82052020-09-11 22:10:22 +0200393 CheckFeature terminal
394
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100395 call term_start(&shell, {'norestore': 1})
396 mksession! Xtest_mks.out
397 let lines = readfile('Xtest_mks.out')
398 let term_cmd = ''
399 for line in lines
400 if line =~ '^terminal'
Bram Moolenaarac665c22020-12-08 20:39:15 +0100401 call assert_report('session must not restore terminal')
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100402 endif
403 endfor
404
Bram Moolenaar7a39dd72019-06-23 00:50:15 +0200405 call StopShellInTerminal(bufnr('%'))
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100406 call delete('Xtest_mks.out')
407endfunc
408
409func Test_mksession_terminal_no_restore_func()
Bram Moolenaarc2c82052020-09-11 22:10:22 +0200410 CheckFeature terminal
411
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100412 terminal
413 call term_setrestore(bufnr('%'), 'NONE')
414 mksession! Xtest_mks.out
415 let lines = readfile('Xtest_mks.out')
416 let term_cmd = ''
417 for line in lines
418 if line =~ '^terminal'
Bram Moolenaarac665c22020-12-08 20:39:15 +0100419 call assert_report('session must not restore terminal')
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100420 endif
421 endfor
422
Bram Moolenaar7a39dd72019-06-23 00:50:15 +0200423 call StopShellInTerminal(bufnr('%'))
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100424 call delete('Xtest_mks.out')
425endfunc
426
427func Test_mksession_terminal_no_ssop()
Bram Moolenaarc2c82052020-09-11 22:10:22 +0200428 CheckFeature terminal
429
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100430 terminal
431 set sessionoptions-=terminal
432 mksession! Xtest_mks.out
433 let lines = readfile('Xtest_mks.out')
434 let term_cmd = ''
435 for line in lines
436 if line =~ '^terminal'
Bram Moolenaarac665c22020-12-08 20:39:15 +0100437 call assert_report('session must not restore terminal')
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100438 endif
439 endfor
440
Bram Moolenaar7a39dd72019-06-23 00:50:15 +0200441 call StopShellInTerminal(bufnr('%'))
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100442 call delete('Xtest_mks.out')
443 set sessionoptions&
444endfunc
445
446func Test_mksession_terminal_restore_other()
Bram Moolenaarc2c82052020-09-11 22:10:22 +0200447 CheckFeature terminal
Bram Moolenaar5a4c3082019-12-01 15:23:11 +0100448 CheckFeature quickfix
449
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100450 terminal
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200451 eval bufnr('%')->term_setrestore('other')
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100452 mksession! Xtest_mks.out
453 let lines = readfile('Xtest_mks.out')
454 let term_cmd = ''
455 for line in lines
456 if line =~ '^terminal'
457 let term_cmd = line
458 endif
459 endfor
Bram Moolenaaraa5df7e2019-02-03 14:53:10 +0100460 call assert_match('terminal ++curwin ++cols=\d\+ ++rows=\d\+.*other', term_cmd)
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100461
Bram Moolenaar7a39dd72019-06-23 00:50:15 +0200462 call StopShellInTerminal(bufnr('%'))
Bram Moolenaar4d8bac82018-03-09 21:33:34 +0100463 call delete('Xtest_mks.out')
464endfunc
465
Bram Moolenaar0e655112020-09-11 20:36:36 +0200466func Test_mksession_terminal_shared_windows()
Bram Moolenaarc2c82052020-09-11 22:10:22 +0200467 CheckFeature terminal
468
Bram Moolenaar0e655112020-09-11 20:36:36 +0200469 terminal
470 let term_buf = bufnr()
471 new
472 execute "buffer" term_buf
473 mksession! Xtest_mks.out
474
475 let lines = readfile('Xtest_mks.out')
476 let found_creation = 0
477 let found_use = 0
478
479 for line in lines
480 if line =~ '^terminal'
481 let found_creation = 1
482 call assert_match('terminal ++curwin ++cols=\d\+ ++rows=\d\+', line)
483 elseif line =~ "^execute 'buffer ' . s:term_buf_" . term_buf . "$"
484 let found_use = 1
485 endif
486 endfor
487
488 call assert_true(found_creation && found_use)
489
490 call StopShellInTerminal(term_buf)
491 call delete('Xtest_mks.out')
492endfunc
493
Bram Moolenaarc2c82052020-09-11 22:10:22 +0200494func Test_mkview_terminal_windows()
495 CheckFeature terminal
496
497 " create two window on the same terminal to check this is handled OK
498 terminal
499 let term_buf = bufnr()
500 exe 'sbuf ' .. term_buf
501 mkview! Xtestview
502
503 call StopShellInTerminal(term_buf)
504 call delete('Xtestview')
505endfunc
Bram Moolenaar4bebc9a2017-08-30 21:07:38 +0200506
Bram Moolenaarf9547eb2021-02-01 19:24:55 +0100507func Test_mkview_open_folds()
508 enew!
509
510 call append(0, ['a', 'b', 'c'])
511 1,3fold
512 " zR affects 'foldlevel', make sure the option is applied after the folds
513 " have been recreated.
514 normal zR
515 write! Xtestfile
516
517 call assert_equal(-1, foldclosed(1))
518 call assert_equal(-1, foldclosed(2))
519 call assert_equal(-1, foldclosed(3))
520
521 mkview! Xtestview
522 source Xtestview
523
524 call assert_equal(-1, foldclosed(1))
525 call assert_equal(-1, foldclosed(2))
526 call assert_equal(-1, foldclosed(3))
527
528 call delete('Xtestview')
529 call delete('Xtestfile')
530 %bwipe
531endfunc
532
Bram Moolenaar139348f2021-02-05 21:55:53 +0100533func Test_mkview_no_balt()
534 edit Xtestfile1
535 edit Xtestfile2
536
537 mkview! Xtestview
538 bdelete Xtestfile1
539
540 source Xtestview
541 call assert_equal(0, buflisted('Xtestfile1'))
542
543 call delete('Xtestview')
544 %bwipe
545endfunc
546
Bram Moolenaar0756f752021-03-13 13:52:33 +0100547func Test_mksession_no_balt()
548 edit Xtestfile1
549 edit Xtestfile2
550
551 bdelete Xtestfile1
552 mksession! Xtestview
553
554 source Xtestview
555 call assert_equal(0, buflisted('Xtestfile1'))
556
557 call delete('Xtestview')
558 %bwipe
559endfunc
560
Bram Moolenaar627cb6a2018-08-28 22:19:31 +0200561" Test :mkview with a file argument.
562func Test_mkview_file()
563 " Create a view with line number and a fold.
564 help :mkview
565 set number
Bram Moolenaar2bf4fe02018-08-30 14:04:25 +0200566 norm! V}zf0
Bram Moolenaardd5d18e2018-08-30 14:16:06 +0200567 let pos = getpos('.')
Bram Moolenaar627cb6a2018-08-28 22:19:31 +0200568 let linefoldclosed1 = foldclosed('.')
569 mkview! Xview
570 set nonumber
571 norm! zrj
572 " We can close the help window, as mkview with a file name should
573 " generate a command to edit the file.
574 helpclose
575
576 source Xview
577 call assert_equal(1, &number)
578 call assert_match('\*:mkview\*$', getline('.'))
Bram Moolenaardd5d18e2018-08-30 14:16:06 +0200579 call assert_equal(pos, getpos('.'))
Bram Moolenaar627cb6a2018-08-28 22:19:31 +0200580 call assert_equal(linefoldclosed1, foldclosed('.'))
581
582 " Creating a view again with the same file name should fail (file
583 " already exists). But with a !, the previous view should be
584 " overwritten without error.
585 help :loadview
586 call assert_fails('mkview Xview', 'E189:')
587 call assert_match('\*:loadview\*$', getline('.'))
588 mkview! Xview
589 call assert_match('\*:loadview\*$', getline('.'))
590
591 call delete('Xview')
592 bwipe
593endfunc
594
595" Test :mkview and :loadview with a custom 'viewdir'.
596func Test_mkview_loadview_with_viewdir()
597 set viewdir=Xviewdir
598
599 help :mkview
600 set number
601 norm! V}zf
Bram Moolenaardd5d18e2018-08-30 14:16:06 +0200602 let pos = getpos('.')
Bram Moolenaar627cb6a2018-08-28 22:19:31 +0200603 let linefoldclosed1 = foldclosed('.')
604 mkview 1
605 set nonumber
606 norm! zrj
607
608 loadview 1
609
610 " The directory Xviewdir/ should have been created and the view
611 " should be stored in that directory.
612 call assert_equal('Xviewdir/' .
613 \ substitute(
614 \ substitute(
615 \ expand('%:p'), '/', '=+', 'g'), ':', '=-', 'g') . '=1.vim',
616 \ glob('Xviewdir/*'))
617 call assert_equal(1, &number)
618 call assert_match('\*:mkview\*$', getline('.'))
Bram Moolenaardd5d18e2018-08-30 14:16:06 +0200619 call assert_equal(pos, getpos('.'))
Bram Moolenaar627cb6a2018-08-28 22:19:31 +0200620 call assert_equal(linefoldclosed1, foldclosed('.'))
621
622 call delete('Xviewdir', 'rf')
623 set viewdir&
624 helpclose
625endfunc
626
627func Test_mkview_no_file_name()
628 new
629 " :mkview or :mkview {nr} should fail in a unnamed buffer.
630 call assert_fails('mkview', 'E32:')
631 call assert_fails('mkview 1', 'E32:')
632
633 " :mkview {file} should succeed in a unnamed buffer.
634 mkview Xview
635 help
636 source Xview
637 call assert_equal('', bufname('%'))
638
639 call delete('Xview')
640 %bwipe
641endfunc
Bram Moolenaar79da5632017-02-01 22:52:44 +0100642
Bram Moolenaar3482be62020-11-27 11:00:38 +0100643func Test_mkview_loadview_jumplist()
644 set viewdir=Xviewdir
645 au BufWinLeave * silent mkview
646 au BufWinEnter * silent loadview
647
648 edit Xfile1
649 call setline(1, ['a', 'bbbbbbb', 'c'])
650 normal j3l
651 call assert_equal([2, 4], getcurpos()[1:2])
652 write
653
654 edit Xfile2
655 call setline(1, ['d', 'eeeeeee', 'f'])
656 normal j5l
657 call assert_equal([2, 6], getcurpos()[1:2])
658 write
659
660 edit Xfile3
661 call setline(1, ['g', 'h', 'iiiii'])
662 normal jj3l
663 call assert_equal([3, 4], getcurpos()[1:2])
664 write
665
666 edit Xfile1
667 call assert_equal([2, 4], getcurpos()[1:2])
668 edit Xfile2
669 call assert_equal([2, 6], getcurpos()[1:2])
670 edit Xfile3
671 call assert_equal([3, 4], getcurpos()[1:2])
672
673 exe "normal \<C-O>"
674 call assert_equal('Xfile2', expand('%'))
675 call assert_equal([2, 6], getcurpos()[1:2])
676 exe "normal \<C-O>"
677 call assert_equal('Xfile1', expand('%'))
678 call assert_equal([2, 4], getcurpos()[1:2])
679
680 au! BufWinLeave
681 au! BufWinEnter
682 bwipe!
683 call delete('Xviewdir', 'rf')
684 call delete('Xfile1')
685 call delete('Xfile2')
686 call delete('Xfile3')
687 set viewdir&
688endfunc
689
Bram Moolenaar555de4e2019-01-21 23:03:49 +0100690" A clean session (one empty buffer, one window, and one tab) should not
691" set any error messages when sourced because no commands should fail.
692func Test_mksession_no_errmsg()
693 let v:errmsg = ''
694 %bwipe!
695 mksession! Xtest_mks.out
696 source Xtest_mks.out
697 call assert_equal('', v:errmsg)
698 call delete('Xtest_mks.out')
699endfunc
700
Bram Moolenaarad36a352019-01-24 13:34:42 +0100701func Test_mksession_quote_in_filename()
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200702 " only Unix can handle this weird filename
703 CheckUnix
704
Bram Moolenaarad36a352019-01-24 13:34:42 +0100705 let v:errmsg = ''
706 %bwipe!
707 split another
708 split x'y\"z
709 mksession! Xtest_mks_quoted.out
710 %bwipe!
711 source Xtest_mks_quoted.out
712 call assert_true(bufexists("x'y\"z"))
713
714 %bwipe!
715 call delete('Xtest_mks_quoted.out')
716endfunc
717
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200718" Test for storing global variables in a session file
719func Test_mksession_globals()
720 set sessionoptions+=globals
721
722 " create different global variables
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200723 let g:Global_string = "Sun is shining\r\n"
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200724 let g:Global_count = 100
725 let g:Global_pi = 3.14
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200726 let g:Global_neg_float = -2.68
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200727
728 mksession! Xtest_mks.out
729
730 unlet g:Global_string
731 unlet g:Global_count
732 unlet g:Global_pi
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200733 unlet g:Global_neg_float
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200734
735 source Xtest_mks.out
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200736 call assert_equal("Sun is shining\r\n", g:Global_string)
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200737 call assert_equal(100, g:Global_count)
738 call assert_equal(3.14, g:Global_pi)
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200739 call assert_equal(-2.68, g:Global_neg_float)
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200740
741 unlet g:Global_string
742 unlet g:Global_count
743 unlet g:Global_pi
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200744 unlet g:Global_neg_float
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200745 call delete('Xtest_mks.out')
746 set sessionoptions&
747endfunc
748
749" Test for changing backslash to forward slash in filenames
750func Test_mksession_slash()
Bram Moolenaar37ac4a52019-09-28 19:29:04 +0200751 if exists('+shellslash')
752 throw 'Skipped: cannot use backslash in file name'
753 endif
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200754 enew
755 %bwipe!
756 e a\\b\\c
757 mksession! Xtest_mks1.out
758 set sessionoptions+=slash
759 mksession! Xtest_mks2.out
760
761 %bwipe!
762 source Xtest_mks1.out
763 call assert_equal('a\b\c', bufname(''))
764 %bwipe!
765 source Xtest_mks2.out
766 call assert_equal('a/b/c', bufname(''))
767
768 %bwipe!
769 call delete('Xtest_mks1.out')
770 call delete('Xtest_mks2.out')
771 set sessionoptions&
772endfunc
773
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200774" Test for changing directory to the session file directory
775func Test_mksession_sesdir()
Bram Moolenaar5bf46e92019-11-09 18:06:04 +0100776 let save_cwd = getcwd()
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200777 call mkdir('Xproj')
778 mksession! Xproj/Xtest_mks1.out
779 set sessionoptions-=curdir
780 set sessionoptions+=sesdir
781 mksession! Xproj/Xtest_mks2.out
782
783 source Xproj/Xtest_mks1.out
784 call assert_equal('testdir', fnamemodify(getcwd(), ':t'))
785 source Xproj/Xtest_mks2.out
786 call assert_equal('Xproj', fnamemodify(getcwd(), ':t'))
Bram Moolenaar5bf46e92019-11-09 18:06:04 +0100787 call chdir(save_cwd)
788 %bwipe
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200789
790 set sessionoptions&
791 call delete('Xproj', 'rf')
792endfunc
793
794" Test for storing the 'lines' and 'columns' settings
795func Test_mksession_resize()
796 mksession! Xtest_mks1.out
797 set sessionoptions+=resize
798 mksession! Xtest_mks2.out
799
800 let lines = readfile('Xtest_mks1.out')
801 let found_resize = v:false
802 for line in lines
803 if line =~ '^set lines='
804 let found_resize = v:true
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200805 break
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200806 endif
807 endfor
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200808 call assert_false(found_resize)
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200809 let lines = readfile('Xtest_mks2.out')
810 let found_resize = v:false
811 for line in lines
812 if line =~ '^set lines='
813 let found_resize = v:true
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200814 break
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200815 endif
816 endfor
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200817 call assert_true(found_resize)
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200818
819 call delete('Xtest_mks1.out')
820 call delete('Xtest_mks2.out')
821 set sessionoptions&
822endfunc
823
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200824" Test for mksession with a named scratch buffer
825func Test_mksession_scratch()
826 enew | only
827 file Xscratch
828 set buftype=nofile
829 mksession! Xtest_mks.out
830 %bwipe
831 source Xtest_mks.out
832 call assert_equal('Xscratch', bufname(''))
833 call assert_equal('nofile', &buftype)
834 %bwipe
835 call delete('Xtest_mks.out')
836endfunc
837
838" Test for mksession with fold options
839func Test_mksession_foldopt()
840 set sessionoptions-=options
841 set sessionoptions+=folds
842 new
843 setlocal foldenable
844 setlocal foldmethod=expr
845 setlocal foldmarker=<<<,>>>
846 setlocal foldignore=%
847 setlocal foldlevel=2
848 setlocal foldminlines=10
849 setlocal foldnestmax=15
850 mksession! Xtest_mks.out
851 close
852 %bwipe
853
854 source Xtest_mks.out
855 call assert_true(&foldenable)
856 call assert_equal('expr', &foldmethod)
857 call assert_equal('<<<,>>>', &foldmarker)
858 call assert_equal('%', &foldignore)
859 call assert_equal(2, &foldlevel)
860 call assert_equal(10, &foldminlines)
861 call assert_equal(15, &foldnestmax)
862
863 close
864 %bwipe
865 set sessionoptions&
866endfunc
867
868" Test for mksession with window position
869func Test_mksession_winpos()
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200870 " Only applicable in GUI Vim
871 CheckGui
872
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200873 set sessionoptions+=winpos
874 mksession! Xtest_mks.out
875 let found_winpos = v:false
876 let lines = readfile('Xtest_mks.out')
877 for line in lines
878 if line =~ '^winpos '
879 let found_winpos = v:true
880 break
881 endif
882 endfor
883 call assert_true(found_winpos)
884 call delete('Xtest_mks.out')
885 set sessionoptions&
886endfunc
887
888" Test for mksession with 'compatible' option
889func Test_mksession_compatible()
890 mksession! Xtest_mks1.out
891 set compatible
892 mksession! Xtest_mks2.out
893 set nocp
894
895 let test_success = v:false
896 let lines = readfile('Xtest_mks1.out')
897 for line in lines
898 if line =~ '^if &cp | set nocp | endif'
899 let test_success = v:true
900 break
901 endif
902 endfor
903 call assert_true(test_success)
904
905 let test_success = v:false
906 let lines = readfile('Xtest_mks2.out')
907 for line in lines
908 if line =~ '^if !&cp | set cp | endif'
909 let test_success = v:true
910 break
911 endif
912 endfor
913 call assert_true(test_success)
914
915 call delete('Xtest_mks1.out')
916 call delete('Xtest_mks2.out')
917 set compatible&
918 set sessionoptions&
919endfunc
920
Bram Moolenaar87500262019-08-01 23:05:49 +0200921func s:ClearMappings()
922 mapclear
923 omapclear
924 mapclear!
925 lmapclear
926 tmapclear
927endfunc
928
929func Test_mkvimrc()
930 let entries = [
931 \ ['', 'nothing', '<Nop>'],
932 \ ['n', 'normal', 'NORMAL'],
933 \ ['v', 'visual', 'VISUAL'],
934 \ ['s', 'select', 'SELECT'],
935 \ ['x', 'visualonly', 'VISUALONLY'],
936 \ ['o', 'operator', 'OPERATOR'],
937 \ ['i', 'insert', 'INSERT'],
938 \ ['l', 'lang', 'LANG'],
939 \ ['c', 'command', 'COMMAND'],
940 \ ['t', 'terminal', 'TERMINAL'],
941 \ ]
942 for entry in entries
943 exe entry[0] .. 'map ' .. entry[1] .. ' ' .. entry[2]
944 endfor
945
946 mkvimrc Xtestvimrc
947
948 call s:ClearMappings()
949 for entry in entries
950 call assert_equal('', maparg(entry[1], entry[0]))
951 endfor
952
953 source Xtestvimrc
954
955 for entry in entries
956 call assert_equal(entry[2], maparg(entry[1], entry[0]))
957 endfor
958
959 call s:ClearMappings()
960 call delete('Xtestvimrc')
961endfunc
962
Bram Moolenaar38890832020-11-01 17:40:54 +0100963func Test_scrolloff()
964 set sessionoptions+=localoptions
965 setlocal so=1 siso=1
966 mksession! Xtest_mks.out
967 setlocal so=-1 siso=-1
968 source Xtest_mks.out
969 call assert_equal(1, &l:so)
970 call assert_equal(1, &l:siso)
971 call delete('Xtest_mks.out')
972 setlocal so& siso&
973 set sessionoptions&
974endfunc
975
Bram Moolenaar3482be62020-11-27 11:00:38 +0100976func Test_altfile()
977 edit Xone
978 split Xtwo
979 edit Xtwoalt
980 edit #
981 wincmd w
982 edit Xonealt
983 edit #
984 mksession! Xtest_altfile
985 only
986 bwipe Xonealt
987 bwipe Xtwoalt
988 bwipe!
989 source Xtest_altfile
990 call assert_equal('Xone', bufname())
991 call assert_equal('Xonealt', bufname('#'))
992 wincmd w
993 call assert_equal('Xtwo', bufname())
994 call assert_equal('Xtwoalt', bufname('#'))
995 only
996 bwipe!
Bram Moolenaarac665c22020-12-08 20:39:15 +0100997 call delete('Xtest_altfile')
Bram Moolenaar3482be62020-11-27 11:00:38 +0100998endfunc
999
Bram Moolenaar5c504f62021-04-01 13:39:51 +02001000" Test for creating views with manual folds
1001func Test_mkview_manual_fold()
1002 call writefile(range(1,10), 'Xfile')
1003 new Xfile
1004 " create recursive folds
1005 5,6fold
1006 4,7fold
1007 mkview Xview
1008 normal zE
1009 source Xview
1010 call assert_equal([-1, 4, 4, 4, 4, -1], [foldclosed(3), foldclosed(4),
1011 \ foldclosed(5), foldclosed(6), foldclosed(7), foldclosed(8)])
1012 " open one level of fold
1013 4foldopen
1014 mkview! Xview
1015 normal zE
1016 source Xview
1017 call assert_equal([-1, -1, 5, 5, -1, -1], [foldclosed(3), foldclosed(4),
1018 \ foldclosed(5), foldclosed(6), foldclosed(7), foldclosed(8)])
1019 " open all the folds
1020 %foldopen!
1021 mkview! Xview
1022 normal zE
1023 source Xview
1024 call assert_equal([-1, -1, -1, -1, -1, -1], [foldclosed(3), foldclosed(4),
1025 \ foldclosed(5), foldclosed(6), foldclosed(7), foldclosed(8)])
1026 call delete('Xfile')
1027 call delete('Xview')
1028 bw!
1029endfunc
1030
Bram Moolenaareca626f2016-12-01 18:47:38 +01001031" vim: shiftwidth=2 sts=2 expandtab