blob: c2b8fb955c98f4c8658d21aa0af9453608e8c78c [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'
384 call assert_report('session must not restore teminal')
385 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'
401 call assert_report('session must not restore teminal')
402 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'
419 call assert_report('session must not restore teminal')
420 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'
437 call assert_report('session must not restore teminal')
438 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 Moolenaar627cb6a2018-08-28 22:19:31 +0200507" Test :mkview with a file argument.
508func Test_mkview_file()
509 " Create a view with line number and a fold.
510 help :mkview
511 set number
Bram Moolenaar2bf4fe02018-08-30 14:04:25 +0200512 norm! V}zf0
Bram Moolenaardd5d18e2018-08-30 14:16:06 +0200513 let pos = getpos('.')
Bram Moolenaar627cb6a2018-08-28 22:19:31 +0200514 let linefoldclosed1 = foldclosed('.')
515 mkview! Xview
516 set nonumber
517 norm! zrj
518 " We can close the help window, as mkview with a file name should
519 " generate a command to edit the file.
520 helpclose
521
522 source Xview
523 call assert_equal(1, &number)
524 call assert_match('\*:mkview\*$', getline('.'))
Bram Moolenaardd5d18e2018-08-30 14:16:06 +0200525 call assert_equal(pos, getpos('.'))
Bram Moolenaar627cb6a2018-08-28 22:19:31 +0200526 call assert_equal(linefoldclosed1, foldclosed('.'))
527
528 " Creating a view again with the same file name should fail (file
529 " already exists). But with a !, the previous view should be
530 " overwritten without error.
531 help :loadview
532 call assert_fails('mkview Xview', 'E189:')
533 call assert_match('\*:loadview\*$', getline('.'))
534 mkview! Xview
535 call assert_match('\*:loadview\*$', getline('.'))
536
537 call delete('Xview')
538 bwipe
539endfunc
540
541" Test :mkview and :loadview with a custom 'viewdir'.
542func Test_mkview_loadview_with_viewdir()
543 set viewdir=Xviewdir
544
545 help :mkview
546 set number
547 norm! V}zf
Bram Moolenaardd5d18e2018-08-30 14:16:06 +0200548 let pos = getpos('.')
Bram Moolenaar627cb6a2018-08-28 22:19:31 +0200549 let linefoldclosed1 = foldclosed('.')
550 mkview 1
551 set nonumber
552 norm! zrj
553
554 loadview 1
555
556 " The directory Xviewdir/ should have been created and the view
557 " should be stored in that directory.
558 call assert_equal('Xviewdir/' .
559 \ substitute(
560 \ substitute(
561 \ expand('%:p'), '/', '=+', 'g'), ':', '=-', 'g') . '=1.vim',
562 \ glob('Xviewdir/*'))
563 call assert_equal(1, &number)
564 call assert_match('\*:mkview\*$', getline('.'))
Bram Moolenaardd5d18e2018-08-30 14:16:06 +0200565 call assert_equal(pos, getpos('.'))
Bram Moolenaar627cb6a2018-08-28 22:19:31 +0200566 call assert_equal(linefoldclosed1, foldclosed('.'))
567
568 call delete('Xviewdir', 'rf')
569 set viewdir&
570 helpclose
571endfunc
572
573func Test_mkview_no_file_name()
574 new
575 " :mkview or :mkview {nr} should fail in a unnamed buffer.
576 call assert_fails('mkview', 'E32:')
577 call assert_fails('mkview 1', 'E32:')
578
579 " :mkview {file} should succeed in a unnamed buffer.
580 mkview Xview
581 help
582 source Xview
583 call assert_equal('', bufname('%'))
584
585 call delete('Xview')
586 %bwipe
587endfunc
Bram Moolenaar79da5632017-02-01 22:52:44 +0100588
Bram Moolenaar3482be62020-11-27 11:00:38 +0100589func Test_mkview_loadview_jumplist()
590 set viewdir=Xviewdir
591 au BufWinLeave * silent mkview
592 au BufWinEnter * silent loadview
593
594 edit Xfile1
595 call setline(1, ['a', 'bbbbbbb', 'c'])
596 normal j3l
597 call assert_equal([2, 4], getcurpos()[1:2])
598 write
599
600 edit Xfile2
601 call setline(1, ['d', 'eeeeeee', 'f'])
602 normal j5l
603 call assert_equal([2, 6], getcurpos()[1:2])
604 write
605
606 edit Xfile3
607 call setline(1, ['g', 'h', 'iiiii'])
608 normal jj3l
609 call assert_equal([3, 4], getcurpos()[1:2])
610 write
611
612 edit Xfile1
613 call assert_equal([2, 4], getcurpos()[1:2])
614 edit Xfile2
615 call assert_equal([2, 6], getcurpos()[1:2])
616 edit Xfile3
617 call assert_equal([3, 4], getcurpos()[1:2])
618
619 exe "normal \<C-O>"
620 call assert_equal('Xfile2', expand('%'))
621 call assert_equal([2, 6], getcurpos()[1:2])
622 exe "normal \<C-O>"
623 call assert_equal('Xfile1', expand('%'))
624 call assert_equal([2, 4], getcurpos()[1:2])
625
626 au! BufWinLeave
627 au! BufWinEnter
628 bwipe!
629 call delete('Xviewdir', 'rf')
630 call delete('Xfile1')
631 call delete('Xfile2')
632 call delete('Xfile3')
633 set viewdir&
634endfunc
635
Bram Moolenaar555de4e2019-01-21 23:03:49 +0100636" A clean session (one empty buffer, one window, and one tab) should not
637" set any error messages when sourced because no commands should fail.
638func Test_mksession_no_errmsg()
639 let v:errmsg = ''
640 %bwipe!
641 mksession! Xtest_mks.out
642 source Xtest_mks.out
643 call assert_equal('', v:errmsg)
644 call delete('Xtest_mks.out')
645endfunc
646
Bram Moolenaarad36a352019-01-24 13:34:42 +0100647func Test_mksession_quote_in_filename()
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200648 " only Unix can handle this weird filename
649 CheckUnix
650
Bram Moolenaarad36a352019-01-24 13:34:42 +0100651 let v:errmsg = ''
652 %bwipe!
653 split another
654 split x'y\"z
655 mksession! Xtest_mks_quoted.out
656 %bwipe!
657 source Xtest_mks_quoted.out
658 call assert_true(bufexists("x'y\"z"))
659
660 %bwipe!
661 call delete('Xtest_mks_quoted.out')
662endfunc
663
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200664" Test for storing global variables in a session file
665func Test_mksession_globals()
666 set sessionoptions+=globals
667
668 " create different global variables
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200669 let g:Global_string = "Sun is shining\r\n"
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200670 let g:Global_count = 100
671 let g:Global_pi = 3.14
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200672 let g:Global_neg_float = -2.68
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200673
674 mksession! Xtest_mks.out
675
676 unlet g:Global_string
677 unlet g:Global_count
678 unlet g:Global_pi
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200679 unlet g:Global_neg_float
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200680
681 source Xtest_mks.out
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200682 call assert_equal("Sun is shining\r\n", g:Global_string)
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200683 call assert_equal(100, g:Global_count)
684 call assert_equal(3.14, g:Global_pi)
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200685 call assert_equal(-2.68, g:Global_neg_float)
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200686
687 unlet g:Global_string
688 unlet g:Global_count
689 unlet g:Global_pi
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200690 unlet g:Global_neg_float
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200691 call delete('Xtest_mks.out')
692 set sessionoptions&
693endfunc
694
695" Test for changing backslash to forward slash in filenames
696func Test_mksession_slash()
Bram Moolenaar37ac4a52019-09-28 19:29:04 +0200697 if exists('+shellslash')
698 throw 'Skipped: cannot use backslash in file name'
699 endif
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200700 enew
701 %bwipe!
702 e a\\b\\c
703 mksession! Xtest_mks1.out
704 set sessionoptions+=slash
705 mksession! Xtest_mks2.out
706
707 %bwipe!
708 source Xtest_mks1.out
709 call assert_equal('a\b\c', bufname(''))
710 %bwipe!
711 source Xtest_mks2.out
712 call assert_equal('a/b/c', bufname(''))
713
714 %bwipe!
715 call delete('Xtest_mks1.out')
716 call delete('Xtest_mks2.out')
717 set sessionoptions&
718endfunc
719
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200720" Test for changing directory to the session file directory
721func Test_mksession_sesdir()
Bram Moolenaar5bf46e92019-11-09 18:06:04 +0100722 let save_cwd = getcwd()
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200723 call mkdir('Xproj')
724 mksession! Xproj/Xtest_mks1.out
725 set sessionoptions-=curdir
726 set sessionoptions+=sesdir
727 mksession! Xproj/Xtest_mks2.out
728
729 source Xproj/Xtest_mks1.out
730 call assert_equal('testdir', fnamemodify(getcwd(), ':t'))
731 source Xproj/Xtest_mks2.out
732 call assert_equal('Xproj', fnamemodify(getcwd(), ':t'))
Bram Moolenaar5bf46e92019-11-09 18:06:04 +0100733 call chdir(save_cwd)
734 %bwipe
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200735
736 set sessionoptions&
737 call delete('Xproj', 'rf')
738endfunc
739
740" Test for storing the 'lines' and 'columns' settings
741func Test_mksession_resize()
742 mksession! Xtest_mks1.out
743 set sessionoptions+=resize
744 mksession! Xtest_mks2.out
745
746 let lines = readfile('Xtest_mks1.out')
747 let found_resize = v:false
748 for line in lines
749 if line =~ '^set lines='
750 let found_resize = v:true
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200751 break
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200752 endif
753 endfor
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200754 call assert_false(found_resize)
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200755 let lines = readfile('Xtest_mks2.out')
756 let found_resize = v:false
757 for line in lines
758 if line =~ '^set lines='
759 let found_resize = v:true
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200760 break
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200761 endif
762 endfor
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200763 call assert_true(found_resize)
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200764
765 call delete('Xtest_mks1.out')
766 call delete('Xtest_mks2.out')
767 set sessionoptions&
768endfunc
769
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200770" Test for mksession with a named scratch buffer
771func Test_mksession_scratch()
772 enew | only
773 file Xscratch
774 set buftype=nofile
775 mksession! Xtest_mks.out
776 %bwipe
777 source Xtest_mks.out
778 call assert_equal('Xscratch', bufname(''))
779 call assert_equal('nofile', &buftype)
780 %bwipe
781 call delete('Xtest_mks.out')
782endfunc
783
784" Test for mksession with fold options
785func Test_mksession_foldopt()
786 set sessionoptions-=options
787 set sessionoptions+=folds
788 new
789 setlocal foldenable
790 setlocal foldmethod=expr
791 setlocal foldmarker=<<<,>>>
792 setlocal foldignore=%
793 setlocal foldlevel=2
794 setlocal foldminlines=10
795 setlocal foldnestmax=15
796 mksession! Xtest_mks.out
797 close
798 %bwipe
799
800 source Xtest_mks.out
801 call assert_true(&foldenable)
802 call assert_equal('expr', &foldmethod)
803 call assert_equal('<<<,>>>', &foldmarker)
804 call assert_equal('%', &foldignore)
805 call assert_equal(2, &foldlevel)
806 call assert_equal(10, &foldminlines)
807 call assert_equal(15, &foldnestmax)
808
809 close
810 %bwipe
811 set sessionoptions&
812endfunc
813
814" Test for mksession with window position
815func Test_mksession_winpos()
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200816 " Only applicable in GUI Vim
817 CheckGui
818
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200819 set sessionoptions+=winpos
820 mksession! Xtest_mks.out
821 let found_winpos = v:false
822 let lines = readfile('Xtest_mks.out')
823 for line in lines
824 if line =~ '^winpos '
825 let found_winpos = v:true
826 break
827 endif
828 endfor
829 call assert_true(found_winpos)
830 call delete('Xtest_mks.out')
831 set sessionoptions&
832endfunc
833
834" Test for mksession with 'compatible' option
835func Test_mksession_compatible()
836 mksession! Xtest_mks1.out
837 set compatible
838 mksession! Xtest_mks2.out
839 set nocp
840
841 let test_success = v:false
842 let lines = readfile('Xtest_mks1.out')
843 for line in lines
844 if line =~ '^if &cp | set nocp | endif'
845 let test_success = v:true
846 break
847 endif
848 endfor
849 call assert_true(test_success)
850
851 let test_success = v:false
852 let lines = readfile('Xtest_mks2.out')
853 for line in lines
854 if line =~ '^if !&cp | set cp | endif'
855 let test_success = v:true
856 break
857 endif
858 endfor
859 call assert_true(test_success)
860
861 call delete('Xtest_mks1.out')
862 call delete('Xtest_mks2.out')
863 set compatible&
864 set sessionoptions&
865endfunc
866
Bram Moolenaar87500262019-08-01 23:05:49 +0200867func s:ClearMappings()
868 mapclear
869 omapclear
870 mapclear!
871 lmapclear
872 tmapclear
873endfunc
874
875func Test_mkvimrc()
876 let entries = [
877 \ ['', 'nothing', '<Nop>'],
878 \ ['n', 'normal', 'NORMAL'],
879 \ ['v', 'visual', 'VISUAL'],
880 \ ['s', 'select', 'SELECT'],
881 \ ['x', 'visualonly', 'VISUALONLY'],
882 \ ['o', 'operator', 'OPERATOR'],
883 \ ['i', 'insert', 'INSERT'],
884 \ ['l', 'lang', 'LANG'],
885 \ ['c', 'command', 'COMMAND'],
886 \ ['t', 'terminal', 'TERMINAL'],
887 \ ]
888 for entry in entries
889 exe entry[0] .. 'map ' .. entry[1] .. ' ' .. entry[2]
890 endfor
891
892 mkvimrc Xtestvimrc
893
894 call s:ClearMappings()
895 for entry in entries
896 call assert_equal('', maparg(entry[1], entry[0]))
897 endfor
898
899 source Xtestvimrc
900
901 for entry in entries
902 call assert_equal(entry[2], maparg(entry[1], entry[0]))
903 endfor
904
905 call s:ClearMappings()
906 call delete('Xtestvimrc')
907endfunc
908
Bram Moolenaar38890832020-11-01 17:40:54 +0100909func Test_scrolloff()
910 set sessionoptions+=localoptions
911 setlocal so=1 siso=1
912 mksession! Xtest_mks.out
913 setlocal so=-1 siso=-1
914 source Xtest_mks.out
915 call assert_equal(1, &l:so)
916 call assert_equal(1, &l:siso)
917 call delete('Xtest_mks.out')
918 setlocal so& siso&
919 set sessionoptions&
920endfunc
921
Bram Moolenaar3482be62020-11-27 11:00:38 +0100922func Test_altfile()
923 edit Xone
924 split Xtwo
925 edit Xtwoalt
926 edit #
927 wincmd w
928 edit Xonealt
929 edit #
930 mksession! Xtest_altfile
931 only
932 bwipe Xonealt
933 bwipe Xtwoalt
934 bwipe!
935 source Xtest_altfile
936 call assert_equal('Xone', bufname())
937 call assert_equal('Xonealt', bufname('#'))
938 wincmd w
939 call assert_equal('Xtwo', bufname())
940 call assert_equal('Xtwoalt', bufname('#'))
941 only
942 bwipe!
943endfunc
944
Bram Moolenaareca626f2016-12-01 18:47:38 +0100945" vim: shiftwidth=2 sts=2 expandtab