blob: 7ae42f33674e09a50f818966da3b0fb63bec79ec [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 Moolenaar555de4e2019-01-21 23:03:49 +0100589" A clean session (one empty buffer, one window, and one tab) should not
590" set any error messages when sourced because no commands should fail.
591func Test_mksession_no_errmsg()
592 let v:errmsg = ''
593 %bwipe!
594 mksession! Xtest_mks.out
595 source Xtest_mks.out
596 call assert_equal('', v:errmsg)
597 call delete('Xtest_mks.out')
598endfunc
599
Bram Moolenaarad36a352019-01-24 13:34:42 +0100600func Test_mksession_quote_in_filename()
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200601 " only Unix can handle this weird filename
602 CheckUnix
603
Bram Moolenaarad36a352019-01-24 13:34:42 +0100604 let v:errmsg = ''
605 %bwipe!
606 split another
607 split x'y\"z
608 mksession! Xtest_mks_quoted.out
609 %bwipe!
610 source Xtest_mks_quoted.out
611 call assert_true(bufexists("x'y\"z"))
612
613 %bwipe!
614 call delete('Xtest_mks_quoted.out')
615endfunc
616
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200617" Test for storing global variables in a session file
618func Test_mksession_globals()
619 set sessionoptions+=globals
620
621 " create different global variables
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200622 let g:Global_string = "Sun is shining\r\n"
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200623 let g:Global_count = 100
624 let g:Global_pi = 3.14
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200625 let g:Global_neg_float = -2.68
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200626
627 mksession! Xtest_mks.out
628
629 unlet g:Global_string
630 unlet g:Global_count
631 unlet g:Global_pi
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200632 unlet g:Global_neg_float
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200633
634 source Xtest_mks.out
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200635 call assert_equal("Sun is shining\r\n", g:Global_string)
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200636 call assert_equal(100, g:Global_count)
637 call assert_equal(3.14, g:Global_pi)
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200638 call assert_equal(-2.68, g:Global_neg_float)
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200639
640 unlet g:Global_string
641 unlet g:Global_count
642 unlet g:Global_pi
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200643 unlet g:Global_neg_float
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200644 call delete('Xtest_mks.out')
645 set sessionoptions&
646endfunc
647
648" Test for changing backslash to forward slash in filenames
649func Test_mksession_slash()
Bram Moolenaar37ac4a52019-09-28 19:29:04 +0200650 if exists('+shellslash')
651 throw 'Skipped: cannot use backslash in file name'
652 endif
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200653 enew
654 %bwipe!
655 e a\\b\\c
656 mksession! Xtest_mks1.out
657 set sessionoptions+=slash
658 mksession! Xtest_mks2.out
659
660 %bwipe!
661 source Xtest_mks1.out
662 call assert_equal('a\b\c', bufname(''))
663 %bwipe!
664 source Xtest_mks2.out
665 call assert_equal('a/b/c', bufname(''))
666
667 %bwipe!
668 call delete('Xtest_mks1.out')
669 call delete('Xtest_mks2.out')
670 set sessionoptions&
671endfunc
672
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200673" Test for changing directory to the session file directory
674func Test_mksession_sesdir()
Bram Moolenaar5bf46e92019-11-09 18:06:04 +0100675 let save_cwd = getcwd()
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200676 call mkdir('Xproj')
677 mksession! Xproj/Xtest_mks1.out
678 set sessionoptions-=curdir
679 set sessionoptions+=sesdir
680 mksession! Xproj/Xtest_mks2.out
681
682 source Xproj/Xtest_mks1.out
683 call assert_equal('testdir', fnamemodify(getcwd(), ':t'))
684 source Xproj/Xtest_mks2.out
685 call assert_equal('Xproj', fnamemodify(getcwd(), ':t'))
Bram Moolenaar5bf46e92019-11-09 18:06:04 +0100686 call chdir(save_cwd)
687 %bwipe
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200688
689 set sessionoptions&
690 call delete('Xproj', 'rf')
691endfunc
692
693" Test for storing the 'lines' and 'columns' settings
694func Test_mksession_resize()
695 mksession! Xtest_mks1.out
696 set sessionoptions+=resize
697 mksession! Xtest_mks2.out
698
699 let lines = readfile('Xtest_mks1.out')
700 let found_resize = v:false
701 for line in lines
702 if line =~ '^set lines='
703 let found_resize = v:true
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200704 break
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200705 endif
706 endfor
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200707 call assert_false(found_resize)
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200708 let lines = readfile('Xtest_mks2.out')
709 let found_resize = v:false
710 for line in lines
711 if line =~ '^set lines='
712 let found_resize = v:true
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200713 break
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200714 endif
715 endfor
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200716 call assert_true(found_resize)
Bram Moolenaar66f0e6c2019-09-28 19:08:45 +0200717
718 call delete('Xtest_mks1.out')
719 call delete('Xtest_mks2.out')
720 set sessionoptions&
721endfunc
722
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200723" Test for mksession with a named scratch buffer
724func Test_mksession_scratch()
725 enew | only
726 file Xscratch
727 set buftype=nofile
728 mksession! Xtest_mks.out
729 %bwipe
730 source Xtest_mks.out
731 call assert_equal('Xscratch', bufname(''))
732 call assert_equal('nofile', &buftype)
733 %bwipe
734 call delete('Xtest_mks.out')
735endfunc
736
737" Test for mksession with fold options
738func Test_mksession_foldopt()
739 set sessionoptions-=options
740 set sessionoptions+=folds
741 new
742 setlocal foldenable
743 setlocal foldmethod=expr
744 setlocal foldmarker=<<<,>>>
745 setlocal foldignore=%
746 setlocal foldlevel=2
747 setlocal foldminlines=10
748 setlocal foldnestmax=15
749 mksession! Xtest_mks.out
750 close
751 %bwipe
752
753 source Xtest_mks.out
754 call assert_true(&foldenable)
755 call assert_equal('expr', &foldmethod)
756 call assert_equal('<<<,>>>', &foldmarker)
757 call assert_equal('%', &foldignore)
758 call assert_equal(2, &foldlevel)
759 call assert_equal(10, &foldminlines)
760 call assert_equal(15, &foldnestmax)
761
762 close
763 %bwipe
764 set sessionoptions&
765endfunc
766
767" Test for mksession with window position
768func Test_mksession_winpos()
Bram Moolenaar6d91bcb2020-08-12 18:50:36 +0200769 " Only applicable in GUI Vim
770 CheckGui
771
Bram Moolenaaree1a2b52019-09-29 14:23:39 +0200772 set sessionoptions+=winpos
773 mksession! Xtest_mks.out
774 let found_winpos = v:false
775 let lines = readfile('Xtest_mks.out')
776 for line in lines
777 if line =~ '^winpos '
778 let found_winpos = v:true
779 break
780 endif
781 endfor
782 call assert_true(found_winpos)
783 call delete('Xtest_mks.out')
784 set sessionoptions&
785endfunc
786
787" Test for mksession with 'compatible' option
788func Test_mksession_compatible()
789 mksession! Xtest_mks1.out
790 set compatible
791 mksession! Xtest_mks2.out
792 set nocp
793
794 let test_success = v:false
795 let lines = readfile('Xtest_mks1.out')
796 for line in lines
797 if line =~ '^if &cp | set nocp | endif'
798 let test_success = v:true
799 break
800 endif
801 endfor
802 call assert_true(test_success)
803
804 let test_success = v:false
805 let lines = readfile('Xtest_mks2.out')
806 for line in lines
807 if line =~ '^if !&cp | set cp | endif'
808 let test_success = v:true
809 break
810 endif
811 endfor
812 call assert_true(test_success)
813
814 call delete('Xtest_mks1.out')
815 call delete('Xtest_mks2.out')
816 set compatible&
817 set sessionoptions&
818endfunc
819
Bram Moolenaar87500262019-08-01 23:05:49 +0200820func s:ClearMappings()
821 mapclear
822 omapclear
823 mapclear!
824 lmapclear
825 tmapclear
826endfunc
827
828func Test_mkvimrc()
829 let entries = [
830 \ ['', 'nothing', '<Nop>'],
831 \ ['n', 'normal', 'NORMAL'],
832 \ ['v', 'visual', 'VISUAL'],
833 \ ['s', 'select', 'SELECT'],
834 \ ['x', 'visualonly', 'VISUALONLY'],
835 \ ['o', 'operator', 'OPERATOR'],
836 \ ['i', 'insert', 'INSERT'],
837 \ ['l', 'lang', 'LANG'],
838 \ ['c', 'command', 'COMMAND'],
839 \ ['t', 'terminal', 'TERMINAL'],
840 \ ]
841 for entry in entries
842 exe entry[0] .. 'map ' .. entry[1] .. ' ' .. entry[2]
843 endfor
844
845 mkvimrc Xtestvimrc
846
847 call s:ClearMappings()
848 for entry in entries
849 call assert_equal('', maparg(entry[1], entry[0]))
850 endfor
851
852 source Xtestvimrc
853
854 for entry in entries
855 call assert_equal(entry[2], maparg(entry[1], entry[0]))
856 endfor
857
858 call s:ClearMappings()
859 call delete('Xtestvimrc')
860endfunc
861
Bram Moolenaar38890832020-11-01 17:40:54 +0100862func Test_scrolloff()
863 set sessionoptions+=localoptions
864 setlocal so=1 siso=1
865 mksession! Xtest_mks.out
866 setlocal so=-1 siso=-1
867 source Xtest_mks.out
868 call assert_equal(1, &l:so)
869 call assert_equal(1, &l:siso)
870 call delete('Xtest_mks.out')
871 setlocal so& siso&
872 set sessionoptions&
873endfunc
874
Bram Moolenaareca626f2016-12-01 18:47:38 +0100875" vim: shiftwidth=2 sts=2 expandtab