blob: 82c96ce6396a836cd8a6c80c821de13f92420f67 [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 Moolenaar627cb6a2018-08-28 22:19:31 +0200533" Test :mkview with a file argument.
534func Test_mkview_file()
535 " Create a view with line number and a fold.
536 help :mkview
537 set number
Bram Moolenaar2bf4fe02018-08-30 14:04:25 +0200538 norm! V}zf0
Bram Moolenaardd5d18e2018-08-30 14:16:06 +0200539 let pos = getpos('.')
Bram Moolenaar627cb6a2018-08-28 22:19:31 +0200540 let linefoldclosed1 = foldclosed('.')
541 mkview! Xview
542 set nonumber
543 norm! zrj
544 " We can close the help window, as mkview with a file name should
545 " generate a command to edit the file.
546 helpclose
547
548 source Xview
549 call assert_equal(1, &number)
550 call assert_match('\*:mkview\*$', getline('.'))
Bram Moolenaardd5d18e2018-08-30 14:16:06 +0200551 call assert_equal(pos, getpos('.'))
Bram Moolenaar627cb6a2018-08-28 22:19:31 +0200552 call assert_equal(linefoldclosed1, foldclosed('.'))
553
554 " Creating a view again with the same file name should fail (file
555 " already exists). But with a !, the previous view should be
556 " overwritten without error.
557 help :loadview
558 call assert_fails('mkview Xview', 'E189:')
559 call assert_match('\*:loadview\*$', getline('.'))
560 mkview! Xview
561 call assert_match('\*:loadview\*$', getline('.'))
562
563 call delete('Xview')
564 bwipe
565endfunc
566
567" Test :mkview and :loadview with a custom 'viewdir'.
568func Test_mkview_loadview_with_viewdir()
569 set viewdir=Xviewdir
570
571 help :mkview
572 set number
573 norm! V}zf
Bram Moolenaardd5d18e2018-08-30 14:16:06 +0200574 let pos = getpos('.')
Bram Moolenaar627cb6a2018-08-28 22:19:31 +0200575 let linefoldclosed1 = foldclosed('.')
576 mkview 1
577 set nonumber
578 norm! zrj
579
580 loadview 1
581
582 " The directory Xviewdir/ should have been created and the view
583 " should be stored in that directory.
584 call assert_equal('Xviewdir/' .
585 \ substitute(
586 \ substitute(
587 \ expand('%:p'), '/', '=+', 'g'), ':', '=-', 'g') . '=1.vim',
588 \ glob('Xviewdir/*'))
589 call assert_equal(1, &number)
590 call assert_match('\*:mkview\*$', getline('.'))
Bram Moolenaardd5d18e2018-08-30 14:16:06 +0200591 call assert_equal(pos, getpos('.'))
Bram Moolenaar627cb6a2018-08-28 22:19:31 +0200592 call assert_equal(linefoldclosed1, foldclosed('.'))
593
594 call delete('Xviewdir', 'rf')
595 set viewdir&
596 helpclose
597endfunc
598
599func Test_mkview_no_file_name()
600 new
601 " :mkview or :mkview {nr} should fail in a unnamed buffer.
602 call assert_fails('mkview', 'E32:')
603 call assert_fails('mkview 1', 'E32:')
604
605 " :mkview {file} should succeed in a unnamed buffer.
606 mkview Xview
607 help
608 source Xview
609 call assert_equal('', bufname('%'))
610
611 call delete('Xview')
612 %bwipe
613endfunc
Bram Moolenaar79da5632017-02-01 22:52:44 +0100614
Bram Moolenaar3482be62020-11-27 11:00:38 +0100615func Test_mkview_loadview_jumplist()
616 set viewdir=Xviewdir
617 au BufWinLeave * silent mkview
618 au BufWinEnter * silent loadview
619
620 edit Xfile1
621 call setline(1, ['a', 'bbbbbbb', 'c'])
622 normal j3l
623 call assert_equal([2, 4], getcurpos()[1:2])
624 write
625
626 edit Xfile2
627 call setline(1, ['d', 'eeeeeee', 'f'])
628 normal j5l
629 call assert_equal([2, 6], getcurpos()[1:2])
630 write
631
632 edit Xfile3
633 call setline(1, ['g', 'h', 'iiiii'])
634 normal jj3l
635 call assert_equal([3, 4], getcurpos()[1:2])
636 write
637
638 edit Xfile1
639 call assert_equal([2, 4], getcurpos()[1:2])
640 edit Xfile2
641 call assert_equal([2, 6], getcurpos()[1:2])
642 edit Xfile3
643 call assert_equal([3, 4], getcurpos()[1:2])
644
645 exe "normal \<C-O>"
646 call assert_equal('Xfile2', expand('%'))
647 call assert_equal([2, 6], getcurpos()[1:2])
648 exe "normal \<C-O>"
649 call assert_equal('Xfile1', expand('%'))
650 call assert_equal([2, 4], getcurpos()[1:2])
651
652 au! BufWinLeave
653 au! BufWinEnter
654 bwipe!
655 call delete('Xviewdir', 'rf')
656 call delete('Xfile1')
657 call delete('Xfile2')
658 call delete('Xfile3')
659 set viewdir&
660endfunc
661
Bram Moolenaar555de4e2019-01-21 23:03:49 +0100662" A clean session (one empty buffer, one window, and one tab) should not
663" set any error messages when sourced because no commands should fail.
664func Test_mksession_no_errmsg()
665 let v:errmsg = ''
666 %bwipe!
667 mksession! Xtest_mks.out
668 source Xtest_mks.out
669 call assert_equal('', v:errmsg)
670 call delete('Xtest_mks.out')
671endfunc
672
Bram Moolenaarad36a352019-01-24 13:34:42 +0100673func Test_mksession_quote_in_filename()
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200674 " only Unix can handle this weird filename
675 CheckUnix
676
Bram Moolenaarad36a352019-01-24 13:34:42 +0100677 let v:errmsg = ''
678 %bwipe!
679 split another
680 split x'y\"z
681 mksession! Xtest_mks_quoted.out
682 %bwipe!
683 source Xtest_mks_quoted.out
684 call assert_true(bufexists("x'y\"z"))
685
686 %bwipe!
687 call delete('Xtest_mks_quoted.out')
688endfunc
689
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200690" Test for storing global variables in a session file
691func Test_mksession_globals()
692 set sessionoptions+=globals
693
694 " create different global variables
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200695 let g:Global_string = "Sun is shining\r\n"
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200696 let g:Global_count = 100
697 let g:Global_pi = 3.14
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200698 let g:Global_neg_float = -2.68
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200699
700 mksession! Xtest_mks.out
701
702 unlet g:Global_string
703 unlet g:Global_count
704 unlet g:Global_pi
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200705 unlet g:Global_neg_float
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200706
707 source Xtest_mks.out
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200708 call assert_equal("Sun is shining\r\n", g:Global_string)
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200709 call assert_equal(100, g:Global_count)
710 call assert_equal(3.14, g:Global_pi)
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200711 call assert_equal(-2.68, g:Global_neg_float)
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200712
713 unlet g:Global_string
714 unlet g:Global_count
715 unlet g:Global_pi
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200716 unlet g:Global_neg_float
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200717 call delete('Xtest_mks.out')
718 set sessionoptions&
719endfunc
720
721" Test for changing backslash to forward slash in filenames
722func Test_mksession_slash()
Bram Moolenaar37ac4a52019-09-28 19:29:04 +0200723 if exists('+shellslash')
724 throw 'Skipped: cannot use backslash in file name'
725 endif
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200726 enew
727 %bwipe!
728 e a\\b\\c
729 mksession! Xtest_mks1.out
730 set sessionoptions+=slash
731 mksession! Xtest_mks2.out
732
733 %bwipe!
734 source Xtest_mks1.out
735 call assert_equal('a\b\c', bufname(''))
736 %bwipe!
737 source Xtest_mks2.out
738 call assert_equal('a/b/c', bufname(''))
739
740 %bwipe!
741 call delete('Xtest_mks1.out')
742 call delete('Xtest_mks2.out')
743 set sessionoptions&
744endfunc
745
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200746" Test for changing directory to the session file directory
747func Test_mksession_sesdir()
Bram Moolenaar5bf46e92019-11-09 18:06:04 +0100748 let save_cwd = getcwd()
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200749 call mkdir('Xproj')
750 mksession! Xproj/Xtest_mks1.out
751 set sessionoptions-=curdir
752 set sessionoptions+=sesdir
753 mksession! Xproj/Xtest_mks2.out
754
755 source Xproj/Xtest_mks1.out
756 call assert_equal('testdir', fnamemodify(getcwd(), ':t'))
757 source Xproj/Xtest_mks2.out
758 call assert_equal('Xproj', fnamemodify(getcwd(), ':t'))
Bram Moolenaar5bf46e92019-11-09 18:06:04 +0100759 call chdir(save_cwd)
760 %bwipe
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200761
762 set sessionoptions&
763 call delete('Xproj', 'rf')
764endfunc
765
766" Test for storing the 'lines' and 'columns' settings
767func Test_mksession_resize()
768 mksession! Xtest_mks1.out
769 set sessionoptions+=resize
770 mksession! Xtest_mks2.out
771
772 let lines = readfile('Xtest_mks1.out')
773 let found_resize = v:false
774 for line in lines
775 if line =~ '^set lines='
776 let found_resize = v:true
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200777 break
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200778 endif
779 endfor
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200780 call assert_false(found_resize)
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200781 let lines = readfile('Xtest_mks2.out')
782 let found_resize = v:false
783 for line in lines
784 if line =~ '^set lines='
785 let found_resize = v:true
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200786 break
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200787 endif
788 endfor
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200789 call assert_true(found_resize)
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200790
791 call delete('Xtest_mks1.out')
792 call delete('Xtest_mks2.out')
793 set sessionoptions&
794endfunc
795
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200796" Test for mksession with a named scratch buffer
797func Test_mksession_scratch()
798 enew | only
799 file Xscratch
800 set buftype=nofile
801 mksession! Xtest_mks.out
802 %bwipe
803 source Xtest_mks.out
804 call assert_equal('Xscratch', bufname(''))
805 call assert_equal('nofile', &buftype)
806 %bwipe
807 call delete('Xtest_mks.out')
808endfunc
809
810" Test for mksession with fold options
811func Test_mksession_foldopt()
812 set sessionoptions-=options
813 set sessionoptions+=folds
814 new
815 setlocal foldenable
816 setlocal foldmethod=expr
817 setlocal foldmarker=<<<,>>>
818 setlocal foldignore=%
819 setlocal foldlevel=2
820 setlocal foldminlines=10
821 setlocal foldnestmax=15
822 mksession! Xtest_mks.out
823 close
824 %bwipe
825
826 source Xtest_mks.out
827 call assert_true(&foldenable)
828 call assert_equal('expr', &foldmethod)
829 call assert_equal('<<<,>>>', &foldmarker)
830 call assert_equal('%', &foldignore)
831 call assert_equal(2, &foldlevel)
832 call assert_equal(10, &foldminlines)
833 call assert_equal(15, &foldnestmax)
834
835 close
836 %bwipe
837 set sessionoptions&
838endfunc
839
840" Test for mksession with window position
841func Test_mksession_winpos()
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200842 " Only applicable in GUI Vim
843 CheckGui
844
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200845 set sessionoptions+=winpos
846 mksession! Xtest_mks.out
847 let found_winpos = v:false
848 let lines = readfile('Xtest_mks.out')
849 for line in lines
850 if line =~ '^winpos '
851 let found_winpos = v:true
852 break
853 endif
854 endfor
855 call assert_true(found_winpos)
856 call delete('Xtest_mks.out')
857 set sessionoptions&
858endfunc
859
860" Test for mksession with 'compatible' option
861func Test_mksession_compatible()
862 mksession! Xtest_mks1.out
863 set compatible
864 mksession! Xtest_mks2.out
865 set nocp
866
867 let test_success = v:false
868 let lines = readfile('Xtest_mks1.out')
869 for line in lines
870 if line =~ '^if &cp | set nocp | endif'
871 let test_success = v:true
872 break
873 endif
874 endfor
875 call assert_true(test_success)
876
877 let test_success = v:false
878 let lines = readfile('Xtest_mks2.out')
879 for line in lines
880 if line =~ '^if !&cp | set cp | endif'
881 let test_success = v:true
882 break
883 endif
884 endfor
885 call assert_true(test_success)
886
887 call delete('Xtest_mks1.out')
888 call delete('Xtest_mks2.out')
889 set compatible&
890 set sessionoptions&
891endfunc
892
Bram Moolenaar87500262019-08-01 23:05:49 +0200893func s:ClearMappings()
894 mapclear
895 omapclear
896 mapclear!
897 lmapclear
898 tmapclear
899endfunc
900
901func Test_mkvimrc()
902 let entries = [
903 \ ['', 'nothing', '<Nop>'],
904 \ ['n', 'normal', 'NORMAL'],
905 \ ['v', 'visual', 'VISUAL'],
906 \ ['s', 'select', 'SELECT'],
907 \ ['x', 'visualonly', 'VISUALONLY'],
908 \ ['o', 'operator', 'OPERATOR'],
909 \ ['i', 'insert', 'INSERT'],
910 \ ['l', 'lang', 'LANG'],
911 \ ['c', 'command', 'COMMAND'],
912 \ ['t', 'terminal', 'TERMINAL'],
913 \ ]
914 for entry in entries
915 exe entry[0] .. 'map ' .. entry[1] .. ' ' .. entry[2]
916 endfor
917
918 mkvimrc Xtestvimrc
919
920 call s:ClearMappings()
921 for entry in entries
922 call assert_equal('', maparg(entry[1], entry[0]))
923 endfor
924
925 source Xtestvimrc
926
927 for entry in entries
928 call assert_equal(entry[2], maparg(entry[1], entry[0]))
929 endfor
930
931 call s:ClearMappings()
932 call delete('Xtestvimrc')
933endfunc
934
Bram Moolenaar38890832020-11-01 17:40:54 +0100935func Test_scrolloff()
936 set sessionoptions+=localoptions
937 setlocal so=1 siso=1
938 mksession! Xtest_mks.out
939 setlocal so=-1 siso=-1
940 source Xtest_mks.out
941 call assert_equal(1, &l:so)
942 call assert_equal(1, &l:siso)
943 call delete('Xtest_mks.out')
944 setlocal so& siso&
945 set sessionoptions&
946endfunc
947
Bram Moolenaar3482be62020-11-27 11:00:38 +0100948func Test_altfile()
949 edit Xone
950 split Xtwo
951 edit Xtwoalt
952 edit #
953 wincmd w
954 edit Xonealt
955 edit #
956 mksession! Xtest_altfile
957 only
958 bwipe Xonealt
959 bwipe Xtwoalt
960 bwipe!
961 source Xtest_altfile
962 call assert_equal('Xone', bufname())
963 call assert_equal('Xonealt', bufname('#'))
964 wincmd w
965 call assert_equal('Xtwo', bufname())
966 call assert_equal('Xtwoalt', bufname('#'))
967 only
968 bwipe!
Bram Moolenaarac665c22020-12-08 20:39:15 +0100969 call delete('Xtest_altfile')
Bram Moolenaar3482be62020-11-27 11:00:38 +0100970endfunc
971
Bram Moolenaareca626f2016-12-01 18:47:38 +0100972" vim: shiftwidth=2 sts=2 expandtab